1
0
Fork 0
mbuni/mbuni/mmlib/mms_queue.h

122 lines
4.0 KiB
C

/*
* Mbuni - Open Source MMS Gateway
*
* Queue management functions
*
* Copyright (C) 2003 - 2005, Digital Solutions Ltd. - http://www.dsmagic.com
*
* Paul Bagyenda <bagyenda@dsmagic.com>
*
* This program is free software, distributed under the terms of
* the GNU General Public License, with a few exceptions granted (see LICENSE)
*/
#ifndef _MMS_QUEUE_INCLUDED__
#define _MMS_QUEUE_INCLUDED__
#include "mms_msg.h"
#include "mms_util.h"
#define QFNAMEMAX 32
typedef struct MmsEnvelopeTo {
Octstr *rcpt; /* Recipient address. */
int process; /* 1 if delivery to this recipient should be attempted.
* Flags below for details.
*/
enum {SFailed=0, SSuccess, SDefered, SUnknown} flag;
} MmsEnvelopeTo;
typedef struct MmsEnvelope {
int msgtype; /* type of message. */
Octstr *msgId; /* message id (for reference). */
Octstr *token; /* User level token, may be null. */
Octstr *from; /* from address. */
List *to; /* List of recipients: MmsEnvelopeTo */
Octstr *subject; /* Message subject (if any). */
time_t created; /* date/time this queue entry was made. */
time_t sendt; /* date/time attempt should be made to send this message.*/
time_t lasttry; /* date/time this queue item was last run. */
time_t expiryt; /* date/time when this message expires. */
time_t lastaccess; /* Last fetch of the corresponding data. */
int dlr; /* Whether to send delivery receipts or not. */
long attempts; /* Delivery attempts made so far. */
unsigned long msize; /* Size of message in octets. */
struct {
int billed;
double amt;
} bill; /* Whether this has been billed and how much. */
Octstr *mdata; /* Generic string data used by any interface. */
Octstr *fromproxy; /* Which proxy sent us this message.*/
Octstr *viaproxy; /* Which proxy must we send this message through. */
struct { /* Name of the queue file, pointer to it (locked). DO NOT MUCK WITH THESE! */
char name[QFNAMEMAX]; /* Name of the file. */
char dir[QFNAMEMAX]; /* Directory in which file is .*/
char _pad[16];
int fd;
} qf;
} MmsEnvelope;
/*
* Add a message to the queue, returns 0 on success -1 otherwise (error is logged).
* 'to' is a list of Octstr * *.
* Returns a queue file name.
*/
extern Octstr *mms_queue_add(Octstr *from, List *to, Octstr *msgid,
Octstr *subject,
Octstr *fromproxy, Octstr *viaproxy,
time_t senddate, time_t expirydate, MmsMsg *m, Octstr *token,
int dlr,
char *directory);
/*
* Update queue status. Returns -1 on error, 0 if queue is updated fine and
* envelope is still valid, 1 if envelope is no longer valid (no more recipients.)
*/
extern int mms_queue_update(MmsEnvelope *e);
/*
* Get the message associated with this queue entry.
*/
extern MmsMsg *mms_queue_getdata(MmsEnvelope *e);
/*
* Reads queue, returns up to lim queue entries that are ready for processing. send 0 for no limit.
*/
/*
* Attempt to read an envelope from queue file:
* - opens and locks the file.
* - if the lock succeeds, check that file hasn't changed since opening. If it has
* return NULL (i.e. file is being processed elsewhere -- race condition), otherwise read it.
* - If should block is 1, then does a potentially blocking attempt to lock the file.
*/
MmsEnvelope *mms_queue_readenvelope(char *qf, char *dir, int shouldblock);
/*
* Run the queue in the given directory. For each envelope that is due for sending, call
* deliver(). If deliver() returns 0, then queue_run needs to destroy envelope
* structure it passed to deliver()
* if deliver() returns 1, it has deleted envelope.
* Also if rstop becomes true, queue run must stop.
*/
void mms_queue_run(char *dir,
int (*deliver)(MmsEnvelope *),
double sleepsecs,
int num_threads,
int *rstop);
/* Get rid of memory used by this. */
extern int mms_queue_free_env(MmsEnvelope *e);
#endif