1
0
mirror of https://github.com/haiwen/seafile-server.git synced 2025-06-27 15:36:48 +00:00
seafile-server/server/processors/recvblock-proc.c
2016-08-19 13:54:16 +08:00

101 lines
2.7 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
#include "common.h"
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <ccnet.h>
#include <ccnet/cevent.h>
#include "net.h"
#include "utils.h"
#include "seafile-session.h"
#include "fs-mgr.h"
#include "block-mgr.h"
#include "recvblock-proc.h"
#include "processors/blocktx-common.h"
#include "log.h"
enum {
PREPARE,
READY,
};
#define GET_PRIV(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), SEAFILE_TYPE_RECVBLOCK_PROC, BlockProcPriv))
#define USE_PRIV \
BlockProcPriv *priv = GET_PRIV(processor);
static int block_proc_start (CcnetProcessor *processor, int argc, char **argv);
static void handle_update (CcnetProcessor *processor,
char *code, char *code_msg,
char *content, int clen);
static void recv_block_cb (CEvent *event, void *vprocessor);
static void release_resource (CcnetProcessor *processor);
G_DEFINE_TYPE (SeafileRecvblockProc, seafile_recvblock_proc, CCNET_TYPE_PROCESSOR)
static void
seafile_recvblock_proc_class_init (SeafileRecvblockProcClass *klass)
{
CcnetProcessorClass *proc_class = CCNET_PROCESSOR_CLASS (klass);
proc_class->name = "recvblock-proc";
proc_class->start = block_proc_start;
proc_class->handle_update = handle_update;
proc_class->release_resource = release_resource;
g_type_class_add_private (klass, sizeof (BlockProcPriv));
}
static void
seafile_recvblock_proc_init (SeafileRecvblockProc *processor)
{
}
static void
recv_block_cb (CEvent *event, void *vprocessor)
{
CcnetProcessor *processor = vprocessor;
BlockResponse *blk_rsp = event->data;
char buf[32];
int len;
len = snprintf (buf, 32, "%d", blk_rsp->block_idx);
ccnet_processor_send_response (processor, SC_ACK, SS_ACK,
buf, len + 1);
g_free (blk_rsp);
}
#include "processors/blocktx-common-impl.h"
static void handle_update (CcnetProcessor *processor,
char *code, char *code_msg,
char *content, int clen)
{
switch (processor->state) {
case PREPARE:
if (memcmp (code, SC_BLOCKLIST, 3) == 0) {
process_block_list (processor, content, clen);
return;
} else if (memcmp (code, SC_GET_PORT, 3) == 0) {
send_port (processor);
return;
}
break;
}
seaf_warning ("Bad code: %s %s\n", code, code_msg);
ccnet_processor_send_response (processor, SC_BAD_UPDATE_CODE,
SS_BAD_UPDATE_CODE, NULL, 0);
ccnet_processor_done (processor, FALSE);
}