SmartOS/Message/DataStore.h

127 lines
2.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __DataStore_H__
#define __DataStore_H__
#include "Sys.h"
#include "Stream.h"
class IDataPort;
// 数据存储适配器
class DataStore
{
public:
ByteArray Data; // 数据
bool Strict; // 是否严格限制存储区读写不许越界。默认true
// 初始化
DataStore();
// 写入数据
int Write(uint offset, const ByteArray& bs);
// 读取数据
int Read(uint offset, ByteArray& bs);
typedef bool (*Handler)(uint offset, uint size, int mode);
// 注册某一块区域的读写钩子函数
void Register(uint offset, uint size, Handler hook);
void Register(uint offset, IDataPort& port);
private:
class Area
{
public:
uint Offset;
uint Size;
Handler Hook;
IDataPort* Port;
Area();
bool Contain(uint offset, uint size);
friend bool operator==(const Area& a1, const Area& a2)
{
return a1.Offset == a2.Offset && a1.Size == a2.Size;
}
};
TArray<Area, 0x08> Areas;
bool OnHook(uint offset, uint size, int mode);
};
/****************************** 数据操作接口 ************************************/
// 数据操作接口。提供字节数据的读写能力
class IDataPort
{
public:
virtual int Size() const { return 1; };
virtual int Write(byte* data) { return Size(); };
virtual int Read(byte* data) { return Size(); };
int Write(int data) { return Write((byte*)&data); }
};
/****************************** 字节数据操作接口 ************************************/
// 字节数据操作接口
class ByteDataPort : public IDataPort
{
public:
virtual ~ByteDataPort();
virtual int Write(byte* data);
virtual int Read(byte* data) { *data = OnRead(); return Size(); };
// 让父类的所有Write函数在这里可见
using IDataPort::Write;
void Flush(int second);
void FlushMs(int ms);
void DelayOpen(int second);
void DelayClose(int second);
protected:
byte Next; // 开关延迟后的下一个状态
uint _tid;
void StartAsync(int ms);
static void AsyncTask(void* param);
virtual int OnWrite(byte data) { return OnRead(); };
virtual byte OnRead() { return Size(); };
};
#include "Port.h"
// 数据输出口
class DataOutputPort : public ByteDataPort, public Object
{
public:
OutputPort* Port;
DataOutputPort(OutputPort* port = false) { Port = port; }
protected:
virtual int OnWrite(byte data) { Port->Write(data); return OnRead(); };
virtual byte OnRead() { return Port->Read() ? 1 : 0; };
virtual String& ToStr(String& str) const { return Port->ToStr(str); }
};
// 数据输入口
class DataInputPort : public IDataPort, public Object
{
public:
InputPort* Port;
DataInputPort(InputPort* port = false) { Port = port; }
virtual int Write(byte* data) { return Read(data); };
virtual int Read(byte* data) { *data = Port->Read() ? 1 : 0; return Size(); };
virtual String& ToStr(String& str) const { return Port->ToStr(str); }
};
#endif