/*----------------------------------------------------------------------------- * CStream *----------------------------------------------------------------------------- * ½ºÆ®¸² Ŭ·¡½º *----------------------------------------------------------------------------- * Copyright (c) , 2006, WEBZEN Inc. * All rights reserved. * * Author : Noh Yong Hwan, 2006, WEBZEN Inc. Research & Development Dept. * fixbrain@gmail.com , somma@webzen.co.kr **---------------------------------------------------------------------------*/ #include "stdafx.h" #include "CStream.h" #include #include /** ----------------------------------------------------------------------- \brief \param \return \code \endcode -------------------------------------------------------------------------*/ #define MAX_UNSIGNED_LONG 0xFFFFFFFF int CStream::ChangeCursor(const unsigned long offset, unsigned long from) { _ASSERTE(0 <= offset); _ASSERTE(0 <= from); _ASSERTE(m_pos >= from); _ASSERTE(MAX_UNSIGNED_LONG >= from); _ASSERTE(MAX_UNSIGNED_LONG >= offset); _ASSERTE(MAX_UNSIGNED_LONG >= from + offset); if ( !(0 <= offset) || !(0 <= from) || !(m_pos >= from) || !(MAX_UNSIGNED_LONG >= from) || !(MAX_UNSIGNED_LONG >= offset) || !(MAX_UNSIGNED_LONG >= from + offset) ) { OutputDebugString("invalid parameter"); return -1; } unsigned long newPosition = from + offset; // position ÀÌ ½ºÆ®¸²ÀÇ Å©±âº¸´Ù Å©¸é ¸¶Áö¸·À¸·Î Ä¿¼­¸¦ ¿Å±ä´Ù. // if (newPosition > m_size) { newPosition = m_size; } setPos(newPosition); return newPosition; }; /** ----------------------------------------------------------------------- \brief memory stream ÀÇ Å©±â¸¦ º¯°æÇÑ´Ù. \param \return \code \endcode -------------------------------------------------------------------------*/ int CMemoryStream::SetSize(unsigned long newSize) { unsigned long oldPosition = GetCurrentCusor(); char *ptr = (char *) realloc(m_pMemory, newSize); if (NULL == ptr) { if(0 == newSize) { // ½ºÆ®¸² clear °æ¿ì // m_pMemory = NULL; } else { // ¸Þ¸ð¸®°¡ ºÎÁ·ÇÔ. // m_pMemory ´Â º¯°æµÇÁö ¾ÊÀ½. // OutputDebugString(TEXT("not enough memory available")); return -1; } } m_pMemory = ptr; m_size = newSize; if (oldPosition > newSize) ChangeCursor(0, newSize); return newSize; } /** ----------------------------------------------------------------------- \brief ½ºÆ®¸²À¸·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àо ¹öÆÛ¿¡ ¾´´Ù. \param \return ¼º°ø½Ã ÀÐÀº ¹ÙÀÌÆ® ¼ö ¸®ÅÏ (½ºÆ®¸²ÀÌ Count º¸´Ù ÀÛÀº °æ¿ì Æ÷ÇÔ) ½ÇÆÐ½Ã -1 ¸®ÅÏ \code \endcode -------------------------------------------------------------------------*/ int CMemoryStream::ReadFromStream(void *Buffer, int Count) { _ASSERTE( TRUE != IsBadWritePtr(Buffer, Count) ); if ( TRUE == IsBadWritePtr(Buffer, Count) ) { OutputDebugString(("%s >> Invalid Parameter", __FUNCTION__)); return -1; } if ( (m_pos >= 0) && (Count >= 0) ) { int ret = m_size - m_pos; if (0 < ret) { if (ret > Count) ret = Count; memmove(Buffer, (char *)(DWORD_PTR(m_pMemory) + m_pos), ret); ChangeCursor(ret, m_pos); return ret; } } return 0; } /** ----------------------------------------------------------------------- \brief ¹öÆÛ·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ÀÐ¾î ½ºÆ®¸²ÀÇ ÇöÀç Æ÷Áö¼Ç¿¡ ¾´´Ù. \param \return ¼º°ø½Ã Write ÇÑ ¹ÙÀÌÆ® ¼ö ½ÇÆÐ½Ã -1 \code \endcode -------------------------------------------------------------------------*/ int CMemoryStream::WriteToStream(const void *Buffer, int Count) { if ( (m_pos >= 0) && (Count >= 0) ) { unsigned long pos = m_pos + Count; if (pos > 0) { if (pos > m_size) { if (-1 == SetSize(pos)) { OutputDebugString("not enough memory"); return -1; } } memmove(&m_pMemory[m_pos], Buffer, Count); this->m_pos = pos; return Count; } } return 0; // write ÇÑ ¹ÙÀÌÆ®°¡ 0 À̹ǷΠ}