Mercurial > ~mikael > mcabber > hg
annotate mcabber/mcabber/caps.c @ 2240:45bab5858d81
Update ChangeLog
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Wed, 27 Jan 2016 09:58:31 +0100 |
parents | 965e0282c128 |
children | f5402d705f67 |
rev | line source |
---|---|
1600 | 1 /* |
2 * caps.c -- Entity Capabilities Cache for mcabber | |
3 * | |
1872 | 4 * Copyright (C) 2008-2010 Frank Zschockelt <mcabber@freakysoft.de> |
1600 | 5 * |
6 * This program is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or (at | |
9 * your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, but | |
12 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | |
19 * USA | |
20 */ | |
21 | |
22 #include <glib.h> | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
23 #include <string.h> |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
24 #include <sys/stat.h> |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
25 #include <unistd.h> |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
26 #include <fcntl.h> |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
27 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
28 #include "settings.h" |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
29 #include "utils.h" |
1600 | 30 |
31 typedef struct { | |
32 char *category; | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
33 char *type; |
1600 | 34 char *name; |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
35 } identity; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
36 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
37 typedef struct { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
38 GHashTable *fields; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
39 } dataform; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
40 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
41 typedef struct { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
42 GHashTable *identities; |
1600 | 43 GHashTable *features; |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
44 GHashTable *forms; |
1600 | 45 } caps; |
46 | |
47 static GHashTable *caps_cache = NULL; | |
48 | |
49 void caps_destroy(gpointer data) | |
50 { | |
51 caps *c = data; | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
52 g_hash_table_destroy(c->identities); |
1600 | 53 g_hash_table_destroy(c->features); |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
54 g_hash_table_destroy(c->forms); |
1600 | 55 g_free(c); |
56 } | |
57 | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
58 void identity_destroy(gpointer data) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
59 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
60 identity *i = data; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
61 g_free(i->category); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
62 g_free(i->type); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
63 g_free(i->name); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
64 g_free(i); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
65 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
66 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
67 void form_destroy(gpointer data) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
68 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
69 dataform *f = data; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
70 g_hash_table_destroy(f->fields); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
71 g_free(f); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
72 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
73 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
74 void field_destroy(gpointer data) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
75 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
76 GList *v = data; |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
77 g_list_foreach (v, (GFunc) g_free, NULL); |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
78 g_list_free (v); |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
79 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
80 |
1600 | 81 void caps_init(void) |
82 { | |
83 if (!caps_cache) | |
84 caps_cache = g_hash_table_new_full(g_str_hash, g_str_equal, | |
85 g_free, caps_destroy); | |
86 } | |
87 | |
88 void caps_free(void) | |
89 { | |
90 if (caps_cache) { | |
91 g_hash_table_destroy(caps_cache); | |
92 caps_cache = NULL; | |
93 } | |
94 } | |
95 | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
96 void caps_add(const char *hash) |
1600 | 97 { |
98 if (!hash) | |
99 return; | |
100 caps *c = g_new0(caps, 1); | |
2223
965e0282c128
Backed out changeset fa516ef22145
Mikael Berthe <mikael@lilotux.net>
parents:
2221
diff
changeset
|
101 c->features = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
102 c->identities = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, identity_destroy); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
103 c->forms = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, form_destroy); |
2212 | 104 g_hash_table_replace(caps_cache, g_strdup(hash), c); |
1600 | 105 } |
106 | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
107 void caps_remove(const char *hash) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
108 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
109 if (!hash) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
110 return; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
111 g_hash_table_remove(caps_cache, hash); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
112 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
113 |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
114 /* if hash is not verified, this will bind capabilities set only with bare jid */ |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
115 void caps_move_to_local(char *hash, char *bjid) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
116 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
117 char *orig_hash; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
118 caps *c = NULL; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
119 if (!hash || !bjid) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
120 return; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
121 g_hash_table_lookup_extended(caps_cache, hash, (gpointer*)&orig_hash, (gpointer*)&c); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
122 if (c) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
123 g_hash_table_steal(caps_cache, hash); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
124 g_free(orig_hash); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
125 g_hash_table_replace(caps_cache, g_strdup_printf("%s/#%s", bjid, hash), c); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
126 // solidus is guaranteed to never appear in bare jid |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
127 // hash will not appear in base64 encoded hash |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
128 // sequence "/#" is deterministic separator, and allows to identify local cache entry |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
129 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
130 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
131 |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
132 /*if bjid is NULL, it will check only verified hashes */ |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
133 int caps_has_hash(const char *hash, const char *bjid) |
1600 | 134 { |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
135 caps *c = NULL; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
136 if (!hash) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
137 return 0; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
138 c = g_hash_table_lookup(caps_cache, hash); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
139 if (!c && bjid) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
140 char *key = g_strdup_printf("%s/#%s", bjid, hash); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
141 c = g_hash_table_lookup(caps_cache, key); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
142 g_free(key); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
143 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
144 return (c != NULL); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
145 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
146 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
147 void caps_add_identity(const char *hash, |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
148 const char *category, |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
149 const char *name, |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
150 const char *type, |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
151 const char *lang) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
152 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
153 caps *c; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
154 if (!hash || !category || !type) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
155 return; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
156 if (!lang) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
157 lang = ""; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
158 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
159 c = g_hash_table_lookup(caps_cache, hash); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
160 if (c) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
161 identity *i = g_new0(identity, 1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
162 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
163 i->category = g_strdup(category); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
164 i->name = g_strdup(name); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
165 i->type = g_strdup(type); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
166 g_hash_table_replace(c->identities, g_strdup(lang), i); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
167 } |
1600 | 168 } |
169 | |
170 void caps_set_identity(char *hash, | |
171 const char *category, | |
172 const char *name, | |
173 const char *type) | |
174 { | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
175 caps_add_identity(hash, category, name, type, NULL); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
176 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
177 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
178 void caps_add_dataform(const char *hash, const char *formtype) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
179 { |
1600 | 180 caps *c; |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
181 if (!formtype) |
1600 | 182 return; |
183 c = g_hash_table_lookup(caps_cache, hash); | |
184 if (c) { | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
185 dataform *d = g_new0(dataform, 1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
186 char *f = g_strdup(formtype); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
187 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
188 d->fields = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, field_destroy); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
189 g_hash_table_replace(c->forms, f, d); |
1600 | 190 } |
191 } | |
192 | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
193 gint _strcmp_sort(gconstpointer a, gconstpointer b) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
194 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
195 return g_strcmp0(a, b); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
196 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
197 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
198 void caps_add_dataform_field(const char *hash, const char *formtype, |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
199 const char *field, const char *value) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
200 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
201 caps *c; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
202 if (!formtype || !field || !value) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
203 return; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
204 c = g_hash_table_lookup(caps_cache, hash); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
205 if (c) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
206 dataform *d; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
207 d = g_hash_table_lookup(c->forms, formtype); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
208 if (d) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
209 gpointer key, val; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
210 char *f; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
211 GList *v = NULL; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
212 if (g_hash_table_lookup_extended(d->fields, field, &key, &val)) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
213 g_hash_table_steal(d->fields, field); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
214 g_free(key); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
215 v = val; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
216 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
217 f = g_strdup(field); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
218 v = g_list_insert_sorted(v, g_strdup(value), _strcmp_sort); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
219 g_hash_table_replace(d->fields, f, v); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
220 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
221 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
222 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
223 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
224 void caps_add_feature(const char *hash, const char *feature) |
1600 | 225 { |
226 caps *c; | |
1872 | 227 if (!hash || !feature) |
1600 | 228 return; |
229 c = g_hash_table_lookup(caps_cache, hash); | |
230 if (c) { | |
231 char *f = g_strdup(feature); | |
1645
d3cd4db23f55
Fix for double-inserted features
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1600
diff
changeset
|
232 g_hash_table_replace(c->features, f, f); |
1600 | 233 } |
234 } | |
235 | |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
236 /* If hash is verified, then bare jid is ignored. |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
237 * If there is no globally verified hash, and bare jid is not null, |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
238 * then local storage for that jid will be checked */ |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
239 int caps_has_feature(const char *hash, char *feature, char *bjid) |
1600 | 240 { |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
241 caps *c = NULL; |
1872 | 242 if (!hash || !feature) |
1600 | 243 return 0; |
244 c = g_hash_table_lookup(caps_cache, hash); | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
245 if (!c && bjid) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
246 char *key = g_strdup_printf("%s/#%s", bjid, hash); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
247 c = g_hash_table_lookup(caps_cache, key); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
248 g_free(key); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
249 } |
1600 | 250 if (c) |
251 return (g_hash_table_lookup(c->features, feature) != NULL); | |
252 return 0; | |
253 } | |
254 | |
255 static GFunc _foreach_function; | |
256 | |
257 void _caps_foreach_helper(gpointer key, gpointer value, gpointer user_data) | |
258 { | |
259 // GFunc func = (GFunc)user_data; | |
260 _foreach_function(value, user_data); | |
261 } | |
262 | |
263 void caps_foreach_feature(const char *hash, GFunc func, gpointer user_data) | |
264 { | |
265 caps *c; | |
266 if (!hash) | |
267 return; | |
268 c = g_hash_table_lookup(caps_cache, hash); | |
269 if (!c) | |
270 return; | |
271 _foreach_function = func; | |
272 g_hash_table_foreach(c->features, _caps_foreach_helper, user_data); | |
273 } | |
274 | |
1729
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
275 // Generates the sha1 hash for the special capability "" and returns it |
1600 | 276 const char *caps_generate(void) |
277 { | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
278 GList *features, *langs; |
1600 | 279 GChecksum *sha1; |
280 guint8 digest[20]; | |
281 gsize digest_size = 20; | |
282 gchar *hash, *old_hash = NULL; | |
2220
79e12dacbccd
Fix a 1-byte memory leak in caps_generate()
Mikael Berthe <mikael@lilotux.net>
parents:
2216
diff
changeset
|
283 caps *old_caps, *c; |
79e12dacbccd
Fix a 1-byte memory leak in caps_generate()
Mikael Berthe <mikael@lilotux.net>
parents:
2216
diff
changeset
|
284 gpointer key; |
79e12dacbccd
Fix a 1-byte memory leak in caps_generate()
Mikael Berthe <mikael@lilotux.net>
parents:
2216
diff
changeset
|
285 |
2221
3f9988ec21e0
caps: Add a cast to remove a compilation warning
Mikael Berthe <mikael@lilotux.net>
parents:
2220
diff
changeset
|
286 if (!g_hash_table_lookup_extended(caps_cache, "", &key, (gpointer *)&c)) |
2220
79e12dacbccd
Fix a 1-byte memory leak in caps_generate()
Mikael Berthe <mikael@lilotux.net>
parents:
2216
diff
changeset
|
287 return NULL; |
1600 | 288 |
289 g_hash_table_steal(caps_cache, ""); | |
2220
79e12dacbccd
Fix a 1-byte memory leak in caps_generate()
Mikael Berthe <mikael@lilotux.net>
parents:
2216
diff
changeset
|
290 g_free(key); |
79e12dacbccd
Fix a 1-byte memory leak in caps_generate()
Mikael Berthe <mikael@lilotux.net>
parents:
2216
diff
changeset
|
291 |
1600 | 292 sha1 = g_checksum_new(G_CHECKSUM_SHA1); |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
293 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
294 langs = g_hash_table_get_keys(c->identities); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
295 langs = g_list_sort(langs, _strcmp_sort); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
296 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
297 identity *i; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
298 GList *lang; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
299 char *identity_S; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
300 for (lang=langs; lang; lang=lang->next) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
301 i = g_hash_table_lookup(c->identities, lang->data); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
302 identity_S = g_strdup_printf("%s/%s/%s/%s<", i->category, i->type, |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
303 (char *)lang->data, i->name ? i->name : ""); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
304 g_checksum_update(sha1, (guchar *)identity_S, -1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
305 g_free(identity_S); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
306 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
307 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
308 g_list_free(langs); |
1600 | 309 |
1662
63ebb1d32c7d
Fix for entity capabilities hash generation.
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1645
diff
changeset
|
310 features = g_hash_table_get_values(c->features); |
1600 | 311 features = g_list_sort(features, _strcmp_sort); |
1662
63ebb1d32c7d
Fix for entity capabilities hash generation.
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1645
diff
changeset
|
312 { |
63ebb1d32c7d
Fix for entity capabilities hash generation.
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1645
diff
changeset
|
313 GList *feature; |
63ebb1d32c7d
Fix for entity capabilities hash generation.
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1645
diff
changeset
|
314 for (feature=features; feature; feature=feature->next) { |
63ebb1d32c7d
Fix for entity capabilities hash generation.
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1645
diff
changeset
|
315 g_checksum_update(sha1, feature->data, -1); |
63ebb1d32c7d
Fix for entity capabilities hash generation.
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1645
diff
changeset
|
316 g_checksum_update(sha1, (guchar *)"<", -1); |
63ebb1d32c7d
Fix for entity capabilities hash generation.
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1645
diff
changeset
|
317 } |
1600 | 318 } |
319 g_list_free(features); | |
320 | |
321 g_checksum_get_digest(sha1, digest, &digest_size); | |
322 hash = g_base64_encode(digest, digest_size); | |
323 g_checksum_free(sha1); | |
324 g_hash_table_lookup_extended(caps_cache, hash, | |
325 (gpointer *)&old_hash, (gpointer *)&old_caps); | |
326 g_hash_table_insert(caps_cache, hash, c); | |
327 if (old_hash) | |
328 return old_hash; | |
329 else | |
330 return hash; | |
331 } | |
332 | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
333 gboolean caps_verify(const char *hash, char *function) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
334 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
335 GList *features, *langs, *forms; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
336 GChecksum *checksum; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
337 guint8 digest[20]; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
338 gsize digest_size = 20; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
339 gchar *local_hash; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
340 gboolean match = FALSE; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
341 caps *c = g_hash_table_lookup(caps_cache, hash); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
342 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
343 if (!g_strcmp0(function, "sha-1")) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
344 checksum = g_checksum_new(G_CHECKSUM_SHA1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
345 } else if (!g_strcmp0(function, "md5")) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
346 checksum = g_checksum_new(G_CHECKSUM_MD5); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
347 digest_size = 16; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
348 } else |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
349 return FALSE; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
350 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
351 langs = g_hash_table_get_keys(c->identities); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
352 langs = g_list_sort(langs, _strcmp_sort); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
353 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
354 identity *i; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
355 GList *lang; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
356 char *identity_S; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
357 for (lang=langs; lang; lang=lang->next) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
358 i = g_hash_table_lookup(c->identities, lang->data); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
359 identity_S = g_strdup_printf("%s/%s/%s/%s<", i->category, i->type, |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
360 (char *)lang->data, i->name ? i->name : ""); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
361 g_checksum_update(checksum, (guchar *)identity_S, -1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
362 g_free(identity_S); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
363 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
364 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
365 g_list_free(langs); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
366 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
367 features = g_hash_table_get_values(c->features); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
368 features = g_list_sort(features, _strcmp_sort); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
369 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
370 GList *feature; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
371 for (feature=features; feature; feature=feature->next) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
372 g_checksum_update(checksum, feature->data, -1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
373 g_checksum_update(checksum, (guchar *)"<", -1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
374 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
375 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
376 g_list_free(features); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
377 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
378 forms = g_hash_table_get_keys(c->forms); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
379 forms = g_list_sort(forms, _strcmp_sort); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
380 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
381 dataform *d; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
382 GList *form, *fields; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
383 for (form=forms; form; form=form->next) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
384 d = g_hash_table_lookup(c->forms, form->data); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
385 g_checksum_update(checksum, form->data, -1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
386 g_checksum_update(checksum, (guchar *)"<", -1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
387 fields = g_hash_table_get_keys(d->fields); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
388 fields = g_list_sort(fields, _strcmp_sort); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
389 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
390 GList *field; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
391 GList *values; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
392 for (field=fields; field; field=field->next) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
393 g_checksum_update(checksum, field->data, -1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
394 g_checksum_update(checksum, (guchar *)"<", -1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
395 values = g_hash_table_lookup(d->fields, field->data); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
396 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
397 GList *value; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
398 for (value=values; value; value=value->next) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
399 g_checksum_update(checksum, value->data, -1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
400 g_checksum_update(checksum, (guchar *)"<", -1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
401 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
402 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
403 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
404 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
405 g_list_free(fields); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
406 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
407 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
408 g_list_free(forms); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
409 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
410 g_checksum_get_digest(checksum, digest, &digest_size); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
411 local_hash = g_base64_encode(digest, digest_size); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
412 g_checksum_free(checksum); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
413 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
414 match = !g_strcmp0(hash, local_hash); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
415 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
416 g_free(local_hash); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
417 return match; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
418 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
419 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
420 static gchar* caps_get_filename(const char* hash) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
421 { |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
422 gchar *hash_fs; |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
423 gchar *dir = (gchar *) settings_opt_get ("caps_directory"); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
424 gchar *file = NULL; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
425 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
426 if (!dir) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
427 goto caps_filename_return; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
428 |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
429 hash_fs = g_strdup (hash); |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
430 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
431 const gchar *valid_fs = |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
432 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+="; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
433 g_strcanon(hash_fs, valid_fs, '-'); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
434 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
435 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
436 dir = expand_filename (dir); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
437 file = g_strdup_printf ("%s/%s.ini", dir, hash_fs); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
438 g_free(dir); |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
439 g_free(hash_fs); |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
440 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
441 caps_filename_return: |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
442 return file; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
443 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
444 |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
445 /* Store capabilities set in GKeyFile. To be used with verified hashes only */ |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
446 void caps_copy_to_persistent(const char* hash, char* xml) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
447 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
448 gchar *file; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
449 GList *features, *langs, *forms; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
450 GKeyFile *key_file; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
451 caps *c; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
452 int fd; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
453 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
454 g_free (xml); |
2064 | 455 |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
456 c = g_hash_table_lookup (caps_cache, hash); |
2064 | 457 if (!c) |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
458 goto caps_copy_return; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
459 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
460 file = caps_get_filename (hash); |
2064 | 461 if (!file) |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
462 goto caps_copy_return; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
463 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
464 fd = open (file, O_WRONLY|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
465 if (fd == -1) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
466 goto caps_copy_exists; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
467 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
468 key_file = g_key_file_new (); |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
469 g_key_file_set_comment (key_file, NULL, NULL, |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
470 "This is autogenerated file. Please do not modify.", |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
471 NULL); |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
472 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
473 langs = g_hash_table_get_keys (c->identities); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
474 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
475 identity *i; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
476 GList *lang; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
477 gchar *group; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
478 for (lang=langs; lang; lang=lang->next) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
479 i = g_hash_table_lookup (c->identities, lang->data); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
480 group = g_strdup_printf("identity_%s", (gchar *)lang->data); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
481 g_key_file_set_string (key_file, group, "category", i->category); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
482 g_key_file_set_string (key_file, group, "type", i->type); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
483 g_key_file_set_string (key_file, group, "name", i->name); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
484 g_free (group); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
485 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
486 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
487 g_list_free (langs); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
488 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
489 features = g_hash_table_get_values (c->features); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
490 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
491 GList *feature; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
492 gchar **string_list; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
493 gint i; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
494 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
495 i = g_list_length (features); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
496 string_list = g_new (gchar*, i + 1); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
497 i = 0; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
498 for (feature=features; feature; feature=feature->next) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
499 string_list[i] = g_strdup(feature->data); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
500 ++i; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
501 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
502 string_list[i] = NULL; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
503 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
504 g_key_file_set_string_list (key_file, "features", "features", |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
505 (const gchar**)string_list, i); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
506 g_strfreev (string_list); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
507 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
508 g_list_free (features); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
509 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
510 forms = g_hash_table_get_keys(c->forms); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
511 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
512 dataform *d; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
513 GList *form, *fields; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
514 gchar *group; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
515 for (form=forms; form; form=form->next) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
516 d = g_hash_table_lookup (c->forms, form->data); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
517 group = g_strdup_printf ("form_%s", (gchar *)form->data); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
518 fields = g_hash_table_get_keys(d->fields); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
519 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
520 GList *field; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
521 GList *values; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
522 for (field=fields; field; field=field->next) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
523 values = g_hash_table_lookup (d->fields, field->data); |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
524 { |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
525 GList *value; |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
526 gchar **string_list; |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
527 gint i; |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
528 i = g_list_length (values); |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
529 string_list = g_new (gchar*, i + 1); |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
530 i = 0; |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
531 for (value=values; value; value=value->next) { |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
532 string_list[i] = g_strdup(value->data); |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
533 ++i; |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
534 } |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
535 string_list[i] = NULL; |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
536 |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
537 g_key_file_set_string_list (key_file, group, field->data, |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
538 (const gchar**)string_list, i); |
2064 | 539 |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
540 g_strfreev (string_list); |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
541 } |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
542 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
543 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
544 g_list_free(fields); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
545 g_free (group); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
546 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
547 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
548 g_list_free (forms); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
549 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
550 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
551 gchar *data; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
552 gsize length; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
553 data = g_key_file_to_data (key_file, &length, NULL); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
554 write (fd, data, length); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
555 g_free(data); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
556 close (fd); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
557 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
558 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
559 g_key_file_free(key_file); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
560 caps_copy_exists: |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
561 g_free(file); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
562 caps_copy_return: |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
563 return; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
564 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
565 |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
566 /* Restore capabilities from GKeyFile. Hash is not verified afterwards */ |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
567 gboolean caps_restore_from_persistent (const char* hash) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
568 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
569 gchar *file; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
570 GKeyFile *key_file; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
571 gchar **groups, **group; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
572 gboolean restored = FALSE; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
573 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
574 file = caps_get_filename (hash); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
575 if (!file) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
576 goto caps_restore_no_file; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
577 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
578 key_file = g_key_file_new (); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
579 if (!g_key_file_load_from_file (key_file, file, G_KEY_FILE_NONE, NULL)) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
580 goto caps_restore_bad_file; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
581 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
582 caps_add(hash); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
583 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
584 groups = g_key_file_get_groups (key_file, NULL); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
585 for (group = groups; *group; ++group) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
586 if (!g_strcmp0(*group, "features")) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
587 gchar **features, **feature; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
588 features = g_key_file_get_string_list (key_file, *group, "features", |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
589 NULL, NULL); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
590 for (feature = features; *feature; ++feature) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
591 caps_add_feature(hash, *feature); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
592 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
593 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
594 g_strfreev (features); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
595 } else if (g_str_has_prefix (*group, "identity_")) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
596 gchar *category, *type, *name, *lang; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
597 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
598 category = g_key_file_get_string(key_file, *group, "category", NULL); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
599 type = g_key_file_get_string(key_file, *group, "type", NULL); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
600 name = g_key_file_get_string(key_file, *group, "name", NULL); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
601 lang = *group + 9; /* "identity_" */ |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
602 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
603 caps_add_identity(hash, category, name, type, lang); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
604 g_free(category); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
605 g_free(type); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
606 g_free(name); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
607 } else if (g_str_has_prefix (*group, "form_")) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
608 gchar *formtype; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
609 gchar **fields, **field; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
610 formtype = *group + 5; /* "form_" */ |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
611 caps_add_dataform (hash, formtype); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
612 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
613 fields = g_key_file_get_keys(key_file, *group, NULL, NULL); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
614 for (field = fields; *field; ++field) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
615 gchar **values, **value; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
616 values = g_key_file_get_string_list (key_file, *group, *field, |
2001
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
617 NULL, NULL); |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
618 for (value = values; *value; ++value) { |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
619 caps_add_dataform_field (hash, formtype, *field, *value); |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
620 } |
76d7c5721210
Remove dependency on newer glib. Caps.c comments, whitespace cleanup.
Hermitifier
parents:
1999
diff
changeset
|
621 g_strfreev (values); |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
622 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
623 g_strfreev (fields); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
624 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
625 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
626 g_strfreev(groups); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
627 restored = TRUE; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
628 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
629 caps_restore_bad_file: |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
630 g_key_file_free (key_file); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
631 g_free (file); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
632 caps_restore_no_file: |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
633 return restored; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
634 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1877
diff
changeset
|
635 |
1811 | 636 /* vim: set expandtab cindent cinoptions=>2\:2(0 sw=2 ts=2: For Vim users... */ |