aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/intel/mm-broadband-modem-xmm7360-rpc.h
blob: 18d107bc1011aa9608cae09f1ec1deb69572763b (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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details:
 *
 * Copyright (C) 2024 Thomas Vogt
 */

#ifndef MM_BROADBAND_MODEM_XMM7360_RPC_H
#define MM_BROADBAND_MODEM_XMM7360_RPC_H

#include <gio/gio.h>

#include "mm-broadband-modem-xmm7360.h"
#include "mm-port-serial-xmmrpc-xmm7360.h"

typedef enum {
    MM_BROADBAND_MODEM_XMM7360_RPC_RESPONSE_PROCESSOR_RESULT_CONTINUE,
    MM_BROADBAND_MODEM_XMM7360_RPC_RESPONSE_PROCESSOR_RESULT_SUCCESS,
    MM_BROADBAND_MODEM_XMM7360_RPC_RESPONSE_PROCESSOR_RESULT_FAILURE,
} MMBroadbandModemXmm7360RpcResponseProcessorResult;

/*
 * SUCCESS must be returned when the operation is to be considered successful,
 * and a result may be given.
 *
 * FAILURE must be returned when a GError is propagated into result_error,
 * which will be treated as a critical error and therefore the operation will be aborted.
 *
 * CONTINUE must be returned when no result_error is given and
 * the operation should go on with the next scheduled command.
 *
 * This setup, therefore allows:
 *  - Running a single command and processing its result.
 *  - Running a set of N commands out of M (N<M), where the global result is
 *    obtained without having executed all configured commands.
 */
typedef MMBroadbandModemXmm7360RpcResponseProcessorResult (* MMBroadbandModemXmm7360RpcResponseProcessor) (
    MMBroadbandModemXmm7360 *self,
    Xmm7360RpcResponse      *response,
    gboolean                 last_command,
    const GError            *error,
    GError                 **result_error);

/* Struct to configure XMMRPC command operations */
typedef struct {
    /* The RCP command's call ID */
    Xmm7360RpcCallId callid;
    /* Async or sync type RCP command */
    gboolean is_async;
    /* payload */
    const Xmm7360RpcMsgArg *body;
    /* Timeout of the command, in seconds */
    guint timeout;
    /* Flag to allow cached replies */
    gboolean allow_cached;
    /* The response processor */
    MMBroadbandModemXmm7360RpcResponseProcessor response_processor;
    /* Time to wait before sending this command (in seconds) */
    guint wait_seconds;
} MMBroadbandModemXmm7360RpcCommand;

/* Generic RPC sequence handling, using the first XMMRPC port available and without
 * explicit cancellations. */
void mm_broadband_modem_xmm7360_rpc_sequence (
    MMBroadbandModemXmm7360 *self,
    const MMBroadbandModemXmm7360RpcCommand *sequence,
    GAsyncReadyCallback callback,
    gpointer user_data);
Xmm7360RpcResponse *mm_broadband_modem_xmm7360_rpc_sequence_finish (
    MMBroadbandModemXmm7360 *self,
    GAsyncResult *res,
    GError **error);

/* Fully detailed RPC sequence handling, when specific XMMRPC port and/or explicit
 * cancellations need to be used. */
void mm_broadband_modem_xmm7360_rpc_sequence_full (
    MMBroadbandModemXmm7360 *self,
    MMPortSerialXmmrpcXmm7360 *port,
    const MMBroadbandModemXmm7360RpcCommand *sequence,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);
Xmm7360RpcResponse *mm_broadband_modem_xmm7360_rpc_sequence_full_finish (
    MMBroadbandModemXmm7360 *self,
    GAsyncResult *res,
    GError **error);

/* Common helper response processors */

/*
 * Response processor for commands that are treated as MANDATORY, where a
 * failure in the command triggers a failure in the sequence.
 */
MMBroadbandModemXmm7360RpcResponseProcessorResult mm_broadband_modem_xmm7360_rpc_response_processor_final (
    MMBroadbandModemXmm7360   *self,
    Xmm7360RpcResponse        *response,
    gboolean                   last_command,
    const GError              *error,
    GError                   **result_error);

/*
 * Response processor for commands that are treated as MANDATORY, where a
 * failure in the command triggers a failure in the sequence. If successful,
 * it will run the next command in the sequence.
 *
 * E.g. used when we provide a list of commands and we want to run all of
 * them successfully, and fail the sequence if one of them fails.
 */
MMBroadbandModemXmm7360RpcResponseProcessorResult mm_broadband_modem_xmm7360_rpc_response_processor_continue_on_success (
    MMBroadbandModemXmm7360   *self,
    Xmm7360RpcResponse        *response,
    gboolean                   last_command,
    const GError              *error,
    GError                   **result_error);

/*
 * Response processor for commands that are treated as OPTIONAL, where a
 * failure in the command doesn't trigger a failure in the sequence. If
 * successful, it finishes the sequence.
 *
 * E.g. used when we provide a list of commands and we want to stop
 * as soon as one of them doesn't fail.
 */
MMBroadbandModemXmm7360RpcResponseProcessorResult mm_broadband_modem_xmm7360_rpc_response_processor_continue_on_error (
    MMBroadbandModemXmm7360   *self,
    Xmm7360RpcResponse        *response,
    gboolean                   last_command,
    const GError              *error,
    GError                   **result_error);

/* Generic RPC command handling, using the best XMMRPC port available and without
 * explicit cancellations. */
void mm_broadband_modem_xmm7360_rpc_command (
    MMBroadbandModemXmm7360 *self,
    Xmm7360RpcCallId callid,
    gboolean is_async,
    GByteArray *body,
    guint timeout,
    gboolean allow_cached,
    GAsyncReadyCallback callback,
    gpointer user_data);
Xmm7360RpcResponse *mm_broadband_modem_xmm7360_rpc_command_finish (
    MMBroadbandModemXmm7360 *self,
    GAsyncResult *res,
    GError **error);

/* Fully detailed RPC command handling, when specific XMMRPC port and/or explicit
 * cancellations need to be used. */
void mm_broadband_modem_xmm7360_rpc_command_full (
    MMBroadbandModemXmm7360 *self,
    MMPortSerialXmmrpcXmm7360 *port,
    Xmm7360RpcCallId callid,
    gboolean is_async,
    GByteArray *body,
    guint timeout,
    gboolean allow_cached,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);
Xmm7360RpcResponse *mm_broadband_modem_xmm7360_rpc_command_full_finish (
    MMBroadbandModemXmm7360 *self,
    GAsyncResult *res,
    GError **error);

#endif /* MM_BROADBAND_MODEM_XMM7360_RPC_H */