messages.h 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. *
  4. * OBEX Server
  5. *
  6. * Copyright (C) 2010-2011 Nokia Corporation
  7. *
  8. *
  9. */
  10. #include <glib.h>
  11. #include <stdint.h>
  12. /* Those are used by backend to notify transport plugin which properties did it
  13. * send.
  14. */
  15. #define PMASK_SUBJECT 0x0001
  16. #define PMASK_DATETIME 0x0002
  17. #define PMASK_SENDER_NAME 0x0004
  18. #define PMASK_SENDER_ADDRESSING 0x0008
  19. #define PMASK_RECIPIENT_NAME 0x0010
  20. #define PMASK_RECIPIENT_ADDRESSING 0x0020
  21. #define PMASK_TYPE 0x0040
  22. #define PMASK_SIZE 0x0080
  23. #define PMASK_RECEPTION_STATUS 0x0100
  24. #define PMASK_TEXT 0x0200
  25. #define PMASK_ATTACHMENT_SIZE 0x0400
  26. #define PMASK_PRIORITY 0x0800
  27. #define PMASK_READ 0x1000
  28. #define PMASK_SENT 0x2000
  29. #define PMASK_PROTECTED 0x4000
  30. #define PMASK_REPLYTO_ADDRESSING 0x8000
  31. /* This one is used in a response to GetMessagesListing. Use PMASK_* values to
  32. * notify the plugin which members are actually set. Backend shall not omit
  33. * properties required by MAP specification (subject, datetime,
  34. * recipient_addressing, type, size, reception_status, attachment_size) unless
  35. * ordered by PARAMETERMASK. Boolean values should be probably
  36. * always sent (need checking). Handle is mandatory. Plugin will filter out any
  37. * properties that were not wanted by MCE.
  38. *
  39. * Handle shall be set to hexadecimal representation with upper-case letters. No
  40. * prefix shall be appended and without no zeros. This corresponds to PTS
  41. * behaviour described in comments to the MAP specification.
  42. *
  43. * The rest of char * fields shall be set according to the MAP specification
  44. * rules.
  45. */
  46. struct messages_message {
  47. uint32_t mask;
  48. char *handle;
  49. char *subject;
  50. char *datetime;
  51. char *sender_name;
  52. char *sender_addressing;
  53. char *replyto_addressing;
  54. char *recipient_name;
  55. char *recipient_addressing;
  56. char *type;
  57. char *reception_status;
  58. char *size;
  59. char *attachment_size;
  60. gboolean text;
  61. gboolean read;
  62. gboolean sent;
  63. gboolean protect;
  64. gboolean priority;
  65. };
  66. /* Type of message event to be delivered to MNS server */
  67. enum messages_event_type {
  68. MET_NEW_MESSAGE,
  69. MET_DELIVERY_SUCCESS,
  70. MET_SENDING_SUCCESS,
  71. MET_DELIVERY_FAILURE,
  72. MET_SENDING_FAILURE,
  73. MET_MEMORY_FULL,
  74. MET_MEMORY_AVAILABLE,
  75. MET_MESSAGE_DELETED,
  76. MET_MESSAGE_SHIFT
  77. };
  78. /* Data for sending MNS notification. Handle shall be formatted as described in
  79. * messages_message.
  80. */
  81. struct messages_event {
  82. enum messages_event_type type;
  83. uint8_t instance_id;
  84. char *handle;
  85. char *folder;
  86. char *old_folder;
  87. char *msg_type;
  88. };
  89. /* parameter_mask: |-ed PMASK_* values
  90. * See MAP specification for the rest.
  91. */
  92. struct messages_filter {
  93. uint32_t parameter_mask;
  94. uint8_t type;
  95. const char *period_begin;
  96. const char *period_end;
  97. uint8_t read_status;
  98. const char *recipient;
  99. const char *originator;
  100. uint8_t priority;
  101. };
  102. /* This is called once after server starts.
  103. *
  104. * Returns value less than zero if error. This will prevent MAP plugin from
  105. * starting.
  106. */
  107. int messages_init(void);
  108. /* This gets called right before server finishes
  109. */
  110. void messages_exit(void);
  111. /* Starts a new MAP session.
  112. *
  113. * session: variable to store pointer to backend session data. This one shall be
  114. * passed to all in-session calls.
  115. *
  116. * If session start succeeded, backend shall return 0. Otherwise the error value
  117. * will be sent as a response to OBEX connect.
  118. */
  119. int messages_connect(void **session);
  120. /* Closes a MAP session.
  121. *
  122. * This call should free buffer reserved by messages_connect.
  123. */
  124. void messages_disconnect(void *session);
  125. /******************************************************************************
  126. * NOTE on callbacks.
  127. *
  128. * All functions requiring callbacks have to call them asynchronously.
  129. * 'user_data' is for passing arbitrary user data.
  130. *
  131. * Functions for GetMessagesListing, GetFolder listing and GetMessage call their
  132. * callbacks multiple times - one for each listing entry or message body chunk.
  133. * To indicate the end of operation backend must call callback with the data
  134. * pointer parameter set to NULL.
  135. *
  136. * If err == -EAGAIN the transport * plugin does not wake IO.
  137. *
  138. * Keep in mind that application parameters has to be send first. Therefore the
  139. * first time err == 0 and thus sending is started, callback will use provided
  140. * parameters (e.g. size in case of folder listing) to build applications
  141. * parameters header used in response. In any other case those parameters will
  142. * be ignored.
  143. *
  144. * If err != 0 && err != -EAGAIN, the operation is finished immediately and err
  145. * value is used to set the error code in OBEX response.
  146. ******************************************************************************/
  147. /* Registers for messaging events notifications.
  148. *
  149. * session: Backend session.
  150. * send_event: Function that will be called to indicate a new event.
  151. *
  152. * To unregister currently registered notifications, call this with send_event
  153. * set to NULL.
  154. */
  155. int messages_set_notification_registration(void *session,
  156. void (*send_event)(void *session,
  157. const struct messages_event *event, void *user_data),
  158. void *user_data);
  159. /* Changes current directory.
  160. *
  161. * session: Backend session.
  162. * name: Subdirectory to go to. If empty or null and cdup is false, go to the
  163. * root directory.
  164. * cdup: If true, go up one level first.
  165. */
  166. int messages_set_folder(void *session, const char *name, gboolean cdup);
  167. /* Retrieves subdirectories listing from a current directory.
  168. *
  169. * session: Backend session.
  170. * name: Optional subdirectory name (not strictly required by MAP).
  171. * max: Maximum number of entries to retrieve.
  172. * offset: Offset of the first entry.
  173. * size: Total size of listing to be returned.
  174. *
  175. * Callback shall be called for every entry of the listing. 'name' is the
  176. * subdirectory name.
  177. */
  178. typedef void (*messages_folder_listing_cb)(void *session, int err,
  179. uint16_t size, const char *name, void *user_data);
  180. int messages_get_folder_listing(void *session, const char *name, uint16_t max,
  181. uint16_t offset,
  182. messages_folder_listing_cb callback,
  183. void *user_data);
  184. /* Retrieves messages listing from a current directory.
  185. *
  186. * session: Backend session.
  187. * name: Optional subdirectory name.
  188. * max: Maximum number of entries to retrieve.
  189. * offset: Offset of the first entry.
  190. * subject_len: Maximum string length of the "subject" parameter in the entries.
  191. * filter: Filter to apply on returned message listing.
  192. * size: Total size of listing to be returned.
  193. * newmsg: Indicates presence of unread messages.
  194. *
  195. * Callback shall be called for every entry of the listing, giving message data
  196. * in 'message'.
  197. */
  198. typedef void (*messages_get_messages_listing_cb)(void *session, int err,
  199. uint16_t size, gboolean newmsg,
  200. const struct messages_message *message,
  201. void *user_data);
  202. int messages_get_messages_listing(void *session, const char *name,
  203. uint16_t max, uint16_t offset,
  204. uint8_t subject_len,
  205. const struct messages_filter *filter,
  206. messages_get_messages_listing_cb callback,
  207. void *user_data);
  208. #define MESSAGES_ATTACHMENT (1 << 0)
  209. #define MESSAGES_UTF8 (1 << 1)
  210. #define MESSAGES_FRACTION (1 << 2)
  211. #define MESSAGES_NEXT (1 << 3)
  212. /* Retrieves bMessage object (see MAP specification, ch. 3.1.3) of a given
  213. * message.
  214. *
  215. * session: Backend session.
  216. * handle: Handle of the message to retrieve.
  217. * flags: or-ed mask of following:
  218. * MESSAGES_ATTACHMENT: Selects whether or not attachments (if any) are to
  219. * be included.
  220. * MESSAGES_UTF8: If true, convert message to utf-8. Otherwise use native
  221. * encoding.
  222. * MESSAGES_FRACTION: If true, deliver fractioned message.
  223. * MESSAGES_NEXT: If fraction is true this indicates whether to retrieve
  224. * first fraction
  225. * or the next one.
  226. * fmore: Indicates whether next fraction is available.
  227. * chunk: chunk of bMessage body
  228. *
  229. * Callback allows for returning bMessage in chunks.
  230. */
  231. typedef void (*messages_get_message_cb)(void *session, int err, gboolean fmore,
  232. const char *chunk, void *user_data);
  233. int messages_get_message(void *session, const char *handle,
  234. unsigned long flags,
  235. messages_get_message_cb callback,
  236. void *user_data);
  237. typedef void (*messages_status_cb)(void *session, int err, void *user_data);
  238. /* Informs Message Server to Update Inbox via network.
  239. *
  240. * session: Backend session.
  241. * user_data: User data if any to be sent.
  242. * Callback shall be called for every update inbox request received from MCE.
  243. */
  244. int messages_update_inbox(void *session, messages_status_cb callback,
  245. void *user_data);
  246. /* Informs Message Server to modify read status of a given message.
  247. *
  248. * session: Backend session.
  249. * handle: Unique identifier to the message.
  250. * value: Indicates the new value of the read status for a given message.
  251. * Callback shall be called for every read status update request
  252. * recieved from MCE.
  253. * user_data: User data if any to be sent.
  254. */
  255. int messages_set_read(void *session, const char *handle, uint8_t value,
  256. messages_status_cb callback, void *user_data);
  257. /* Informs Message Server to modify delete status of a given message.
  258. *
  259. * session: Backend session.
  260. * handle: Unique identifier to the message.
  261. * value: Indicates the new value of the delete status for a given message.
  262. * Callback shall be called for every delete status update request
  263. * recieved from MCE.
  264. * user_data: User data if any to be sent.
  265. */
  266. int messages_set_delete(void *session, const char *handle, uint8_t value,
  267. messages_status_cb callback, void *user_data);
  268. /* Aborts currently pending request.
  269. *
  270. * session: Backend session.
  271. */
  272. void messages_abort(void *session);