1
0
mirror of https://github.com/haiwen/seafile-server.git synced 2025-06-26 23:16:51 +00:00
seafile-server/common/mq-mgr.c
2016-08-20 15:29:51 +08:00

141 lines
3.4 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
#include <ccnet.h>
#include "mq-mgr.h"
#include "seafile-session.h"
#include "log.h"
typedef struct _SeafMqManagerPriv SeafMqManagerPriv;
struct _SeafMqManagerPriv {
CcnetMqclientProc *mqclient_proc;
CcnetTimer *timer;
};
SeafMqManager *
seaf_mq_manager_new (SeafileSession *seaf)
{
CcnetClient *client = seaf->session;
SeafMqManager *mgr;
SeafMqManagerPriv *priv;
mgr = g_new0 (SeafMqManager, 1);
priv = g_new0 (SeafMqManagerPriv, 1);
mgr->seaf = seaf;
mgr->priv = priv;
priv->mqclient_proc = (CcnetMqclientProc *)
ccnet_proc_factory_create_master_processor (client->proc_factory,
"mq-client");
if (!priv->mqclient_proc) {
seaf_warning ("Failed to create mqclient proc.\n");
g_free (mgr);
g_free(priv);
return NULL;
}
return mgr;
}
static int
start_mq_client (CcnetMqclientProc *mqclient)
{
if (ccnet_processor_startl ((CcnetProcessor *)mqclient, NULL) < 0) {
ccnet_processor_done ((CcnetProcessor *)mqclient, FALSE);
seaf_warning ("Failed to start mqclient proc\n");
return -1;
}
seaf_message ("[mq client] mq cilent is started\n");
return 0;
}
int
seaf_mq_manager_init (SeafMqManager *mgr)
{
SeafMqManagerPriv *priv = mgr->priv;
if (start_mq_client(priv->mqclient_proc) < 0)
return -1;
return 0;
}
int
seaf_mq_manager_start (SeafMqManager *mgr)
{
return 0;
}
static inline CcnetMessage *
create_message (SeafMqManager *mgr, const char *app, const char *body, int flags)
{
CcnetClient *client = mgr->seaf->session;
CcnetMessage *msg;
char *from = client->base.id;
char *to = client->base.id;
msg = ccnet_message_new (from, to, app, body, flags);
return msg;
}
/* Wrap around ccnet_message_new since all messages we use are local. */
static inline void
_send_message (SeafMqManager *mgr, CcnetMessage *msg)
{
CcnetMqclientProc *mqclient_proc = mgr->priv->mqclient_proc;
ccnet_mqclient_proc_put_message (mqclient_proc, msg);
}
void
seaf_mq_manager_publish_message (SeafMqManager *mgr,
CcnetMessage *msg)
{
_send_message (mgr, msg);
}
void
seaf_mq_manager_publish_message_full (SeafMqManager *mgr,
const char *app,
const char *body,
int flags)
{
CcnetMessage *msg = create_message (mgr, app, body, flags);
_send_message (mgr, msg);
ccnet_message_free (msg);
}
void
seaf_mq_manager_publish_notification (SeafMqManager *mgr,
const char *type,
const char *content)
{
static const char *app = "seafile.notification";
GString *buf = g_string_new(NULL);
g_string_append_printf (buf, "%s\n%s", type, content);
CcnetMessage *msg = create_message (mgr, app, buf->str, 0);
_send_message (mgr, msg);
g_string_free (buf, TRUE);
ccnet_message_free (msg);
}
void
seaf_mq_manager_publish_event (SeafMqManager *mgr, const char *content)
{
static const char *app = "seaf_server.event";
CcnetMessage *msg = create_message (mgr, app, content, 0);
_send_message (mgr, msg);
ccnet_message_free (msg);
}