1 |
/** |
2 |
* metadata.C: Metadata management |
3 |
* |
4 |
* Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team |
5 |
* Rights to this code are as documented in COPYING. |
6 |
*/ |
7 |
|
8 |
#include "atheme.h" |
9 |
#include <account/chanacs.h> |
10 |
#include <account/mychan.h> |
11 |
#include <account/mymemo.h> |
12 |
#include <account/mynick.h> |
13 |
#include <account/myuser.h> |
14 |
#include <account/metadata.h> |
15 |
|
16 |
/******************* |
17 |
* M E T A D A T A * |
18 |
*******************/ |
19 |
|
20 |
has_metadata::callbacks has_metadata::callback; |
21 |
|
22 |
metadata * |
23 |
has_metadata::add_metadata (char const * const name, char const * const value) |
24 |
{ |
25 |
bool is_private = false; |
26 |
char *newname = sstrdup (name); |
27 |
char *newvalue = sstrdup (value); |
28 |
metadata::map_type::iterator it = mdmap.find (newname); |
29 |
|
30 |
callback.metadata_change (this, name, value); |
31 |
if (it != mdmap.end ()) |
32 |
{ |
33 |
metadata *md = it->second; |
34 |
is_private = md->is_private; |
35 |
mdmap.erase (it); |
36 |
delete md; |
37 |
} |
38 |
|
39 |
if (is_private || !strncmp ("private:", name, 8)) |
40 |
is_private = true; |
41 |
|
42 |
return mdmap[newname] = new metadata (newname, newvalue, is_private); |
43 |
} |
44 |
|
45 |
bool |
46 |
has_metadata::del_metadata (char const * const name) |
47 |
{ |
48 |
metadata::map_type::iterator it = mdmap.find (name); |
49 |
|
50 |
callback.metadata_change (this, name, NULL); |
51 |
|
52 |
if (it != mdmap.end ()) |
53 |
{ |
54 |
mdmap.erase (it); |
55 |
delete it->second; |
56 |
return true; |
57 |
} |
58 |
|
59 |
return false; |
60 |
} |
61 |
|
62 |
metadata * |
63 |
has_metadata::find_metadata (char const * const name) |
64 |
{ |
65 |
metadata::map_type::iterator it = mdmap.find (name); |
66 |
if (it != mdmap.end ()) |
67 |
return it->second; |
68 |
|
69 |
return NULL; |
70 |
} |
71 |
|
72 |
void |
73 |
has_metadata::clear_metadata (void) |
74 |
{ |
75 |
metadata::map_type::iterator it = mdmap.begin (); |
76 |
metadata::map_type::iterator et = mdmap.end (); |
77 |
|
78 |
while (it != et) |
79 |
{ |
80 |
callback.metadata_change (this, it->second->key, NULL); |
81 |
delete it->second; |
82 |
++it; |
83 |
} |
84 |
|
85 |
mdmap.clear (); |
86 |
} |