119 lines
2.5 KiB
C++
119 lines
2.5 KiB
C++
//
|
|
|
|
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
// ***************************************************************************
|
|
//
|
|
// Original Author: Rajesh Rao
|
|
//
|
|
// $Author: rajeshr $
|
|
// $Date: 6/11/98 4:43p $
|
|
// $Workfile:refcount.cpp $
|
|
//
|
|
// $Modtime: 6/11/98 11:21a $
|
|
// $Revision: 1 $
|
|
// $Nokeywords: $
|
|
//
|
|
//
|
|
// Description: Contains the imlementation for a basic reference counted object
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include "precomp.h"
|
|
|
|
CRefCountedObject::CRefCountedObject() :
|
|
m_dwRefCount ( 1 ),
|
|
m_lpszName ( NULL ),
|
|
m_CreationTime ( 0 ),
|
|
m_LastAccessTime ( 0 )
|
|
{
|
|
// Initialize the critical section
|
|
InitializeCriticalSection(&m_ReferenceCountSection);
|
|
|
|
FILETIME fileTime;
|
|
GetSystemTimeAsFileTime(&fileTime);
|
|
LARGE_INTEGER creationTime;
|
|
memcpy((LPVOID)&creationTime, (LPVOID)&fileTime, sizeof LARGE_INTEGER);
|
|
m_CreationTime = creationTime.QuadPart;
|
|
m_LastAccessTime = creationTime.QuadPart;
|
|
}
|
|
|
|
CRefCountedObject::CRefCountedObject(LPCWSTR lpszName) :
|
|
m_dwRefCount ( 1 ),
|
|
m_lpszName ( NULL ),
|
|
m_CreationTime ( 0 ),
|
|
m_LastAccessTime ( 0 )
|
|
{
|
|
// Initialize the critical section
|
|
InitializeCriticalSection(&m_ReferenceCountSection);
|
|
|
|
if(lpszName)
|
|
{
|
|
try
|
|
{
|
|
m_lpszName = new WCHAR[wcslen(lpszName) + 1];
|
|
wcscpy(m_lpszName, lpszName);
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( m_lpszName )
|
|
{
|
|
delete [] m_lpszName;
|
|
m_lpszName = NULL;
|
|
}
|
|
|
|
DeleteCriticalSection(&m_ReferenceCountSection);
|
|
|
|
throw;
|
|
}
|
|
}
|
|
|
|
FILETIME fileTime;
|
|
GetSystemTimeAsFileTime(&fileTime);
|
|
LARGE_INTEGER creationTime;
|
|
memcpy((LPVOID)&creationTime, (LPVOID)&fileTime, sizeof LARGE_INTEGER);
|
|
m_CreationTime = creationTime.QuadPart;
|
|
}
|
|
|
|
CRefCountedObject::~CRefCountedObject()
|
|
{
|
|
delete[] m_lpszName;
|
|
|
|
// Destroy the critical section
|
|
DeleteCriticalSection(&m_ReferenceCountSection);
|
|
}
|
|
|
|
|
|
void CRefCountedObject::AddRef()
|
|
{
|
|
EnterCriticalSection(&m_ReferenceCountSection);
|
|
m_dwRefCount ++;
|
|
LeaveCriticalSection(&m_ReferenceCountSection);
|
|
}
|
|
|
|
void CRefCountedObject::Release()
|
|
{
|
|
EnterCriticalSection(&m_ReferenceCountSection);
|
|
DWORD dwCount = --m_dwRefCount;
|
|
LeaveCriticalSection(&m_ReferenceCountSection);
|
|
|
|
if( dwCount == 0)
|
|
delete this;
|
|
}
|
|
|
|
LPCWSTR CRefCountedObject::GetName()
|
|
{
|
|
return m_lpszName;
|
|
}
|
|
|
|
void CRefCountedObject::SetName(LPCWSTR lpszName)
|
|
{
|
|
delete[] m_lpszName;
|
|
if(lpszName)
|
|
{
|
|
m_lpszName = new WCHAR[wcslen(lpszName) + 1];
|
|
wcscpy(m_lpszName, lpszName);
|
|
}
|
|
else
|
|
m_lpszName = NULL;
|
|
} |