/
mms_handler.h
285 lines (243 loc) · 9.75 KB
/
mms_handler.h
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
/*
* Copyright (C) 2013-2017 Jolla Ltd.
* Contact: Slava Monich <slava.monich@jolla.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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.
*/
#ifndef JOLLA_MMS_HANDLER_H
#define JOLLA_MMS_HANDLER_H
#include "mms_message.h"
/* Receive state */
typedef enum _mms_receive_state {
MMS_RECEIVE_STATE_INVALID = -1,
MMS_RECEIVE_STATE_RECEIVING,
MMS_RECEIVE_STATE_DEFERRED,
MMS_RECEIVE_STATE_NOSPACE,
MMS_RECEIVE_STATE_DECODING,
MMS_RECEIVE_STATE_DOWNLOAD_ERROR,
MMS_RECEIVE_STATE_DECODING_ERROR
} MMS_RECEIVE_STATE;
/* Send state */
typedef enum _mms_send_state {
MMS_SEND_STATE_INVALID = -1,
MMS_SEND_STATE_ENCODING,
MMS_SEND_STATE_TOO_BIG,
MMS_SEND_STATE_SENDING,
MMS_SEND_STATE_DEFERRED,
MMS_SEND_STATE_NO_SPACE,
MMS_SEND_STATE_SEND_ERROR,
MMS_SEND_STATE_REFUSED
} MMS_SEND_STATE;
/* Delivery status */
typedef enum _mms_delivery_status {
MMS_DELIVERY_STATUS_INVALID = -1,
MMS_DELIVERY_STATUS_UNKNOWN,
MMS_DELIVERY_STATUS_EXPIRED,
MMS_DELIVERY_STATUS_RETRIEVED,
MMS_DELIVERY_STATUS_REJECTED,
MMS_DELIVERY_STATUS_DEFERRED,
MMS_DELIVERY_STATUS_UNRECOGNISED,
MMS_DELIVERY_STATUS_FORWARDED,
MMS_DELIVERY_STATUS_UNREACHABLE
} MMS_DELIVERY_STATUS;
/* Read status */
typedef MMSReadStatus MMS_READ_STATUS;
/* Read report status */
typedef enum _mms_read_report_status {
MMS_READ_REPORT_STATUS_INVALID = -1,
MMS_READ_REPORT_STATUS_OK,
MMS_READ_REPORT_STATUS_IO_ERROR,
MMS_READ_REPORT_STATUS_PERMANENT_ERROR
} MMS_READ_REPORT_STATUS;
/* Handler event callback */
typedef void
(*mms_handler_event_fn)(
MMSHandler* handler,
void* param);
/* Asynchronous incoming message notification. Non-empty message id means
* that we start download the message immediately, empty string means that
* download is postponed, NULL id means that an error has occured. */
typedef struct mms_handler_message_notify_call MMSHandlerMessageNotifyCall;
typedef void
(*mms_handler_message_notify_complete_fn)(
MMSHandlerMessageNotifyCall* call,
const char* id,
void* param);
/* Asynchronous message received notification. Note that the files associated
* with MMSMessage must not be deleted until after the call completes. The
* call context is carrying a reference to MMSMessage with it, that should
* take care of it even if the caller drops its reference immediately after
* submitting the call. */
typedef struct mms_handler_message_received_call MMSHandlerMessageReceivedCall;
typedef void
(*mms_handler_message_received_complete_fn)(
MMSHandlerMessageReceivedCall* call,
MMSMessage* msg,
gboolean ok,
void* param);
/* Instance */
struct mms_handler {
GObject object;
int busy;
};
/* Class */
typedef struct mms_handler_class {
GObjectClass parent;
/* New incoming message notification (cancellable) */
MMSHandlerMessageNotifyCall* (*fn_message_notify)(
MMSHandler* handler, /* Handler instance */
const char* imsi, /* Subscriber identity */
const char* from, /* Sender's phone number */
const char* subject, /* Subject (optional) */
time_t expiry, /* Message expiry time */
GBytes* push, /* Raw push message */
const char* location, /* Download URL */
mms_handler_message_notify_complete_fn cb,
void* param);
void (*fn_message_notify_cancel)(
MMSHandler* handler,
MMSHandlerMessageNotifyCall* call);
/* Message has been successfully received (cancellable) */
MMSHandlerMessageReceivedCall* (*fn_message_received)(
MMSHandler* handler, /* Handler instance */
MMSMessage* msg, /* Decoded message */
mms_handler_message_received_complete_fn cb,
void* param);
void (*fn_message_received_cancel)(
MMSHandler* handler,
MMSHandlerMessageReceivedCall* call);
/* Sets the receive state */
gboolean (*fn_message_receive_state_changed)(
MMSHandler* handler, /* Handler instance */
const char* id, /* Handler record id */
MMS_RECEIVE_STATE state); /* Receive state */
/* Sets the send state */
gboolean (*fn_message_send_state_changed)(
MMSHandler* handler, /* Handler instance */
const char* id, /* Handler record id */
MMS_SEND_STATE state, /* Receive state */
const char* details); /* Optional details */
/* Message has been sent */
gboolean (*fn_message_sent)(
MMSHandler* handler, /* Handler instance */
const char* id, /* Handler record id */
const char* msgid); /* Message id assigned by operator */
/* Delivery report has been received */
gboolean (*fn_delivery_report)(
MMSHandler* handler, /* Handler instance */
const char* imsi, /* Subscriber identity */
const char* msgid, /* Message id assigned by operator */
const char* recipient, /* Recipient's phone number */
MMS_DELIVERY_STATUS ds); /* Delivery status */
/* Read report has been received */
gboolean (*fn_read_report)(
MMSHandler* handler, /* Handler instance */
const char* imsi, /* Subscriber identity */
const char* msgid, /* Message id assigned by operator */
const char* recipient, /* Recipient's phone number */
MMS_READ_STATUS rs); /* Read status */
/* Done with sending MMS read report */
gboolean (*fn_read_report_send_status)(
MMSHandler* handler, /* Handler instance */
const char* id, /* Handler record id */
MMS_READ_REPORT_STATUS s); /* Status */
} MMSHandlerClass;
GType mms_handler_get_type(void);
#define MMS_TYPE_HANDLER (mms_handler_get_type())
MMSHandler*
mms_handler_ref(
MMSHandler* handler);
void
mms_handler_unref(
MMSHandler* handler);
MMSHandlerMessageNotifyCall*
mms_handler_message_notify(
MMSHandler* handler, /* Handler instance */
const char* imsi, /* Subscriber identity */
const char* from, /* Sender's phone number */
const char* subject, /* Subject (optional) */
time_t expiry, /* Message expiry time */
GBytes* push, /* Raw push message */
const char* location, /* Download URL */
mms_handler_message_notify_complete_fn cb,
void* param);
void
mms_handler_message_notify_cancel(
MMSHandler* handler,
MMSHandlerMessageNotifyCall* call);
MMSHandlerMessageReceivedCall*
mms_handler_message_received(
MMSHandler* handler, /* Handler instance */
MMSMessage* msg, /* Decoded message */
mms_handler_message_received_complete_fn cb,
void* param);
void
mms_handler_message_received_cancel(
MMSHandler* handler,
MMSHandlerMessageReceivedCall* call);
gboolean
mms_handler_message_receive_state_changed(
MMSHandler* handler, /* Handler instance */
const char* id, /* Handler record id */
MMS_RECEIVE_STATE state); /* Receive state */
gboolean
mms_handler_message_send_state_changed(
MMSHandler* handler, /* Handler instance */
const char* id, /* Handler record id */
MMS_SEND_STATE state, /* Receive state */
const char* details); /* Optional details */
gboolean
mms_handler_message_sent(
MMSHandler* handler, /* Handler instance */
const char* id, /* Handler record id */
const char* msgid); /* Message id assigned by operator */
gboolean
mms_handler_delivery_report(
MMSHandler* handler, /* Handler instance */
const char* imsi, /* Subscriber identity */
const char* msgid, /* Message id assigned by operator */
const char* recipient, /* Recipient's phone number */
MMS_DELIVERY_STATUS ds); /* Delivery status */
gboolean
mms_handler_read_report(
MMSHandler* handler, /* Handler instance */
const char* imsi, /* Subscriber identity */
const char* msgid, /* Message id assigned by operator */
const char* recipient, /* Recipient's phone number */
MMS_READ_STATUS rs); /* Read status */
gboolean
mms_handler_read_report_send_status(
MMSHandler* handler, /* Handler instance */
const char* id, /* Handler record id */
MMS_READ_REPORT_STATUS status); /* Status */
void
mms_handler_busy_update(
MMSHandler* handler, /* Handler instance */
int change); /* Normally +1 or -1 */
gulong
mms_handler_add_done_callback(
MMSHandler* handler, /* Handler instance */
mms_handler_event_fn fn, /* Callback function */
void* param); /* Callback parameter */
void
mms_handler_remove_callback(
MMSHandler* handler, /* Handler instance */
gulong handler_id); /* Idenfies the callback to remove */
#define mms_handler_busy(handler) ((handler) && ((handler)->busy > 0))
#define mms_handler_busy_inc(handler) mms_handler_busy_update(handler,1)
#define mms_handler_busy_dec(handler) mms_handler_busy_update(handler,-1)
#endif /* JOLLA_MMS_HANDLER_H */
/*
* Local Variables:
* mode: C
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*/