#include "precomp.h" #include "Message.h" CChatMessage *CChatMessage::ms_pFirst = NULL; int CChatMessage::ms_cMessages = 0; CChatMessage *CChatMessage::ms_pLast = NULL; int CChatMessage::ms_iMessageLimit = INITIAL_LIMIT; CChatMessage *CChatMessage::get_head() { return ms_pFirst; } int CChatMessage::get_count() { return ms_cMessages; } CChatMessage *CChatMessage::get_last() { return ms_pLast; } void CChatMessage::put_limit( int iLimit ) { ASSERT( iLimit >= 1 ); ms_iMessageLimit = iLimit; while( ms_cMessages > ms_iMessageLimit ) { CChatMessage *pKillMe = ms_pFirst; ms_pFirst = ms_pFirst->m_pNext; delete pKillMe; } } int CChatMessage::get_limit() { return ms_iMessageLimit; } CChatMessage *CChatMessage::get_next() const { return m_pNext; } CChatMessage *CChatMessage::get_prev() const { return m_pPrev; } CChatMessage::CHAT_MSGTYPE CChatMessage::get_type() const { return m_msgType; } const LPTSTR CChatMessage::get_date() const { return m_szDate; } const LPTSTR CChatMessage::get_time() const { return m_szTime; } const LPTSTR CChatMessage::get_person() const { return m_szPerson; } const LPTSTR CChatMessage::get_message() const { return m_szMessage; } CChatMessage::CChatMessage( LPCTSTR szPerson, LPCTSTR szMessage, CHAT_MSGTYPE msgType ) : m_msgType( msgType ), m_szDate( NULL ), m_szTime( NULL ), m_szPerson( NULL ), m_szMessage( NULL ), m_pNext( NULL ), m_pPrev( NULL ) { _GetDate(); _GetTime(); m_szPerson = _CopyString( szPerson ); m_szMessage = _CopyString( szMessage ); if( 0 == ms_cMessages ) { ms_pFirst = this; ms_pLast = this; } else { ms_pLast->m_pNext = this; m_pPrev = ms_pLast; ms_pLast = this; } ms_cMessages++; while( ms_cMessages > ms_iMessageLimit ) { CChatMessage *pKillMe = ms_pFirst; ms_pFirst = ms_pFirst->m_pNext; delete pKillMe; } } CChatMessage::~CChatMessage() { delete [] m_szDate; delete [] m_szTime; delete [] m_szPerson; delete [] m_szMessage; ms_cMessages--; } void CChatMessage::DeleteAll() { CChatMessage *pMsg = ms_pFirst; while( pMsg ) { CChatMessage *pNext = pMsg->m_pNext; delete pMsg; pMsg = pNext; } ms_pFirst = NULL; ms_pLast = NULL; ms_cMessages = 0; } LPTSTR CChatMessage::_CopyString( LPCTSTR sz ) { LPTSTR szNew = NULL; if( NULL == sz ) { DBG_SAVE_FILE_LINE szNew = new TCHAR[1]; ASSERT( szNew ); if( NULL == szNew ) { return NULL; } szNew[0] = '\0'; } else { int iLen = lstrlen( sz ) + 1; DBG_SAVE_FILE_LINE szNew = new TCHAR[ iLen ]; ASSERT( szNew ); if( NULL == szNew ) { return NULL; } lstrcpyn( szNew, sz, iLen ); } return szNew; } void CChatMessage::_GetDate() { int iLen = 1 + GetDateFormat( LOCALE_USER_DEFAULT, // locale for which date is to be formatted 0, // flags specifying function options NULL, // time to be formatted NULL, // time format string NULL, // buffer for storing formatted string 0 // size, in bytes or characters, of the buffer ); m_szDate = new TCHAR[ iLen ]; ASSERT( m_szDate ); if( 0 == (iLen = GetDateFormat( LOCALE_USER_DEFAULT, // locale for which date is to be formatted 0, // flags specifying function options NULL, // time to be formatted NULL, // time format string m_szDate, // buffer for storing formatted string iLen // size, in bytes or characters, of the buffer ) ) ) { DWORD dw = GetLastError(); WARNING_OUT(( TEXT("CChatMessage::_GetDate: Can not get date") )); } else { m_szDate[ iLen ] = '\0'; } } void CChatMessage::_GetTime(void) { int iLen = 1 + GetTimeFormat( LOCALE_USER_DEFAULT, // locale for which time is to be formatted 0, // flags specifying function options NULL, // time to be formatted NULL, // time format string NULL, // buffer for storing formatted string 0 // size, in bytes or characters, of the buffer ); m_szTime = new TCHAR[ iLen ]; ASSERT( m_szTime ); if( 0 == (iLen = GetTimeFormat( LOCALE_USER_DEFAULT, // locale for which time is to be formatted 0, // flags specifying function options NULL, // time to be formatted NULL, // time format string m_szTime, // buffer for storing formatted string iLen // size, in bytes or characters, of the buffer ) ) ) { DWORD dw = GetLastError(); WARNING_OUT(( TEXT("CChatMessage::_GetTime: Can not get time") )); } else { m_szTime[ iLen ] = '\0'; } }