Blame src/mw_service.h

Packit 16808d
Packit 16808d
/*
Packit 16808d
  Meanwhile - Unofficial Lotus Sametime Community Client Library
Packit 16808d
  Copyright (C) 2004  Christopher (siege) O'Brien
Packit 16808d
  
Packit 16808d
  This library is free software; you can redistribute it and/or
Packit 16808d
  modify it under the terms of the GNU Library General Public
Packit 16808d
  License as published by the Free Software Foundation; either
Packit 16808d
  version 2 of the License, or (at your option) any later version.
Packit 16808d
  
Packit 16808d
  This library is distributed in the hope that it will be useful,
Packit 16808d
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 16808d
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 16808d
  Library General Public License for more details.
Packit 16808d
  
Packit 16808d
  You should have received a copy of the GNU Library General Public
Packit 16808d
  License along with this library; if not, write to the Free
Packit 16808d
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit 16808d
*/
Packit 16808d
Packit 16808d
#ifndef _MW_SERVICE_H
Packit 16808d
#define _MW_SERVICE_H
Packit 16808d
Packit 16808d
Packit 16808d
#include "mw_common.h"
Packit 16808d
Packit 16808d
Packit 16808d
#ifdef __cplusplus
Packit 16808d
extern "C" {
Packit 16808d
#endif
Packit 16808d
Packit 16808d
Packit 16808d
/* place-holders */
Packit 16808d
struct mwChannel;
Packit 16808d
struct mwService;
Packit 16808d
struct mwSession;
Packit 16808d
struct mwMsgChannelCreate;
Packit 16808d
struct mwMsgChannelAccept;
Packit 16808d
struct mwMsgChannelDestroy;
Packit 16808d
Packit 16808d
Packit 16808d
/** State-tracking for a service */
Packit 16808d
enum mwServiceState {
Packit 16808d
  mwServiceState_STOPPED,   /**< the service is not active */
Packit 16808d
  mwServiceState_STOPPING,  /**< the service is shutting down */
Packit 16808d
  mwServiceState_STARTED,   /**< the service is active */
Packit 16808d
  mwServiceState_STARTING,  /**< the service is starting up */
Packit 16808d
  mwServiceState_ERROR,     /**< error in service, shutting down */
Packit 16808d
  mwServiceState_UNKNOWN,   /**< error determining state */
Packit 16808d
};
Packit 16808d
Packit 16808d
Packit 16808d
/** Casts a concrete service (such as mwServiceAware) into a mwService */
Packit 16808d
#define MW_SERVICE(srv) ((struct mwService *) srv)
Packit 16808d
Packit 16808d
Packit 16808d
#define MW_SERVICE_IS_STATE(srvc, state) \
Packit 16808d
  (mwService_getState(MW_SERVICE(srvc)) == (state))
Packit 16808d
Packit 16808d
#define MW_SERVICE_IS_STOPPED(srvc)  \
Packit 16808d
  MW_SERVICE_IS_STATE(srvc, mwServiceState_STOPPED)
Packit 16808d
Packit 16808d
#define MW_SERVICE_IS_STOPPING(srvc) \
Packit 16808d
  MW_SERVICE_IS_STATE(srvc, mwServiceState_STOPPING)
Packit 16808d
Packit 16808d
#define MW_SERVICE_IS_STARTED(srvc)  \
Packit 16808d
  MW_SERVICE_IS_STATE(srvc, mwServiceState_STARTED)
Packit 16808d
Packit 16808d
#define MW_SERVICE_IS_STARTING(srvc) \
Packit 16808d
  MW_SERVICE_IS_STATE(srvc, mwServiceState_STARTING)
Packit 16808d
Packit 16808d
Packit 16808d
/** If a service is STARTING or STARTED, it's considered LIVE */
Packit 16808d
#define MW_SERVICE_IS_LIVE(srvc) \
Packit 16808d
  (MW_SERVICE_IS_STARTING(srvc) || MW_SERVICE_IS_STARTED(srvc))
Packit 16808d
Packit 16808d
/** If a service is STOPPING or STOPPED, it's considered DEAD */
Packit 16808d
#define MW_SERVICE_IS_DEAD(srvc) \
Packit 16808d
  (MW_SERVICE_IS_STOPPING(srvc) || MW_SERVICE_IS_STOPPED(srvc))
Packit 16808d
Packit 16808d
Packit 16808d
typedef void (*mwService_funcStart)(struct mwService *service);
Packit 16808d
Packit 16808d
typedef void (*mwService_funcStop)(struct mwService *service);
Packit 16808d
Packit 16808d
typedef void (*mwService_funcClear)(struct mwService *service);
Packit 16808d
Packit 16808d
typedef const char *(*mwService_funcGetName)(struct mwService *service);
Packit 16808d
Packit 16808d
typedef const char *(*mwService_funcGetDesc)(struct mwService *service);
Packit 16808d
Packit 16808d
/** @todo remove msg and replace with appropriate additional parameters */
Packit 16808d
typedef void (*mwService_funcRecvCreate)
Packit 16808d
     (struct mwService *service,
Packit 16808d
      struct mwChannel *channel,
Packit 16808d
      struct mwMsgChannelCreate *msg);
Packit 16808d
Packit 16808d
/** @todo remove msg and replace with appropriate additional parameters */
Packit 16808d
typedef void (*mwService_funcRecvAccept)
Packit 16808d
     (struct mwService *service,
Packit 16808d
      struct mwChannel *channel,
Packit 16808d
      struct mwMsgChannelAccept *msg);
Packit 16808d
Packit 16808d
/** @todo remove msg and replace with appropriate additional parameters */
Packit 16808d
typedef void (*mwService_funcRecvDestroy)
Packit 16808d
     (struct mwService *service,
Packit 16808d
      struct mwChannel *channel,
Packit 16808d
      struct mwMsgChannelDestroy *msg);
Packit 16808d
Packit 16808d
typedef void (*mwService_funcRecv)
Packit 16808d
     (struct mwService *service,
Packit 16808d
      struct mwChannel *channel,
Packit 16808d
      guint16 msg_type,
Packit 16808d
      struct mwOpaque *data);
Packit 16808d
Packit 16808d
Packit 16808d
/** A service is the recipient of sendOnCnl messages sent over
Packit 16808d
    channels marked with the corresponding service id. Services
Packit 16808d
    provide functionality such as IM relaying, Awareness tracking and
Packit 16808d
    notification, and Conference handling.  It is a service's
Packit 16808d
    responsibility to accept or destroy channels, and to process data
Packit 16808d
    sent over those channels */
Packit 16808d
struct mwService {
Packit 16808d
Packit 16808d
  /** the unique identifier by which this service is registered. The
Packit 16808d
      type value also relates to those channels which will be directed
Packit 16808d
      to this service */
Packit 16808d
  guint32 type;
Packit 16808d
Packit 16808d
  /** the state of this service. Determines whether or not the session
Packit 16808d
      should call the start function upon receipt of a service
Packit 16808d
      available message. Should not be set or checked by hand.
Packit 16808d
Packit 16808d
      @relates mwService_getState */
Packit 16808d
  enum mwServiceState state;
Packit 16808d
Packit 16808d
  /** session this service is attached to.
Packit 16808d
      @relates mwService_getSession */
Packit 16808d
  struct mwSession *session;
Packit 16808d
Packit 16808d
  /** @return string short name of the service
Packit 16808d
      @relates mwService_getName */
Packit 16808d
  mwService_funcGetName get_name;
Packit 16808d
Packit 16808d
  /** @return string short description of the service
Packit 16808d
      @relates mwService_getDesc */
Packit 16808d
  mwService_funcGetDesc get_desc;
Packit 16808d
Packit 16808d
  /** The service's channel create handler. Called when the session
Packit 16808d
      receives a channel create message with a service matching this
Packit 16808d
      service's type.
Packit 16808d
Packit 16808d
      @relates mwService_recvCreate */
Packit 16808d
  mwService_funcRecvCreate recv_create;
Packit 16808d
Packit 16808d
  /** The service's channel accept handler. Called when the session
Packit 16808d
      receives a channel accept message for a channel with a service
Packit 16808d
      matching this service's type.
Packit 16808d
Packit 16808d
      @relates mwService_recvAccept */
Packit 16808d
  mwService_funcRecvAccept recv_accept;
Packit 16808d
Packit 16808d
  /** The service's channel destroy handler. Called when the session
Packit 16808d
      receives a channel destroy message for a channel with a service
Packit 16808d
      matching this service's type.
Packit 16808d
Packit 16808d
      @relates mwService_recvDestroy */
Packit 16808d
  mwService_funcRecvDestroy recv_destroy;
Packit 16808d
Packit 16808d
  /** The service's input handler. Called when the session receives
Packit 16808d
      data on a channel belonging to this service
Packit 16808d
Packit 16808d
      @relates mwService_recv */
Packit 16808d
  mwService_funcRecv recv;
Packit 16808d
Packit 16808d
  /** The service's start handler. Called upon the receipt of a
Packit 16808d
      service available message.
Packit 16808d
Packit 16808d
      @relates mwService_start */
Packit 16808d
  mwService_funcStart start;
Packit 16808d
Packit 16808d
  /** The service's stop handler. Called when the session is shutting
Packit 16808d
      down, or when the service is free'd.
Packit 16808d
Packit 16808d
      @relates mwService_stop */
Packit 16808d
  mwService_funcStop stop;
Packit 16808d
  
Packit 16808d
  /** The service's cleanup handler. Service implementations should
Packit 16808d
      presume that mwService::stop will be called first. The clear
Packit 16808d
      handler is not for shutting down channels or generating
Packit 16808d
      non-cleanup side-effects, it is only for handling tear-down of
Packit 16808d
      the service, and will only be called once for any instance.
Packit 16808d
Packit 16808d
      @relates mwService_free */
Packit 16808d
  mwService_funcClear clear;
Packit 16808d
Packit 16808d
  /** Optional client data, not for use by service implementations
Packit 16808d
Packit 16808d
      @relates mwService_getClientData
Packit 16808d
      @relates mwService_setClientData */
Packit 16808d
  gpointer client_data;
Packit 16808d
Packit 16808d
  /** Optional client data cleanup function. Called with client_data
Packit 16808d
      from mwService_free
Packit 16808d
Packit 16808d
      @relates mwService_getClientData
Packit 16808d
      @relates mwService_setClientData */
Packit 16808d
  GDestroyNotify client_cleanup;
Packit 16808d
};
Packit 16808d
Packit 16808d
Packit 16808d
/** @name Service Extension API
Packit 16808d
Packit 16808d
    These functions are for use by service implementations */
Packit 16808d
/*@{*/
Packit 16808d
Packit 16808d
Packit 16808d
/** Prepares a newly allocated service for use.
Packit 16808d
    
Packit 16808d
    Intended for use by service implementations, rather than by code
Packit 16808d
    utilizing a service.
Packit 16808d
    
Packit 16808d
    The service state will be initialized to STOPPED.
Packit 16808d
    
Packit 16808d
    @param service       the service to initialize
Packit 16808d
    @param session       the service's owning session
Packit 16808d
    @param service_type  the service ID number */
Packit 16808d
void mwService_init(struct mwService *service,
Packit 16808d
		    struct mwSession *session,
Packit 16808d
		    guint32 service_type);
Packit 16808d
Packit 16808d
Packit 16808d
/** Indicate that a service is started. To be used by service
Packit 16808d
    implementations when the service is fully started. */
Packit 16808d
void mwService_started(struct mwService *service);
Packit 16808d
Packit 16808d
Packit 16808d
/** Indicate that a service is stopped. To be used by service
Packit 16808d
    implementations when the service is fully stopped. */
Packit 16808d
void mwService_stopped(struct mwService *service);
Packit 16808d
Packit 16808d
Packit 16808d
/*@}*/
Packit 16808d
Packit 16808d
Packit 16808d
/** @name General Services API
Packit 16808d
Packit 16808d
    These functions provide unified access to the general functions of
Packit 16808d
    a client service, with some simple sanity-checking. */
Packit 16808d
/*@{*/
Packit 16808d
Packit 16808d
Packit 16808d
/** Triggers the recv_create handler on the service.
Packit 16808d
Packit 16808d
    @param service  the service to handle the message
Packit 16808d
    @param channel  the channel being created
Packit 16808d
    @param msg      the channel create message */
Packit 16808d
void mwService_recvCreate(struct mwService *service,
Packit 16808d
			  struct mwChannel *channel,
Packit 16808d
			  struct mwMsgChannelCreate *msg);
Packit 16808d
Packit 16808d
Packit 16808d
/** Triggers the recv_accept handler on the service.
Packit 16808d
Packit 16808d
    @param service  the service to handle the message
Packit 16808d
    @param channel  the channel being accepted
Packit 16808d
    @param msg      the channel accept message */
Packit 16808d
void mwService_recvAccept(struct mwService *service,
Packit 16808d
			  struct mwChannel *channel,
Packit 16808d
			  struct mwMsgChannelAccept *msg);
Packit 16808d
Packit 16808d
Packit 16808d
/** Triggers the recv_destroy handler on the service.
Packit 16808d
Packit 16808d
    @param service  the service to handle the message
Packit 16808d
    @param channel  the channel being destroyed
Packit 16808d
    @param msg      the channel destroy message */
Packit 16808d
void mwService_recvDestroy(struct mwService *service,
Packit 16808d
			   struct mwChannel *channel,
Packit 16808d
			   struct mwMsgChannelDestroy *msg);
Packit 16808d
Packit 16808d
Packit 16808d
/** Triggers the input handler on the service
Packit 16808d
Packit 16808d
    @param service   the service to receive the input
Packit 16808d
    @param channel   the channel the input was received from
Packit 16808d
    @param msg_type  the service-dependant message type
Packit 16808d
    @param data      the message data */
Packit 16808d
void mwService_recv(struct mwService *service,
Packit 16808d
		    struct mwChannel *channel,
Packit 16808d
		    guint16 msg_type,
Packit 16808d
		    struct mwOpaque *data);
Packit 16808d
Packit 16808d
Packit 16808d
/** @return the appropriate type id for the service */
Packit 16808d
guint32 mwService_getType(struct mwService *);
Packit 16808d
Packit 16808d
Packit 16808d
/** @return string short name of the service */
Packit 16808d
const char *mwService_getName(struct mwService *);
Packit 16808d
Packit 16808d
Packit 16808d
/** @return string short description of the service */
Packit 16808d
const char *mwService_getDesc(struct mwService *);
Packit 16808d
Packit 16808d
Packit 16808d
/** @return the service's session */
Packit 16808d
struct mwSession *mwService_getSession(struct mwService *service);
Packit 16808d
Packit 16808d
Packit 16808d
/** @returns the service's state
Packit 16808d
*/
Packit 16808d
enum mwServiceState mwService_getState(struct mwService *service);
Packit 16808d
Packit 16808d
Packit 16808d
/** Triggers the start handler for the service. Normally called from
Packit 16808d
    the session upon receipt of a service available message. Service
Packit 16808d
    implementations should use this handler to open any necessary
Packit 16808d
    channels, etc. Checks that the service is STOPPED, or returns.
Packit 16808d
    
Packit 16808d
    @param service The service to start
Packit 16808d
*/
Packit 16808d
void mwService_start(struct mwService *service);
Packit 16808d
Packit 16808d
Packit 16808d
/** Triggers the stop handler for the service. Normally called from
Packit 16808d
    the session before closing down the connection. Checks that the
Packit 16808d
    service is STARTED or STARTING, or returns
Packit 16808d
Packit 16808d
    @param service The service to stop
Packit 16808d
*/
Packit 16808d
void mwService_stop(struct mwService *service);
Packit 16808d
Packit 16808d
Packit 16808d
/** Frees memory used by a service. Will trigger the stop handler if
Packit 16808d
    the service is STARTED or STARTING. Triggers clear handler to allow
Packit 16808d
    cleanup.
Packit 16808d
Packit 16808d
    @param service The service to clear and free
Packit 16808d
*/
Packit 16808d
void mwService_free(struct mwService *service);
Packit 16808d
Packit 16808d
Packit 16808d
/** Associates client data with service. If there is existing data, it
Packit 16808d
    will not have its cleanup function called. Client data is not for
Packit 16808d
    use by service implementations. Rather, it is for use by client
Packit 16808d
    code which may later make use of those service implementations. */
Packit 16808d
void mwService_setClientData(struct mwService *service,
Packit 16808d
			     gpointer data, GDestroyNotify cleanup);
Packit 16808d
Packit 16808d
Packit 16808d
/** Reference associated client data */
Packit 16808d
gpointer mwService_getClientData(struct mwService *service);
Packit 16808d
Packit 16808d
Packit 16808d
/** Removes client data from service. If there is a cleanup function,
Packit 16808d
    it will be called. */
Packit 16808d
void mwService_removeClientData(struct mwService *service);
Packit 16808d
Packit 16808d
Packit 16808d
/*@}*/
Packit 16808d
Packit 16808d
Packit 16808d
#ifdef __cplusplus
Packit 16808d
}
Packit 16808d
#endif
Packit 16808d
Packit 16808d
Packit 16808d
#endif /* _MW_SERVICE_H */
Packit 16808d