/** @file HandlerEx.h
@brief
* Copyright (c) 2007,第九城市游戏研发中心
* All rights reserved.
*
* 当前版本:
* 作 者:zhangsongwei
* 完成日期:2008-6-17
*
* 取代版本:
* 作 者:
* 完成日期:
*/
#ifndef HANDLER_EX_H
#define HANDLER_EX_H
//#include "HandlerT.h"
#include "BufQueue/BufQueue.h"
#include "BufQueue/BufQueueImp.h"
#include
class CHandlerEx : public ACE_Event_Handler
{
public:
///
typedef ACE_SOCK_Stream stream_type;
///
typedef ACE_INET_Addr addr_type;
enum
{
UIO_SIZE = 1024
};
public:
/// 缺省
CHandlerEx(void);
/// 构造
explicit CHandlerEx(unsigned int uiPeerBufferSize);
/// 析构
virtual ~CHandlerEx(void);
public:
/// 初始化
virtual int open(void * = 0);
/// 清理
virtual int close(u_long flags = 0);
/// 输入事件发生时被框架回调(例如连接或者数据)
virtual int handle_input(ACE_HANDLE fd = ACE_INVALID_HANDLE);
/// 对应句柄可写时
virtual int handle_output (ACE_HANDLE fd = ACE_INVALID_HANDLE);
/**
* 当返回-1或者被框架调用时.
* 表明什么事件触发被调用,指定具体的句柄
*/
virtual int handle_close(ACE_HANDLE handle,
ACE_Reactor_Mask close_mask);
/// 获取句柄
virtual ACE_HANDLE get_handle(void) const;
/// 获取底层stream
ACE_SOCK_Stream & peer(void) const;
public:
/// 获取/设置队列
/// 获取已读队列
IBufQueue * ReadQueue(void);
/// 设置已读队列
void ReadQueue(IBufQueue *pReadQueue);
/// 获取待发队列
IBufQueue * SendQueue(void);
/// 设置待发队列
void SendQueue(IBufQueue *pSendQueue);
/// 获取/设置SessionID
/// 获取
unsigned int SessionID(void);
/// 设置
void SessionID(unsigned int uiSessionID);
public:
/// 追加数据
int AppendMsg(MsgToPut *pMsgToPut);
/// 是否使用?
bool IsUsed(void);
/// 设置使用
void IsUsed(bool bIsUsed);
/// 是否主动连接
bool ActiveConnect(void);
/// 设置是否连接
void ActiveConnect(bool bActiveConnect);
protected:
/// 连接建立时处理
virtual int OnLinkUp(void);
/// 连接段开始处理
virtual int OnLinkDown(u_long flags = 0);
/// 出错
virtual void OnError(int closeType, int arg);
/// 处理一个完整包
virtual int HandlePackage(char* pszPack, unsigned int uiPakcLen);
/// 获取对端信息
int GetRemoteAddress(ACE_INET_Addr & remoteAddress);
/// 是否是关闭消息(主应用逻辑发过来)
bool IsCloseMsg(MsgToPut *pMsgToPut);
/// 重置所有数据成员
void Reset(u_long flags = 0);
/// 发送
int SendMsg(void);
private:
/// 底层stream
ACE_SOCK_Stream m_peer;
/// 已读消息队列
IBufQueue *m_pReadQueue;
/// 待发送消息队列
IBufQueue *m_pSendQueue;
/// 会话id
unsigned int m_uiSessionID;
/// 消息队列
std::queue m_messageQueue;
// 发送消息列表
MsgToPut *m_msgArray[UIO_SIZE];
/// 发送缓冲区
iovec m_iov[UIO_SIZE];
/// 发送缓冲区实际长度
short m_iovCount;
/// 发送缓冲区中待发送的索引
short m_iovOffset;
/// 互斥锁
ACE_Thread_Mutex m_mutex;
/// 是否延迟关闭
bool m_bDeferredClose;
/// 是否使用
bool m_bIsUsed;
/// 是否主动连接
bool m_bActiveConnect;
/// 是否存在数据待发送
bool m_bExistDataToSend;
};
#endif/*HANDLER_EX_H*/