/*
 * rpc_common.h
 *
 *  Created on: 2011-3-20
 *      Author: yanghu
 */

#ifndef RPC_COMMON_H_
#define RPC_COMMON_H_

#include "rpc_types.h"


#define WORKER_LEN 4
#define BACKLOG 5
#define BUF_MAX_SIZE 163840
#define BUFFER_SIZE (BUF_MAX_SIZE + 40960)
#define RPC_VERSION "RPC/1.0"
#define TIMEOUT 120
#define TIMEWARN 200

typedef enum {
    /* RPC ret code */
	RET_OK = 0,
    RET_ERR = 1,
	RET_UNKNOWN = 2,
	RET_SYSERR  = 3,
	RET_NOTFOUND = 4,
	RET_TIMEOUT = 5,

    RET_NULLP  = 6,
    RET_NOMEM  = 7,
    RET_CHKERR = 8,
    RET_EXCEERR = 9,
    RET_SOCKERR = 10,
    RET_NOTSUPPORT = 11,
    RET_INPUTERR = 12,
    RET_IPINVALID = 13,
    RET_NAMEINVAL = 14,
    RET_EXIST = 15,
    RET_FULL = 16
} ret_code;

#define RET_ERROR_DISC \
{ \
    { RET_OK,         "OK" }, \
    { RET_ERR,        "Error" },\
    { RET_UNKNOWN,    "Unkown" },\
    { RET_SYSERR,     "SystemError" },\
    { RET_NOTFOUND,   "NotFound" }, \
    { RET_TIMEOUT,    "Timeout" }, \
    { RET_NULLP,      "NullPointer" } ,\
    { RET_NOMEM,      "NotEnoughMemery"},\
    { RET_CHKERR,     "CheckError"},\
    { RET_EXCEERR,    "ExecutError"},\
    { RET_SOCKERR,    "SockError"},\
    { RET_NOTSUPPORT, "NotSupport"},\
    { RET_INPUTERR,   "InputError"},\
    { RET_IPINVALID,  "IpInvalid"},\
    { RET_NAMEINVAL, "NameInvalid"},\
    { RET_EXIST, "AlreadyExist"},\
    { RET_FULL, "Full"}\
}

#define RET_BUFF_SIZE 256;

typedef enum {
	RPC_Parse_OK = 0, RPC_Parse_NeedData = 1, RPC_Parse_Error = 2
} rpc_parse_result;

typedef struct _rpc_server rpc_server;
typedef struct _rpc_client rpc_client;
typedef struct _rpc_conn rpc_conn;
typedef struct _rpc_request rpc_request;
typedef struct _rpc_response rpc_response;

typedef void (*rpc_callback)(ret_code code, pointer output,
		                     int output_len, pointer data);


typedef void* (*rpc_thread_func)(void* args);

typedef void (*rpc_function)(rpc_conn *conn, pointer input, int input_len,
		pointer data);

typedef struct _rpc_dispatch_thread rpc_dispatch_thread;

typedef struct _rpc_client_thread rpc_client_thread;

typedef struct _rpc_worker_thread rpc_worker_thread;

struct _rpc_service {
	char *service_name;
	char *method_name;
	char *data;
	rpc_function cb;
};

typedef struct _rpc_service rpc_service;

const char* rpc_code_format(const ret_code code);

ret_code rpc_str_code(const char* str);

typedef struct token_s {
	char *value;
	size_t length;
} token_t;

int tokenize_command(char *command, token_t *tokens, const size_t max_token);


#endif /* RPC_COMMON_H_ */