mail-notification

Fork of Jean-Yves Lefort's mail-notification, a tray icon to notify of new mail
git clone https://code.djc.id.au/git/mail-notification/

src/mn-client-session.h (7605B) - raw

      1 /*
      2  * Mail Notification
      3  * Copyright (C) 2003-2008 Jean-Yves Lefort <jylefort@brutele.be>
      4  *
      5  * This program is free software; you can redistribute it and/or modify
      6  * it under the terms of the GNU General Public License as published by
      7  * the Free Software Foundation; either version 3 of the License, or
      8  * (at your option) any later version.
      9  *
     10  * This program is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  * GNU General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU General Public License along
     16  * with this program; if not, write to the Free Software Foundation, Inc.,
     17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
     18  */
     19 
     20 #ifndef _MN_CLIENT_SESSION_H
     21 #define _MN_CLIENT_SESSION_H
     22 
     23 #include <glib.h>
     24 #if WITH_SASL
     25 #include <sasl/sasl.h>
     26 #endif
     27 
     28 typedef struct _MNClientSession MNClientSession;
     29 typedef struct _MNClientSessionPrivate MNClientSessionPrivate;
     30 typedef struct _MNClientSessionResponse MNClientSessionResponse;
     31 
     32 #define MN_CLIENT_SESSION_ERROR		(mn_client_session_error_quark())
     33 
     34 typedef enum
     35 {
     36   MN_CLIENT_SESSION_ERROR_OTHER,
     37   MN_CLIENT_SESSION_ERROR_CONNECTION_LOST
     38 } MNClientSessionError;
     39 
     40 enum
     41 {
     42   /* read the next input line */
     43   MN_CLIENT_SESSION_RESULT_CONTINUE			= -1,
     44   /* signal an uncompliant response and disconnect */
     45   MN_CLIENT_SESSION_RESULT_BAD_RESPONSE_FOR_CONTEXT	= -2,
     46   /* disconnect */
     47   MN_CLIENT_SESSION_RESULT_DISCONNECT			= -3
     48 };
     49 
     50 /*
     51  * In all the session callbacks below, @session is the session which
     52  * is being run, and @private is the opaque data pointer which was
     53  * passed to mn_client_session_run().
     54  */
     55 
     56 typedef struct
     57 {
     58   /*
     59    * The state ID, which must be a positive non-zero integer.
     60    */
     61   unsigned int	id;
     62 
     63   /*
     64    * enter_cb (optional):
     65    *
     66    * Enters the state. If set to %NULL, does nothing and returns
     67    * %MN_CLIENT_SESSION_RESULT_CONTINUE.
     68    *
     69    * Return value: must return a state ID to switch to, or one of the
     70    * MN_CLIENT_SESSION_RESULT_ codes above
     71    */
     72   int		(*enter_cb)	(MNClientSession	  *session,
     73 				 MNClientSessionPrivate	  *private);
     74 
     75   /*
     76    * handle_cb (required):
     77    * @response: the #MNClientSessionResponse returned by the response_new()
     78    *            callback.
     79    *
     80    * Handles a response received while the state is active.
     81    *
     82    * Return value: must return a state ID to switch to, or one of the
     83    * MN_CLIENT_SESSION_RESULT_ codes above
     84    */
     85   int		(*handle_cb)	(MNClientSession	  *session,
     86 				 MNClientSessionResponse  *response,
     87 				 MNClientSessionPrivate	  *private);
     88 } MNClientSessionState;
     89 
     90 /* the state to enter after connecting */
     91 #define MN_CLIENT_SESSION_INITIAL_STATE		1
     92 /* the MNClientSessionState array canary */
     93 #define MN_CLIENT_SESSION_STATES_END		{ 0, NULL, NULL }
     94 
     95 typedef struct
     96 {
     97   /*
     98    * notice (optional):
     99    * @message: the notice message
    100    *
    101    * Handles a notice.
    102    */
    103   void      (*notice)		(MNClientSession	  *session,
    104 				 const char		  *message,
    105 				 MNClientSessionPrivate	  *private);
    106 
    107   /*
    108    * warning (optional):
    109    * @message: the warning message
    110    *
    111    * Handles a warning.
    112    */
    113   void      (*warning)		(MNClientSession	  *session,
    114 				 const char		  *message,
    115 				 MNClientSessionPrivate	  *private);
    116 
    117   /*
    118    * response_new (required):
    119    * @input: an input line received from the server
    120    *
    121    * Parses server input.
    122    *
    123    * Return value: must return an opaque data pointer on success, or
    124    * %NULL on failure
    125    */
    126   MNClientSessionResponse *(*response_new) (MNClientSession         *session,
    127 					    const char              *input,
    128 					    MNClientSessionPrivate  *private);
    129 
    130   /*
    131    * response_free (optional):
    132    * @response: a response that was returned by response_new()
    133    *
    134    * Releases all the memory associated with @response.
    135    */
    136   void      (*response_free)	(MNClientSession	  *session,
    137 				 MNClientSessionResponse  *response,
    138 				 MNClientSessionPrivate   *private);
    139 
    140   /*
    141    * pre_read (optional):
    142    *
    143    * Called before calling read() or one of its variants.
    144    */
    145   void      (*pre_read)		(MNClientSession          *session,
    146 				 MNClientSessionPrivate   *private);
    147 
    148   /*
    149    * post_read (optional):
    150    *
    151    * Called after calling read() or one of its variants.
    152    */
    153   void      (*post_read)	(MNClientSession          *session,
    154 				 MNClientSessionPrivate   *private);
    155 
    156 #if WITH_SASL
    157   /*
    158    * sasl_get_credentials (required if
    159    * mn_client_session_sasl_authentication_start() is needed, optional
    160    * otherwise):
    161    * @username: a pointer to store the username, or %NULL
    162    * @password: a pointer to store the password, or %NULL
    163    *
    164    * Fills in the requested credentials.
    165    *
    166    * Return value: must return %TRUE in case of success, or %FALSE if
    167    * a requested credential cannot be provided (in such case, the SASL
    168    * authentication exchange will be aborted)
    169    */
    170   gboolean  (*sasl_get_credentials)	(MNClientSession	*session,
    171 					 MNClientSessionPrivate	*priv,
    172 					 const char		**username,
    173 					 const char		**password);
    174 #endif /* WITH_SASL */
    175 
    176 #if WITH_SSL
    177   /*
    178    * ssl_trust_server (required if SSL support was compiled in):
    179    *
    180    * Decides whether to trust the given server after SSL verification
    181    * failed. If the server provided a certificate, the @fingerprint
    182    * and @verify_error arguments will be set.
    183    *
    184    * Return value: must return %TRUE if the given server should be trusted.
    185    */
    186   gboolean  (*ssl_trust_server)		(MNClientSession	*session,
    187 					 const char		*server,
    188 					 int			port,
    189 					 const char		*fingerprint,
    190 					 const char		*verify_error,
    191 					 MNClientSessionPrivate	*priv);
    192 #endif /* WITH_SSL */
    193 } MNClientSessionCallbacks;
    194 
    195 gboolean mn_client_session_run (const MNClientSessionState *states,
    196 				const MNClientSessionCallbacks *callbacks,
    197 #if WITH_SSL
    198 				gboolean use_ssl,
    199 #endif
    200 				const char *hostname,
    201 				int port,
    202 				MNClientSessionPrivate *private,
    203 				GError **err);
    204 
    205 gconstpointer mn_client_session_read (MNClientSession *session, unsigned int nbytes);
    206 const char *mn_client_session_read_line (MNClientSession *session);
    207 
    208 int mn_client_session_write (MNClientSession *session,
    209 			     const char *format,
    210 			     ...) G_GNUC_PRINTF(2, 3);
    211 
    212 #if WITH_SSL
    213 gboolean mn_client_session_enable_ssl (MNClientSession *session);
    214 #endif
    215 
    216 #if WITH_SASL
    217 gboolean mn_client_session_sasl_authentication_start (MNClientSession *session,
    218 						      const char *service,
    219 						      GSList *mechanisms,
    220 						      const char *forced_mechanism,
    221 						      const char **used_mechanism,
    222 						      const char **initial_clientout,
    223 						      unsigned int *initial_clientoutlen);
    224 int mn_client_session_sasl_authentication_step (MNClientSession *session,
    225 						const char *input);
    226 gboolean mn_client_session_sasl_authentication_done (MNClientSession *session);
    227 
    228 void mn_client_session_sasl_dispose (MNClientSession *session);
    229 sasl_ssf_t mn_client_session_sasl_get_ssf (MNClientSession *session);
    230 #endif /* WITH_SASL */
    231 
    232 void mn_client_session_notice (MNClientSession *session,
    233 			       const char *format,
    234 			       ...) G_GNUC_PRINTF(2, 3);
    235 void mn_client_session_warning (MNClientSession *session,
    236 				const char *format,
    237 				...) G_GNUC_PRINTF(2, 3);
    238 
    239 int mn_client_session_set_error (MNClientSession *session,
    240 				 int code,
    241 				 const char *format,
    242 				 ...) G_GNUC_PRINTF(3, 4);
    243 int mn_client_session_set_error_from_response (MNClientSession *session,
    244 					       int code,
    245 					       const char *response);
    246 
    247 GQuark mn_client_session_error_quark (void);
    248 
    249 #endif /* _MN_CLIENT_SESSION_H */