|
|
//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995
//
// File: getobj.cxx
//
// Contents: NetWare 3.12 GetObject functionality
//
// History:
//----------------------------------------------------------------------------
#include "NWCOMPAT.hxx"
#pragma hdrstop
//+---------------------------------------------------------------------------
// Function: GetObject
//
// Synopsis: Called by ResolvePathName to return an object
//
// Arguments: [LPWSTR szBuffer]
// [LPVOID *ppObject]
//
// Returns: HRESULT
//
// Modifies: -
//
// History: 11-Jan-96 t-ptam Created.
//
//----------------------------------------------------------------------------
HRESULT GetObject( LPWSTR szBuffer, LPVOID * ppObject ) { OBJECTINFO ObjectInfo; POBJECTINFO pObjectInfo = &ObjectInfo; CLexer Lexer(szBuffer); HRESULT hr = S_OK;
memset(pObjectInfo, 0, sizeof(OBJECTINFO)); hr = Object(&Lexer, pObjectInfo); BAIL_ON_FAILURE(hr);
hr = ValidateProvider(pObjectInfo); BAIL_ON_FAILURE(hr);
if (pObjectInfo->NumComponents >= 1) {
hr = NWApiLoginToServer(pObjectInfo->ComponentArray[0], NULL, NULL) ; BAIL_ON_FAILURE(hr); }
switch (pObjectInfo->ObjectType) { case TOKEN_COMPUTER: hr = GetComputerObject(pObjectInfo, ppObject); break;
case TOKEN_USER: hr = GetUserObject(pObjectInfo, ppObject); break;
case TOKEN_GROUP: hr = GetGroupObject(pObjectInfo, ppObject); break;
case TOKEN_SCHEMA: hr = GetSchemaObject(pObjectInfo, ppObject); break;
case TOKEN_CLASS: hr = GetClassObject(pObjectInfo, ppObject); break;
case TOKEN_PROPERTY: hr = GetPropertyObject(pObjectInfo, ppObject); break;
case TOKEN_SYNTAX: hr = GetSyntaxObject(pObjectInfo, ppObject); break;
case TOKEN_FILESERVICE: hr = GetFileServiceObject(pObjectInfo, ppObject); break;
case TOKEN_FILESHARE: hr = GetFileShareObject(pObjectInfo, ppObject); break;
case TOKEN_PRINTER: hr = GetPrinterObject(pObjectInfo, ppObject); break;
default: hr = HeuristicGetObject(pObjectInfo, ppObject); break; }
error:
FreeObjectInfo( &ObjectInfo, TRUE ); RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: HeuristicGetObject
//
// Synopsis: Get object of yet undetermined type.
//
// Arguments: [POBJECTINFO pObjectInfo]
// [LPVOID *ppObject]
//
// Returns: HRESULT
//
// Modifies:
//
// History: 11-Jan-96 t-ptam Created.
//
//----------------------------------------------------------------------------
HRESULT HeuristicGetObject( POBJECTINFO pObjectInfo, LPVOID * ppObject ) { HRESULT hr = S_OK;
//
// Case 0: No componenet - Namespace object.
//
if (pObjectInfo->NumComponents == 0) { RRETURN(GetNamespaceObject(pObjectInfo, ppObject)); }
//
// Case 1: Single component - Computer object.
//
if (pObjectInfo->NumComponents == 1) {
RRETURN(GetComputerObject(pObjectInfo, ppObject)); }
//
// Case 2: Two components - FileService object
// Group object
// Schema object
// User object
// Printer object
//
if (pObjectInfo->NumComponents == 2) {
hr = GetSchemaObject(pObjectInfo, ppObject);
if (FAILED(hr)) {
hr = GetUserObject(pObjectInfo, ppObject);
if (FAILED(hr)) {
hr = GetGroupObject(pObjectInfo, ppObject);
if (FAILED(hr)) {
hr = GetFileServiceObject(pObjectInfo, ppObject);
if (FAILED(hr)) {
hr = GetPrinterObject(pObjectInfo, ppObject); } } } }
if (FAILED(hr)) { hr = E_ADS_UNKNOWN_OBJECT; } else { RRETURN(S_OK); } }
//
// Case 3: Three components - FileShare object
// Schema Class object
// Schema FunctionSet object
// Schema Syntax object
//
if (pObjectInfo->NumComponents == 3) {
hr = GetFileShareObject(pObjectInfo, ppObject);
if (FAILED(hr)) {
if ( _wcsicmp( pObjectInfo->ComponentArray[1], SCHEMA_NAME ) == 0 ){
hr = GetClassObject(pObjectInfo, ppObject);
if (FAILED(hr)) { hr = GetPropertyObject(pObjectInfo, ppObject); }
if (FAILED(hr)) {
hr = GetSyntaxObject(pObjectInfo, ppObject); } } }
if (FAILED(hr)) { hr = E_ADS_UNKNOWN_OBJECT; } else { RRETURN(S_OK); } }
//
// Case 4: Four components - Schema FunctionSetAlias object
// Schema Property object
//
RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: GetNamespaceObject
//
// Synopsis:
//
// Arguments: POBJECTINFO pObjectInfo
// LPVOID * ppObject
//
// Returns: HRESULT
//
// Modifies:
//
// History: 04-Mar-96 t-ptam Created.
//
//----------------------------------------------------------------------------
HRESULT GetNamespaceObject( POBJECTINFO pObjectInfo, LPVOID * ppObject ) { HRESULT hr = S_OK;
hr = ValidateNamespaceObject( pObjectInfo ); BAIL_ON_FAILURE(hr);
hr = CoCreateInstance( CLSID_NWCOMPATNamespace, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)ppObject );
RRETURN(hr);
error: RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: GetComputerObject
//
// Synopsis:
//
// Arguments: POBJECTINFO pObjectInfo
// LPVOID * ppObject
//
// Returns: HRESULT
//
// Modifies:
//
// History: 11-Jan-96 t-ptam Created.
//
//----------------------------------------------------------------------------
HRESULT GetComputerObject( POBJECTINFO pObjectInfo, LPVOID * ppObject ) { HRESULT hr = S_OK; WCHAR ADsParent[MAX_ADS_PATH];
hr = ValidateComputerObject( pObjectInfo ); BAIL_ON_FAILURE(hr);
hr = BuildParent( pObjectInfo, ADsParent ); BAIL_ON_FAILURE(hr);
hr = CNWCOMPATComputer::CreateComputer( ADsParent, pObjectInfo->ComponentArray[0], ADS_OBJECT_BOUND, IID_IUnknown, ppObject ); error: RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: GetUserObject
//
// Synopsis:
//
// Arguments: POBJECTINFO pObjectInfo
// LPVOID * ppObject
//
// Returns: HRESULT
//
// Modifies:
//
// History: 29-Feb-96 t-ptam Created.
//
//----------------------------------------------------------------------------
HRESULT GetUserObject( POBJECTINFO pObjectInfo, LPVOID * ppObject ) { HRESULT hr = S_OK; WCHAR ADsParent[MAX_ADS_PATH];
hr = ValidateUserObject( pObjectInfo ); BAIL_ON_FAILURE(hr);
hr = BuildParent( pObjectInfo, ADsParent ); BAIL_ON_FAILURE(hr);
hr = CNWCOMPATUser::CreateUser( ADsParent, NWCOMPAT_COMPUTER_ID, pObjectInfo->ComponentArray[0], pObjectInfo->ComponentArray[1], ADS_OBJECT_BOUND, IID_IUnknown, ppObject ); error: RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: GetGroupObject
//
// Synopsis:
//
// Arguments: POBJECTINFO pObjectInfo
// LPVOID * ppObject
//
// Returns: HRESULT
//
// Modifies:
//
// History: 29-Feb-96 t-ptam Created.
//
//----------------------------------------------------------------------------
HRESULT GetGroupObject( POBJECTINFO pObjectInfo, LPVOID * ppObject ) { HRESULT hr = S_OK; WCHAR ADsParent[MAX_ADS_PATH];
hr = ValidateGroupObject( pObjectInfo ); BAIL_ON_FAILURE(hr);
hr = BuildParent( pObjectInfo, ADsParent ); BAIL_ON_FAILURE(hr);
hr = CNWCOMPATGroup::CreateGroup( ADsParent, NWCOMPAT_COMPUTER_ID, pObjectInfo->ComponentArray[0], pObjectInfo->ComponentArray[1], ADS_OBJECT_BOUND, IID_IUnknown, ppObject ); error: RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: GetSchemaObject
//
// Synopsis:
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 1-17-96 yihsins Created.
//
//----------------------------------------------------------------------------
HRESULT GetSchemaObject( POBJECTINFO pObjectInfo, LPVOID * ppObject ) { LPUNKNOWN pUnknown = NULL; WCHAR ADsParent[MAX_ADS_PATH]; HRESULT hr = S_OK;
if (pObjectInfo->NumComponents != 2) RRETURN(E_ADS_BAD_PATHNAME);
if ( _wcsicmp( pObjectInfo->ComponentArray[1], SCHEMA_NAME ) != 0 ) { hr = E_ADS_BAD_PATHNAME; BAIL_ON_FAILURE(hr); }
hr = BuildParent(pObjectInfo, ADsParent); BAIL_ON_FAILURE(hr);
hr = CNWCOMPATSchema::CreateSchema( ADsParent, pObjectInfo->ComponentArray[1], ADS_OBJECT_BOUND, IID_IUnknown, (void **)&pUnknown ); BAIL_ON_FAILURE(hr);
*ppObject = pUnknown;
RRETURN(hr);
error: if (pUnknown) pUnknown->Release();
*ppObject = NULL; RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: GetClassObject
//
// Synopsis:
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 1-17-96 yihsins Created.
//
//----------------------------------------------------------------------------
HRESULT GetClassObject( POBJECTINFO pObjectInfo, LPVOID * ppObject ) { LPUNKNOWN pUnknown = NULL; WCHAR ADsParent[MAX_ADS_PATH]; HRESULT hr = S_OK; DWORD i;
if (pObjectInfo->NumComponents != 3) RRETURN(E_ADS_BAD_PATHNAME);
if ( _wcsicmp( pObjectInfo->ComponentArray[1], SCHEMA_NAME ) != 0 ) { hr = E_ADS_BAD_PATHNAME; BAIL_ON_FAILURE(hr); }
//
// Look for the given class name
//
for ( i = 0; i < g_cNWCOMPATClasses; i++ ) { if ( _wcsicmp( g_aNWCOMPATClasses[i].bstrName, pObjectInfo->ComponentArray[2] ) == 0 ) break; }
if ( i == g_cNWCOMPATClasses ) { //
// Class name not found, return error
//
hr = E_ADS_BAD_PATHNAME; BAIL_ON_FAILURE(hr); }
//
// Class name found, create and return the object
//
hr = BuildParent(pObjectInfo, ADsParent); BAIL_ON_FAILURE(hr);
hr = CNWCOMPATClass::CreateClass( ADsParent, &g_aNWCOMPATClasses[i], ADS_OBJECT_BOUND, IID_IUnknown, (void **)&pUnknown ); BAIL_ON_FAILURE(hr);
*ppObject = pUnknown;
RRETURN(hr);
error: if (pUnknown) pUnknown->Release();
*ppObject = NULL; RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: GetSyntaxObject
//
// Synopsis:
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 1-17-96 yihsins Created.
//
//----------------------------------------------------------------------------
HRESULT GetSyntaxObject( POBJECTINFO pObjectInfo, LPVOID * ppObject ) { LPUNKNOWN pUnknown = NULL; WCHAR ADsParent[MAX_ADS_PATH]; HRESULT hr = S_OK; DWORD i;
if (pObjectInfo->NumComponents != 3) RRETURN(E_ADS_BAD_PATHNAME);
if ( _wcsicmp( pObjectInfo->ComponentArray[1], SCHEMA_NAME ) != 0 ) { hr = E_ADS_BAD_PATHNAME; BAIL_ON_FAILURE(hr); }
//
// Look for the given syntax name
//
for ( i = 0; i < g_cNWCOMPATSyntax; i++ ) { if ( _wcsicmp( g_aNWCOMPATSyntax[i].bstrName, pObjectInfo->ComponentArray[2] ) == 0 ) break; }
if ( i == g_cNWCOMPATSyntax ) { //
// Syntax name not found, return error
//
hr = E_ADS_BAD_PATHNAME; BAIL_ON_FAILURE(hr); }
//
// Syntax name found, create and return the object
//
hr = BuildParent(pObjectInfo, ADsParent); BAIL_ON_FAILURE(hr);
hr = CNWCOMPATSyntax::CreateSyntax( ADsParent, &g_aNWCOMPATSyntax[i], ADS_OBJECT_BOUND, IID_IUnknown, (void **)&pUnknown ); BAIL_ON_FAILURE(hr);
*ppObject = pUnknown;
RRETURN(hr);
error: if (pUnknown) pUnknown->Release();
*ppObject = NULL; RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: GetPropertyObject
//
// Synopsis:
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 1-17-96 yihsins Created.
//
//----------------------------------------------------------------------------
HRESULT GetPropertyObject( POBJECTINFO pObjectInfo, LPVOID * ppObject ) { LPUNKNOWN pUnknown = NULL; WCHAR ADsParent[MAX_ADS_PATH]; WCHAR ADsGrandParent[MAX_ADS_PATH]; HRESULT hr = S_OK; DWORD nClass, nProp;
if (pObjectInfo->NumComponents != 3) RRETURN(E_ADS_BAD_PATHNAME);
if ( _wcsicmp( pObjectInfo->ComponentArray[1], SCHEMA_NAME ) != 0 ) { hr = E_ADS_BAD_PATHNAME; BAIL_ON_FAILURE(hr); }
//
// We found the specified functional set, now see if we can locate
// the given property name
//
for ( nProp = 0; nProp < g_cNWCOMPATProperties; nProp++ ) { if ( _wcsicmp(g_aNWCOMPATProperties[nProp].szPropertyName, pObjectInfo->ComponentArray[2] ) == 0 ) break; }
if ( nProp == g_cNWCOMPATProperties ) { // Return error because the given property name is not found
hr = E_ADS_BAD_PATHNAME; BAIL_ON_FAILURE(hr); }
//
// Property name is found, so create and return the object
//
hr = BuildParent(pObjectInfo, ADsParent); BAIL_ON_FAILURE(hr);
hr = BuildGrandParent(pObjectInfo, ADsGrandParent); BAIL_ON_FAILURE(hr);
hr = CNWCOMPATProperty::CreateProperty( ADsParent, &(g_aNWCOMPATProperties[nProp]), ADS_OBJECT_BOUND, IID_IUnknown, (void **)&pUnknown ); BAIL_ON_FAILURE(hr);
*ppObject = pUnknown;
RRETURN(hr);
error: if (pUnknown) pUnknown->Release();
*ppObject = NULL; RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: GetFileServiceObject
//
// Synopsis:
//
// Arguments: POBJECTINFO pObjectInfo
// LPVOID * ppObject
//
// Returns: HRESULT
//
// Modifies:
//
// History: 22-Apr-96 t-ptam Created.
//
//----------------------------------------------------------------------------
HRESULT GetFileServiceObject( POBJECTINFO pObjectInfo, LPVOID * ppObject ) { HRESULT hr = S_OK; WCHAR ADsParent[MAX_ADS_PATH];
hr = ValidateFileServiceObject( pObjectInfo ); BAIL_ON_FAILURE(hr);
hr = BuildParent( pObjectInfo, ADsParent ); BAIL_ON_FAILURE(hr);
hr = CNWCOMPATFileService::CreateFileService( ADsParent, pObjectInfo->ComponentArray[0], pObjectInfo->ComponentArray[1], ADS_OBJECT_BOUND, IID_IUnknown, ppObject ); error: RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: GetFileShareObject
//
// Synopsis:
//
// Arguments: POBJECTINFO pObjectInfo
// LPVOID * ppObject
//
// Returns: HRESULT
//
// Modifies:
//
// History: 22-Apr-96 t-ptam Created.
//
//----------------------------------------------------------------------------
HRESULT GetFileShareObject( POBJECTINFO pObjectInfo, LPVOID * ppObject ) { HRESULT hr = S_OK; WCHAR ADsParent[MAX_ADS_PATH];
hr = ValidateFileShareObject( pObjectInfo ); BAIL_ON_FAILURE(hr);
hr = BuildParent( pObjectInfo, ADsParent ); BAIL_ON_FAILURE(hr);
hr = CNWCOMPATFileShare::CreateFileShare( ADsParent, pObjectInfo->ComponentArray[2], ADS_OBJECT_BOUND, IID_IUnknown, ppObject ); error: RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: GetPrinterObject
//
// Synopsis:
//
// Arguments: POBJECTINFO pObjectInfo
// LPVOID * ppObject
//
// Returns: HRESULT
//
// Modifies:
//
// History: 2-May-96 t-ptam Created.
//
//----------------------------------------------------------------------------
HRESULT GetPrinterObject( POBJECTINFO pObjectInfo, LPVOID * ppObject ) { HRESULT hr = S_OK; WCHAR ADsParent[MAX_ADS_PATH];
hr = ValidatePrinterObject( pObjectInfo ); BAIL_ON_FAILURE(hr);
hr = BuildParent( pObjectInfo, ADsParent ); BAIL_ON_FAILURE(hr);
hr = CNWCOMPATPrintQueue::CreatePrintQueue( ADsParent, pObjectInfo->ComponentArray[1], ADS_OBJECT_BOUND, IID_IUnknown, ppObject ); error: RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: ValidateNamespaceObject
//
// Synopsis:
//
// Arguments: POBJECTINFO pObjectInfo
//
// Returns: HRESULT
//
// Modifies:
//
// History: 16-Jan-96 t-ptam (Patrick) Created.
//
//----------------------------------------------------------------------------
HRESULT ValidateNamespaceObject( POBJECTINFO pObjectInfo ) {
if (!_wcsicmp(pObjectInfo->ProviderName, bstrProviderName)) { } RRETURN(S_OK); }
//+---------------------------------------------------------------------------
// Function: ValidateComputerObject
//
// Synopsis: Validate the existence of a computer object by obtaining
// a handle to it. A computer object must exist if a handle
// to it can be obtained.
//
// Arguments: [LPWSTR szComputerName]
//
// Returns: HRESULT
//
// Modifies:
//
// History: 16-Jan-96 t-ptam (Patrick) Created.
//
//----------------------------------------------------------------------------
HRESULT ValidateComputerObject( POBJECTINFO pObjectInfo ) { //
// A handle of a certain bindery can only be obtained if the bindery
// exist. Therefore we used this fact to validate the existence of
// a computer object.
//
NWCONN_HANDLE hConn = NULL; HRESULT hr = S_OK;
if (pObjectInfo->NumComponents != 1) { RRETURN(E_ADS_BAD_PATHNAME); }
//
// Try to obtain a handle to a NWCOMPAT Server.
//
hr = NWApiGetBinderyHandle( &hConn, pObjectInfo->ComponentArray[0] ); BAIL_ON_FAILURE(hr);
//
// Detach handle.
//
hr = NWApiReleaseBinderyHandle( hConn );
error: RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: ValidateUserObject
//
// Synopsis: Validate the existence of a computer object by obtaining
// a handle to it. A computer object must exist if a handle
// to it can be obtained.
//
// Arguments: [LPWSTR szComputerName]
//
// Returns: HRESULT
//
// Modifies: pObjectInfo->ComponentArray[1] is upper-cased
//
// History: 29-Feb-96 t-ptam (Patrick) Created.
// 29-Jul-96 t-danal Uppercase fix.
//
// Note: Netware will let you create a lowercase user name but will
// internally store only uppercase. However, it will not
// return the uppercase user name on a lowercase request.
//
//----------------------------------------------------------------------------
HRESULT ValidateUserObject( POBJECTINFO pObjectInfo ) { NWCONN_HANDLE hConn = NULL; HRESULT hr = S_OK; DWORD dwResumeObjectID = 0xffffffff;
if (pObjectInfo->NumComponents != 2) { RRETURN(E_ADS_BAD_PATHNAME); }
//
// Obtain a handle to a NetWare Server.
//
hr = NWApiGetBinderyHandle( &hConn, pObjectInfo->ComponentArray[0] ); BAIL_ON_FAILURE(hr);
//
// Get the specified (uppercased) user object.
//
hr = NWApiValidateObject( hConn, OT_USER, _wcsupr(pObjectInfo->ComponentArray[1]), &dwResumeObjectID ); BAIL_ON_FAILURE(hr);
error: if (hConn) { NWApiReleaseBinderyHandle(hConn); }
RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: ValidateGroupObject
//
// Synopsis: Validate the existence of a group object by scanning
// for it in the bindery.
//
// Arguments: [POBJECTINFO pObjectInfo]
//
// Returns: HRESULT
//
// Modifies: pObjectInfo->ComponentArray[1] is upper-cased
//
// History: 29-Feb-96 t-ptam (Patrick) Created.
// 29-Jul-96 t-danal Uppercase fix.
//
// Note: Netware will let you create a lowercase user name but will
// internally store only uppercase. However, it will not
// return the uppercase user name on a lowercase request.
//
//----------------------------------------------------------------------------
HRESULT ValidateGroupObject( POBJECTINFO pObjectInfo ) { NWCONN_HANDLE hConn = NULL; HRESULT hr = S_OK; DWORD dwResumeObjectID = 0xffffffff;
if (pObjectInfo->NumComponents != 2) { RRETURN(E_ADS_BAD_PATHNAME); }
//
// Obtain a handle to a NetWare Server.
//
hr = NWApiGetBinderyHandle( &hConn, pObjectInfo->ComponentArray[0] ); BAIL_ON_FAILURE(hr);
//
// Get the specified (uppercased) group object.
//
hr = NWApiValidateObject( hConn, OT_USER_GROUP, _wcsupr(pObjectInfo->ComponentArray[1]), &dwResumeObjectID ); BAIL_ON_FAILURE(hr);
error: if (hConn) { NWApiReleaseBinderyHandle(hConn); }
RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: ValidateFileServiceObject
//
// Synopsis:
//
// Arguments: [POBJECTINFO pObjectInfo]
//
// Returns: HRESULT
//
// Modifies:
//
// History: 22-Apr-96 t-ptam (Patrick) Created.
//
//----------------------------------------------------------------------------
HRESULT ValidateFileServiceObject( POBJECTINFO pObjectInfo ) { //
// In NetWare, a FileService object represents a bindery, which is also
// represented as a computer object. Therefore validation of file service
// object can be done the same way as the computer object.
//
//
// A handle of a certain bindery can only be obtained if the bindery exist.
// Therefore we used this fact to validate the existence of a computer
// object.
//
NWCONN_HANDLE hConn = NULL; HRESULT hr = S_OK;
if (pObjectInfo->NumComponents != 2) { RRETURN(E_ADS_BAD_PATHNAME); }
//
// Check for valid NetWare File Server name.
//
if (_wcsicmp(pObjectInfo->ComponentArray[1], bstrNWFileServiceName)) { RRETURN(E_ADS_BAD_PATHNAME); }
//
// Try to obtain a handle to a NWCOMPAT Server.
//
hr = NWApiGetBinderyHandle( &hConn, pObjectInfo->ComponentArray[0] ); BAIL_ON_FAILURE(hr);
//
// Detach handle.
//
hr = NWApiReleaseBinderyHandle( hConn );
error: RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: ValidateFileShareObject
//
// Synopsis:
//
// Arguments: [POBJECTINFO pObjectInfo]
//
// Returns: HRESULT
//
// Modifies:
//
// History: 29-Apr-96 t-ptam (Patrick) Created.
//
//----------------------------------------------------------------------------
HRESULT ValidateFileShareObject( POBJECTINFO pObjectInfo ) { HRESULT hr = S_OK; DWORD dwResumeObjectID = 0xffffffff; NWCONN_HANDLE hConn = NULL; NWVOL_NUM VolumeNumber = 0;
if (pObjectInfo->NumComponents != 3) { RRETURN(E_ADS_BAD_PATHNAME); }
//
// Obtain a handle to a NetWare Server.
//
hr = NWApiGetBinderyHandle( &hConn, pObjectInfo->ComponentArray[0] ); BAIL_ON_FAILURE(hr);
//
// Try to get the Volume ID that correspond to the Volume name. If it
// succeeds, the FileShare is valid.
//
hr = NWApiGetVolumeNumber( hConn, pObjectInfo->ComponentArray[2], &VolumeNumber ); BAIL_ON_FAILURE(hr);
error: if (hConn) { NWApiReleaseBinderyHandle(hConn); }
RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: ValidatePrinterObject
//
// Synopsis:
//
// Arguments: [POBJECTINFO pObjectInfo]
//
// Returns: HRESULT
//
// Modifies:
//
// History: 2-May-96 t-ptam (Patrick) Created.
//
//----------------------------------------------------------------------------
HRESULT ValidatePrinterObject( POBJECTINFO pObjectInfo ) { HANDLE hPrinter = NULL; HRESULT hr = S_OK; WCHAR szUncName[MAX_PATH];
if (pObjectInfo->NumComponents != 2) { RRETURN(E_ADS_BAD_PATHNAME); }
//
// Build UNC name from ObjectInfo.
//
wsprintf( szUncName, L"\\\\%s\\%s", pObjectInfo->ComponentArray[0], pObjectInfo->ComponentArray[1] );
//
// Get a handle of the printer.
//
hr = NWApiOpenPrinter( szUncName, &hPrinter, PRINTER_ACCESS_USE ); BAIL_ON_FAILURE(hr);
//
// Release it.
//
hr = NWApiClosePrinter( hPrinter ); error:
RRETURN(hr); }
//+---------------------------------------------------------------------------
// Function: BuildParent
//
// Synopsis:
//
// Arguments: [POBJECTINFO pObjectInfo]
// [LPWSTR szBuffer]
//
// Returns: HRESULT
//
// Modifies:
//
// History: 11-3-95 krishnag Created.
//
//----------------------------------------------------------------------------
HRESULT BuildParent( POBJECTINFO pObjectInfo, LPWSTR szBuffer ) { DWORD i = 0;
if (!pObjectInfo->ProviderName) { RRETURN(E_ADS_BAD_PATHNAME); }
wsprintf(szBuffer,L"%s:", pObjectInfo->ProviderName);
if (pObjectInfo->NumComponents - 1) {
wcscat(szBuffer, L"//"); wcscat(szBuffer, pObjectInfo->DisplayComponentArray[0]);
for (i = 1; i < (pObjectInfo->NumComponents - 1); i++) { wcscat(szBuffer, L"/"); wcscat(szBuffer, pObjectInfo->DisplayComponentArray[i]); } } RRETURN(S_OK); }
//+---------------------------------------------------------------------------
// Function: BuildGrandParent
//
// Synopsis:
//
// Arguments: [POBJECTINFO pObjectInfo]
// [LPWSTR szBuffer]
//
// Returns: HRESULT
//
// Modifies:
//
// History: 11-3-95 krishnag Created.
//
//----------------------------------------------------------------------------
HRESULT BuildGrandParent(POBJECTINFO pObjectInfo, LPWSTR szBuffer) { DWORD i = 0;
if (!pObjectInfo->ProviderName) { RRETURN(E_ADS_BAD_PATHNAME); }
wsprintf(szBuffer,L"%s:", pObjectInfo->ProviderName);
if (pObjectInfo->NumComponents - 2) {
wcscat(szBuffer, L"//"); wcscat(szBuffer, pObjectInfo->DisplayComponentArray[0]);
for (i = 1; i < (pObjectInfo->NumComponents - 2); i++) { wcscat(szBuffer, L"/"); wcscat(szBuffer, pObjectInfo->DisplayComponentArray[i]); } }
RRETURN(S_OK); }
//+---------------------------------------------------------------------------
// Function: BuildADsPath
//
// Synopsis:
//
// Arguments: [POBJECTINFO pObjectInfo]
// [LPWSTR szBuffer]
//
// Returns: HRESULT
//
// Modifies:
//
// History: 11-3-95 krishnag Created.
//
//----------------------------------------------------------------------------
HRESULT BuildADsPath( POBJECTINFO pObjectInfo, LPWSTR szBuffer ) { DWORD i = 0;
if (!pObjectInfo->ProviderName) { RRETURN(E_ADS_BAD_PATHNAME); }
wsprintf(szBuffer,L"%s:", pObjectInfo->ProviderName);
if (pObjectInfo->NumComponents) {
wcscat(szBuffer, L"//"); wcscat(szBuffer, pObjectInfo->DisplayComponentArray[0]);
for (i = 1; i < (pObjectInfo->NumComponents); i++) { wcscat(szBuffer, L"/"); wcscat(szBuffer, pObjectInfo->DisplayComponentArray[i]); } } RRETURN(S_OK); }
|