mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-12-14 14:34:34 +08:00
e24161f526
This removes duplicated code.
310 lines
10 KiB
C
310 lines
10 KiB
C
/*
|
|
*
|
|
* OBEX Server
|
|
*
|
|
* Copyright (C) 2010-2011 Nokia Corporation
|
|
*
|
|
*
|
|
* 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.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*/
|
|
|
|
#include <glib.h>
|
|
#include <stdint.h>
|
|
|
|
/* Those are used by backend to notify transport plugin which properties did it
|
|
* send.
|
|
*/
|
|
#define PMASK_SUBJECT 0x0001
|
|
#define PMASK_DATETIME 0x0002
|
|
#define PMASK_SENDER_NAME 0x0004
|
|
#define PMASK_SENDER_ADDRESSING 0x0008
|
|
#define PMASK_RECIPIENT_NAME 0x0010
|
|
#define PMASK_RECIPIENT_ADDRESSING 0x0020
|
|
#define PMASK_TYPE 0x0040
|
|
#define PMASK_SIZE 0x0080
|
|
#define PMASK_RECEPTION_STATUS 0x0100
|
|
#define PMASK_TEXT 0x0200
|
|
#define PMASK_ATTACHMENT_SIZE 0x0400
|
|
#define PMASK_PRIORITY 0x0800
|
|
#define PMASK_READ 0x1000
|
|
#define PMASK_SENT 0x2000
|
|
#define PMASK_PROTECTED 0x4000
|
|
#define PMASK_REPLYTO_ADDRESSING 0x8000
|
|
|
|
/* This one is used in a response to GetMessagesListing. Use PMASK_* values to
|
|
* notify the plugin which members are actually set. Backend shall not omit
|
|
* properties required by MAP specification (subject, datetime,
|
|
* recipient_addressing, type, size, reception_status, attachment_size) unless
|
|
* ordered by PARAMETERMASK. Boolean values should be probably
|
|
* always sent (need checking). Handle is mandatory. Plugin will filter out any
|
|
* properties that were not wanted by MCE.
|
|
*
|
|
* Handle shall be set to hexadecimal representation with upper-case letters. No
|
|
* prefix shall be appended and without no zeros. This corresponds to PTS
|
|
* behaviour described in comments to the MAP specification.
|
|
*
|
|
* The rest of char * fields shall be set according to the MAP specification
|
|
* rules.
|
|
*/
|
|
struct messages_message {
|
|
uint32_t mask;
|
|
char *handle;
|
|
char *subject;
|
|
char *datetime;
|
|
char *sender_name;
|
|
char *sender_addressing;
|
|
char *replyto_addressing;
|
|
char *recipient_name;
|
|
char *recipient_addressing;
|
|
char *type;
|
|
char *reception_status;
|
|
char *size;
|
|
char *attachment_size;
|
|
gboolean text;
|
|
gboolean read;
|
|
gboolean sent;
|
|
gboolean protect;
|
|
gboolean priority;
|
|
};
|
|
|
|
/* Type of message event to be delivered to MNS server */
|
|
enum messages_event_type {
|
|
MET_NEW_MESSAGE,
|
|
MET_DELIVERY_SUCCESS,
|
|
MET_SENDING_SUCCESS,
|
|
MET_DELIVERY_FAILURE,
|
|
MET_SENDING_FAILURE,
|
|
MET_MEMORY_FULL,
|
|
MET_MEMORY_AVAILABLE,
|
|
MET_MESSAGE_DELETED,
|
|
MET_MESSAGE_SHIFT
|
|
};
|
|
|
|
/* Data for sending MNS notification. Handle shall be formatted as described in
|
|
* messages_message.
|
|
*/
|
|
struct messages_event {
|
|
enum messages_event_type type;
|
|
uint8_t instance_id;
|
|
char *handle;
|
|
char *folder;
|
|
char *old_folder;
|
|
char *msg_type;
|
|
};
|
|
|
|
/* parameter_mask: |-ed PMASK_* values
|
|
* See MAP specification for the rest.
|
|
*/
|
|
struct messages_filter {
|
|
uint32_t parameter_mask;
|
|
uint8_t type;
|
|
const char *period_begin;
|
|
const char *period_end;
|
|
uint8_t read_status;
|
|
const char *recipient;
|
|
const char *originator;
|
|
uint8_t priority;
|
|
};
|
|
|
|
/* This is called once after server starts.
|
|
*
|
|
* Returns value less than zero if error. This will prevent MAP plugin from
|
|
* starting.
|
|
*/
|
|
int messages_init(void);
|
|
|
|
/* This gets called right before server finishes
|
|
*/
|
|
void messages_exit(void);
|
|
|
|
/* Starts a new MAP session.
|
|
*
|
|
* session: variable to store pointer to backend session data. This one shall be
|
|
* passed to all in-session calls.
|
|
*
|
|
* If session start succeeded, backend shall return 0. Otherwise the error value
|
|
* will be sent as a response to OBEX connect.
|
|
*/
|
|
int messages_connect(void **session);
|
|
|
|
/* Closes a MAP session.
|
|
*
|
|
* This call should free buffer reserved by messages_connect.
|
|
*/
|
|
void messages_disconnect(void *session);
|
|
|
|
/******************************************************************************
|
|
* NOTE on callbacks.
|
|
*
|
|
* All functions requiring callbacks have to call them asynchronously.
|
|
* 'user_data' is for passing arbitrary user data.
|
|
*
|
|
* Functions for GetMessagesListing, GetFolder listing and GetMessage call their
|
|
* callbacks multiple times - one for each listing entry or message body chunk.
|
|
* To indicate the end of operation backend must call callback with the data
|
|
* pointer parameter set to NULL.
|
|
*
|
|
* If err == -EAGAIN the transport * plugin does not wake IO.
|
|
*
|
|
* Keep in mind that application parameters has to be send first. Therefore the
|
|
* first time err == 0 and thus sending is started, callback will use provided
|
|
* parameters (e.g. size in case of folder listing) to build applications
|
|
* parameters header used in response. In any other case those parameters will
|
|
* be ignored.
|
|
*
|
|
* If err != 0 && err != -EAGAIN, the operation is finished immediately and err
|
|
* value is used to set the error code in OBEX response.
|
|
******************************************************************************/
|
|
|
|
/* Registers for messaging events notifications.
|
|
*
|
|
* session: Backend session.
|
|
* send_event: Function that will be called to indicate a new event.
|
|
*
|
|
* To unregister currently registered notifications, call this with send_event
|
|
* set to NULL.
|
|
*/
|
|
int messages_set_notification_registration(void *session,
|
|
void (*send_event)(void *session,
|
|
const struct messages_event *event, void *user_data),
|
|
void *user_data);
|
|
|
|
/* Changes current directory.
|
|
*
|
|
* session: Backend session.
|
|
* name: Subdirectory to go to. If empty or null and cdup is false, go to the
|
|
* root directory.
|
|
* cdup: If true, go up one level first.
|
|
*/
|
|
int messages_set_folder(void *session, const char *name, gboolean cdup);
|
|
|
|
/* Retrieves subdirectories listing from a current directory.
|
|
*
|
|
* session: Backend session.
|
|
* name: Optional subdirectory name (not strictly required by MAP).
|
|
* max: Maximum number of entries to retrieve.
|
|
* offset: Offset of the first entry.
|
|
* size: Total size of listing to be returned.
|
|
*
|
|
* Callback shall be called for every entry of the listing. 'name' is the
|
|
* subdirectory name.
|
|
*/
|
|
typedef void (*messages_folder_listing_cb)(void *session, int err,
|
|
uint16_t size, const char *name, void *user_data);
|
|
|
|
int messages_get_folder_listing(void *session, const char *name, uint16_t max,
|
|
uint16_t offset,
|
|
messages_folder_listing_cb callback,
|
|
void *user_data);
|
|
|
|
/* Retrieves messages listing from a current directory.
|
|
*
|
|
* session: Backend session.
|
|
* name: Optional subdirectory name.
|
|
* max: Maximum number of entries to retrieve.
|
|
* offset: Offset of the first entry.
|
|
* subject_len: Maximum string length of the "subject" parameter in the entries.
|
|
* filter: Filter to apply on returned message listing.
|
|
* size: Total size of listing to be returned.
|
|
* newmsg: Indicates presence of unread messages.
|
|
*
|
|
* Callback shall be called for every entry of the listing, giving message data
|
|
* in 'message'.
|
|
*/
|
|
typedef void (*messages_get_messages_listing_cb)(void *session, int err,
|
|
uint16_t size, gboolean newmsg,
|
|
const struct messages_message *message,
|
|
void *user_data);
|
|
|
|
int messages_get_messages_listing(void *session, const char *name,
|
|
uint16_t max, uint16_t offset,
|
|
uint8_t subject_len,
|
|
const struct messages_filter *filter,
|
|
messages_get_messages_listing_cb callback,
|
|
void *user_data);
|
|
|
|
#define MESSAGES_ATTACHMENT (1 << 0)
|
|
#define MESSAGES_UTF8 (1 << 1)
|
|
#define MESSAGES_FRACTION (1 << 2)
|
|
#define MESSAGES_NEXT (1 << 3)
|
|
|
|
/* Retrieves bMessage object (see MAP specification, ch. 3.1.3) of a given
|
|
* message.
|
|
*
|
|
* session: Backend session.
|
|
* handle: Handle of the message to retrieve.
|
|
* flags: or-ed mask of following:
|
|
* MESSAGES_ATTACHMENT: Selects whether or not attachments (if any) are to
|
|
* be included.
|
|
* MESSAGES_UTF8: If true, convert message to utf-8. Otherwise use native
|
|
* encoding.
|
|
* MESSAGES_FRACTION: If true, deliver fractioned message.
|
|
* MESSAGES_NEXT: If fraction is true this indicates whether to retrieve
|
|
* first fraction
|
|
* or the next one.
|
|
* fmore: Indicates whether next fraction is available.
|
|
* chunk: chunk of bMessage body
|
|
*
|
|
* Callback allows for returning bMessage in chunks.
|
|
*/
|
|
typedef void (*messages_get_message_cb)(void *session, int err, gboolean fmore,
|
|
const char *chunk, void *user_data);
|
|
|
|
int messages_get_message(void *session, const char *handle,
|
|
unsigned long flags,
|
|
messages_get_message_cb callback,
|
|
void *user_data);
|
|
|
|
typedef void (*messages_status_cb)(void *session, int err, void *user_data);
|
|
|
|
/* Informs Message Server to Update Inbox via network.
|
|
*
|
|
* session: Backend session.
|
|
* user_data: User data if any to be sent.
|
|
* Callback shall be called for every update inbox request received from MCE.
|
|
*/
|
|
int messages_update_inbox(void *session, messages_status_cb callback,
|
|
void *user_data);
|
|
/* Informs Message Server to modify read status of a given message.
|
|
*
|
|
* session: Backend session.
|
|
* handle: Unique identifier to the message.
|
|
* value: Indicates the new value of the read status for a given message.
|
|
* Callback shall be called for every read status update request
|
|
* recieved from MCE.
|
|
* user_data: User data if any to be sent.
|
|
*/
|
|
int messages_set_read(void *session, const char *handle, uint8_t value,
|
|
messages_status_cb callback, void *user_data);
|
|
|
|
/* Informs Message Server to modify delete status of a given message.
|
|
*
|
|
* session: Backend session.
|
|
* handle: Unique identifier to the message.
|
|
* value: Indicates the new value of the delete status for a given message.
|
|
* Callback shall be called for every delete status update request
|
|
* recieved from MCE.
|
|
* user_data: User data if any to be sent.
|
|
*/
|
|
int messages_set_delete(void *session, const char *handle, uint8_t value,
|
|
messages_status_cb callback, void *user_data);
|
|
|
|
/* Aborts currently pending request.
|
|
*
|
|
* session: Backend session.
|
|
*/
|
|
void messages_abort(void *session);
|