gnunet_chat_message.c (3737B)
1 /* 2 This file is part of GNUnet. 3 Copyright (C) 2021--2026 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_message.c 23 */ 24 25 #include "gnunet_chat_message.h" 26 #include "gnunet_chat_context.h" 27 28 #include <gnunet/gnunet_messenger_service.h> 29 30 struct GNUNET_CHAT_Message* 31 message_create_from_msg (struct GNUNET_CHAT_Context *context, 32 const struct GNUNET_HashCode *hash, 33 enum GNUNET_MESSENGER_MessageFlags flags, 34 const struct GNUNET_MESSENGER_Message *msg) 35 { 36 GNUNET_assert((context) && (hash) && (msg)); 37 38 struct GNUNET_CHAT_Message *message = GNUNET_new(struct GNUNET_CHAT_Message); 39 40 message->account = NULL; 41 message->context = context; 42 message->task = NULL; 43 44 GNUNET_memcpy(&(message->hash), hash, sizeof(message->hash)); 45 message->flags = flags; 46 message->flag = GNUNET_CHAT_FLAG_NONE; 47 48 message->warning_buffer = NULL; 49 50 message->msg = msg; 51 message->user_pointer = NULL; 52 53 return message; 54 } 55 56 struct GNUNET_CHAT_Message* 57 message_create_internally (struct GNUNET_CHAT_Account *account, 58 struct GNUNET_CHAT_Context *context, 59 enum GNUNET_CHAT_MessageFlag flag, 60 const char *warning, 61 enum GNUNET_GenericReturnValue async_warning) 62 { 63 struct GNUNET_CHAT_Message *message = GNUNET_new(struct GNUNET_CHAT_Message); 64 65 message->account = account; 66 message->context = context; 67 message->task = NULL; 68 69 memset(&(message->hash), 0, sizeof(message->hash)); 70 message->flags = GNUNET_MESSENGER_FLAG_PRIVATE; 71 message->flag = flag; 72 73 if (GNUNET_YES == async_warning) 74 message->warning_buffer = warning? GNUNET_strdup(warning) : NULL; 75 else 76 message->warning_buffer = NULL; 77 78 message->warning = GNUNET_YES == async_warning? message->warning_buffer : warning; 79 message->user_pointer = NULL; 80 81 return message; 82 } 83 84 enum GNUNET_GenericReturnValue 85 message_has_msg (const struct GNUNET_CHAT_Message* message) 86 { 87 GNUNET_assert(message); 88 89 if (message->flag != GNUNET_CHAT_FLAG_NONE) 90 return GNUNET_NO; 91 92 if (message->msg) 93 return GNUNET_YES; 94 else 95 return GNUNET_NO; 96 } 97 98 void 99 message_update_msg (struct GNUNET_CHAT_Message* message, 100 enum GNUNET_MESSENGER_MessageFlags flags, 101 const struct GNUNET_MESSENGER_Message *msg) 102 { 103 GNUNET_assert((message) && (msg)); 104 105 if ((GNUNET_YES != message_has_msg(message)) || 106 (message->flags & GNUNET_MESSENGER_FLAG_DELETE)) 107 return; 108 109 if (flags & GNUNET_MESSENGER_FLAG_UPDATE) 110 message->msg = msg; 111 else if (flags & GNUNET_MESSENGER_FLAG_DELETE) 112 context_delete_message(message->context, message); 113 else 114 return; 115 116 message->flags = flags | GNUNET_MESSENGER_FLAG_UPDATE; 117 } 118 119 void 120 message_destroy (struct GNUNET_CHAT_Message* message) 121 { 122 GNUNET_assert(message); 123 124 if (message->task) 125 GNUNET_SCHEDULER_cancel(message->task); 126 127 if (message->warning_buffer) 128 GNUNET_free(message->warning_buffer); 129 130 GNUNET_free(message); 131 }