GNUnet  0.11.x
gnunet-service-messenger_message_state.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2020--2021 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  */
27 
28 void
30 {
31  GNUNET_assert(state);
32 
34 }
35 
36 void
38 {
39  GNUNET_assert(state);
40 
42 }
43 
44 void
46  struct GNUNET_HashCode *hash)
47 {
48  GNUNET_assert((state) && (hash));
49 
50  if (state->last_messages.head)
51  GNUNET_memcpy(hash, &(state->last_messages.head->hash), sizeof(*hash));
52  else
53  memset (hash, 0, sizeof(*hash));
54 }
55 
56 const struct GNUNET_HashCode*
58 {
59  GNUNET_assert(state);
60 
61  if (state->last_messages.head == state->last_messages.tail)
62  return NULL;
63 
64  return &(state->last_messages.tail->hash);
65 }
66 
67 void
69  const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
70 {
71  GNUNET_assert((state) && (message) && (hash));
72 
73  if ((GNUNET_YES == requested) ||
74  (GNUNET_MESSENGER_KIND_INFO == message->header.kind) ||
76  return;
77 
78  if (GNUNET_MESSENGER_KIND_MERGE == message->header.kind)
81 
82  add_to_list_messages (&(state->last_messages), hash);
83 }
84 
85 void
87 {
88  GNUNET_assert((state) && (path));
89 
90  char *last_messages_file;
91  GNUNET_asprintf (&last_messages_file, "%s%s", path, "last_messages.list");
92 
93  load_list_messages(&(state->last_messages), last_messages_file);
94  GNUNET_free(last_messages_file);
95 }
96 
97 void
98 save_message_state (const struct GNUNET_MESSENGER_MessageState *state, const char *path)
99 {
100  GNUNET_assert((state) && (path));
101 
102  char *last_messages_file;
103  GNUNET_asprintf (&last_messages_file, "%s%s", path, "last_messages.list");
104 
105  save_list_messages(&(state->last_messages), last_messages_file);
106  GNUNET_free(last_messages_file);
107 }
108 
109 
struct GNUNET_MESSENGER_MessageHeader header
Header.
struct GNUNET_MESSENGER_ListMessage * head
void init_message_state(struct GNUNET_MESSENGER_MessageState *state)
void load_message_state(struct GNUNET_MESSENGER_MessageState *state, const char *path)
void save_message_state(const struct GNUNET_MESSENGER_MessageState *state, const char *path)
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
const struct GNUNET_HashCode * get_message_state_merge_hash(const struct GNUNET_MESSENGER_MessageState *state)
void init_list_messages(struct GNUNET_MESSENGER_ListMessages *messages)
Initializes list of message hashes as empty list.
enum State state
current state of profiling
struct GNUNET_HashCode previous
The hash of a second previous message.
void add_to_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const struct GNUNET_HashCode *hash)
Adds a specific hash from a message to the end of the list.
struct GNUNET_MESSENGER_MessageBody body
Body.
void load_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const char *path)
Loads the list of message hashes from a file under a given path.
struct GNUNET_MESSENGER_MessageMerge merge
struct GNUNET_MESSENGER_ListMessages last_messages
A 512-bit hashcode.
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
void clear_message_state(struct GNUNET_MESSENGER_MessageState *state)
struct GNUNET_HashCode previous
The hash of the previous message from the senders perspective.
void remove_from_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const struct GNUNET_HashCode *hash)
Removes the first entry with a matching hash from the list.
struct GNUNET_MESSENGER_ListMessage * tail
void clear_list_messages(struct GNUNET_MESSENGER_ListMessages *messages)
Clears the list of message hashes.
void get_message_state_chain_hash(const struct GNUNET_MESSENGER_MessageState *state, struct GNUNET_HashCode *hash)
void save_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const char *path)
Saves the list of message hashes to a file under a given path.
void update_message_state(struct GNUNET_MESSENGER_MessageState *state, int requested, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
#define GNUNET_free(ptr)
Wrapper around free.
enum GNUNET_MESSENGER_MessageKind kind
The kind of the message.