client.h revision a5a0a25a2aa6c85e1bbf0f281d515b45018e190e
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch#ifndef __CLIENT_H
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch#define __CLIENT_H
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch#include "imap-parser.h"
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch#include "mail-storage.h"
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstruct client;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschtypedef int (*client_command_func_t)(struct client *client);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstruct client {
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch int socket;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch struct io *io;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch struct istream *input;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch struct ostream *output;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch struct mail_storage *storage;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch struct mailbox *mailbox;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch unsigned int select_counter; /* increased when mailbox is changed */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch time_t last_input;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch unsigned int bad_counter;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch struct imap_parser *parser;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch const char *cmd_tag; /* tag of command (allocated from parser pool), */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch const char *cmd_name; /* command name (allocated from parser pool) */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch client_command_func_t cmd_func;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch unsigned int cmd_error:1;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch unsigned int cmd_uid:1; /* used UID command */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch unsigned int sync_flags_send_uid:1;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch unsigned int rawlog:1;
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch unsigned int input_skip_line:1; /* skip all the data until we've
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch found a new line */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch};
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch/* Create new client with specified input/output handles. socket specifies
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch if the handle is a socket. */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschstruct client *client_create(int hin, int hout, struct mail_storage *storage);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid client_destroy(struct client *client);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch/* Disconnect client connection */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid client_disconnect(struct client *client);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch/* Send a line of data to client */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid client_send_line(struct client *client, const char *data);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch/* Send line of data to client, prefixed with client->tag */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid client_send_tagline(struct client *client, const char *data);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch/* Send BAD command error to client. msg can be NULL. */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid client_send_command_error(struct client *client, const char *msg);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch/* Read a number of arguments. Returns TRUE if everything was read or
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch FALSE if either needs more data or error occured. */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschint client_read_args(struct client *client, unsigned int count,
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch unsigned int flags, struct imap_arg **args);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch/* Reads a number of string arguments. ... is a list of pointers where to
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch store the arguments. */
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschint client_read_string_args(struct client *client, unsigned int count, ...);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid clients_init(void);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Boschvoid clients_deinit(void);
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch#endif
56dd928c164ec5c0d1158a1760154b58c5f1f6e7Stephan Bosch