Blame src/service.c

Packit Service 37472d
Packit Service 37472d
/*
Packit Service 37472d
  Meanwhile - Unofficial Lotus Sametime Community Client Library
Packit Service 37472d
  Copyright (C) 2004  Christopher (siege) O'Brien
Packit Service 37472d
  
Packit Service 37472d
  This library is free software; you can redistribute it and/or
Packit Service 37472d
  modify it under the terms of the GNU Library General Public
Packit Service 37472d
  License as published by the Free Software Foundation; either
Packit Service 37472d
  version 2 of the License, or (at your option) any later version.
Packit Service 37472d
  
Packit Service 37472d
  This library is distributed in the hope that it will be useful,
Packit Service 37472d
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 37472d
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 37472d
  Library General Public License for more details.
Packit Service 37472d
  
Packit Service 37472d
  You should have received a copy of the GNU Library General Public
Packit Service 37472d
  License along with this library; if not, write to the Free
Packit Service 37472d
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit Service 37472d
*/
Packit Service 37472d
Packit Service 37472d
#include "mw_channel.h"
Packit Service 37472d
#include "mw_debug.h"
Packit Service 37472d
#include "mw_error.h"
Packit Service 37472d
#include "mw_message.h"
Packit Service 37472d
#include "mw_service.h"
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* I tried to be explicit with the g_return_* calls, to make the debug
Packit Service 37472d
   logging a bit more sensible. Hence all the explicit "foo != NULL"
Packit Service 37472d
   checks. */
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwService_recvCreate(struct mwService *s, struct mwChannel *chan,
Packit Service 37472d
			  struct mwMsgChannelCreate *msg) {
Packit Service 37472d
Packit Service 37472d
  /* ensure none are null, ensure that the service and channel belong
Packit Service 37472d
     to the same session, and ensure that the message belongs on the
Packit Service 37472d
     channel */
Packit Service 37472d
  g_return_if_fail(s != NULL);
Packit Service 37472d
  g_return_if_fail(chan != NULL);
Packit Service 37472d
  g_return_if_fail(msg != NULL);
Packit Service 37472d
  g_return_if_fail(s->session == mwChannel_getSession(chan));
Packit Service 37472d
  g_return_if_fail(mwChannel_getId(chan) == msg->channel);
Packit Service 37472d
Packit Service 37472d
  if(s->recv_create) {
Packit Service 37472d
    s->recv_create(s, chan, msg);
Packit Service 37472d
  } else {
Packit Service 37472d
    mwChannel_destroy(chan, ERR_FAILURE, NULL);
Packit Service 37472d
  }
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwService_recvAccept(struct mwService *s, struct mwChannel *chan,
Packit Service 37472d
			  struct mwMsgChannelAccept *msg) {
Packit Service 37472d
Packit Service 37472d
  /* ensure none are null, ensure that the service and channel belong
Packit Service 37472d
     to the same session, and ensure that the message belongs on the
Packit Service 37472d
     channel */
Packit Service 37472d
  g_return_if_fail(s != NULL);
Packit Service 37472d
  g_return_if_fail(chan != NULL);
Packit Service 37472d
  g_return_if_fail(msg != NULL);
Packit Service 37472d
  g_return_if_fail(s->session == mwChannel_getSession(chan));
Packit Service 37472d
  g_return_if_fail(mwChannel_getId(chan) == msg->head.channel);
Packit Service 37472d
Packit Service 37472d
  if(s->recv_accept)
Packit Service 37472d
    s->recv_accept(s, chan, msg);
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwService_recvDestroy(struct mwService *s, struct mwChannel *chan,
Packit Service 37472d
			   struct mwMsgChannelDestroy *msg) {
Packit Service 37472d
Packit Service 37472d
  /* ensure none are null, ensure that the service and channel belong
Packit Service 37472d
     to the same session, and ensure that the message belongs on the
Packit Service 37472d
     channel */
Packit Service 37472d
  g_return_if_fail(s != NULL);
Packit Service 37472d
  g_return_if_fail(chan != NULL);
Packit Service 37472d
  g_return_if_fail(msg != NULL);
Packit Service 37472d
  g_return_if_fail(s->session == mwChannel_getSession(chan));
Packit Service 37472d
  g_return_if_fail(mwChannel_getId(chan) == msg->head.channel);
Packit Service 37472d
Packit Service 37472d
  if(s->recv_destroy)
Packit Service 37472d
    s->recv_destroy(s, chan, msg);
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwService_recv(struct mwService *s, struct mwChannel *chan,
Packit Service 37472d
		    guint16 msg_type, struct mwOpaque *data) {
Packit Service 37472d
Packit Service 37472d
  /* ensure that none are null. zero-length messages are acceptable */
Packit Service 37472d
  g_return_if_fail(s != NULL);
Packit Service 37472d
  g_return_if_fail(chan != NULL);
Packit Service 37472d
  g_return_if_fail(data != NULL);
Packit Service 37472d
  g_return_if_fail(s->session == mwChannel_getSession(chan));
Packit Service 37472d
Packit Service 37472d
  /*
Packit Service 37472d
  g_message("mwService_recv: session = %p, service = %p, b = %p, n = %u",
Packit Service 37472d
	    mwService_getSession(s), s, data->data, data->len);
Packit Service 37472d
  */
Packit Service 37472d
Packit Service 37472d
  if(s->recv)
Packit Service 37472d
    s->recv(s, chan, msg_type, data);
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
guint32 mwService_getType(struct mwService *s) {
Packit Service 37472d
  g_return_val_if_fail(s != NULL, 0x00);
Packit Service 37472d
  return s->type;
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
const char *mwService_getName(struct mwService *s) {
Packit Service 37472d
  g_return_val_if_fail(s != NULL, NULL);
Packit Service 37472d
  g_return_val_if_fail(s->get_name != NULL, NULL);
Packit Service 37472d
Packit Service 37472d
  return s->get_name(s);
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
const char *mwService_getDesc(struct mwService *s) {
Packit Service 37472d
  g_return_val_if_fail(s != NULL, NULL);
Packit Service 37472d
  g_return_val_if_fail(s->get_desc != NULL, NULL);
Packit Service 37472d
Packit Service 37472d
  return s->get_desc(s);
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
struct mwSession *mwService_getSession(struct mwService *s) {
Packit Service 37472d
  g_return_val_if_fail(s != NULL, NULL);
Packit Service 37472d
  return s->session;
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwService_init(struct mwService *srvc, struct mwSession *sess,
Packit Service 37472d
		    guint32 type) {
Packit Service 37472d
Packit Service 37472d
  /* ensure nothing is null, and there's no such thing as a zero
Packit Service 37472d
     service type */
Packit Service 37472d
  g_return_if_fail(srvc != NULL);
Packit Service 37472d
  g_return_if_fail(sess != NULL);
Packit Service 37472d
  g_return_if_fail(type != 0x00);
Packit Service 37472d
Packit Service 37472d
  srvc->session = sess;
Packit Service 37472d
  srvc->type = type;
Packit Service 37472d
  srvc->state = mwServiceState_STOPPED;
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
enum mwServiceState mwService_getState(struct mwService *srvc) {
Packit Service 37472d
  g_return_val_if_fail(srvc != NULL, mwServiceState_STOPPED);
Packit Service 37472d
  return srvc->state;
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwService_start(struct mwService *srvc) {
Packit Service 37472d
  g_return_if_fail(srvc != NULL);
Packit Service 37472d
Packit Service 37472d
  if(! MW_SERVICE_IS_STOPPED(srvc))
Packit Service 37472d
    return;
Packit Service 37472d
Packit Service 37472d
  srvc->state = mwServiceState_STARTING;
Packit Service 37472d
  g_message("starting service %s", NSTR(mwService_getName(srvc)));
Packit Service 37472d
Packit Service 37472d
  if(srvc->start) {
Packit Service 37472d
    srvc->start(srvc);
Packit Service 37472d
  } else {
Packit Service 37472d
    mwService_started(srvc);
Packit Service 37472d
  }
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwService_started(struct mwService *srvc) {
Packit Service 37472d
  g_return_if_fail(srvc != NULL);
Packit Service 37472d
Packit Service 37472d
  srvc->state = mwServiceState_STARTED;
Packit Service 37472d
  g_message("started service %s", NSTR(mwService_getName(srvc)));
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwService_error(struct mwService *srvc) {
Packit Service 37472d
  g_return_if_fail(srvc != NULL);
Packit Service 37472d
Packit Service 37472d
  if(MW_SERVICE_IS_DEAD(srvc))
Packit Service 37472d
    return;
Packit Service 37472d
Packit Service 37472d
  srvc->state = mwServiceState_ERROR;
Packit Service 37472d
  g_message("error in service %s", NSTR(mwService_getName(srvc)));
Packit Service 37472d
Packit Service 37472d
  if(srvc->stop) {
Packit Service 37472d
    srvc->stop(srvc);
Packit Service 37472d
  } else {
Packit Service 37472d
    mwService_stopped(srvc);
Packit Service 37472d
  }
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwService_stop(struct mwService *srvc) {
Packit Service 37472d
  g_return_if_fail(srvc != NULL);
Packit Service 37472d
Packit Service 37472d
  if(MW_SERVICE_IS_DEAD(srvc))
Packit Service 37472d
    return;
Packit Service 37472d
Packit Service 37472d
  srvc->state = mwServiceState_STOPPING;
Packit Service 37472d
  g_message("stopping service %s", NSTR(mwService_getName(srvc)));
Packit Service 37472d
Packit Service 37472d
  if(srvc->stop) {
Packit Service 37472d
    srvc->stop(srvc);
Packit Service 37472d
  } else {
Packit Service 37472d
    mwService_stopped(srvc);
Packit Service 37472d
  }
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwService_stopped(struct mwService *srvc) {
Packit Service 37472d
  g_return_if_fail(srvc != NULL);
Packit Service 37472d
Packit Service 37472d
  if(srvc->state != mwServiceState_STOPPED) {
Packit Service 37472d
    srvc->state = mwServiceState_STOPPED;
Packit Service 37472d
    g_message("stopped service %s", NSTR(mwService_getName(srvc)));
Packit Service 37472d
  }
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwService_free(struct mwService *srvc) {
Packit Service 37472d
  g_return_if_fail(srvc != NULL);
Packit Service 37472d
Packit Service 37472d
  mwService_stop(srvc);
Packit Service 37472d
Packit Service 37472d
  if(srvc->clear)
Packit Service 37472d
    srvc->clear(srvc);
Packit Service 37472d
Packit Service 37472d
  if(srvc->client_cleanup)
Packit Service 37472d
    srvc->client_cleanup(srvc->client_data);
Packit Service 37472d
Packit Service 37472d
  g_free(srvc);
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** @todo switch the following to using mw_datum */
Packit Service 37472d
Packit Service 37472d
void mwService_setClientData(struct mwService *srvc,
Packit Service 37472d
			     gpointer data, GDestroyNotify cleanup) {
Packit Service 37472d
Packit Service 37472d
  g_return_if_fail(srvc != NULL);
Packit Service 37472d
Packit Service 37472d
  srvc->client_data = data;
Packit Service 37472d
  srvc->client_cleanup = cleanup;
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
gpointer mwService_getClientData(struct mwService *srvc) {
Packit Service 37472d
  g_return_val_if_fail(srvc != NULL, NULL);
Packit Service 37472d
  return srvc->client_data;
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mwService_removeClientData(struct mwService *srvc) {
Packit Service 37472d
  g_return_if_fail(srvc != NULL);
Packit Service 37472d
Packit Service 37472d
  if(srvc->client_cleanup) {
Packit Service 37472d
    srvc->client_cleanup(srvc->client_data);
Packit Service 37472d
    srvc->client_cleanup = NULL;
Packit Service 37472d
  }
Packit Service 37472d
Packit Service 37472d
  srvc->client_data = NULL;
Packit Service 37472d
}
Packit Service 37472d