#include "procs.hxx" #pragma hdrstop //---------------------------------------------------------------------------- // // Function: NWApiGetBinderyHandle // // Synopsis: // //---------------------------------------------------------------------------- HRESULT NWApiGetBinderyHandle( NWCONN_HANDLE *phConnReturned, BSTR bstrBinderyName ) { NWLOCAL_SCOPE ScopeFlag = 0; NWCONN_HANDLE hConn; NWCCODE usRet = SUCCESSFUL; HRESULT hr = S_OK; usRet = NWCAttachToFileServerW( bstrBinderyName, ScopeFlag, &hConn ); hr = HRESULT_FROM_NWCCODE(usRet); BAIL_ON_FAILURE(hr); // // Return. // *phConnReturned = hConn; RRETURN(hr); error: *phConnReturned = NULL; RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: NWApiReleaseBinderyHandle // // Synopsis: // //---------------------------------------------------------------------------- HRESULT NWApiReleaseBinderyHandle( NWCONN_HANDLE hConn ) { HRESULT hr = S_OK; NWCCODE usRet = SUCCESSFUL; if (hConn) { usRet = NWCDetachFromFileServer(hConn); hr = HRESULT_FROM_NWCCODE(usRet); } RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: NWApiWriteProperty // // Synopsis: This function modifies values of a bindery property. For now, it // only accept one buffer segment. However, one segment is enough // for most practical purpose. If the bindery property does not // exist, the function will attempt to create the property. // //---------------------------------------------------------------------------- HRESULT NWApiWriteProperty( NWCONN_HANDLE hConn, BSTR bstrObjectName, NWOBJ_TYPE wObjType, LPSTR lpszPropertyName, NWSEGMENT_DATA *SegmentData ) { CHAR szObjectName[(OBJ_NAME_SIZE + 1)*2]; HRESULT hr = S_OK; NWCCODE usRet; // // Convert BSTR into an ANSI representation required by NWC APIs. "0" is // passed to UnicodeToAnsiString when the length of the string is unknown. // if (wcslen(bstrObjectName) > OBJ_NAME_SIZE) { hr = E_INVALIDARG; BAIL_ON_FAILURE(hr); } UnicodeToAnsiString( bstrObjectName, szObjectName, 0 ); usRet = NWCWritePropertyValue( hConn, szObjectName, wObjType, lpszPropertyName, 1, // "1" for one segment. SegmentData, 0 // "0" for no more segment. ); // // Create the property if it doesn't exist and attempt to write again. // // If the property doesn't exist, NWCWritePropertyValue will return // UNSUCCESSFUL, not NO_SUCH_PROPERTY (bug #34833 --- by design). // So if the call doesn't succeed, try to create the property and // see if that succeeds. if (usRet == 0xffff) { hr = NWApiCreateProperty( hConn, bstrObjectName, wObjType, lpszPropertyName, BF_ITEM ); BAIL_ON_FAILURE(hr); usRet = NWCWritePropertyValue( hConn, szObjectName, wObjType, lpszPropertyName, 1, // "1" for one segment. SegmentData, 0 // "0" for no more segment. ); } hr = HRESULT_FROM_NWCCODE(usRet); error: RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: NWApiObjectEnum // // Synopsis: // //---------------------------------------------------------------------------- HRESULT NWApiObjectEnum( NWCONN_HANDLE hConn, NWOBJ_TYPE dwObjType, LPWSTR *lppszObjectName, DWORD *pdwResumeObjectID ) { HRESULT hr = S_OK; LPWSTR lpszTemp = NULL; NWCCODE usRet = SUCCESSFUL; NWOBJ_TYPE pdwObjType = 0xFFFF; NWFLAGS pucHasProperties; NWFLAGS pucObjectFlags; NWFLAGS pucObjSecurity; CHAR szObjectName[(OBJ_NAME_SIZE + 1)*2]; // // This call will fail and return 0xffff if the user is not authenticated // on the server to which the hConn handle is attached to. // usRet = NWCScanObject( hConn, "*", dwObjType, pdwResumeObjectID, szObjectName, &pdwObjType, &pucHasProperties, &pucObjectFlags, &pucObjSecurity ); hr = HRESULT_FROM_NWCCODE(usRet); BAIL_ON_FAILURE(hr); lpszTemp = AllocateUnicodeString(szObjectName); if (!lpszTemp) { RRETURN(E_OUTOFMEMORY); } *lppszObjectName = AllocADsStr(lpszTemp); if (!(*lppszObjectName)) { RRETURN(E_OUTOFMEMORY); } if(lpszTemp){ FreeUnicodeString(lpszTemp); } RRETURN(hr); error: *lppszObjectName = NULL; pdwResumeObjectID = NULL; RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: NWApiValidateObject // // Synopsis: // //---------------------------------------------------------------------------- HRESULT NWApiValidateObject( NWCONN_HANDLE hConn, NWOBJ_TYPE dwObjType, LPWSTR lpszObjectName, DWORD *pdwResumeObjectID ) { HRESULT hr = S_OK; NWCCODE usRet = SUCCESSFUL; CHAR szAnsiObjectName[(OBJ_NAME_SIZE + 1)*2]; CHAR szObjectName[(OBJ_NAME_SIZE + 1)*2]; NWOBJ_TYPE pdwObjType = 0xFFFF; NWFLAGS pucHasProperties; NWFLAGS pucObjectFlags; NWFLAGS pucObjSecurity; // // Convert BSTR into an ANSI representation required by NWC APIs. "0" is // passed to UnicodeToAnsiString when the length of the string is unknown. // if (wcslen(lpszObjectName) > OBJ_NAME_SIZE) { RRETURN(E_INVALIDARG); } UnicodeToAnsiString( lpszObjectName, szAnsiObjectName, 0 ); // // This call will fail and return 0xffff if the user is not authenticated // on the server to which the hConn handle is attached to. // usRet = NWCScanObject( hConn, szAnsiObjectName, dwObjType, pdwResumeObjectID, szObjectName, &pdwObjType, &pucHasProperties, &pucObjectFlags, &pucObjSecurity ); hr = HRESULT_FROM_NWCCODE(usRet); RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: NWApiGetAnyBinderyHandle // // Synopsis: // //---------------------------------------------------------------------------- HRESULT NWApiGetAnyBinderyHandle( NWCONN_HANDLE *phConn ) { HRESULT hr = S_OK; // // Get Bindery handle. // hr = NWApiGetBinderyHandle( phConn, L"*" ); RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: NWApiGetObjectName // // Synopsis: // //---------------------------------------------------------------------------- HRESULT NWApiGetObjectName( NWCONN_HANDLE hConn, DWORD dwObjectID, LPWSTR *lppszObjectName ) { CHAR szObjectName[(OBJ_NAME_SIZE + 1)*2]; HRESULT hr = S_OK; LPWSTR lpszTemp = NULL; NWCCODE usRet = SUCCESSFUL; NWOBJ_TYPE dwObjType; usRet = NWCGetObjectName( hConn, dwObjectID, szObjectName, &dwObjType ); hr = HRESULT_FROM_NWCCODE(usRet); BAIL_ON_FAILURE(hr); lpszTemp = AllocateUnicodeString(szObjectName); if (!lpszTemp) { RRETURN(E_OUTOFMEMORY); } *lppszObjectName = AllocADsStr(lpszTemp); if (!(*lppszObjectName)) { RRETURN(E_OUTOFMEMORY); } FreeUnicodeString(lpszTemp); RRETURN(hr); error: *lppszObjectName = NULL; RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: HRESULT_FROM_NWCCODE // // Synopsis: // //---------------------------------------------------------------------------- HRESULT HRESULT_FROM_NWCCODE( NWCCODE usRet ) { HRESULT hr = S_OK; if (usRet != SUCCESSFUL) { hr = HRESULT_FROM_WIN32(GetLastError()); if (hr == S_OK) { // // In case CSNW didn't SetLastError, // make sure we don't return a false S_OK, // since we know _some_ error occurred // hr = HRESULT_FROM_WIN32(ERROR_EXTENDED_ERROR); } if (hr == HRESULT_FROM_WIN32(ERROR_EXTENDED_ERROR)) { ADsSetLastError((DWORD) usRet, L"", L"NDS Provider" ); } } RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: NWApiOpenPrinter // // Synopsis: // //---------------------------------------------------------------------------- HRESULT NWApiOpenPrinter( LPWSTR lpszUncPrinterName, HANDLE *phPrinter, DWORD dwAccess ) { BOOL fStatus = TRUE; HANDLE hPrinter; HRESULT hr = S_OK; PRINTER_DEFAULTS PrinterDefault = {0, 0, dwAccess}; // // Set desired access right. // PrinterDefault.DesiredAccess = dwAccess; // // Get a handle to the speccified printer using Win32 API. // fStatus = OpenPrinter( lpszUncPrinterName, &hPrinter, &PrinterDefault ); // // Convert error code into HRESULT. // if (fStatus == FALSE) { hr = HRESULT_FROM_WIN32(GetLastError()); } // // Return. // else { *phPrinter = hPrinter; } RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: NWApiClosePrinter // // Synopsis: // //---------------------------------------------------------------------------- HRESULT NWApiClosePrinter( HANDLE hPrinter ) { BOOL fStatus = TRUE; HRESULT hr = S_OK; // // Close a printer using Win32 API. // fStatus = ClosePrinter(hPrinter); // // Convert error code into HRESULT. // if (fStatus == FALSE) { hr = HRESULT_FROM_WIN32(GetLastError()); } // // Return. // RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: NWApiSetPrinter // // Synopsis: // //---------------------------------------------------------------------------- HRESULT NWApiSetPrinter( HANDLE hPrinter, DWORD dwLevel, LPBYTE lpbPrinters, DWORD dwAccess ) { BOOL fStatus = FALSE; HRESULT hr = S_OK; fStatus = SetPrinter( hPrinter, dwLevel, lpbPrinters, dwAccess ); if (!fStatus) { goto error; } RRETURN(S_OK); error: hr = HRESULT_FROM_WIN32(GetLastError()); RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: NWApiGetJob // // Synopsis: // //---------------------------------------------------------------------------- HRESULT NWApiGetJob( HANDLE hPrinter, DWORD dwJobId, DWORD dwLevel, LPBYTE *lplpbJobs ) { BOOL fStatus = FALSE; DWORD dwError = 0; DWORD dwNeeded = 0; DWORD dwPassed = 1024; LPBYTE pMem = NULL; // // Allocate memory for return buffer. // pMem = (LPBYTE)AllocADsMem(dwPassed); if (!pMem) { RRETURN(E_OUTOFMEMORY); } // // Get Job's information. // fStatus = GetJob( hPrinter, dwJobId, dwLevel, pMem, dwPassed, &dwNeeded ); // // Get job's information again with a bigger buffer if a bigger buffer is // needed for the result. // if (!fStatus) { if (pMem){ FreeADsMem(pMem); } if ((dwError = GetLastError()) != ERROR_INSUFFICIENT_BUFFER) { RRETURN(HRESULT_FROM_WIN32(dwError)); } pMem = (LPBYTE)AllocADsMem( dwNeeded ); if (!pMem) { RRETURN(E_OUTOFMEMORY); } dwPassed = dwNeeded; fStatus = GetJob( hPrinter, dwJobId, dwLevel, pMem, dwPassed, &dwNeeded ); if (!fStatus) { FreeADsMem(pMem); RRETURN(HRESULT_FROM_WIN32(GetLastError())); } } // // Return. // *lplpbJobs = pMem; RRETURN(S_OK); } //---------------------------------------------------------------------------- // // Function: NWApiSetJob // // Synopsis: // //---------------------------------------------------------------------------- HRESULT NWApiSetJob( HANDLE hPrinter, DWORD dwJobId, DWORD dwLevel, LPBYTE lpbJobs, DWORD dwCommand ) { BOOL fStatus = FALSE; HRESULT hr = S_OK; fStatus = SetJob( hPrinter, dwJobId, dwLevel, lpbJobs, dwCommand ); if (!fStatus) { goto error; } RRETURN(S_OK); error: hr = HRESULT_FROM_WIN32(GetLastError()); RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: NWApiCreateProperty // // Synopsis: This function creates a bindery property. Access is logged read, // supervisor write. // //---------------------------------------------------------------------------- HRESULT NWApiCreateProperty( NWCONN_HANDLE hConn, LPWSTR lpszObjectName, NWOBJ_TYPE wObjType, LPSTR lpszPropertyName, NWFLAGS ucObjectFlags ) { CHAR szAnsiObjectName[(OBJ_NAME_SIZE + 1)*2]; HRESULT hr = S_OK; NWCCODE usRet = SUCCESSFUL; // // Convert BSTR into an ANSI representation required by NWC APIs. "0" is // passed to UnicodeToAnsiString when the length of the string is unknown. // if (wcslen(lpszObjectName) > OBJ_NAME_SIZE) { RRETURN(E_INVALIDARG); } UnicodeToAnsiString( lpszObjectName, szAnsiObjectName, 0 ); // // Create property. // usRet = NWCCreateProperty( hConn, szAnsiObjectName, wObjType, lpszPropertyName, ucObjectFlags, BS_LOGGED_READ | BS_SUPER_WRITE ); // // Return. // hr = HRESULT_FROM_NWCCODE(usRet); RRETURN(hr); }