aboutsummaryrefslogtreecommitdiff
path: root/src/gnunet_chat_group.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gnunet_chat_group.c')
-rw-r--r--src/gnunet_chat_group.c93
1 files changed, 89 insertions, 4 deletions
diff --git a/src/gnunet_chat_group.c b/src/gnunet_chat_group.c
index 0355dd5..a2aab29 100644
--- a/src/gnunet_chat_group.c
+++ b/src/gnunet_chat_group.c
@@ -23,6 +23,7 @@
23 */ 23 */
24 24
25#include "gnunet_chat_group.h" 25#include "gnunet_chat_group.h"
26#include "gnunet_chat_util.h"
26 27
27#include "gnunet_chat_group_intern.c" 28#include "gnunet_chat_group_intern.c"
28 29
@@ -63,14 +64,98 @@ group_destroy (struct GNUNET_CHAT_Group* group)
63void 64void
64group_publish (struct GNUNET_CHAT_Group* group) 65group_publish (struct GNUNET_CHAT_Group* group)
65{ 66{
67 char* topic = NULL;
68 GNUNET_asprintf (
69 &topic,
70 "GNUNET_CHAT_%s",
71 group->topic
72 );
73
66 group->announcement = GNUNET_REGEX_announce( 74 group->announcement = GNUNET_REGEX_announce(
67 group->handle->cfg, group->topic, // TODO: raw topic? 75 group->handle->cfg, topic,
68 GNUNET_TIME_relative_get_minute_(), // TODO: configure delay? 76 GNUNET_TIME_relative_get_minute_(),
69 1 // TODO: no compression? 77 6
70 ); 78 );
71 79
72 group->search = GNUNET_REGEX_search( 80 group->search = GNUNET_REGEX_search(
73 group->handle->cfg, group->topic, // TODO: raw topic? 81 group->handle->cfg, topic,
74 search_group_by_topic, group 82 search_group_by_topic, group
75 ); 83 );
84
85 GNUNET_free(topic);
86}
87
88void
89group_load_config (struct GNUNET_CHAT_Group *group)
90{
91 const char *directory = group->handle->directory;
92
93 if ((!directory) || (!(group->context)))
94 return;
95
96 const struct GNUNET_HashCode *hash = GNUNET_MESSENGER_room_get_key(
97 group->context->room
98 );
99
100 char* filename;
101 util_get_filename(directory, "groups", hash, &filename);
102
103 if (GNUNET_YES != GNUNET_DISK_file_test(filename))
104 goto free_filename;
105
106 struct GNUNET_CONFIGURATION_Handle *config = GNUNET_CONFIGURATION_create();
107
108 if (GNUNET_OK != GNUNET_CONFIGURATION_load(config, directory))
109 goto destroy_config;
110
111 char* name = NULL;
112
113 if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string(
114 config, "group", "topic", &name))
115 util_set_name_field(name, &(group->topic));
116
117 if (name)
118 GNUNET_free(name);
119
120destroy_config:
121 GNUNET_CONFIGURATION_destroy(config);
122
123free_filename:
124 GNUNET_free(filename);
125}
126
127void
128group_save_config (const struct GNUNET_CHAT_Group *group)
129{
130 const char *directory = group->handle->directory;
131
132 if ((!directory) || (!(group->context)))
133 return;
134
135 const struct GNUNET_HashCode *hash = GNUNET_MESSENGER_room_get_key(
136 group->context->room
137 );
138
139 struct GNUNET_CONFIGURATION_Handle *config = GNUNET_CONFIGURATION_create();
140
141 if (group->topic)
142 {
143 struct GNUNET_HashCode topic_hash;
144 GNUNET_CRYPTO_hash(group->topic, strlen(group->topic), &topic_hash);
145
146 if (0 == GNUNET_memcmp(hash, &topic_hash))
147 GNUNET_CONFIGURATION_set_value_string(
148 config, "group", "topic", group->topic
149 );
150 }
151
152 char* filename;
153 util_get_filename(directory, "groups", hash, &filename);
154
155 if (GNUNET_OK == GNUNET_DISK_directory_create_for_file(filename))
156 GNUNET_CONFIGURATION_write(config, filename);
157
158 GNUNET_CONFIGURATION_destroy(config);
159
160 GNUNET_free(filename);
76} 161}