You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1213 lines
30 KiB
1213 lines
30 KiB
/*++
|
|
|
|
Copyright (c) 1998 Microsoft Corporation
|
|
|
|
Module Name :
|
|
logscripting.cpp
|
|
|
|
Abstract:
|
|
LogScripting.cpp : Implementation of CLogScripting
|
|
Automation compatible logging interface
|
|
|
|
Author:
|
|
|
|
Saurab Nog ( saurabn ) 01-Feb-1998
|
|
|
|
Project:
|
|
|
|
IIS Logging 5.0
|
|
|
|
--*/
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "script.h"
|
|
|
|
#include <initguid.h>
|
|
#include <InetCom.h>
|
|
#include <LogType.h>
|
|
#include <ILogObj.hxx>
|
|
|
|
#include <limits.h>
|
|
|
|
#include <iadmw.h>
|
|
#include <iiscnfg.h>
|
|
|
|
#include <atlimpl.cpp>
|
|
|
|
#include "LogScripting.h"
|
|
|
|
|
|
const int MB_TIMEOUT = 5000;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CLogScripting
|
|
|
|
|
|
CLogScripting::CLogScripting(VOID)
|
|
:
|
|
m_iNumPlugins ( -1),
|
|
m_iReadPlugin ( -1),
|
|
m_iWritePlugin ( -1),
|
|
m_pPluginInfo ( NULL),
|
|
m_fDirectory ( false),
|
|
m_fEndOfReadRecords ( true),
|
|
m_StartDateTime ( LONG_MIN),
|
|
m_EndDateTime ( LONG_MAX),
|
|
m_hDirSearchHandle ( INVALID_HANDLE_VALUE)
|
|
{
|
|
m_wcsReadFileName[0] = 0;
|
|
m_wcsReadDirectoryName[0] = 0;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
HRESULT CLogScripting::FinalConstruct()
|
|
{
|
|
m_pMBCom = NULL;
|
|
|
|
::CoCreateInstance(GETAdminBaseCLSID(TRUE), NULL, CLSCTX_LOCAL_SERVER,
|
|
IID_IMSAdminBase, (void **)(&m_pMBCom));
|
|
|
|
if (m_pMBCom)
|
|
{
|
|
CreateAllPlugins();
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
void CLogScripting::FinalRelease()
|
|
{
|
|
if ( m_pMBCom )
|
|
{
|
|
m_pMBCom->Release();
|
|
m_pMBCom = NULL;
|
|
}
|
|
|
|
for(int i=0; i< m_iNumPlugins; i++)
|
|
{
|
|
if ( NULL != m_pPluginInfo[i].pILogScripting)
|
|
{
|
|
m_pPluginInfo[i].pILogScripting->CloseLogFiles(AllOpenFiles);
|
|
m_pPluginInfo[i].pILogScripting->Release();
|
|
m_pPluginInfo[i].pILogScripting = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Private Methods of CLogScripting
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
int CLogScripting:: CreateAllPlugins()
|
|
{
|
|
int i,j = 0;
|
|
HRESULT hr;
|
|
|
|
typedef ILogScripting *pILogScripting;
|
|
|
|
m_iNumPlugins = 0;
|
|
|
|
if (GetListOfAvailablePlugins() && (m_iNumPlugins > 0))
|
|
{
|
|
//
|
|
// Load all the plugins
|
|
//
|
|
|
|
for (i=j=0; i<m_iNumPlugins; i++)
|
|
{
|
|
hr = ::CoCreateInstance(m_pPluginInfo[i].clsid, NULL, CLSCTX_INPROC_SERVER,
|
|
IID_ILogScripting, (void **)(& m_pPluginInfo[i].pILogScripting));
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
j++;
|
|
}
|
|
else
|
|
{
|
|
m_pPluginInfo[i].pILogScripting = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
return j; // Number of plugins successfully created.
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
bool CLogScripting::GetListOfAvailablePlugins()
|
|
{
|
|
USES_CONVERSION;
|
|
|
|
m_pPluginInfo = new PLUGIN_INFO[4];
|
|
|
|
if( m_pPluginInfo == NULL )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
wcscpy(m_pPluginInfo[0].wcsFriendlyName, L"NCSA Common Log File Format");
|
|
CLSIDFromString(A2W(NCSALOG_CLSID), &m_pPluginInfo[0].clsid);
|
|
|
|
wcscpy(m_pPluginInfo[1].wcsFriendlyName, L"ODBC Logging");
|
|
CLSIDFromString(A2W(ODBCLOG_CLSID), &m_pPluginInfo[1].clsid);
|
|
|
|
wcscpy(m_pPluginInfo[2].wcsFriendlyName, L"Microsoft IIS Log File Format");
|
|
CLSIDFromString(A2W(ASCLOG_CLSID), &m_pPluginInfo[2].clsid);
|
|
|
|
wcscpy(m_pPluginInfo[3].wcsFriendlyName, L"W3C Extended Log File Format");
|
|
CLSIDFromString(A2W(EXTLOG_CLSID), &m_pPluginInfo[3].clsid);
|
|
|
|
m_iNumPlugins = 4;
|
|
|
|
return true;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
bool CLogScripting::GetNextFileName()
|
|
{
|
|
|
|
WIN32_FIND_DATAW stFindFileData;
|
|
PFileListEntry pFileInfo;
|
|
|
|
if (NULL == m_hDirSearchHandle)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (INVALID_HANDLE_VALUE == m_hDirSearchHandle)
|
|
{
|
|
//
|
|
// This is the first/new call. Clean up file Q by removing old file information.
|
|
//
|
|
|
|
while(! m_fQueue.empty())
|
|
{
|
|
pFileInfo = m_fQueue.top();
|
|
m_fQueue.pop();
|
|
delete pFileInfo;
|
|
}
|
|
|
|
//
|
|
// Loop till we enumerate all files in this directory
|
|
//
|
|
|
|
WCHAR wcsSearchPath[MAX_PATH+1];
|
|
|
|
wcscpy(wcsSearchPath, m_wcsReadDirectoryName);
|
|
wcscat(wcsSearchPath, L"\\*");
|
|
|
|
if (m_hDirSearchHandle)
|
|
{
|
|
FindClose(m_hDirSearchHandle);
|
|
}
|
|
|
|
m_hDirSearchHandle = FindFirstFileW(wcsSearchPath, &stFindFileData);
|
|
|
|
do
|
|
{
|
|
if (! (stFindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
|
{
|
|
pFileInfo = new FileListEntry;
|
|
|
|
pFileInfo->Copy(stFindFileData);
|
|
m_fQueue.push(pFileInfo);
|
|
}
|
|
}
|
|
while ( FindNextFileW(m_hDirSearchHandle, &stFindFileData) );
|
|
}
|
|
|
|
|
|
//
|
|
// Pop the lowest timestamp file
|
|
//
|
|
|
|
pFileInfo = NULL;
|
|
|
|
if (! m_fQueue.empty())
|
|
{
|
|
pFileInfo = m_fQueue.top();
|
|
m_fQueue.pop();
|
|
}
|
|
|
|
if (NULL == pFileInfo)
|
|
{
|
|
//
|
|
// We have run out of files or some error occured. Prevent another search.
|
|
//
|
|
|
|
FindClose(m_hDirSearchHandle);
|
|
m_hDirSearchHandle = NULL;
|
|
m_wcsReadFileName[0] = 0;
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
wcscpy(m_wcsReadFileName, m_wcsReadDirectoryName);
|
|
wcscat(m_wcsReadFileName, L"\\");
|
|
wcscat(m_wcsReadFileName, pFileInfo->wcsFileName);
|
|
delete pFileInfo;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
int CLogScripting::ParseLogFile()
|
|
{
|
|
|
|
if (m_wcsReadFileName[0] == 0)
|
|
{
|
|
return INVALID_PLUGIN;
|
|
}
|
|
|
|
//
|
|
// Linear search thru all plugins
|
|
//
|
|
|
|
for(int i=0; i < m_iNumPlugins; i++)
|
|
{
|
|
if ( m_pPluginInfo[i].pILogScripting != NULL )
|
|
{
|
|
m_pPluginInfo[i].pILogScripting->OpenLogFile(
|
|
W2BSTR(m_wcsReadFileName),
|
|
ForReading,
|
|
L"",
|
|
0,
|
|
L""
|
|
);
|
|
|
|
if ( SUCCEEDED(m_pPluginInfo[i].pILogScripting->ReadLogRecord()) )
|
|
{
|
|
return i;
|
|
}
|
|
|
|
m_pPluginInfo[i].pILogScripting->CloseLogFiles(ForReading);
|
|
}
|
|
}
|
|
|
|
//
|
|
// None of the registered plugins knows how to read the log file. Sorry !!
|
|
//
|
|
|
|
return INVALID_PLUGIN;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
HRESULT CLogScripting::InternalReadLogRecord()
|
|
{
|
|
DATE logDateTime = 0;
|
|
HRESULT hr = HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS);
|
|
|
|
if (!m_fDirectory)
|
|
{
|
|
//
|
|
// Simple case. Not a directory.
|
|
//
|
|
|
|
if ( INVALID_PLUGIN == m_iReadPlugin )
|
|
{
|
|
//
|
|
// First use. Find a plugin to read the file.
|
|
//
|
|
|
|
if ( (m_iReadPlugin = ParseLogFile()) != INVALID_PLUGIN)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Read next record
|
|
//
|
|
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->ReadLogRecord();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Directory case
|
|
//
|
|
|
|
if (m_iReadPlugin != INVALID_PLUGIN)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->ReadLogRecord();
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
goto returnlabel;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Either this is the first use or the last read failed
|
|
//
|
|
|
|
while (GetNextFileName())
|
|
{
|
|
if ( (m_iReadPlugin = ParseLogFile()) != INVALID_PLUGIN)
|
|
{
|
|
hr = S_OK;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
returnlabel:
|
|
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Methods of ILogRead
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::OpenLogFile(
|
|
BSTR szLogFileName,
|
|
IOMode Mode,
|
|
BSTR szServiceName,
|
|
long iServiceInstance,
|
|
BSTR szOutputLogFileFormat
|
|
)
|
|
{
|
|
DWORD dwFileAttrib;
|
|
HRESULT hr = E_INVALIDARG;
|
|
WCHAR szFilePath[MAX_PATH+1];
|
|
|
|
BOOL fHasFileName = (( NULL != szLogFileName) && ( 0 != szLogFileName[0]));
|
|
BOOL fHasServiceName = (( NULL != szServiceName) && ( 0 != szServiceName[0]));
|
|
|
|
BOOL fHasOutputFormatName = (( NULL != szOutputLogFileFormat) &&
|
|
( 0 != szOutputLogFileFormat[0]));
|
|
|
|
CloseLogFiles(Mode);
|
|
|
|
if (ForReading == Mode)
|
|
{
|
|
//
|
|
// If the File Name isn't specified but Service Name & ID are, get
|
|
// the appropriate log directory and use that as the log file name.
|
|
//
|
|
|
|
if ( (!fHasFileName) && fHasServiceName && ( 0 != iServiceInstance))
|
|
{
|
|
|
|
METADATA_HANDLE hMeta = NULL;
|
|
METADATA_RECORD mdRecord;
|
|
WCHAR szTemp[MAX_PATH+1] = L"/LM/";
|
|
DWORD dwRequiredLen;
|
|
|
|
if (m_pMBCom == NULL)
|
|
{
|
|
hr = E_FAIL;
|
|
goto cleanup;
|
|
}
|
|
|
|
if (wcslen(szServiceName) > MAX_PATH+1 - sizeof("/LM//4294967296"))
|
|
{
|
|
hr = E_INVALIDARG;
|
|
goto cleanup;
|
|
}
|
|
wcscat(szTemp, szServiceName);
|
|
wcscat(szTemp, L"/");
|
|
_ltow(iServiceInstance, szTemp+wcslen(szTemp),10);
|
|
|
|
hr = m_pMBCom->OpenKey( METADATA_MASTER_ROOT_HANDLE, szTemp,
|
|
METADATA_PERMISSION_READ, MB_TIMEOUT, &hMeta);
|
|
|
|
if ( FAILED(hr))
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
//
|
|
// prepare the metadata record for reading
|
|
//
|
|
|
|
mdRecord.dwMDIdentifier = MD_LOGFILE_DIRECTORY;
|
|
mdRecord.dwMDAttributes = METADATA_INHERIT;
|
|
mdRecord.dwMDUserType = IIS_MD_UT_SERVER;
|
|
mdRecord.dwMDDataType = EXPANDSZ_METADATA;
|
|
mdRecord.pbMDData = (PBYTE)szTemp;
|
|
mdRecord.dwMDDataLen = MAX_PATH;
|
|
|
|
hr = m_pMBCom->GetData(hMeta, L"", &mdRecord, &dwRequiredLen);
|
|
m_pMBCom->CloseKey(hMeta);
|
|
|
|
if ( FAILED(hr))
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
//
|
|
// Expand system variables used in this path.
|
|
//
|
|
|
|
if (ExpandEnvironmentStringsW(szTemp, szFilePath, MAX_PATH+1) != 0)
|
|
{
|
|
if ( wcslen(szFilePath) > MAX_PATH-wcslen(szServiceName)-10 )
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto cleanup;
|
|
}
|
|
|
|
wcscat(szFilePath,L"\\");
|
|
wcscat(szFilePath,szServiceName);
|
|
_ltow(iServiceInstance, szFilePath+wcslen(szFilePath),10);
|
|
wcscat(szFilePath,L"\\");
|
|
szLogFileName = szFilePath;
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// At this point szLogFileName should be defined.
|
|
//
|
|
|
|
hr = E_INVALIDARG;
|
|
|
|
if ( (NULL == szLogFileName ) || ( 0 == szLogFileName[0]) ||
|
|
((ForReading != Mode ) && (ForWriting != Mode))
|
|
)
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
if (ForReading == Mode)
|
|
{
|
|
//
|
|
// Reset EOF flag
|
|
//
|
|
|
|
m_fEndOfReadRecords = false;
|
|
|
|
//
|
|
// Check if this is a valid file and/or a directory
|
|
//
|
|
|
|
if ( 0xFFFFFFFF != (dwFileAttrib = GetFileAttributesW(szLogFileName)) )
|
|
{
|
|
if (dwFileAttrib & FILE_ATTRIBUTE_DIRECTORY)
|
|
{
|
|
// This is a directory
|
|
|
|
m_fDirectory = true;
|
|
wcscpy(m_wcsReadDirectoryName, szLogFileName);
|
|
}
|
|
else
|
|
{
|
|
wcscpy(m_wcsReadFileName, szLogFileName);
|
|
}
|
|
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
// couldn't get file attributes. check for error code
|
|
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Find the correct plugin & set the value. If user didn't specify file format use W3C
|
|
//
|
|
|
|
if ( ( NULL == szOutputLogFileFormat) ||
|
|
( 0 == *szOutputLogFileFormat)
|
|
)
|
|
{
|
|
//
|
|
// Search based on the clsid of W3C Logging
|
|
//
|
|
|
|
for(int i=0; i< m_iNumPlugins; i++)
|
|
{
|
|
if ( (CLSID_EXTLOG == m_pPluginInfo[i].clsid) &&
|
|
(NULL != m_pPluginInfo[i].pILogScripting)
|
|
)
|
|
{
|
|
m_iWritePlugin = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
//
|
|
// Search based on format name provided by the user
|
|
//
|
|
|
|
for(int i=0; i< m_iNumPlugins; i++)
|
|
{
|
|
if ( (0 == _wcsicmp(m_pPluginInfo[i].wcsFriendlyName,
|
|
szOutputLogFileFormat)) &&
|
|
(NULL != m_pPluginInfo[i].pILogScripting)
|
|
)
|
|
{
|
|
m_iWritePlugin = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (0 <= m_iWritePlugin)
|
|
{
|
|
hr = m_pPluginInfo[m_iWritePlugin].pILogScripting->OpenLogFile(
|
|
W2BSTR(szLogFileName),
|
|
Mode,
|
|
L"",
|
|
0,
|
|
L"");
|
|
}
|
|
}
|
|
|
|
cleanup:
|
|
|
|
/*
|
|
fix for bug 364649:
|
|
No need to do that becuase oleaut does some thicks with mem allocation and free.
|
|
That's true for both cscirtp and ASP, so I choose to remove these deltions. Even if
|
|
I am wrong, and it necesasry to free somehow that string, it is better to leak ~20 bytes than
|
|
AV or currupt memory while deleting what was not allocated by sysallocstring
|
|
|
|
if (fHasFileName)
|
|
{
|
|
SysFreeString(szLogFileName);
|
|
}
|
|
if (fHasServiceName)
|
|
{
|
|
SysFreeString(szServiceName);
|
|
}
|
|
if (fHasOutputFormatName)
|
|
{
|
|
SysFreeString(szOutputLogFileFormat);
|
|
}
|
|
*/
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::CloseLogFiles(IOMode Mode)
|
|
{
|
|
if ((ForReading == Mode) || (AllOpenFiles == Mode))
|
|
{
|
|
if (m_iReadPlugin != INVALID_PLUGIN)
|
|
{
|
|
m_pPluginInfo[m_iReadPlugin].pILogScripting->CloseLogFiles(ForReading);
|
|
}
|
|
|
|
m_iReadPlugin = INVALID_PLUGIN; // Reset Plugin in Use
|
|
m_fDirectory = false;
|
|
m_hDirSearchHandle = INVALID_HANDLE_VALUE; // Reset Search Handle
|
|
m_wcsReadFileName[0] = 0;
|
|
m_wcsReadDirectoryName[0] = 0;
|
|
}
|
|
|
|
if ((ForWriting == Mode) || (AllOpenFiles == Mode))
|
|
{
|
|
if (m_iWritePlugin != INVALID_PLUGIN)
|
|
{
|
|
m_pPluginInfo[m_iWritePlugin].pILogScripting->CloseLogFiles(ForWriting);
|
|
}
|
|
|
|
m_iWritePlugin = INVALID_PLUGIN; // Reset Plugin in Use
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::ReadFilter( DATE startDateTime, DATE endDateTime)
|
|
{
|
|
m_StartDateTime = startDateTime;
|
|
m_EndDateTime = endDateTime;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::ReadLogRecord()
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
VARIANT logDateTime = {0};
|
|
|
|
if ( m_fEndOfReadRecords )
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// Read the next record. Only return records between the start & end times.
|
|
//
|
|
|
|
while ( SUCCEEDED( hr = InternalReadLogRecord() ) )
|
|
{
|
|
if ( SUCCEEDED(m_pPluginInfo[m_iReadPlugin].pILogScripting->get_DateTime(&logDateTime)) )
|
|
{
|
|
if ( (m_StartDateTime > logDateTime.date) || (m_EndDateTime < logDateTime.date))
|
|
{
|
|
//
|
|
// Read next record
|
|
//
|
|
|
|
continue;
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
if ( FAILED(hr))
|
|
{
|
|
m_fEndOfReadRecords = true;
|
|
hr = S_OK;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::AtEndOfLog(VARIANT_BOOL *pfEndOfRead)
|
|
{
|
|
DBG_ASSERT( NULL != pfEndOfRead);
|
|
|
|
*pfEndOfRead = m_fEndOfReadRecords;
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::WriteLogRecord(ILogScripting * pILogScripting)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pILogScripting);
|
|
|
|
if (m_iWritePlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iWritePlugin].pILogScripting->WriteLogRecord(pILogScripting);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_DateTime(VARIANT * pvarDateTime)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarDateTime);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarDateTime->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_DateTime(pvarDateTime);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_ServiceName(VARIANT * pvarServiceName)
|
|
{
|
|
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarServiceName);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarServiceName->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_ServiceName(pvarServiceName);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_ServerName(VARIANT * pvarServerName)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarServerName);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarServerName->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_ServerName(pvarServerName);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_ClientIP(VARIANT * pvarClientIP)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarClientIP);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarClientIP->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_ClientIP(pvarClientIP);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_UserName(VARIANT * pvarUserName)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarUserName);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarUserName->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_UserName(pvarUserName);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_ServerIP(VARIANT * pvarServerIP)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarServerIP);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarServerIP->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_ServerIP(pvarServerIP);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_Method(VARIANT * pvarMethod)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarMethod);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarMethod->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_Method(pvarMethod);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_URIStem(VARIANT * pvarURIStem)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarURIStem);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarURIStem->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_URIStem(pvarURIStem);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_URIQuery(VARIANT * pvarURIQuery)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarURIQuery);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarURIQuery->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_URIQuery(pvarURIQuery);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_TimeTaken(VARIANT * pvarTimeTaken)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarTimeTaken);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarTimeTaken->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_TimeTaken(pvarTimeTaken);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_BytesSent(VARIANT * pvarBytesSent)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarBytesSent);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarBytesSent->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_BytesSent(pvarBytesSent);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_BytesReceived(VARIANT * pvarBytesReceived)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarBytesReceived);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarBytesReceived->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_BytesReceived(pvarBytesReceived);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_Win32Status(VARIANT * pvarWin32Status)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarWin32Status);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarWin32Status->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_Win32Status(pvarWin32Status);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_ProtocolStatus(VARIANT * pvarProtocolStatus)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarProtocolStatus);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarProtocolStatus->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_ProtocolStatus(pvarProtocolStatus);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_ServerPort(VARIANT * pvarServerPort)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarServerPort);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarServerPort->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_ServerPort(pvarServerPort);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_ProtocolVersion(VARIANT * pvarProtocolVersion)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarProtocolVersion);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarProtocolVersion->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_ProtocolVersion(pvarProtocolVersion);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_UserAgent(VARIANT * pvarUserAgent)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarUserAgent);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarUserAgent->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_UserAgent(pvarUserAgent);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_Cookie(VARIANT * pvarCookie)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarCookie);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarCookie->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_Cookie(pvarCookie);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_Referer(VARIANT * pvarReferer)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarReferer);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarReferer->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_Referer(pvarReferer);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|
|
STDMETHODIMP
|
|
CLogScripting::get_CustomFields(VARIANT * pvarCustomFieldsArray)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
DBG_ASSERT( NULL != pvarCustomFieldsArray);
|
|
|
|
if (m_fEndOfReadRecords)
|
|
{
|
|
pvarCustomFieldsArray->vt = VT_NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
if (m_iReadPlugin >= 0)
|
|
{
|
|
hr = m_pPluginInfo[m_iReadPlugin].pILogScripting->get_CustomFields(pvarCustomFieldsArray);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
/* ************************************************************************* */
|
|
|