/*++ Copyright (C) 1996-2000 Microsoft Corporation Module Name: logsrc.cpp Abstract: --*/ #include "polyline.h" #include "unihelpr.h" #include "logsrc.h" // Construction/Destruction CLogFileItem::CLogFileItem ( CSysmonControl *pCtrl ) : m_cRef ( 0 ), m_pCtrl ( pCtrl ), m_pImpIDispatch ( NULL ), m_pNextItem ( NULL ), m_szPath ( NULL ) /*++ Routine Description: Constructor for the CLogFileItem class. It initializes the member variables. Arguments: None. Return Value: None. --*/ { return; } CLogFileItem::~CLogFileItem ( VOID ) /*++ Routine Description: Destructor for the CLogFileItem class. It frees any objects, storage, and interfaces that were created. If the item is part of a query it is removed from the query. Arguments: None. Return Value: None. --*/ { if ( NULL != m_szPath ) delete m_szPath; if ( NULL != m_pImpIDispatch ) delete m_pImpIDispatch; } HRESULT CLogFileItem::Initialize ( LPCTSTR pszPath, CLogFileItem** pListHead ) { HRESULT hr = E_POINTER; WCHAR* pszNewPath = NULL; USES_CONVERSION if ( NULL != pszPath ) { if ( _T('\0') != (TCHAR)(*pszPath) ) { pszNewPath = new WCHAR [lstrlen(pszPath) + 1]; if ( NULL != pszNewPath ) { lstrcpyW ( pszNewPath, T2W(pszPath) ); m_szPath = pszNewPath; hr = S_OK; } else { hr = E_OUTOFMEMORY; } } else { hr = E_INVALIDARG; } } if ( SUCCEEDED ( hr ) ) { m_pNextItem = *pListHead; *pListHead = this; } return hr; } HRESULT CLogFileItem::SaveToStream ( IN LPSTREAM pIStream, IN BOOL, // fWildCard, IN INT iVersMaj, IN INT // iVersMin ) /*++ Routine Description: SaveToStream writes the log source's properties to the provided stream. Arguments: pIStream - Pointer to stream interface Return Value: HRESULT - S_OK or stream error --*/ { HRESULT hr = NOERROR; // TodoLogFiles: Wildcard support if ( SMONCTRL_MAJ_VERSION == iVersMaj ) { LOGFILE_DATA ItemData; // Move properties to storage structure ItemData.m_nPathLength = lstrlen(m_szPath); assert ( 0 < ItemData.m_nPathLength ); // Write structure to stream hr = pIStream->Write(&ItemData, sizeof(ItemData), NULL); if (FAILED(hr)) return hr; // Write path name to stream hr = pIStream->Write(m_szPath, ItemData.m_nPathLength*sizeof(WCHAR), NULL); if (FAILED(hr)) return hr; } return S_OK; } HRESULT CLogFileItem::NullItemToStream ( IN LPSTREAM pIStream, IN INT,// iVersMaj, IN INT // iVersMin ) /*++ Routine Description: NulItemToStream writes a log file item structiure with a 0 path length to the stream. This is used to marked the end of the log file data in the control's saved state. Arguments: pIStream - Pointer to stream interface Return Value: HRESULT - S_OK or stream error --*/ { LOGFILE_DATA ItemData; // Zero path length, other fields needn't be initialized ItemData.m_nPathLength = 0; // Write structure to stream return pIStream->Write(&ItemData, sizeof(ItemData), NULL); } HRESULT CLogFileItem::SaveToPropertyBag ( IN IPropertyBag* pIPropBag, IN INT iIndex, IN INT, // iVersMaj, IN INT // iVersMin ) /*++ Routine Description: SaveToPropertyBag writes the log file item's properties to the provided property bag interface. Arguments: pIPropBag - Pointer to property bag interface fWildCard iVersMaj iVersMin Return Value: HRESULT - S_OK or property bag error --*/ { HRESULT hr = S_OK; TCHAR szPropertyName[20]; DWORD dwPropertyNameLength; LPTSTR pszNext; USES_CONVERSION // TodoLogFiles: Wildcard support // Write properties // Write path name _stprintf ( szPropertyName, _T("%s%05d."), _T("LogFile"), iIndex ); dwPropertyNameLength = lstrlen (szPropertyName); pszNext = szPropertyName + dwPropertyNameLength; lstrcpy ( pszNext, _T("Path") ); hr = StringToPropertyBag ( pIPropBag, szPropertyName, m_szPath ); return hr; } /* * CLogFileItem::QueryInterface * CLogFileItem::AddRef * CLogFileItem::Release */ STDMETHODIMP CLogFileItem::QueryInterface(REFIID riid , LPVOID *ppv) { HRESULT hr = NOERROR; if ( NULL != ppv ) { *ppv = NULL; if (riid == IID_ILogFileItem || riid == IID_IUnknown) { *ppv = this; } else if (riid == DIID_DILogFileItem) { if (m_pImpIDispatch == NULL) { m_pImpIDispatch = new CImpIDispatch(this, this); if ( NULL != m_pImpIDispatch ) { m_pImpIDispatch->SetInterface(DIID_DILogFileItem, this); *ppv = m_pImpIDispatch; } else { hr = E_OUTOFMEMORY; } } else { *ppv = m_pImpIDispatch; } } else { hr = E_NOINTERFACE; } if ( SUCCEEDED ( hr ) ) { ((LPUNKNOWN)*ppv)->AddRef(); } } else { hr = E_POINTER; } return hr; } STDMETHODIMP_(ULONG) CLogFileItem::AddRef(void) { return ++m_cRef; } STDMETHODIMP_(ULONG) CLogFileItem::Release(void) { if ( 0 == --m_cRef ) { delete this; return 0; } return m_cRef; } STDMETHODIMP CLogFileItem::get_Path ( OUT BSTR* pstrPath ) { HRESULT hr = E_POINTER; if ( NULL != pstrPath ) { *pstrPath = SysAllocString ( m_szPath ); if ( NULL == *pstrPath ) { hr = E_OUTOFMEMORY; } else { hr = NOERROR; } } return hr; } CLogFileItem* CLogFileItem::Next ( void ) { return m_pNextItem; } void CLogFileItem::SetNext ( CLogFileItem* pNext ) { m_pNextItem = pNext; } LPCWSTR CLogFileItem::GetPath ( void ) { return m_szPath; }