Files
Sun1602/Client/GameClient/PacketRequestManager.h
2022-10-26 12:25:11 +08:00

106 lines
3.9 KiB
C++

//------------------------------------------------------------------------------
//! created : 2010/04/22
//! author : by i4u4me
//! remark : 패킷을 보내고 응답이 오지 않았을경우 다시 요청함.
//------------------------------------------------------------------------------
#ifndef GAMECLIENT_PACKETREQUESTMANAGER_H_
#define GAMECLIENT_PACKETREQUESTMANAGER_H_
#if _MSC_VER > 1000
#pragma once
#endif
#include <Singleton.h>
#include <boost/shared_ptr.hpp>
#define PACKET_WAITING_MILLISECOND (1000 * 30)
//------------------------------------------------------------------------------
//!PacketRequestManager
//------------------------------------------------------------------------------
class PacketRequestManager : public util::Singleton<PacketRequestManager>
{
public:
class PacketRequestInfo
{
public:
PacketRequestInfo() : syn_packet_(NULL), ack_packet_(NULL), nak_packet_(NULL),
syn_packet_size_(0), send_millisecond_(0), wait_millisecond_(0),
is_request_(false){}
PacketRequestInfo(MSG_BASE* syn_packet, //!< new 생성성해서 넣음
MSG_BASE* ack_packet, //!< new로 생성해서 넣음
MSG_BASE* nak_packet, //!< new로 생성해서 넣음
int syn_packet_size,
DWORD send_millisecond,
DWORD wait_millisecond,
bool is_request)
{
syn_packet_ = syn_packet;
ack_packet_ = ack_packet;
nak_packet_ = nak_packet;
syn_packet_size_ = syn_packet_size;
send_millisecond_ = send_millisecond;
wait_millisecond_ = wait_millisecond;
is_request_ = is_request;
}
~PacketRequestInfo()
{
SAFE_DELETE(syn_packet_);
SAFE_DELETE(ack_packet_);
SAFE_DELETE(nak_packet_);
}
DWORD send_millisecond() const { return send_millisecond_; }
void set_send_millisecond(DWORD millisecond) { send_millisecond_ = millisecond; }
DWORD wait_millisecond() const { return wait_millisecond_; }
bool is_request() const { return is_request_; }
MSG_BASE* syn_packet() const { return syn_packet_; }
MSG_BASE* ack_packet() const { return ack_packet_; }
MSG_BASE* nak_packet() const { return nak_packet_; }
int syn_packet_size() const { return syn_packet_size_; }
private:
DWORD send_millisecond_;
DWORD wait_millisecond_;
int syn_packet_size_;
bool is_request_;
MSG_BASE* syn_packet_; //!< new 로 생성하고 소멸자에서 delete 한다.
MSG_BASE* ack_packet_; //!< new 로 생성하고 소멸자에서 delete 한다.
MSG_BASE* nak_packet_; //!< new 로 생성하고 소멸자에서 delete 한다.
};
typedef boost::shared_ptr<PacketRequestInfo> PacketRequestInfo_Shared_Ptr;
public:
PacketRequestManager();
~PacketRequestManager();
void Release();
void CheckRequestPacket();
void NetworkProc(MSG_BASE * packet);
void PushPacket(MSG_BASE* syn_packet,
MSG_BASE* ack_packet,
MSG_BASE* nak_packet,
int syn_packet_size,
DWORD wait_millisecond,
bool is_request);
bool is_sent(BYTE category, BYTE protocol);
int count() { return static_cast<int>(request_info_vector_.size()); }
std::vector<PacketRequestInfo_Shared_Ptr>& request_info_vector() { return request_info_vector_; }
private:
bool ComparePacket_CG_QUEST_COMPLETE_ACK(PacketRequestInfo* info, MSG_CG_QUEST_COMPLETE_ACK* packet);
bool ComparePacket_CG_SYNC_WINGS_CONTROL_CMD(MSG_CG_SYNC_WINGS_CONTROL_CMD* packet);
bool ComparePacket_CG_STATUS_STAT_APPLY_ACK(MSG_CG_STATUS_STAT_APPLY_ACK* packet);
std::vector<PacketRequestInfo_Shared_Ptr> request_info_vector_;
};
#endif // GAMECLIENT_PACKETREQUESTMANAGER_H_