summaryrefslogtreecommitdiff
path: root/src/messenger/gnunet-service-messenger_operation.h
blob: f1e06f4a79f5b77910e64effc058fd403abf37f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
   This file is part of GNUnet.
   Copyright (C) 2021 GNUnet e.V.

   GNUnet is free software: you can redistribute it and/or modify it
   under the terms of the GNU Affero General Public License as published
   by the Free Software Foundation, either version 3 of the License,
   or (at your option) any later version.

   GNUnet is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Affero General Public License for more details.

   You should have received a copy of the GNU Affero General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.

   SPDX-License-Identifier: AGPL3.0-or-later
 */
/**
 * @author Tobias Frisch
 * @file src/messenger/gnunet-service-messenger_operation.h
 * @brief GNUnet MESSENGER service
 */

#ifndef GNUNET_SERVICE_MESSENGER_OPERATION_H
#define GNUNET_SERVICE_MESSENGER_OPERATION_H

#include "platform.h"
#include "gnunet_configuration_lib.h"
#include "gnunet_crypto_lib.h"
#include "gnunet_scheduler_lib.h"
#include "gnunet_strings_lib.h"
#include "gnunet_time_lib.h"

enum GNUNET_MESSENGER_OperationType
{
  GNUNET_MESSENGER_OP_REQUEST = 1,
  GNUNET_MESSENGER_OP_DELETE = 2,
  GNUNET_MESSENGER_OP_MERGE = 3,

  GNUNET_MESSENGER_OP_UNKNOWN = 0
};

struct GNUNET_MESSENGER_OperationStore;

struct GNUNET_MESSENGER_Operation
{
  enum GNUNET_MESSENGER_OperationType type;

  struct GNUNET_HashCode hash;
  struct GNUNET_TIME_Absolute timestamp;

  struct GNUNET_MESSENGER_OperationStore *store;
  struct GNUNET_SCHEDULER_Task* task;
};

/**
 * Creates and allocates a new operation under a given <i>hash</i>.
 *
 * @param[in] hash Hash of message
 */
struct GNUNET_MESSENGER_Operation*
create_operation (const struct GNUNET_HashCode *hash);

/**
 * Destroys an operation and frees its memory fully.
 *
 * @param[in/out] op Operation
 */
void
destroy_operation (struct GNUNET_MESSENGER_Operation *op);

/**
 * Loads data from a configuration file at a selected <i>path</i> into
 * a new allocated and created operation for a specific operation
 * <i>store</i> if the required information could be read successfully.
 *
 * The method will return the new operation and it will be started
 * automatically to match its timestamp of execution.
 *
 * If the method fails to restore any valid operation from the file,
 * NULL gets returned instead.
 *
 * @param[in/out] store Operation store
 * @param[in] path Path of a configuration file
 */
struct GNUNET_MESSENGER_Operation*
load_operation (struct GNUNET_MESSENGER_OperationStore *store, const char *path);

/**
 * Saves data from an <i>operation</i> into a configuration file at a
 * selected <i>path</i> which can be load to restore the operation
 * completely and continue its process.
 *
 * @param[in] op Operation
 * @param[in] path Path of a configuration file
 */
void
save_operation (const struct GNUNET_MESSENGER_Operation *op, const char *path);

/**
 * Starts an inactive operation with a given <i>delay</i> in a
 * specific operation <i>store</i>. The method will replace the
 * operations type to process it correctly. An operation can't be
 * started twice, it has to be stopped or fully processed first.
 *
 * @param[in/out] op Operation
 * @param[in] type Type of operation
 * @param[in/out] store Operation store
 * @param[in] delay Delay
 * @return #GNUNET_OK on success, otherwise #GNUNET_SYSERR
 */
int
start_operation (struct GNUNET_MESSENGER_Operation *op,
                 enum GNUNET_MESSENGER_OperationType type,
                 struct GNUNET_MESSENGER_OperationStore *store,
                 struct GNUNET_TIME_Relative delay);

/**
 * Stops an active operation and resets its type to be
 * #GNUNET_MESSENGER_OP_UNKNOWN.
 *
 * @return #GNUNET_OK on success, otherwise #GNUNET_SYSERR
 */
int
stop_operation (struct GNUNET_MESSENGER_Operation *op);

#endif //GNUNET_SERVICE_MESSENGER_OPERATION_H