|
|
// sessions.cpp : Implementation of CnntpadmApp and DLL registration.
#include "stdafx.h"
#include "nntpcmn.h"
#include "oleutil.h"
#include "sessions.h"
#include "nntptype.h"
#include "nntpapi.h"
#include <lmapibuf.h>
// Must define THIS_FILE_* macros to use NntpCreateException()
#define THIS_FILE_HELP_CONTEXT 0
#define THIS_FILE_PROG_ID _T("Nntpadm.Sessions.1")
#define THIS_FILE_IID IID_INntpAdminSessions
/////////////////////////////////////////////////////////////////////////////
//
//
// Use a macro to define all the default methods
//
DECLARE_METHOD_IMPLEMENTATION_FOR_STANDARD_EXTENSION_INTERFACES(NntpAdminSessions, CNntpAdminSessions, IID_INntpAdminSessions)
STDMETHODIMP CNntpAdminSessions::InterfaceSupportsErrorInfo(REFIID riid) { static const IID* arr[] = { &IID_INntpAdminSessions, };
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++) { if (InlineIsEqualGUID(*arr[i],riid)) return S_OK; } return S_FALSE; }
CNntpAdminSessions::CNntpAdminSessions () : m_cCount ( 0 ), m_dwIpAddress ( 0 ), m_dwPort ( 0 ), m_dwAuthenticationType ( 0 ), m_fIsAnonymous ( FALSE ), m_dateStartTime ( 0 ), m_pSessionInfo ( NULL ), m_fSetCursor ( FALSE ) // CComBSTR's are initialized to NULL by default.
{ InitAsyncTrace ( );
m_iadsImpl.SetService ( MD_SERVICE_NAME ); m_iadsImpl.SetName ( _T("Sessions") ); m_iadsImpl.SetClass ( _T("IIsNntpSessions") ); }
CNntpAdminSessions::~CNntpAdminSessions () { if ( m_pSessionInfo ) { NetApiBufferFree ( m_pSessionInfo ); }
// All CComBSTR's are freed automatically.
TermAsyncTrace ( ); }
//
// IADs methods:
//
DECLARE_SIMPLE_IADS_IMPLEMENTATION(CNntpAdminSessions,m_iadsImpl)
//
// Properties:
//
STDMETHODIMP CNntpAdminSessions::get_Count ( long * plCount ) { // Count should check to be sure the client enumerated.
return StdPropertyGet ( m_cCount, plCount ); }
STDMETHODIMP CNntpAdminSessions::get_Username ( BSTR * pstrUsername ) { return StdPropertyGet ( m_strUsername, pstrUsername ); }
STDMETHODIMP CNntpAdminSessions::put_Username ( BSTR strUsername ) { _ASSERT ( strUsername ); _ASSERT ( IS_VALID_STRING ( strUsername ) );
if ( strUsername == NULL ) { return E_POINTER; }
if ( lstrcmp ( strUsername, _T("") ) == 0 ) { m_strUsername.Empty();
return NOERROR; } else { return StdPropertyPut ( &m_strUsername, strUsername ); } }
STDMETHODIMP CNntpAdminSessions::get_IpAddress ( BSTR * pstrIpAddress ) { return StdPropertyGet ( m_strIpAddress, pstrIpAddress ); }
STDMETHODIMP CNntpAdminSessions::put_IpAddress ( BSTR strIpAddress ) { _ASSERT ( strIpAddress ); _ASSERT ( IS_VALID_STRING ( strIpAddress ) );
if ( strIpAddress == NULL ) { return E_POINTER; }
if ( lstrcmp ( strIpAddress, _T("") ) == 0 ) { m_strIpAddress.Empty(); m_dwIpAddress = 0;
return NOERROR; } else { // The IP Address value has two properties, so keep them in sync.
StringToInetAddress ( strIpAddress, &m_dwIpAddress );
return StdPropertyPut ( &m_strIpAddress, strIpAddress ); } }
STDMETHODIMP CNntpAdminSessions::get_IntegerIpAddress ( long * plIpAddress ) { return StdPropertyGet ( m_dwIpAddress, plIpAddress ); }
STDMETHODIMP CNntpAdminSessions::put_IntegerIpAddress ( long lIpAddress ) { HRESULT hr = NOERROR; WCHAR wszAddress[100]; DWORD dwOldIpAddress = m_dwIpAddress;
hr = StdPropertyPut ( &m_dwIpAddress, lIpAddress );
if ( FAILED (hr) ) { goto Exit; }
// The IP Address value has two properties, so keep them in sync.
if ( !InetAddressToString ( lIpAddress, wszAddress, 100 ) ) { hr = E_FAIL; goto Exit; }
m_strIpAddress = wszAddress;
if ( m_strIpAddress == NULL ) { hr = E_OUTOFMEMORY; goto Exit; }
Exit:
if ( FAILED (hr) ) { // We failed, so put back the old IP address:
m_dwIpAddress = dwOldIpAddress; }
return hr; }
STDMETHODIMP CNntpAdminSessions::get_Port ( long * plPort ) { CHECK_FOR_SET_CURSOR ( m_pSessionInfo != NULL, m_fSetCursor );
return StdPropertyGet ( m_dwPort, plPort ); }
STDMETHODIMP CNntpAdminSessions::get_AuthenticationType ( long * plAuthenticationType ) { CHECK_FOR_SET_CURSOR ( m_pSessionInfo != NULL, m_fSetCursor );
return StdPropertyGet ( m_dwAuthenticationType, plAuthenticationType ); }
STDMETHODIMP CNntpAdminSessions::get_IsAnonymous ( BOOL * pfAnonymous ) { CHECK_FOR_SET_CURSOR ( m_pSessionInfo != NULL, m_fSetCursor );
return StdPropertyGet ( m_fIsAnonymous, pfAnonymous ); }
STDMETHODIMP CNntpAdminSessions::get_StartTime ( DATE * pdateStart ) { CHECK_FOR_SET_CURSOR ( m_pSessionInfo != NULL, m_fSetCursor );
return StdPropertyGet ( m_dateStartTime, pdateStart ); }
//////////////////////////////////////////////////////////////////////
// Methods:
//////////////////////////////////////////////////////////////////////
STDMETHODIMP CNntpAdminSessions::Enumerate ( ) { TraceFunctEnter ( "CNntpAdminSessions::Enumerate" );
// Variables:
HRESULT hr = NOERROR; NET_API_STATUS err;
// Validate Server & Service Instance:
if ( m_iadsImpl.QueryInstance() == 0 ) { return NntpCreateException ( IDS_NNTPEXCEPTION_SERVICE_INSTANCE_CANT_BE_ZERO ); }
// Enumerating loses the cursor:
m_fSetCursor = FALSE;
if ( m_pSessionInfo ) { NetApiBufferFree ( m_pSessionInfo ); }
// Call the enumerate sessions RPC:
err = NntpEnumerateSessions ( m_iadsImpl.QueryComputer(), m_iadsImpl.QueryInstance(), &m_cCount, &m_pSessionInfo );
if ( err != NOERROR ) { hr = RETURNCODETOHRESULT ( err ); goto Exit; }
Exit: TRACE_HRESULT(hr); TraceFunctLeave (); return hr; }
STDMETHODIMP CNntpAdminSessions::GetNth ( long lIndex ) { TraceFunctEnter ( "CNntpAdminSessions::GetNth" );
HRESULT hr = NOERROR; FILETIME ftLocal; SYSTEMTIME st; WCHAR wszUsername[MAX_USER_NAME_LENGTH + 1]; WCHAR wszIpAddress[256]; DWORD cchCopied;
*wszUsername = NULL;
// Did we enumerate first?
if ( m_pSessionInfo == NULL ) {
return NntpCreateException ( IDS_NNTPEXCEPTION_DIDNT_ENUMERATE ); } // Is the index valid?
if ( lIndex < 0 || (DWORD) lIndex >= m_cCount ) { return NntpCreateException ( IDS_NNTPEXCEPTION_INVALID_INDEX ); }
//
// Copy the properties from m_pSessionInfo [ lIndex ] to member variables:
//
// ( CComBSTR handles free-ing of old properties )
FileTimeToLocalFileTime ( &m_pSessionInfo[ lIndex ].SessionStartTime, &ftLocal ); FileTimeToSystemTime ( &ftLocal, &st ); SystemTimeToVariantTime ( &st, &m_dateStartTime );
m_dwIpAddress = m_pSessionInfo[ lIndex ].IPAddress; m_dwAuthenticationType = m_pSessionInfo[ lIndex ].AuthenticationType; m_dwPort = m_pSessionInfo[ lIndex ].PortConnected; m_fIsAnonymous = m_pSessionInfo[ lIndex ].fAnonymous;
cchCopied = MultiByteToWideChar ( CP_ACP, MB_PRECOMPOSED | MB_USEGLYPHCHARS, m_pSessionInfo[ lIndex ].UserName, -1, wszUsername, MAX_USER_NAME_LENGTH );
m_strUsername = wszUsername;
if ( m_strUsername == NULL ) { hr = E_OUTOFMEMORY; goto Exit; }
InetAddressToString ( m_dwIpAddress, wszIpAddress, 256 );
m_strIpAddress = wszIpAddress;
if ( m_strIpAddress == NULL ) { hr = E_OUTOFMEMORY; goto Exit; }
// GetNth sets the cursor:
m_fSetCursor = TRUE;
Exit: TRACE_HRESULT(hr); TraceFunctLeave (); return hr; }
STDMETHODIMP CNntpAdminSessions::Terminate ( ) { TraceFunctEnter ( "CNntpAdminSessions::Terminate" );
HRESULT hr = NOERROR; DWORD err = NOERROR; char szAnsiUsername[ MAX_USER_NAME_LENGTH + 1]; char szAnsiIpAddress[ 50 ]; DWORD cchCopied;
szAnsiUsername[0] = NULL; szAnsiIpAddress[0] = NULL;
// Validate Server & Service Instance:
if ( m_iadsImpl.QueryInstance() == 0 ) { return NntpCreateException ( IDS_NNTPEXCEPTION_SERVICE_INSTANCE_CANT_BE_ZERO ); }
// Check Username & IpAddress parameters:
if ( m_strUsername == NULL && m_strIpAddress == NULL ) { return NntpCreateException ( IDS_NNTPEXCEPTION_MUST_SUPPLY_USERNAME_OR_IPADDRESS ); }
// Translate the username & ipaddress to ANSI.
if ( m_strUsername != NULL ) { cchCopied = WideCharToMultiByte ( CP_ACP, 0, m_strUsername, -1, szAnsiUsername, MAX_USER_NAME_LENGTH, NULL, NULL ); }
if ( m_strIpAddress != NULL ) { cchCopied = WideCharToMultiByte ( CP_ACP, 0, m_strIpAddress, -1, szAnsiIpAddress, 50, NULL, NULL ); }
// Call the TerminateSession RPC:
err = NntpTerminateSession ( m_iadsImpl.QueryComputer(), m_iadsImpl.QueryInstance(), m_strUsername ? szAnsiUsername : NULL, m_strIpAddress ? szAnsiIpAddress : NULL );
if ( err != NOERROR ) { hr = RETURNCODETOHRESULT ( err ); goto Exit; }
Exit: TRACE_HRESULT(hr); TraceFunctLeave (); return hr; }
STDMETHODIMP CNntpAdminSessions::TerminateAll ( ) { TraceFunctEnter ( "CNntpAdminSessions::TerminateAll" );
// Did we enumerate first?
HRESULT hr = NOERROR; DWORD ErrResult = NOERROR; DWORD Err = NOERROR; DWORD i;
// Validate Server & Service Instance:
if ( m_iadsImpl.QueryInstance() == 0 ) { return NntpCreateException ( IDS_NNTPEXCEPTION_SERVICE_INSTANCE_CANT_BE_ZERO ); }
#if 0
// Make sure the user has enumerated:
if ( m_pSessionInfo == NULL ) { return NntpCreateException ( IDS_NNTPEXCEPTION_DIDNT_ENUMERATE ); } #endif
// For Each Session:
for ( i = 0; i < m_cCount; i++ ) {
// Call the terminate session RPC:
Err = NntpTerminateSession ( m_iadsImpl.QueryComputer(), m_iadsImpl.QueryInstance(), m_pSessionInfo[ i ].UserName, NULL );
if ( Err != 0 && ErrResult == 0 ) { ErrResult = Err; } }
if ( ErrResult != NOERROR ) { hr = RETURNCODETOHRESULT ( ErrResult ); goto Exit; }
Exit: TRACE_HRESULT(hr); TraceFunctLeave (); return hr; }
|