aboutsummaryrefslogtreecommitdiff
path: root/src/internal/gnunet_chat_accounts.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal/gnunet_chat_accounts.c')
-rw-r--r--src/internal/gnunet_chat_accounts.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/internal/gnunet_chat_accounts.c b/src/internal/gnunet_chat_accounts.c
new file mode 100644
index 0000000..9d055e1
--- /dev/null
+++ b/src/internal/gnunet_chat_accounts.c
@@ -0,0 +1,114 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2024 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20/*
21 * @author Tobias Frisch
22 * @file gnunet_chat_accounts.c
23 */
24
25#include "gnunet_chat_accounts.h"
26
27#include "../gnunet_chat_handle.h"
28
29#include <gnunet/gnunet_common.h>
30
31struct GNUNET_CHAT_InternalAccounts*
32internal_accounts_create(struct GNUNET_CHAT_Handle *handle,
33 struct GNUNET_CHAT_Account *account)
34{
35 GNUNET_assert(handle);
36
37 struct GNUNET_CHAT_InternalAccounts *accounts = GNUNET_new(
38 struct GNUNET_CHAT_InternalAccounts
39 );
40
41 if (!accounts)
42 return NULL;
43
44 accounts->handle = handle;
45 accounts->account = account;
46
47 accounts->identifier = NULL;
48 accounts->op = NULL;
49 accounts->method = GNUNET_CHAT_ACCOUNT_NONE;
50
51 GNUNET_CONTAINER_DLL_insert(
52 accounts->handle->accounts_head,
53 accounts->handle->accounts_tail,
54 accounts
55 );
56
57 return accounts;
58}
59
60void
61internal_accounts_destroy(struct GNUNET_CHAT_InternalAccounts *accounts)
62{
63 GNUNET_assert((accounts) && (accounts->handle));
64
65 GNUNET_CONTAINER_DLL_remove(
66 accounts->handle->accounts_head,
67 accounts->handle->accounts_tail,
68 accounts
69 );
70
71 if (accounts->identifier)
72 GNUNET_free(accounts->identifier);
73
74 if (accounts->op)
75 GNUNET_IDENTITY_cancel(accounts->op);
76
77 GNUNET_free(accounts);
78}
79
80void
81internal_accounts_start_method(struct GNUNET_CHAT_InternalAccounts *accounts,
82 enum GNUNET_CHAT_AccountMethod method,
83 const char *identifier)
84{
85 GNUNET_assert(
86 (accounts) &&
87 (GNUNET_CHAT_ACCOUNT_NONE == accounts->method) &&
88 (!(accounts->identifier)) &&
89 (!(accounts->op))
90 );
91
92 accounts->identifier = identifier ? GNUNET_strdup(identifier) : NULL;
93 accounts->method = method;
94}
95
96void
97internal_accounts_stop_method(struct GNUNET_CHAT_InternalAccounts *accounts)
98{
99 GNUNET_assert(accounts);
100
101 if (accounts->identifier)
102 {
103 GNUNET_free(accounts->identifier);
104 accounts->identifier = NULL;
105 }
106
107 if (accounts->op)
108 {
109 GNUNET_IDENTITY_cancel(accounts->op);
110 accounts->op = NULL;
111 }
112
113 accounts->method = GNUNET_CHAT_ACCOUNT_NONE;
114}