#include #include #include #include "NFNet.h" #include "NFIOBuffer.h" namespace NaveNet { NFIOBuffer::NFIOBuffer() : m_iHead(0), m_iTail(0), m_iBufSize(0), m_cBuf(0), m_iBuffered(0) { } NFIOBuffer::~NFIOBuffer() { DeleteIOBuf(); } VOID NFIOBuffer::InitIOBuf() { m_iHead = m_iTail = 0; m_iBuffered = 0; if(m_cBuf) memset(m_cBuf, 0, sizeof(m_cBuf)); } VOID NFIOBuffer::NewIOBuf(INT BufSize) { if(BufSize <= 0) BufSize = IOBUF_DEF_SIZE; m_cBuf = new CHAR[BufSize]; if(m_cBuf == NULL) { // throw "NFIOBuffer::NewIOBuf : Memory allocation failure!"; return; } m_iBufSize = BufSize; InitIOBuf(); } VOID NFIOBuffer::DeleteIOBuf() { if(m_cBuf) { delete []m_cBuf; m_cBuf = NULL; } m_iBufSize = 0; m_iHead = m_iTail = 0; m_iBuffered = 0; } // Size ¸¸Å­ BufferÀÇ ³»¿ëÀ» ¾´´Ù. INT NFIOBuffer::Append(const CHAR* Buffer, INT Size) { // ¿À¹öÇ÷ο찡 µÈ´Ù. if(m_iBuffered + Size >= m_iBufSize) { // throw "NFIOBuffer::Append : Buffer overflow"; return -1; } INT aSize = 0; INT Added = 0; // ¸ðµç Size¸¦ Ãß°¡ÇÒ¶§±îÁö ó¸®ÇÑ´Ù. while(Size > 0) { if(Size > m_iBufSize-m_iTail) aSize = m_iBufSize-m_iTail; else aSize = Size; if(aSize) { memcpy(m_cBuf+m_iTail, Buffer, aSize); Added += aSize; Size -= aSize; Buffer += aSize; m_iTail += aSize; if(m_iTail >= m_iBufSize) m_iTail -= m_iBufSize; } } CalcBuffered(); return Added; } // Size¸¸Å­ µ¥ÀÌŸ¸¦ Àоî Buffer¿¡ ¾´´Ù. INT NFIOBuffer::GetData(CHAR* Buffer, INT Size) { // ½áÀÖ´Â µ¥ÀÌŸ º¸´Ù ¸¹ÀÌ ÀÐÀ¸¸é ½áÀÖ´Â µ¥ÀÌŸ¸¸ ÀÐ°Ô ÇÑ´Ù. if(GetBufferUsed() < Size) Size = GetBufferUsed(); if(Size <= 0) return 0; // Àß·ÁÀÖÀ¸¸é. ó¸®ÇÑ´Ù. if(m_iHead+Size >= m_iBufSize) { // ¿©±â¿¡ Áö±Ý ¹ö±×°¡ ÀÖ´Ù. INT Size1 = m_iBufSize - m_iHead; memcpy(Buffer, m_cBuf+m_iHead, Size1); memcpy(Buffer+Size1, m_cBuf, Size-Size1); } else // ¾ÈÀß·Á ÀÖÀ¸¸é. { memcpy(Buffer, m_cBuf+m_iHead, Size); } m_iHead += Size; if(m_iHead >= m_iBufSize) m_iHead -= m_iBufSize; CalcBuffered(); return Size; } INT NFIOBuffer::CheckData(INT Size) { // ½áÀÖ´Â µ¥ÀÌŸ º¸´Ù ¸¹ÀÌ ÀÐÀ¸¸é ½áÀÖ´Â µ¥ÀÌŸ¸¸ ÀÐ°Ô ÇÑ´Ù. if(GetBufferUsed() < Size) Size = GetBufferUsed(); if(Size <= 0) return 0; m_iHead += Size; if(m_iHead >= m_iBufSize) m_iHead -= m_iBufSize; CalcBuffered(); return Size; } VOID NFIOBuffer::CalcBuffered() { if(m_iHead > m_iTail) m_iBuffered = m_iBufSize - m_iHead + m_iTail; else m_iBuffered = m_iTail-m_iHead; } NFPacketIOBuffer::NFPacketIOBuffer() : m_iLockHead(0) { // ÃʱâÈ­. NFIOBuffer::NFIOBuffer(); } NFPacketIOBuffer::~NFPacketIOBuffer() { DeleteIOBuf(); } VOID NFPacketIOBuffer::Lock() { m_iLockHead = GetHead(); } VOID NFPacketIOBuffer::UnLock() { SetHead(m_iLockHead); } BOOL NFPacketIOBuffer::CheckPacket() { PACKETHEADER header; INT HeaderSize = sizeof(PACKETHEADER); // Header if(GetBufferUsed() < HeaderSize) { // ¿¡·¯°¡ ¾Æ´Ï¶ó µ¥ÀÌŸ°¡ ¾ø´Â°Å´Ù. // throw "NFPacketIOBuffer::GetPacket : IOBuffer Used Memory < P_SIZE"; return FALSE; } if(HeaderSize != GetData((CHAR*)&header, HeaderSize)) { // Çì´õ¸¦ ¿ø·¡´ë·Î ÃʱâÈ­ ÇÑ´Ù. // throw "NFPacketIOBuffer::GetPacket : Packet Header Size != P_SIZE"; return FALSE; } INT PacketSize = header.Size-HeaderSize; // Çì´õ´Â Á¦´ë·Î µé¾î°¬´Âµ¥ ¹öÆÛ°¡ Á¦´ë·Î µé¾î°¬´ÂÁö È®ÀÎÇÑ´Ù. if(GetBufferUsed() < PacketSize) { // Çì´õ¸¦ ¿ø·¡´ë·Î ÃʱâÈ­ ÇÑ´Ù. // ¿¡·¯°¡ ¾Æ´Ï¶ó µ¥ÀÌŸ°¡ ¾ø´Â°Å´Ù. // throw "NFPacketIOBuffer::GetPacket : IOBuffer Used Memory < PacketLen"; return FALSE; } INT GetSize = CheckData(PacketSize); if(GetSize != PacketSize) { // Çì´õ¸¦ ¿ø·¡´ë·Î ÃʱâÈ­ ÇÑ´Ù. // throw "NFPacketIOBuffer::GetPacket : Packet Data Read Faild, PacketSize != GetSize"; return FALSE; } return TRUE; } INT NFPacketIOBuffer::GetPacket(NFPacket* Packet) { INT OldHead = GetHead(); INT HeaderSize = HEADERSIZE; // Header if(GetBufferUsed() < HeaderSize) { // ¿¡·¯°¡ ¾Æ´Ï¶ó µ¥ÀÌŸ°¡ ¾ø´Â°Å´Ù. // throw "NFPacketIOBuffer::GetPacket : IOBuffer Used Memory < P_SIZE"; return -1; } if(HeaderSize != GetData((CHAR*)&Packet->m_Header, HeaderSize)) { // Çì´õ¸¦ ¿ø·¡´ë·Î ÃʱâÈ­ ÇÑ´Ù. SetHead(OldHead); // throw "NFPacketIOBuffer::GetPacket : Packet Header Size != P_SIZE"; return -2; } INT PacketSize = Packet->m_Header.Size-HeaderSize; // Çì´õ´Â Á¦´ë·Î µé¾î°¬´Âµ¥ ¹öÆÛ°¡ Á¦´ë·Î µé¾î°¬´ÂÁö È®ÀÎÇÑ´Ù. if(GetBufferUsed() < PacketSize) { // Çì´õ¸¦ ¿ø·¡´ë·Î ÃʱâÈ­ ÇÑ´Ù. SetHead(OldHead); // ¿¡·¯°¡ ¾Æ´Ï¶ó µ¥ÀÌŸ°¡ ¾ø´Â°Å´Ù. // throw "NFPacketIOBuffer::GetPacket : IOBuffer Used Memory < PacketLen"; return -3; } // ¾ÆÁ÷ µ¥ÀÌŸ°¡ Á¦´ë·Î 󸮾ȵƴÙ. INT GetSize = GetData(Packet->m_Packet, PacketSize); if(GetSize != PacketSize) { // Çì´õ¸¦ ¿ø·¡´ë·Î ÃʱâÈ­ ÇÑ´Ù. SetHead(OldHead); // throw "NFPacketIOBuffer::GetPacket : Packet Data Read Faild, PacketSize != GetSize"; return -4; } // ÆÐŶÀ» Á¦´ë·Î Àоîµé¿´´Ù. return 1; } }