comparison mcabber/mcabber/caps.c @ 2337:ffd0e57e9563

Defined types shall end with "_t"
author franky
date Sun, 12 May 2019 11:32:30 +0200
parents f5402d705f67
children
comparison
equal deleted inserted replaced
2336:0dc317b5599d 2337:ffd0e57e9563
28 28
29 typedef struct { 29 typedef struct {
30 char *category; 30 char *category;
31 char *type; 31 char *type;
32 char *name; 32 char *name;
33 } identity; 33 } identity_t;
34 34
35 typedef struct { 35 typedef struct {
36 GHashTable *fields; 36 GHashTable *fields;
37 } dataform; 37 } dataform_t;
38 38
39 typedef struct { 39 typedef struct {
40 GHashTable *identities; 40 GHashTable *identities;
41 GHashTable *features; 41 GHashTable *features;
42 GHashTable *forms; 42 GHashTable *forms;
43 } caps; 43 } caps_t;
44 44
45 static GHashTable *caps_cache = NULL; 45 static GHashTable *caps_cache = NULL;
46 46
47 void caps_destroy(gpointer data) 47 void caps_destroy(gpointer data)
48 { 48 {
49 caps *c = data; 49 caps_t *c = data;
50 g_hash_table_destroy(c->identities); 50 g_hash_table_destroy(c->identities);
51 g_hash_table_destroy(c->features); 51 g_hash_table_destroy(c->features);
52 g_hash_table_destroy(c->forms); 52 g_hash_table_destroy(c->forms);
53 g_free(c); 53 g_free(c);
54 } 54 }
55 55
56 void identity_destroy(gpointer data) 56 void identity_destroy(gpointer data)
57 { 57 {
58 identity *i = data; 58 identity_t *i = data;
59 g_free(i->category); 59 g_free(i->category);
60 g_free(i->type); 60 g_free(i->type);
61 g_free(i->name); 61 g_free(i->name);
62 g_free(i); 62 g_free(i);
63 } 63 }
64 64
65 void form_destroy(gpointer data) 65 void form_destroy(gpointer data)
66 { 66 {
67 dataform *f = data; 67 dataform_t *f = data;
68 g_hash_table_destroy(f->fields); 68 g_hash_table_destroy(f->fields);
69 g_free(f); 69 g_free(f);
70 } 70 }
71 71
72 void field_destroy(gpointer data) 72 void field_destroy(gpointer data)
93 93
94 void caps_add(const char *hash) 94 void caps_add(const char *hash)
95 { 95 {
96 if (!hash) 96 if (!hash)
97 return; 97 return;
98 caps *c = g_new0(caps, 1); 98 caps_t *c = g_new0(caps_t, 1);
99 c->features = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); 99 c->features = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
100 c->identities = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, identity_destroy); 100 c->identities = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, identity_destroy);
101 c->forms = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, form_destroy); 101 c->forms = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, form_destroy);
102 g_hash_table_replace(caps_cache, g_strdup(hash), c); 102 g_hash_table_replace(caps_cache, g_strdup(hash), c);
103 } 103 }
111 111
112 /* if hash is not verified, this will bind capabilities set only with bare jid */ 112 /* if hash is not verified, this will bind capabilities set only with bare jid */
113 void caps_move_to_local(char *hash, char *bjid) 113 void caps_move_to_local(char *hash, char *bjid)
114 { 114 {
115 char *orig_hash; 115 char *orig_hash;
116 caps *c = NULL; 116 caps_t *c = NULL;
117 if (!hash || !bjid) 117 if (!hash || !bjid)
118 return; 118 return;
119 g_hash_table_lookup_extended(caps_cache, hash, (gpointer*)&orig_hash, (gpointer*)&c); 119 g_hash_table_lookup_extended(caps_cache, hash, (gpointer*)&orig_hash, (gpointer*)&c);
120 if (c) { 120 if (c) {
121 g_hash_table_steal(caps_cache, hash); 121 g_hash_table_steal(caps_cache, hash);
128 } 128 }
129 129
130 /*if bjid is NULL, it will check only verified hashes */ 130 /*if bjid is NULL, it will check only verified hashes */
131 int caps_has_hash(const char *hash, const char *bjid) 131 int caps_has_hash(const char *hash, const char *bjid)
132 { 132 {
133 caps *c = NULL; 133 caps_t *c = NULL;
134 if (!hash) 134 if (!hash)
135 return 0; 135 return 0;
136 c = g_hash_table_lookup(caps_cache, hash); 136 c = g_hash_table_lookup(caps_cache, hash);
137 if (!c && bjid) { 137 if (!c && bjid) {
138 char *key = g_strdup_printf("%s/#%s", bjid, hash); 138 char *key = g_strdup_printf("%s/#%s", bjid, hash);
146 const char *category, 146 const char *category,
147 const char *name, 147 const char *name,
148 const char *type, 148 const char *type,
149 const char *lang) 149 const char *lang)
150 { 150 {
151 caps *c; 151 caps_t *c;
152 if (!hash || !category || !type) 152 if (!hash || !category || !type)
153 return; 153 return;
154 if (!lang) 154 if (!lang)
155 lang = ""; 155 lang = "";
156 156
157 c = g_hash_table_lookup(caps_cache, hash); 157 c = g_hash_table_lookup(caps_cache, hash);
158 if (c) { 158 if (c) {
159 identity *i = g_new0(identity, 1); 159 identity_t *i = g_new0(identity_t, 1);
160 160
161 i->category = g_strdup(category); 161 i->category = g_strdup(category);
162 i->name = g_strdup(name); 162 i->name = g_strdup(name);
163 i->type = g_strdup(type); 163 i->type = g_strdup(type);
164 g_hash_table_replace(c->identities, g_strdup(lang), i); 164 g_hash_table_replace(c->identities, g_strdup(lang), i);
173 caps_add_identity(hash, category, name, type, NULL); 173 caps_add_identity(hash, category, name, type, NULL);
174 } 174 }
175 175
176 void caps_add_dataform(const char *hash, const char *formtype) 176 void caps_add_dataform(const char *hash, const char *formtype)
177 { 177 {
178 caps *c; 178 caps_t *c;
179 if (!formtype) 179 if (!formtype)
180 return; 180 return;
181 c = g_hash_table_lookup(caps_cache, hash); 181 c = g_hash_table_lookup(caps_cache, hash);
182 if (c) { 182 if (c) {
183 dataform *d = g_new0(dataform, 1); 183 dataform_t *d = g_new0(dataform_t, 1);
184 char *f = g_strdup(formtype); 184 char *f = g_strdup(formtype);
185 185
186 d->fields = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, field_destroy); 186 d->fields = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, field_destroy);
187 g_hash_table_replace(c->forms, f, d); 187 g_hash_table_replace(c->forms, f, d);
188 } 188 }
194 } 194 }
195 195
196 void caps_add_dataform_field(const char *hash, const char *formtype, 196 void caps_add_dataform_field(const char *hash, const char *formtype,
197 const char *field, const char *value) 197 const char *field, const char *value)
198 { 198 {
199 caps *c; 199 caps_t *c;
200 if (!formtype || !field || !value) 200 if (!formtype || !field || !value)
201 return; 201 return;
202 c = g_hash_table_lookup(caps_cache, hash); 202 c = g_hash_table_lookup(caps_cache, hash);
203 if (c) { 203 if (c) {
204 dataform *d; 204 dataform_t *d;
205 d = g_hash_table_lookup(c->forms, formtype); 205 d = g_hash_table_lookup(c->forms, formtype);
206 if (d) { 206 if (d) {
207 gpointer key, val; 207 gpointer key, val;
208 char *f; 208 char *f;
209 GList *v = NULL; 209 GList *v = NULL;
219 } 219 }
220 } 220 }
221 221
222 void caps_add_feature(const char *hash, const char *feature) 222 void caps_add_feature(const char *hash, const char *feature)
223 { 223 {
224 caps *c; 224 caps_t *c;
225 if (!hash || !feature) 225 if (!hash || !feature)
226 return; 226 return;
227 c = g_hash_table_lookup(caps_cache, hash); 227 c = g_hash_table_lookup(caps_cache, hash);
228 if (c) { 228 if (c) {
229 char *f = g_strdup(feature); 229 char *f = g_strdup(feature);
234 /* If hash is verified, then bare jid is ignored. 234 /* If hash is verified, then bare jid is ignored.
235 * If there is no globally verified hash, and bare jid is not null, 235 * If there is no globally verified hash, and bare jid is not null,
236 * then local storage for that jid will be checked */ 236 * then local storage for that jid will be checked */
237 int caps_has_feature(const char *hash, char *feature, char *bjid) 237 int caps_has_feature(const char *hash, char *feature, char *bjid)
238 { 238 {
239 caps *c = NULL; 239 caps_t *c = NULL;
240 if (!hash || !feature) 240 if (!hash || !feature)
241 return 0; 241 return 0;
242 c = g_hash_table_lookup(caps_cache, hash); 242 c = g_hash_table_lookup(caps_cache, hash);
243 if (!c && bjid) { 243 if (!c && bjid) {
244 char *key = g_strdup_printf("%s/#%s", bjid, hash); 244 char *key = g_strdup_printf("%s/#%s", bjid, hash);
258 _foreach_function(value, user_data); 258 _foreach_function(value, user_data);
259 } 259 }
260 260
261 void caps_foreach_feature(const char *hash, GFunc func, gpointer user_data) 261 void caps_foreach_feature(const char *hash, GFunc func, gpointer user_data)
262 { 262 {
263 caps *c; 263 caps_t *c;
264 if (!hash) 264 if (!hash)
265 return; 265 return;
266 c = g_hash_table_lookup(caps_cache, hash); 266 c = g_hash_table_lookup(caps_cache, hash);
267 if (!c) 267 if (!c)
268 return; 268 return;
276 GList *features, *langs; 276 GList *features, *langs;
277 GChecksum *sha1; 277 GChecksum *sha1;
278 guint8 digest[20]; 278 guint8 digest[20];
279 gsize digest_size = 20; 279 gsize digest_size = 20;
280 gchar *hash, *old_hash = NULL; 280 gchar *hash, *old_hash = NULL;
281 caps *old_caps, *c; 281 caps_t *old_caps, *c;
282 gpointer key; 282 gpointer key;
283 283
284 if (!g_hash_table_lookup_extended(caps_cache, "", &key, (gpointer *)&c)) 284 if (!g_hash_table_lookup_extended(caps_cache, "", &key, (gpointer *)&c))
285 return NULL; 285 return NULL;
286 286
290 sha1 = g_checksum_new(G_CHECKSUM_SHA1); 290 sha1 = g_checksum_new(G_CHECKSUM_SHA1);
291 291
292 langs = g_hash_table_get_keys(c->identities); 292 langs = g_hash_table_get_keys(c->identities);
293 langs = g_list_sort(langs, _strcmp_sort); 293 langs = g_list_sort(langs, _strcmp_sort);
294 { 294 {
295 identity *i; 295 identity_t *i;
296 GList *lang; 296 GList *lang;
297 char *identity_S; 297 char *identity_S;
298 for (lang=langs; lang; lang=lang->next) { 298 for (lang=langs; lang; lang=lang->next) {
299 i = g_hash_table_lookup(c->identities, lang->data); 299 i = g_hash_table_lookup(c->identities, lang->data);
300 identity_S = g_strdup_printf("%s/%s/%s/%s<", i->category, i->type, 300 identity_S = g_strdup_printf("%s/%s/%s/%s<", i->category, i->type,
334 GChecksum *checksum; 334 GChecksum *checksum;
335 guint8 digest[20]; 335 guint8 digest[20];
336 gsize digest_size = 20; 336 gsize digest_size = 20;
337 gchar *local_hash; 337 gchar *local_hash;
338 gboolean match = FALSE; 338 gboolean match = FALSE;
339 caps *c = g_hash_table_lookup(caps_cache, hash); 339 caps_t *c = g_hash_table_lookup(caps_cache, hash);
340 340
341 if (!g_strcmp0(function, "sha-1")) { 341 if (!g_strcmp0(function, "sha-1")) {
342 checksum = g_checksum_new(G_CHECKSUM_SHA1); 342 checksum = g_checksum_new(G_CHECKSUM_SHA1);
343 } else if (!g_strcmp0(function, "md5")) { 343 } else if (!g_strcmp0(function, "md5")) {
344 checksum = g_checksum_new(G_CHECKSUM_MD5); 344 checksum = g_checksum_new(G_CHECKSUM_MD5);
347 return FALSE; 347 return FALSE;
348 348
349 langs = g_hash_table_get_keys(c->identities); 349 langs = g_hash_table_get_keys(c->identities);
350 langs = g_list_sort(langs, _strcmp_sort); 350 langs = g_list_sort(langs, _strcmp_sort);
351 { 351 {
352 identity *i; 352 identity_t *i;
353 GList *lang; 353 GList *lang;
354 char *identity_S; 354 char *identity_S;
355 for (lang=langs; lang; lang=lang->next) { 355 for (lang=langs; lang; lang=lang->next) {
356 i = g_hash_table_lookup(c->identities, lang->data); 356 i = g_hash_table_lookup(c->identities, lang->data);
357 identity_S = g_strdup_printf("%s/%s/%s/%s<", i->category, i->type, 357 identity_S = g_strdup_printf("%s/%s/%s/%s<", i->category, i->type,
374 g_list_free(features); 374 g_list_free(features);
375 375
376 forms = g_hash_table_get_keys(c->forms); 376 forms = g_hash_table_get_keys(c->forms);
377 forms = g_list_sort(forms, _strcmp_sort); 377 forms = g_list_sort(forms, _strcmp_sort);
378 { 378 {
379 dataform *d; 379 dataform_t *d;
380 GList *form, *fields; 380 GList *form, *fields;
381 for (form=forms; form; form=form->next) { 381 for (form=forms; form; form=form->next) {
382 d = g_hash_table_lookup(c->forms, form->data); 382 d = g_hash_table_lookup(c->forms, form->data);
383 g_checksum_update(checksum, form->data, -1); 383 g_checksum_update(checksum, form->data, -1);
384 g_checksum_update(checksum, (guchar *)"<", -1); 384 g_checksum_update(checksum, (guchar *)"<", -1);
444 void caps_copy_to_persistent(const char* hash, char* xml) 444 void caps_copy_to_persistent(const char* hash, char* xml)
445 { 445 {
446 gchar *file; 446 gchar *file;
447 GList *features, *langs, *forms; 447 GList *features, *langs, *forms;
448 GKeyFile *key_file; 448 GKeyFile *key_file;
449 caps *c; 449 caps_t *c;
450 int fd; 450 int fd;
451 451
452 g_free (xml); 452 g_free (xml);
453 453
454 c = g_hash_table_lookup (caps_cache, hash); 454 c = g_hash_table_lookup (caps_cache, hash);
468 "This is autogenerated file. Please do not modify.", 468 "This is autogenerated file. Please do not modify.",
469 NULL); 469 NULL);
470 470
471 langs = g_hash_table_get_keys (c->identities); 471 langs = g_hash_table_get_keys (c->identities);
472 { 472 {
473 identity *i; 473 identity_t *i;
474 GList *lang; 474 GList *lang;
475 gchar *group; 475 gchar *group;
476 for (lang=langs; lang; lang=lang->next) { 476 for (lang=langs; lang; lang=lang->next) {
477 i = g_hash_table_lookup (c->identities, lang->data); 477 i = g_hash_table_lookup (c->identities, lang->data);
478 group = g_strdup_printf("identity_%s", (gchar *)lang->data); 478 group = g_strdup_printf("identity_%s", (gchar *)lang->data);
505 } 505 }
506 g_list_free (features); 506 g_list_free (features);
507 507
508 forms = g_hash_table_get_keys(c->forms); 508 forms = g_hash_table_get_keys(c->forms);
509 { 509 {
510 dataform *d; 510 dataform_t *d;
511 GList *form, *fields; 511 GList *form, *fields;
512 gchar *group; 512 gchar *group;
513 for (form=forms; form; form=form->next) { 513 for (form=forms; form; form=form->next) {
514 d = g_hash_table_lookup (c->forms, form->data); 514 d = g_hash_table_lookup (c->forms, form->data);
515 group = g_strdup_printf ("form_%s", (gchar *)form->data); 515 group = g_strdup_printf ("form_%s", (gchar *)form->data);