nim_duilib/base/framework/win_io_message_pump.h
jiajia_deng 4933d1f2bc Remove dependency on shared
Signed-off-by: jiajia_deng <2894220@gmail.com>
2019-09-20 16:27:58 +08:00

89 lines
1.9 KiB
C++

// a implemention of a Windows specific message pump for I/O,
// the mechanism of which is from the Google Chrome project
#ifndef BASE_FRAMEWORK_WIN_IO_MESSAGE_PUMP_H_
#define BASE_FRAMEWORK_WIN_IO_MESSAGE_PUMP_H_
#include "base/framework/win_message_pump.h"
#if defined(OS_WIN)
#include <list>
#include "base/framework/observer_list.h"
#include "base/win32/scoped_win_handle.h"
namespace nbase
{
class BASE_EXPORT WinIOMessagePump: public WinMessagePump
{
public:
struct IOContext;
class IOHandler
{
public:
virtual ~IOHandler() {}
virtual void OnIOCompleted(IOContext *context, DWORD bytes_transfered, DWORD error) = 0;
};
class IOObserver
{
public:
IOObserver();
virtual void PreProcessIOEvent() = 0;
virtual void PostProcessIOEvent() = 0;
protected:
virtual ~IOObserver();
};
struct IOContext
{
OVERLAPPED overlapped;
IOHandler *handler;
};
WinIOMessagePump();
virtual ~WinIOMessagePump() {}
virtual void ScheduleWork();
virtual void ScheduleDelayedWork(const TimeTicks& delayed_work_time);
void RegisterIOHandler(HANDLE file_handle, IOHandler *handler);
bool WaitForIOCompletion(DWORD timeout, IOHandler *handler);
void AddObserver(IOObserver *observer);
void RemoveObserver(IOObserver *observer);
private:
struct IOItem
{
IOHandler* handler;
IOContext* context;
DWORD bytes_transfered;
DWORD error;
};
virtual void DoRunLoop();
void WaitForWork();
bool MatchCompletedIOItem(IOHandler* filter, IOItem* item);
bool GetIOItem(DWORD timeout, IOItem* item);
bool ProcessInternalIOItem(const IOItem& item);
void PreProcessIOEvent();
void PostProcessIOEvent();
// IOCP scoped handle
win32::ScopedWinHandle port_;
// IO completions that have not been delivered yet
std::list<IOItem> completed_io_;
// IO observers
ObserverList<IOObserver> observers_;
};
} // namespace nbase
#endif // OS_WIN
#endif // BASE_FRAMEWORK_WIN_IO_MESSAGE_PUMP_H_