aboutsummaryrefslogtreecommitdiff
path: root/src/gnunet_chat_handle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gnunet_chat_handle.c')
-rw-r--r--src/gnunet_chat_handle.c170
1 files changed, 170 insertions, 0 deletions
diff --git a/src/gnunet_chat_handle.c b/src/gnunet_chat_handle.c
new file mode 100644
index 0000000..888dc65
--- /dev/null
+++ b/src/gnunet_chat_handle.c
@@ -0,0 +1,170 @@
1/*
2 * @author Tobias Frisch
3 * @file gnunet_chat_handle.c
4 */
5
6#include "gnunet_chat_lib.h"
7#include "gnunet_chat_handle.h"
8#include "gnunet_chat_group.h"
9
10static void handle_arm_connection(void* cls, int connected) {
11 struct GNUNET_CHAT_Handle *handle = cls;
12
13 if (GNUNET_YES == connected) {
14 GNUNET_ARM_request_service_start(handle->handles.arm, "messenger", GNUNET_OS_INHERIT_STD_NONE, NULL, NULL);
15 GNUNET_ARM_request_service_start(handle->handles.arm, "fs", GNUNET_OS_INHERIT_STD_NONE, NULL, NULL);
16 } else {
17 GNUNET_ARM_request_service_start(handle->handles.arm, "arm", GNUNET_OS_INHERIT_STD_NONE, NULL, NULL);
18 }
19}
20
21
22struct GNUNET_CHAT_Handle*
23GNUNET_CHAT_start (const struct GNUNET_CONFIGURATION_Handle* cfg,
24 const char *name) {
25 if (!cfg)
26 return NULL;
27
28 struct GNUNET_CHAT_Handle *handle = GNUNET_new(struct GNUNET_CHAT_Handle);
29 memset(handle, 0, sizeof(*handle));
30 handle->cfg = cfg;
31
32 handle->handles.arm = GNUNET_ARM_connect(cfg, &handle_arm_connection, handle);
33
34 if (handle->handles.arm)
35 handle_arm_connection(handle, GNUNET_NO);
36
37 handle->handles.messenger = GNUNET_MESSENGER_connect(
38 cfg, name, NULL, NULL, NULL, NULL //TODO
39 );
40
41 if (!handle->handles.messenger)
42 {
43 GNUNET_CHAT_stop(handle);
44 return NULL;
45 }
46
47 handle->handles.fs = GNUNET_FS_start(
48 cfg,
49 NULL, //TODO
50 NULL,
51 GNUNET_FS_FLAGS_NONE,
52 GNUNET_FS_OPTIONS_END
53 );
54
55 handle->contacts = GNUNET_CONTAINER_multihashmap_create(8, GNUNET_NO);
56 handle->groups = GNUNET_CONTAINER_multihashmap_create(8, GNUNET_NO);
57
58 return handle;
59}
60
61void
62GNUNET_CHAT_stop (struct GNUNET_CHAT_Handle *handle)
63{
64 if (!handle)
65 return;
66
67 if (handle->handles.fs)
68 {
69 // TODO: stop each action
70
71 GNUNET_FS_stop(handle->handles.fs);
72 handle->handles.fs = NULL;
73 }
74
75 if (handle->handles.messenger)
76 {
77 // TODO: stop everything related
78
79 GNUNET_MESSENGER_disconnect(handle->handles.messenger);
80 handle->handles.messenger = NULL;
81 }
82
83 if (handle->groups)
84 {
85 // TODO: destroy each
86
87 GNUNET_CONTAINER_multihashmap_destroy(handle->groups);
88 handle->groups = NULL;
89 }
90
91 if (handle->contacts)
92 {
93 // TODO: destroy each
94
95 GNUNET_CONTAINER_multihashmap_destroy(handle->contacts);
96 handle->contacts = NULL;
97 }
98
99 if (handle->handles.arm)
100 {
101 //TODO: stop started services?
102
103 GNUNET_ARM_disconnect(handle->handles.arm);
104 handle->handles.arm = NULL;
105 }
106
107 GNUNET_free(handle);
108}
109
110int
111GNUNET_CHAT_update (struct GNUNET_CHAT_Handle *handle)
112{
113 if (!handle)
114 return GNUNET_SYSERR;
115
116 return GNUNET_MESSENGER_update(handle->handles.messenger);
117}
118
119int
120GNUNET_CHAT_set_name (struct GNUNET_CHAT_Handle *handle,
121 const char *name)
122{
123 if (!handle)
124 return GNUNET_SYSERR;
125
126 return GNUNET_MESSENGER_set_name(handle, name);
127}
128
129const char*
130GNUNET_CHAT_get_name (const struct GNUNET_CHAT_Handle *handle)
131{
132 if (!handle)
133 return GNUNET_SYSERR;
134
135 return GNUNET_MESSENGER_get_name(handle->handles.messenger);
136}
137
138const struct GNUNET_IDENTITY_PublicKey*
139GNUNET_CHAT_get_key (const struct GNUNET_CHAT_Handle *handle)
140{
141 if (!handle)
142 return GNUNET_SYSERR;
143
144 return GNUNET_MESSENGER_get_key(handle->handles.messenger);
145}
146
147int
148GNUNET_CHAT_iterate_contacts (struct GNUNET_CHAT_Handle *handle,
149 GNUNET_CHAT_ContactCallback callback,
150 void *cls)
151{
152 return GNUNET_SYSERR;
153}
154
155struct GNUNET_CHAT_Group*
156GNUNET_CHAT_group_create (struct GNUNET_CHAT_Handle *handle)
157{
158 if (!handle)
159 return NULL;
160
161 return group_create(handle);
162}
163
164int
165GNUNET_CHAT_iterate_groups (struct GNUNET_CHAT_Handle *handle,
166 GNUNET_CHAT_GroupCallback callback,
167 void *cls)
168{
169 return GNUNET_SYSERR;
170}