/*++ Copyright (c) 1996 Microsoft Corporation Module Name: config.c Abstract: This module contains the configuration specific WINFAX API functions. Author: Wesley Witt (wesw) 29-Nov-1996 Revision History: --*/ #include "faxapi.h" #pragma hdrstop #include BOOL WINAPI FaxGetConfigurationW( IN HANDLE FaxHandle, OUT PFAX_CONFIGURATIONW *FaxConfig ) /*++ Routine Description: Retrieves the FAX configuration from the FAX server. The SizeOfStruct in the FaxConfig argument MUST be set to a value=>= sizeof(FAX_CONFIGURATION). Arguments: FaxHandle - FAX handle obtained from FaxConnectFaxServer. FaxConfig - Pointer to a FAX_CONFIGURATION structure. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DWORD FaxConfigSize = 0; DEBUG_FUNCTION_NAME(TEXT("FaxGetConfigurationW")); if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!FaxConfig) { SetLastError( ERROR_INVALID_PARAMETER ); DebugPrintEx(DEBUG_ERR, _T("FaxConfig is NULL.")); return FALSE; } *FaxConfig = NULL; // __try { ec = FAX_GetConfiguration( FH_FAX_HANDLE(FaxHandle), (LPBYTE*)FaxConfig, &FaxConfigSize ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_GetConfiguration. (ec: %ld)"), ec); } if (ec) { DumpRPCExtendedStatus(); SetLastError( ec ); return FALSE; } FixupStringPtrW( FaxConfig, (*FaxConfig)->ArchiveDirectory ); (*FaxConfig)->Reserved = NULL; return TRUE; } BOOL WINAPI FaxGetConfigurationA( IN HANDLE FaxHandle, OUT PFAX_CONFIGURATIONA *FaxConfigA ) /*++ Routine Description: Retrieves the FAX configuration from the FAX server. The SizeOfStruct in the FaxConfig argument MUST be set to a value=>= sizeof(FAX_CONFIGURATION). Arguments: FaxHandle - FAX handle obtained from FaxConnectFaxServer. FaxConfig - Pointer to a FAX_CONFIGURATION structure. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { DEBUG_FUNCTION_NAME(TEXT("FaxGetConfigurationA")); // // No need to Validate Parameters, FaxGetConfigurationW() will do that // if (!FaxGetConfigurationW( FaxHandle, (PFAX_CONFIGURATIONW*) FaxConfigA )) { DebugPrintEx(DEBUG_ERR, _T("FaxGetConfigurationW() is failed, ec = %ld."), GetLastError()); return FALSE; } if (!ConvertUnicodeStringInPlace((LPWSTR) (*FaxConfigA)->ArchiveDirectory)) { DebugPrintEx(DEBUG_ERR, _T("ConvertUnicodeStringInPlace failed, ec = %ld."), GetLastError()); MemFree (*FaxConfigA); return FALSE; } (*FaxConfigA)->SizeOfStruct = sizeof(FAX_CONFIGURATIONA); return TRUE; } // FaxGetConfigurationA BOOL WINAPI FaxSetConfigurationW( IN HANDLE FaxHandle, IN const FAX_CONFIGURATIONW *FaxConfig ) /*++ Routine Description: Changes the FAX configuration on the FAX server. The SizeOfStruct in the FaxConfig argument MUST be set to a value == sizeof(FAX_CONFIGURATION). Arguments: FaxHandle - FAX handle obtained from FaxConnectFaxServer. FaxConfig - Pointer to a FAX_CONFIGURATION structure. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxSetConfigurationW")); // // Validate Parameters // if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!FaxConfig) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("FaxConfig() is NULL.")); return FALSE; } if (FaxConfig->SizeOfStruct != sizeof(FAX_CONFIGURATIONW)) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("FaxConfig->SizeOfStruct != sizeof(FAX_CONFIGURATIONW)")); return FALSE; } __try { ec = FAX_SetConfiguration( FH_FAX_HANDLE(FaxHandle), FaxConfig ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx(DEBUG_ERR, _T("Exception on RPC call to FAX_SetConfiguration. (ec: %ld)"), ec); } if (ec) { DumpRPCExtendedStatus(); SetLastError( ec ); return FALSE; } return TRUE; } BOOL WINAPI FaxSetConfigurationA( IN HANDLE FaxHandle, IN const FAX_CONFIGURATIONA *FaxConfig ) { error_status_t ec = ERROR_SUCCESS; FAX_CONFIGURATIONW FaxConfigW; DEBUG_FUNCTION_NAME(TEXT("FaxSetConfigurationA")); // // Validate Parameters // if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!FaxConfig) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("FaxConfig is NULL.")); return FALSE; } if (FaxConfig->SizeOfStruct != sizeof(FAX_CONFIGURATIONA)) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("FaxConfig->SizeOfStruct != sizeof(FAX_CONFIGURATIONA).")); return FALSE; } // // ansi structure is same size as unicode structure, so we can just copy it, then // cast the string pointers correctly // CopyMemory(&FaxConfigW,FaxConfig,sizeof(FAX_CONFIGURATIONA)); if (FaxConfig->ArchiveDirectory) { if (NULL == (FaxConfigW.ArchiveDirectory = AnsiStringToUnicodeString(FaxConfig->ArchiveDirectory))) { ec = ERROR_OUTOFMEMORY; DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString(FaxConfig->ArchiveDirectory) returns NULL.")); goto exit; } } // // Set InboundProfile to NULL // FaxConfigW.Reserved = NULL; __try { ec = FAX_SetConfiguration( FH_FAX_HANDLE(FaxHandle), (PFAX_CONFIGURATIONW)&FaxConfigW ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_SetConfiguration. (ec: %ld)"), ec); } exit: if (FaxConfigW.ArchiveDirectory) { MemFree((PVOID)FaxConfigW.ArchiveDirectory); } if (ec != ERROR_SUCCESS) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } BOOL WINAPI FaxGetLoggingCategoriesA( IN HANDLE FaxHandle, OUT PFAX_LOG_CATEGORYA *Categories, OUT LPDWORD NumberCategories ) { BOOL retval; DWORD i; DEBUG_FUNCTION_NAME(TEXT("FaxGetLoggingCategoriesA")); if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!Categories) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("Categories is NULL.")); return FALSE; } if (!NumberCategories) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("NumberCategories is NULL.")); return FALSE; } retval = FaxGetLoggingCategoriesW(FaxHandle,(PFAX_LOG_CATEGORYW *)Categories , NumberCategories); if (!retval) { DebugPrintEx(DEBUG_ERR, _T("FaxGetLoggingCategoriesW() is failed.")); return FALSE; } for (i=0; i<*NumberCategories; i++) { if (!ConvertUnicodeStringInPlace((LPWSTR)(*Categories)[i].Name)) { DebugPrintEx(DEBUG_ERR, _T("ConvertUnicodeStringInPlace failed, ec = %ld."), GetLastError()); MemFree (*Categories); return FALSE; } } return TRUE; } // FaxGetLoggingCategoriesA BOOL WINAPI FaxGetLoggingCategoriesW( IN HANDLE FaxHandle, OUT PFAX_LOG_CATEGORYW *Categories, OUT LPDWORD NumberCategories ) { error_status_t ec; DWORD BufferSize = 0; DWORD i; DEBUG_FUNCTION_NAME(TEXT("FaxGetLoggingCategoriesW")); if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!Categories) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("Categories is NULL.")); return FALSE; } if (!NumberCategories) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("NumberCategories is NULL.")); return FALSE; } *Categories = NULL; *NumberCategories = 0; // __try { ec = FAX_GetLoggingCategories( FH_FAX_HANDLE(FaxHandle), (LPBYTE*)Categories, &BufferSize, NumberCategories ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_GetLoggingCategories. (ec: %ld)"), ec); } if (ec != ERROR_SUCCESS) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } for (i=0; i<*NumberCategories; i++) { FixupStringPtrW( Categories, (*Categories)[i].Name ); } return TRUE; } BOOL WINAPI FaxSetLoggingCategoriesA( IN HANDLE FaxHandle, IN const FAX_LOG_CATEGORYA *Categories, IN DWORD NumberCategories ) { DWORD i; PFAX_LOG_CATEGORYW CategoryW; BOOL retval; DEBUG_FUNCTION_NAME(TEXT("FaxSetLoggingCategoriesA")); // // Validate Parameters // if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!Categories) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("Categories is NULL.")); return FALSE; } if (!NumberCategories) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("NumberCategories is NULL.")); return FALSE; } CategoryW = (PFAX_LOG_CATEGORYW) MemAlloc( sizeof(FAX_LOG_CATEGORYW) * NumberCategories ); if (!CategoryW) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); DebugPrintEx(DEBUG_ERR, _T("MemAlloc() returned NULL.")); return FALSE; } for (i = 0; i< NumberCategories; i++) { CategoryW[i].Category = Categories[i].Category; CategoryW[i].Level = Categories[i].Level; CategoryW[i].Name = (LPCWSTR) AnsiStringToUnicodeString(Categories[i].Name); if (!CategoryW[i].Name && Categories[i].Name) { DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString(Categories[%ld].Name) returns NULL."), i); goto error_exit; } } retval = FaxSetLoggingCategoriesW(FaxHandle, CategoryW, NumberCategories); for (i = 0; i< NumberCategories; i++) { if (CategoryW[i].Name) MemFree((LPBYTE)CategoryW[i].Name); } MemFree(CategoryW); return retval; error_exit: for (i = 0; i< NumberCategories; i++) { if (CategoryW[i].Name) MemFree((LPBYTE)CategoryW[i].Name); } MemFree(CategoryW); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } BOOL WINAPI FaxSetLoggingCategoriesW( IN HANDLE FaxHandle, IN const FAX_LOG_CATEGORYW *Categories, IN DWORD NumberCategories ) { error_status_t ec; DWORD BufferSize; DWORD i; LPBYTE Buffer; ULONG_PTR Offset; PFAX_LOG_CATEGORY LogCat; DEBUG_FUNCTION_NAME(TEXT("FaxSetLoggingCategoriesW")); // // Validate Parameters // if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!Categories) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("Categories is NULL.")); return FALSE; } if (!NumberCategories) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("NumberCategories is NULL.")); return FALSE; } Offset = sizeof(FAX_LOG_CATEGORY) * NumberCategories; BufferSize = DWORD(Offset); for (i=0; iLineCountryEntries = (PFAX_TAPI_LINECOUNTRY_ENTRYW) ((LPBYTE)*CountryListBuffer + (ULONG_PTR)(*CountryListBuffer)->LineCountryEntries); for (dwIndex=0; dwIndex<(*CountryListBuffer)->dwNumCountries; dwIndex++) { if ((*CountryListBuffer)->LineCountryEntries[dwIndex].lpctstrCountryName) { (*CountryListBuffer)->LineCountryEntries[dwIndex].lpctstrCountryName = (LPWSTR) ((LPBYTE)*CountryListBuffer + (ULONG_PTR)(*CountryListBuffer)->LineCountryEntries[dwIndex].lpctstrCountryName); } if ((*CountryListBuffer)->LineCountryEntries[dwIndex].lpctstrLongDistanceRule) { (*CountryListBuffer)->LineCountryEntries[dwIndex].lpctstrLongDistanceRule = (LPWSTR) ((LPBYTE)*CountryListBuffer + (ULONG_PTR)(*CountryListBuffer)->LineCountryEntries[dwIndex].lpctstrLongDistanceRule); } } return TRUE; } BOOL WINAPI FaxGetCountryListA( IN HANDLE FaxHandle, OUT PFAX_TAPI_LINECOUNTRY_LISTA *CountryListBuffer ) { DWORD i; DEBUG_FUNCTION_NAME(TEXT("FaxGetCountryListA")); // // no need to validate parameters, FaxGetCountryListW() will do that // if (!FaxGetCountryListW( FaxHandle, (PFAX_TAPI_LINECOUNTRY_LISTW*) CountryListBuffer )) { DebugPrintEx(DEBUG_ERR, _T("FaxGetCountryListW() is failed. ec = %ld."), GetLastError()); return FALSE; } for (i=0; i<(*CountryListBuffer)->dwNumCountries; i++) { if (!ConvertUnicodeStringInPlace((LPWSTR)(*CountryListBuffer)->LineCountryEntries[i].lpctstrCountryName) || !ConvertUnicodeStringInPlace((LPWSTR)(*CountryListBuffer)->LineCountryEntries[i].lpctstrLongDistanceRule)) { DebugPrintEx(DEBUG_ERR, _T("ConvertUnicodeStringInPlace failed, ec = %ld."), GetLastError()); MemFree (*CountryListBuffer); return FALSE; } } return TRUE; } // FaxGetCountryListA #ifndef UNICODE BOOL WINAPI FaxGetCountryListX( IN HANDLE FaxHandle, OUT PFAX_TAPI_LINECOUNTRY_LISTA *CountryListBuffer ) { UNREFERENCED_PARAMETER (FaxHandle); UNREFERENCED_PARAMETER (CountryListBuffer); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } #endif // #ifndef UNICODE FaxEnumGlobalRoutingInfoW( IN HANDLE FaxHandle, OUT PFAX_GLOBAL_ROUTING_INFOW *RoutingInfoBuffer, OUT LPDWORD MethodsReturned ) { PFAX_GLOBAL_ROUTING_INFOW FaxRoutingInfo = NULL; error_status_t ec; DWORD i; DWORD RoutingInfoBufferSize = 0; DEBUG_FUNCTION_NAME(TEXT("FaxEnumGlobalRoutingInfoW")); // // Validate Parameters // if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!RoutingInfoBuffer) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("RoutingInfoBuffer is NULL.")); return FALSE; } if (!MethodsReturned) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("MethodsReturned is NULL.")); return FALSE; } *RoutingInfoBuffer = NULL; __try { ec = FAX_EnumGlobalRoutingInfo( FH_FAX_HANDLE(FaxHandle), (LPBYTE*)RoutingInfoBuffer, &RoutingInfoBufferSize, MethodsReturned ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_EnumGlobalRoutingInfo. (ec: %ld)"), ec); } if (ec) { DumpRPCExtendedStatus(); SetLastError( ec ); return FALSE; } FaxRoutingInfo = (PFAX_GLOBAL_ROUTING_INFOW) *RoutingInfoBuffer; for (i=0; i<*MethodsReturned; i++) { FixupStringPtrW( RoutingInfoBuffer, FaxRoutingInfo[i].Guid ); FixupStringPtrW( RoutingInfoBuffer, FaxRoutingInfo[i].FunctionName ); FixupStringPtrW( RoutingInfoBuffer, FaxRoutingInfo[i].FriendlyName ); FixupStringPtrW( RoutingInfoBuffer, FaxRoutingInfo[i].ExtensionImageName ); FixupStringPtrW( RoutingInfoBuffer, FaxRoutingInfo[i].ExtensionFriendlyName ); } return TRUE; } BOOL WINAPI FaxEnumGlobalRoutingInfoA( IN HANDLE FaxHandle, OUT PFAX_GLOBAL_ROUTING_INFOA *RoutingInfoBuffer, OUT LPDWORD MethodsReturned ) { PFAX_GLOBAL_ROUTING_INFOW FaxRoutingMethod = NULL; DWORD i; DEBUG_FUNCTION_NAME(TEXT("FaxEnumGlobalRoutingInfoA")); // // No need to validate parameters, FaxEnumGlobalRoutingInfoW() will do that // if (!FaxEnumGlobalRoutingInfoW( FaxHandle, (PFAX_GLOBAL_ROUTING_INFOW *)RoutingInfoBuffer, MethodsReturned )) { DebugPrintEx(DEBUG_ERR, _T("FAX_EnumGlobalRoutingInfoW() failed. ec = %ld."), GetLastError()); return FALSE; } FaxRoutingMethod = (PFAX_GLOBAL_ROUTING_INFOW) *RoutingInfoBuffer; for (i=0; i<*MethodsReturned; i++) { if (!ConvertUnicodeStringInPlace((LPWSTR)FaxRoutingMethod[i].Guid) || !ConvertUnicodeStringInPlace((LPWSTR)FaxRoutingMethod[i].FunctionName) || !ConvertUnicodeStringInPlace((LPWSTR)FaxRoutingMethod[i].FriendlyName) || !ConvertUnicodeStringInPlace((LPWSTR)FaxRoutingMethod[i].ExtensionImageName) || !ConvertUnicodeStringInPlace((LPWSTR)FaxRoutingMethod[i].ExtensionFriendlyName)) { DebugPrintEx(DEBUG_ERR, _T("ConvertUnicodeStringInPlace failed, ec = %ld."), GetLastError()); MemFree (*RoutingInfoBuffer); return FALSE; } } return TRUE; } // FaxEnumGlobalRoutingInfoA BOOL WINAPI FaxSetGlobalRoutingInfoW( IN HANDLE FaxHandle, IN const FAX_GLOBAL_ROUTING_INFOW *RoutingInfo ) { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxSetGlobalRoutingInfoW")); // // Validate Parameters // if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() failed.")); return FALSE; } if (!RoutingInfo) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("RoutingInfo is NULL.")); return FALSE; } if (RoutingInfo->SizeOfStruct != sizeof(FAX_GLOBAL_ROUTING_INFOW)) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("RoutingInfo->SizeOfStruct != sizeof(FAX_GLOBAL_ROUTING_INFOW).")); return FALSE; } __try { ec = FAX_SetGlobalRoutingInfo( FH_FAX_HANDLE(FaxHandle), RoutingInfo ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_SetGlobalRoutingInfo. (ec: %ld)"), ec); } if (ec) { DumpRPCExtendedStatus(); SetLastError( ec ); return FALSE; } return TRUE; } BOOL WINAPI FaxSetGlobalRoutingInfoA( IN HANDLE FaxHandle, IN const FAX_GLOBAL_ROUTING_INFOA *RoutingInfo ) { BOOL Rval; FAX_GLOBAL_ROUTING_INFOW RoutingInfoW = {0}; DEBUG_FUNCTION_NAME(TEXT("FaxSetGlobalRoutingInfoA")); // // Validate Parameters // if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() failed.")); return FALSE; } if (!RoutingInfo) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("RoutingInfo is NULL.")); return FALSE; } if (RoutingInfo->SizeOfStruct != sizeof(FAX_GLOBAL_ROUTING_INFOA)) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("RoutingInfo->SizeOfStruct != sizeof(FAX_GLOBAL_ROUTING_INFOA).")); return FALSE; } RoutingInfoW.SizeOfStruct = sizeof(FAX_GLOBAL_ROUTING_INFOW); RoutingInfoW.Priority = RoutingInfo->Priority; RoutingInfoW.Guid = AnsiStringToUnicodeString(RoutingInfo->Guid); if (!RoutingInfoW.Guid && RoutingInfo->Guid) { Rval = ERROR_OUTOFMEMORY; DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString(RoutingInfo->Guid) returns NULL.")); goto exit; } RoutingInfoW.FriendlyName = AnsiStringToUnicodeString(RoutingInfo->FriendlyName); if (!RoutingInfoW.FriendlyName && RoutingInfo->FriendlyName) { Rval = ERROR_OUTOFMEMORY; DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString(RoutingInfo->FriendlyName) returns NULL.")); goto exit; } RoutingInfoW.FunctionName = AnsiStringToUnicodeString(RoutingInfo->FunctionName); if (!RoutingInfoW.FunctionName && RoutingInfo->FunctionName) { Rval = ERROR_OUTOFMEMORY; DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString(RoutingInfo->FunctionName) returns NULL.")); goto exit; } RoutingInfoW.ExtensionImageName = AnsiStringToUnicodeString(RoutingInfo->ExtensionImageName); if (!RoutingInfoW.ExtensionImageName && RoutingInfo->ExtensionImageName) { Rval = ERROR_OUTOFMEMORY; DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString(RoutingInfo->ExtensionImageName) returns NULL.")); goto exit; } RoutingInfoW.ExtensionFriendlyName = AnsiStringToUnicodeString(RoutingInfo->ExtensionFriendlyName); if (!RoutingInfoW.ExtensionFriendlyName && RoutingInfo->ExtensionFriendlyName) { Rval = ERROR_OUTOFMEMORY; DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString(RoutingInfo->ExtensionFriendlyName) returns NULL.")); goto exit; } Rval = FaxSetGlobalRoutingInfoW( FaxHandle, &RoutingInfoW); exit: if (RoutingInfoW.Guid) MemFree( (LPBYTE) RoutingInfoW.Guid ) ; if (RoutingInfoW.FriendlyName) MemFree( (LPBYTE) RoutingInfoW.FriendlyName ) ; if (RoutingInfoW.FunctionName) MemFree( (LPBYTE) RoutingInfoW.FunctionName ) ; if (RoutingInfoW.ExtensionImageName) MemFree( (LPBYTE) RoutingInfoW.ExtensionImageName ) ; if (RoutingInfoW.ExtensionFriendlyName) MemFree( (LPBYTE) RoutingInfoW.ExtensionFriendlyName ) ; return Rval; } BOOL WINAPI FaxAccessCheck( IN HANDLE FaxHandle, IN DWORD AccessMask ) { BOOL fPermission = FALSE; error_status_t ec = ERROR_SUCCESS; DWORD dwAccessMaskEx = 0; DWORD dwValidMask = (FAX_JOB_SUBMIT | FAX_JOB_QUERY | FAX_CONFIG_QUERY | FAX_CONFIG_SET | FAX_PORT_QUERY | FAX_PORT_SET | FAX_JOB_MANAGE | WRITE_DAC | WRITE_OWNER | ACCESS_SYSTEM_SECURITY | READ_CONTROL | GENERIC_ALL | GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE); DEBUG_FUNCTION_NAME(TEXT("FaxAccessCheck")); // // Validate Parameters // if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) { SetLastError (ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } // // For legacy support - Turn off SYNCHRONIZE and DELETE (They are part of legacy FAX_ALL_ACCESS) // AccessMask &= ~(SYNCHRONIZE | DELETE); // // Validate specific access rights // if (0 == (AccessMask & dwValidMask)) { SetLastError( ERROR_SUCCESS ); // // means access is denied DebugPrintEx(DEBUG_ERR, _T("AccessMask is invalid - No valid access bit type indicated")); return FALSE; } if ( 0 != (AccessMask & ~dwValidMask)) { SetLastError( ERROR_SUCCESS ); // means access is denied DebugPrintEx(DEBUG_ERR, _T("AccessMask is invalid - contains invalid access type bits")); return FALSE; } // // Convert the Win2K legacy specific access rights to our new exteneded specific access rights // before calling FaxAccessCheckEx(). // if (FAX_JOB_SUBMIT & AccessMask) { dwAccessMaskEx |= FAX_ACCESS_SUBMIT; } if (FAX_JOB_QUERY & AccessMask) { dwAccessMaskEx |= FAX_ACCESS_QUERY_JOBS; } if (FAX_CONFIG_QUERY & AccessMask) { dwAccessMaskEx |= FAX_ACCESS_QUERY_CONFIG; } if (FAX_CONFIG_SET & AccessMask) { dwAccessMaskEx |= FAX_ACCESS_MANAGE_CONFIG; } if (FAX_PORT_QUERY & AccessMask) { dwAccessMaskEx |= FAX_ACCESS_QUERY_CONFIG; } if (FAX_PORT_SET & AccessMask) { dwAccessMaskEx |= FAX_ACCESS_MANAGE_CONFIG; } if (FAX_JOB_MANAGE & AccessMask) { dwAccessMaskEx |= FAX_ACCESS_MANAGE_JOBS; } // // Add standard and generic access rights // dwAccessMaskEx |= (AccessMask & ~SPECIFIC_RIGHTS_ALL); return FaxAccessCheckEx (FaxHandle, dwAccessMaskEx, NULL); } BOOL WINAPI FaxAccessCheckEx( IN HANDLE hFaxHandle, IN DWORD dwAccessMask, IN LPDWORD lpdwAccessRights ) { BOOL fPermission = FALSE; error_status_t ec = ERROR_SUCCESS; DEBUG_FUNCTION_NAME(TEXT("FaxAccessCheckEx")); DWORD dwValidMask = ( FAX_ACCESS_SUBMIT | FAX_ACCESS_SUBMIT_NORMAL | FAX_ACCESS_SUBMIT_HIGH | FAX_ACCESS_QUERY_JOBS | FAX_ACCESS_MANAGE_JOBS | FAX_ACCESS_QUERY_CONFIG | FAX_ACCESS_MANAGE_CONFIG | FAX_ACCESS_QUERY_IN_ARCHIVE | FAX_ACCESS_MANAGE_IN_ARCHIVE | FAX_ACCESS_QUERY_OUT_ARCHIVE | FAX_ACCESS_MANAGE_OUT_ARCHIVE | WRITE_DAC | WRITE_OWNER | ACCESS_SYSTEM_SECURITY | READ_CONTROL | MAXIMUM_ALLOWED | GENERIC_ALL | GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError (ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (0 == (dwAccessMask & dwValidMask)) { SetLastError( ERROR_SUCCESS ); // means access is denied DebugPrintEx(DEBUG_ERR, _T("dwAccessMask is invalid - No valid access bit type indicated")); return FALSE; } if ( 0 != (dwAccessMask & ~dwValidMask)) { SetLastError( ERROR_SUCCESS ); // means access is denied DebugPrintEx(DEBUG_ERR, _T("dwAccessMask is invalid - contains invalid access type bits")); return FALSE; } __try { ec = FAX_AccessCheck( FH_FAX_HANDLE(hFaxHandle), dwAccessMask, &fPermission, lpdwAccessRights); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we crashed. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_AccessCheck. (ec: %ld)"), ec); } if (ec != ERROR_SUCCESS) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } SetLastError (ERROR_SUCCESS); return fPermission; } //************************************ //* Getting / Setting the queue state //************************************ BOOL WINAPI FaxGetQueueStates ( IN HANDLE hFaxHandle, OUT PDWORD pdwQueueStates ) /*++ Routine name : FaxGetQueueStates Routine description: Retruns the state of the queue Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in] - Handle to fax server pdwQueueStates [out] - Returned queue state Return Value: TRUE on success, FALSE otherwise --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxGetQueueStates")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (NULL == pdwQueueStates) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pdwQueueStates is NULL.")); return FALSE; } __try { ec = FAX_GetQueueStates( FH_FAX_HANDLE(hFaxHandle), pdwQueueStates ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we crashed. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_GetQueueStates. (ec: %ld)"), ec); } if (ec != ERROR_SUCCESS) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxGetQueueStates BOOL WINAPI FaxSetQueue ( IN HANDLE hFaxHandle, IN CONST DWORD dwQueueStates ) /*++ Routine name : FaxSetQueue Routine description: Sets the server's queue state Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in] - Handle to fax server dwQueueStates [in] - New queue state Return Value: TRUE on success, FALSE otherwise --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxSetQueue")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (dwQueueStates & ~(FAX_INCOMING_BLOCKED | FAX_OUTBOX_BLOCKED | FAX_OUTBOX_PAUSED)) { // // Some invalid queue state specified // SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("Invalid dwQueueStates.")); return FALSE; } __try { ec = FAX_SetQueue( FH_FAX_HANDLE(hFaxHandle), dwQueueStates ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we crashed. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_SetQueue. (ec: %ld)"), ec); } if (ec != ERROR_SUCCESS) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxSetQueue //************************************************ //* Getting / Setting the receipts configuration //************************************************ BOOL WINAPI FaxGetReceiptsConfigurationA ( IN HANDLE hFaxHandle, OUT PFAX_RECEIPTS_CONFIGA *ppReceipts ) /*++ Routine name : FaxGetReceiptsConfigurationA Routine description: Retrieve receipts configuration - ANSI version Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in ] - Fax server handle ppReceipts [out] - New receipts configuration buffer Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { DEBUG_FUNCTION_NAME(TEXT("FaxGetReceiptsConfigurationA")); // // no need to validate parameters ,FaxGetReceipsConfigurationW() will do that // if (!FaxGetReceiptsConfigurationW( hFaxHandle, (PFAX_RECEIPTS_CONFIGW*) ppReceipts )) { DebugPrintEx(DEBUG_ERR, _T("FaxGetReceiptsConfigurationW() is failed. ec = %ld."), GetLastError()); return FALSE; } if (!ConvertUnicodeStringInPlace((LPWSTR) (*ppReceipts)->lptstrSMTPServer) || !ConvertUnicodeStringInPlace((LPWSTR) (*ppReceipts)->lptstrSMTPFrom) || !ConvertUnicodeStringInPlace((LPWSTR) (*ppReceipts)->lptstrSMTPUserName) || !ConvertUnicodeStringInPlace((LPWSTR) (*ppReceipts)->lptstrSMTPPassword)) { DebugPrintEx(DEBUG_ERR, _T("ConvertUnicodeStringInPlace failed, ec = %ld."), GetLastError()); MemFree (*ppReceipts); return FALSE; } return TRUE; } // FaxGetReceiptsConfigurationA BOOL WINAPI FaxGetReceiptsConfigurationW ( IN HANDLE hFaxHandle, OUT PFAX_RECEIPTS_CONFIGW *ppReceipts ) /*++ Routine name : FaxGetReceiptsConfigurationW Routine description: Retrieve receipts configuration - Unicode version Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in ] - Fax server handle ppReceipts [out] - New receipts configuration buffer Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DWORD dwConfigSize = 0; DEBUG_FUNCTION_NAME(TEXT("FaxGetReceiptsConfigurationW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!ppReceipts) { SetLastError( ERROR_INVALID_PARAMETER ); DebugPrintEx(DEBUG_ERR, _T("ppReceipts is NULL.")); return FALSE; } *ppReceipts = NULL; __try { ec = FAX_GetReceiptsConfiguration ( FH_FAX_HANDLE(hFaxHandle), (LPBYTE*)ppReceipts, &dwConfigSize ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_GetReceiptsConfiguration. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError( ec ); return FALSE; } FixupStringPtrW( ppReceipts, (*ppReceipts)->lptstrSMTPServer ); FixupStringPtrW( ppReceipts, (*ppReceipts)->lptstrSMTPFrom ); FixupStringPtrW( ppReceipts, (*ppReceipts)->lptstrSMTPUserName ); FixupStringPtrW( ppReceipts, (*ppReceipts)->lptstrSMTPPassword ); return TRUE; } // FaxGetReceiptsConfigurationW #ifndef UNICODE BOOL WINAPI FaxGetReceiptsConfigurationX ( IN HANDLE hFaxHandle, OUT PFAX_RECEIPTS_CONFIGW *ppReceipts ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (ppReceipts); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } #endif // #ifndef UNICODE BOOL WINAPI FaxSetReceiptsConfigurationA ( IN HANDLE hFaxHandle, IN CONST PFAX_RECEIPTS_CONFIGA pReceipts ) /*++ Routine name : FaxSetReceiptsConfigurationA Routine description: Set receipts configuration - ANSI version Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in] - Handle to fax server pReceipts [in] - New configuration Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { FAX_RECEIPTS_CONFIGW ReceiptsConfigW; BOOL bRes = FALSE; DEBUG_FUNCTION_NAME(TEXT("FaxSetReceiptsConfigurationA")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!pReceipts) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pReceipts is NULL.")); return FALSE; } if (sizeof (FAX_RECEIPTS_CONFIGA) != pReceipts->dwSizeOfStruct) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("sizeof (FAX_RECEIPTS_CONFIGA) != pReceipts->dwSizeOfStruct")); return FALSE; } // // ansi structure is same size as unicode structure, so we can just copy it, then // cast the string pointers correctly // CopyMemory(&ReceiptsConfigW, pReceipts, sizeof(FAX_RECEIPTS_CONFIGA)); ReceiptsConfigW.dwSizeOfStruct = sizeof (FAX_RECEIPTS_CONFIGW); ReceiptsConfigW.bIsToUseForMSRouteThroughEmailMethod = pReceipts->bIsToUseForMSRouteThroughEmailMethod; ReceiptsConfigW.lptstrSMTPFrom = NULL; ReceiptsConfigW.lptstrSMTPUserName = NULL; ReceiptsConfigW.lptstrSMTPPassword = NULL; ReceiptsConfigW.lptstrSMTPServer = NULL; ReceiptsConfigW.lptstrReserved = NULL; if (pReceipts->lptstrSMTPServer) { if (NULL == (ReceiptsConfigW.lptstrSMTPServer = AnsiStringToUnicodeString(pReceipts->lptstrSMTPServer)) ) { DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString(pReceipts->lptstrSMTPServer) returns NULL.")); goto exit; } } if (pReceipts->lptstrSMTPFrom) { if (NULL == (ReceiptsConfigW.lptstrSMTPFrom = AnsiStringToUnicodeString(pReceipts->lptstrSMTPFrom)) ) { DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString(pReceipts->lptstrSMTPFrom) returns NULL.")); goto exit; } } if (pReceipts->lptstrSMTPUserName) { if (NULL == (ReceiptsConfigW.lptstrSMTPUserName = AnsiStringToUnicodeString(pReceipts->lptstrSMTPUserName)) ) { DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString(pReceipts->lptstrSMTPUserName) returns NULL.")); goto exit; } } if (pReceipts->lptstrSMTPPassword) { if (NULL == (ReceiptsConfigW.lptstrSMTPPassword = AnsiStringToUnicodeString(pReceipts->lptstrSMTPPassword)) ) { DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString(pReceipts->lptstrSMTPPassword) returns NULL.")); goto exit; } } bRes = FaxSetReceiptsConfigurationW (hFaxHandle, &ReceiptsConfigW); exit: MemFree((PVOID)ReceiptsConfigW.lptstrSMTPServer); MemFree((PVOID)ReceiptsConfigW.lptstrSMTPFrom); MemFree((PVOID)ReceiptsConfigW.lptstrSMTPUserName); SecureZeroMemory((PVOID)ReceiptsConfigW.lptstrSMTPPassword,wcslen(ReceiptsConfigW.lptstrSMTPPassword)*sizeof(WCHAR)); MemFree((PVOID)ReceiptsConfigW.lptstrSMTPPassword); return bRes; } // FaxSetReceiptsConfigurationA BOOL WINAPI FaxSetReceiptsConfigurationW ( IN HANDLE hFaxHandle, IN CONST PFAX_RECEIPTS_CONFIGW pReceipts ) /*++ Routine name : FaxSetReceiptsConfigurationW Routine description: Set receipts configuration - UNICODE version Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in] - Handle to fax server pReceipts [in] - New configuration Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxSetReceiptsConfigurationW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!pReceipts) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pReceipts is NULL.")); return FALSE; } if (sizeof (FAX_RECEIPTS_CONFIGW) != pReceipts->dwSizeOfStruct) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("sizeof (FAX_RECEIPTS_CONFIGW) != pReceipts->dwSizeOfStruct")); return FALSE; } if ((pReceipts->SMTPAuthOption < FAX_SMTP_AUTH_ANONYMOUS) || (pReceipts->SMTPAuthOption > FAX_SMTP_AUTH_NTLM)) { // // SMTP auth type type is invalid // SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("SMTP auth type is invalid.")); return FALSE; } if ((pReceipts->dwAllowedReceipts) & ~DRT_ALL) { // // Receipts type is invalid // SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("Receipts type is invalid : (pReceipts->dwAllowedReceipts) & ~DRT_ALL.")); return FALSE; } __try { ec = FAX_SetReceiptsConfiguration( FH_FAX_HANDLE(hFaxHandle), pReceipts ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_SetReceiptsConfiguration. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxSetReceiptsConfigurationW #ifndef UNICODE BOOL WINAPI FaxSetReceiptsConfigurationX ( IN HANDLE hFaxHandle, IN CONST PFAX_RECEIPTS_CONFIGW pReceipts ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (pReceipts); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } #endif // #ifndef UNICODE //******************************************** //* Server version //******************************************** BOOL WINAPI FaxGetVersion ( IN HANDLE hFaxHandle, OUT PFAX_VERSION pVersion ) /*++ Routine name : FaxGetVersion Routine description: Retrieves the version of the fax server Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in ] - Handle to fax server pVersion [in\out] - Returned version structure Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxGetVersion")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!pVersion) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pVersion is NULL.")); return FALSE; } if (sizeof (FAX_VERSION) != pVersion->dwSizeOfStruct) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("sizeof (FAX_VERSION) != pVersion->dwSizeOfStruct.")); return FALSE; } __try { ec = FAX_GetVersion( FH_FAX_HANDLE(hFaxHandle), pVersion ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_GetVersion. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxGetVersion //******************************************** //* Outbox configuration //******************************************** BOOL WINAPI FaxGetOutboxConfiguration ( IN HANDLE hFaxHandle, OUT PFAX_OUTBOX_CONFIG *ppOutboxCfg ) /*++ Routine name : FaxGetOutboxConfiguration Routine description: Get Outbox configuration Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in ] - Handle to fax server ppOutboxCfg [out] - New Outbox configuration buffer Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DWORD dwConfigSize = 0; DEBUG_FUNCTION_NAME(TEXT("FaxGetOutboxConfiguration")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!ppOutboxCfg) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("ppOutboxCfg is NULL.")); return FALSE; } *ppOutboxCfg = NULL; __try { ec = FAX_GetOutboxConfiguration( FH_FAX_HANDLE(hFaxHandle), (LPBYTE*)ppOutboxCfg, &dwConfigSize ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_GetOutboxConfiguration. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxGetOutboxConfiguration BOOL WINAPI FaxSetOutboxConfiguration ( IN HANDLE hFaxHandle, IN CONST PFAX_OUTBOX_CONFIG pOutboxCfg ) /*++ Routine name : FaxSetOutboxConfiguration Routine description: Set Outbox configuration Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in] - Handle to fax server pOutboxCfg [in] - New configuration Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxSetOutboxConfiguration")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!pOutboxCfg) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pOutboxCfg is NULL.")); return FALSE; } if (sizeof (FAX_OUTBOX_CONFIG) != pOutboxCfg->dwSizeOfStruct) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("sizeof (FAX_OUTBOX_CONFIG) != pOutboxCfg->dwSizeOfStruct.")); return FALSE; } if ((pOutboxCfg->dtDiscountStart.Hour > 23) || (pOutboxCfg->dtDiscountStart.Minute > 59) || (pOutboxCfg->dtDiscountEnd.Hour > 23) || (pOutboxCfg->dtDiscountEnd.Minute > 59)) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("wrong pOutboxCfg->dwDiscountStart OR ->dwDiscountEnd.")); return FALSE; } __try { ec = FAX_SetOutboxConfiguration( FH_FAX_HANDLE(hFaxHandle), pOutboxCfg ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_SetOutboxConfiguration. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxSetOutboxConfiguration //******************************************** //* Archive configuration //******************************************** BOOL WINAPI FaxGetArchiveConfigurationA ( IN HANDLE hFaxHandle, IN FAX_ENUM_MESSAGE_FOLDER Folder, OUT PFAX_ARCHIVE_CONFIGA *ppArchiveCfg ) /*++ Routine name : FaxGetArchiveConfigurationA Routine description: Gets the archive configuration - ANSI version Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in ] - Handle to fax server Folder [in ] - Folder type ppArchiveCfg [out] - Configuration buffer Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { DEBUG_FUNCTION_NAME(TEXT("FaxGetArchiveConfigurationA")); // // no need to validate parameters, FaxGetArchiveConfigurationW() will do that // if (!FaxGetArchiveConfigurationW( hFaxHandle, Folder, (PFAX_ARCHIVE_CONFIGW*) ppArchiveCfg )) { DebugPrintEx(DEBUG_ERR, _T("FaxGetArchiveConfigurationW() is failed.")); return FALSE; } if (!ConvertUnicodeStringInPlace((LPWSTR)(*ppArchiveCfg)->lpcstrFolder)) { DebugPrintEx(DEBUG_ERR, _T("ConvertUnicodeStringInPlace failed, ec = %ld."), GetLastError()); MemFree (*ppArchiveCfg); return FALSE; } (*ppArchiveCfg)->dwSizeOfStruct = sizeof(FAX_ARCHIVE_CONFIGA); return TRUE; } // FaxGetArchiveConfigurationA BOOL WINAPI FaxGetArchiveConfigurationW ( IN HANDLE hFaxHandle, IN FAX_ENUM_MESSAGE_FOLDER Folder, OUT PFAX_ARCHIVE_CONFIGW *ppArchiveCfg ) /*++ Routine name : FaxGetArchiveConfigurationW Routine description: Gets the archive configuration - UNICODE version Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in ] - Handle to fax server Folder [in ] - Folder type ppArchiveCfg [out] - Configuration buffer Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { DWORD dwConfigSize = 0; error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxGetArchiveConfigurationA")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!ppArchiveCfg) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("ppArchiveCfg is NULL.")); return FALSE; } if ((Folder != FAX_MESSAGE_FOLDER_SENTITEMS) && (Folder != FAX_MESSAGE_FOLDER_INBOX) ) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("Folder is neither SentItems nor Inbox.")); return FALSE; } *ppArchiveCfg = NULL; __try { ec = FAX_GetArchiveConfiguration( FH_FAX_HANDLE(hFaxHandle), Folder, (LPBYTE*)ppArchiveCfg, &dwConfigSize ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_GetArchiveConfiguration. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } FixupStringPtrW( ppArchiveCfg, (*ppArchiveCfg)->lpcstrFolder ); return TRUE; } // FaxGetArchiveConfigurationW #ifndef UNICODE FaxGetArchiveConfigurationX ( IN HANDLE hFaxHandle, IN FAX_ENUM_MESSAGE_FOLDER Folder, OUT PFAX_ARCHIVE_CONFIGW *ppArchiveCfg ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (Folder); UNREFERENCED_PARAMETER (ppArchiveCfg); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } #endif // #ifndef UNICODE BOOL WINAPI FaxSetArchiveConfigurationA ( IN HANDLE hFaxHandle, IN FAX_ENUM_MESSAGE_FOLDER Folder, IN CONST PFAX_ARCHIVE_CONFIGA pArchiveCfg ) /*++ Routine name : FaxSetArchiveConfigurationA Routine description: Sets the archive configuration - ANSI version Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in ] - Handle to fax server Folder [in ] - Folder type pArchiveCfg [in ] - New configuration. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { FAX_ARCHIVE_CONFIGW ConfigW; BOOL bRes; DEBUG_FUNCTION_NAME(TEXT("FaxSetArchiveConfigurationA")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle is failed.")); return FALSE; } if (!pArchiveCfg) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pArchiveCfg is NULL.")); return FALSE; } if (sizeof(FAX_ARCHIVE_CONFIGA) != pArchiveCfg->dwSizeOfStruct) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pArchiveCfg->dwSizeOfStruct != sizeof(FAX_ARCHIVE_CONFIGA).")); return FALSE; } // // Create a UNICODE structure and pass along to UNICODE function // Ansi structure is same size as unicode structure, so we can just copy it, then // cast the string pointers correctly // CopyMemory(&ConfigW, pArchiveCfg, sizeof(FAX_ARCHIVE_CONFIGA)); ConfigW.lpcstrFolder = NULL; ConfigW.dwSizeOfStruct = sizeof (FAX_ARCHIVE_CONFIGW); if (pArchiveCfg->lpcstrFolder) { if (NULL == (ConfigW.lpcstrFolder = AnsiStringToUnicodeString(pArchiveCfg->lpcstrFolder)) ) { DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString(pArchiveCfg->lpcstrFolder) returns NULL.")); return FALSE; } } bRes = FaxSetArchiveConfigurationW (hFaxHandle, Folder, &ConfigW); MemFree((PVOID)ConfigW.lpcstrFolder); return bRes; } // FaxSetArchiveConfigurationA BOOL WINAPI FaxSetArchiveConfigurationW ( IN HANDLE hFaxHandle, IN FAX_ENUM_MESSAGE_FOLDER Folder, IN CONST PFAX_ARCHIVE_CONFIGW pArchiveCfg ) /*++ Routine name : FaxSetArchiveConfigurationW Routine description: Sets the archive configuration - UNICODE version Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in ] - Handle to fax server Folder [in ] - Folder type pArchiveCfg [in ] - New configuration. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxSetArchiveConfigurationW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!pArchiveCfg) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pArchiveCfg is NULL.")); return FALSE; } if ((Folder != FAX_MESSAGE_FOLDER_SENTITEMS) && (Folder != FAX_MESSAGE_FOLDER_INBOX) ) { DebugPrintEx(DEBUG_ERR, _T("Invalid folder id (%ld)"), Folder); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (sizeof(FAX_ARCHIVE_CONFIGW) != pArchiveCfg->dwSizeOfStruct) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("sizeof(FAX_ARCHIVE_CONFIGW) != pArchiveCfg->dwSizeOfStruct.")); return FALSE; } if (pArchiveCfg->bUseArchive) { if (pArchiveCfg->dwSizeQuotaHighWatermark < pArchiveCfg->dwSizeQuotaLowWatermark) { DebugPrintEx(DEBUG_ERR, _T("Watermarks mismatch (high=%ld, low=%ld)"), pArchiveCfg->dwSizeQuotaHighWatermark, pArchiveCfg->dwSizeQuotaLowWatermark); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if ((NULL == pArchiveCfg->lpcstrFolder) || (L'\0' == pArchiveCfg->lpcstrFolder[0])) { DebugPrintEx(DEBUG_ERR, _T("Empty archive folder specified")); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (lstrlenW (pArchiveCfg->lpcstrFolder) > MAX_ARCHIVE_FOLDER_PATH) { DebugPrintEx(DEBUG_ERR, _T("DB file name exceeds MAX_PATH")); SetLastError (ERROR_BUFFER_OVERFLOW); return FALSE; } } __try { ec = FAX_SetArchiveConfiguration( FH_FAX_HANDLE(hFaxHandle), Folder, pArchiveCfg ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_SetArchiveConfiguration. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxSetArchiveConfigurationW #ifndef UNICODE FaxSetArchiveConfigurationX ( IN HANDLE hFaxHandle, IN FAX_ENUM_MESSAGE_FOLDER Folder, IN CONST PFAX_ARCHIVE_CONFIGW pArchiveCfg ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (Folder); UNREFERENCED_PARAMETER (pArchiveCfg); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } #endif // #ifndef UNICODE //******************************************** //* Activity logging //******************************************** BOOL WINAPI FaxGetActivityLoggingConfigurationA ( IN HANDLE hFaxHandle, OUT PFAX_ACTIVITY_LOGGING_CONFIGA *ppLoggingCfg ) /*++ Routine name : FaxGetActivityLoggingConfigurationA Routine description: Gets the activity logging configuration - ANSI version Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in ] - Handle to fax server ppLoggingCfg [out] - Configuration buffer Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { DEBUG_FUNCTION_NAME(TEXT("FaxGetActivityLoggingConfigurationA")); // // no need to validate parameters, FaxGetActivityLoggingConfigurationW() will do that // if (!FaxGetActivityLoggingConfigurationW( hFaxHandle, (PFAX_ACTIVITY_LOGGING_CONFIGW*) ppLoggingCfg )) { DebugPrintEx(DEBUG_ERR, _T("FaxGetActivityLoggingConfigurationW() is failed.")); return FALSE; } if (!ConvertUnicodeStringInPlace((LPWSTR) (*ppLoggingCfg)->lptstrDBPath)) { DebugPrintEx(DEBUG_ERR, _T("ConvertUnicodeStringInPlace failed, ec = %ld."), GetLastError()); MemFree (*ppLoggingCfg); return FALSE; } (*ppLoggingCfg)->dwSizeOfStruct = sizeof(FAX_ACTIVITY_LOGGING_CONFIGA); return TRUE; } // FaxGetActivityLoggingConfigurationA BOOL WINAPI FaxGetActivityLoggingConfigurationW ( IN HANDLE hFaxHandle, OUT PFAX_ACTIVITY_LOGGING_CONFIGW *ppLoggingCfg ) /*++ Routine name : FaxGetActivityLoggingConfigurationW Routine description: Gets the activity logging configuration - UNICODE version Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in ] - Handle to fax server ppLoggingCfg [out] - Configuration buffer Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { DWORD dwConfigSize = 0; error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxGetActivityLoggingConfigurationW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!ppLoggingCfg) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("ppLoggingCfg is NULL.")); return FALSE; } *ppLoggingCfg = NULL; __try { ec = FAX_GetActivityLoggingConfiguration( FH_FAX_HANDLE(hFaxHandle), (LPBYTE*)ppLoggingCfg, &dwConfigSize ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_GetActivityLoggingConfiguration. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } FixupStringPtrW( ppLoggingCfg, (*ppLoggingCfg)->lptstrDBPath ); return TRUE; } // FaxGetActivityLoggingConfigurationW #ifndef UNICODE FaxGetActivityLoggingConfigurationX ( IN HANDLE hFaxHandle, OUT PFAX_ACTIVITY_LOGGING_CONFIGW *ppLoggingCfg ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (ppLoggingCfg); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } // FaxGetActivityLoggingConfigurationX #endif // #ifndef UNICODE BOOL WINAPI FaxSetActivityLoggingConfigurationA ( IN HANDLE hFaxHandle, IN CONST PFAX_ACTIVITY_LOGGING_CONFIGA pLoggingCfg ) /*++ Routine name : FaxSetActivityLoggingConfigurationA Routine description: Sets the activity logging configuration - ANSI version Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in ] - Handle to fax server pLoggingCfg [in ] - New configuration Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { FAX_ACTIVITY_LOGGING_CONFIGW ConfigW; BOOL bRes; DEBUG_FUNCTION_NAME(TEXT("FaxSetActivityLoggingConfigurationA")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!pLoggingCfg) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pLoggingCfg is NULL.")); return FALSE; } if (sizeof (FAX_ACTIVITY_LOGGING_CONFIGA) != pLoggingCfg->dwSizeOfStruct) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("sizeof (FAX_ACTIVITY_LOGGING_CONFIGA) != pLoggingCfg->dwSizeOfStruct.")); return FALSE; } // // Create a UNICODE structure and pass along to UNICODE function // Ansi structure is same size as unicode structure, so we can just copy it, then // cast the string pointers correctly // CopyMemory(&ConfigW, pLoggingCfg, sizeof(FAX_ACTIVITY_LOGGING_CONFIGA)); ConfigW.lptstrDBPath = NULL; ConfigW.dwSizeOfStruct = sizeof (FAX_ACTIVITY_LOGGING_CONFIGW); if (pLoggingCfg->lptstrDBPath) { if (NULL == (ConfigW.lptstrDBPath = AnsiStringToUnicodeString(pLoggingCfg->lptstrDBPath)) ) { DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString(pLoggingCfg->lptstrDBPath) returns NULL.")); return FALSE; } } bRes = FaxSetActivityLoggingConfigurationW (hFaxHandle, &ConfigW); MemFree((PVOID)ConfigW.lptstrDBPath); return bRes; } // FaxSetActivityLoggingConfigurationA BOOL WINAPI FaxSetActivityLoggingConfigurationW ( IN HANDLE hFaxHandle, IN CONST PFAX_ACTIVITY_LOGGING_CONFIGW pLoggingCfg ) /*++ Routine name : FaxSetActivityLoggingConfigurationW Routine description: Sets the activity logging configuration - UNICODE version Author: Eran Yariv (EranY), Nov, 1999 Arguments: hFaxHandle [in ] - Handle to fax server pLoggingCfg [in ] - New configuration Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxSetActivityLoggingConfigurationW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!pLoggingCfg) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pLoggingCfg is NULL.")); return FALSE; } if (sizeof (FAX_ACTIVITY_LOGGING_CONFIGW) != pLoggingCfg->dwSizeOfStruct) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("sizeof (FAX_ACTIVITY_LOGGING_CONFIGW) != pLoggingCfg->dwSizeOfStruct.")); return FALSE; } if (pLoggingCfg->bLogIncoming || pLoggingCfg->bLogOutgoing) { if ((NULL == pLoggingCfg->lptstrDBPath) || (L'\0' == pLoggingCfg->lptstrDBPath[0])) { DebugPrintEx(DEBUG_ERR, _T("Empty logging database specified")); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (lstrlenW (pLoggingCfg->lptstrDBPath) > MAX_DIR_PATH) // Limit of directory path length { DebugPrintEx(DEBUG_ERR, _T("DB file name exceeds MAX_PATH")); SetLastError (ERROR_BUFFER_OVERFLOW); return FALSE; } } __try { ec = FAX_SetActivityLoggingConfiguration( FH_FAX_HANDLE(hFaxHandle), pLoggingCfg ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_SetActivityLoggingConfiguration. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxSetActivityLoggingConfigurationW #ifndef UNICODE FaxSetActivityLoggingConfigurationX ( IN HANDLE hFaxHandle, IN CONST PFAX_ACTIVITY_LOGGING_CONFIGW pLoggingCfg ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (pLoggingCfg); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } // FaxSetActivityLoggingConfigurationX #endif // #ifndef UNICODE //******************************************** //* Outbound routing //******************************************** BOOL WINAPI FaxAddOutboundGroupA ( IN HANDLE hFaxHandle, IN LPCSTR lpctstrGroupName ) { LPWSTR lpwstrGroupName; BOOL bRes; DEBUG_FUNCTION_NAME(TEXT("FaxAddOutboundGroupA")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!lpctstrGroupName) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("lpctstrGroupName is NULL.")); return FALSE; } if (_mbsicmp((PUCHAR)lpctstrGroupName, (PUCHAR)ROUTING_GROUP_ALL_DEVICESA) == 0) { SetLastError(ERROR_DUP_NAME); DebugPrintEx(DEBUG_ERR, _T("_mbsicmp((PUCHAR)lpctstrGroupName, (PUCHAR)ROUTING_GROUP_ALL_DEVICESA) == 0.")); return FALSE; } if (strlen(lpctstrGroupName) >= MAX_ROUTING_GROUP_NAME) { SetLastError(ERROR_BUFFER_OVERFLOW); DebugPrintEx(DEBUG_ERR, _T("strlen(lpctstrGroupName) >= MAX_ROUTING_GROUP_NAME.")); return FALSE; } if (NULL == (lpwstrGroupName = AnsiStringToUnicodeString(lpctstrGroupName))) { DebugPrintEx( DEBUG_ERR, TEXT("AnsiStringToUnicodeString failed. (ec: %ld)"), GetLastError()); return FALSE; } bRes = FaxAddOutboundGroupW (hFaxHandle, lpwstrGroupName); MemFree (lpwstrGroupName); return bRes; } BOOL WINAPI FaxAddOutboundGroupW ( IN HANDLE hFaxHandle, IN LPCWSTR lpctstrGroupName ) /*++ Routine name : FaxAddOutboundGroupW Routine description: Adds an empty outbound routing group for a Fax server Author: Oded Sacher (OdedS), Nov, 1999 Arguments: hFaxHandle [ in ] - Fax server handle obtained from a call to FaxConnectFaxServer lpctstrGroupName [ in ] - A pointer to a null-terminated string that uniqely identifies a new group name Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxAddOutboundGroupW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!lpctstrGroupName) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("lpctstrGroupName is NULL.")); return FALSE; } if (_wcsicmp (lpctstrGroupName, ROUTING_GROUP_ALL_DEVICESW) == 0) { SetLastError(ERROR_DUP_NAME); DebugPrintEx(DEBUG_ERR, _T("_mbsicmp((PUCHAR)lpctstrGroupName, (PUCHAR)ROUTING_GROUP_ALL_DEVICESA) == 0.")); return FALSE; } if (wcslen (lpctstrGroupName) >= MAX_ROUTING_GROUP_NAME) { SetLastError(ERROR_BUFFER_OVERFLOW); DebugPrintEx(DEBUG_ERR, _T("strlen(lpctstrGroupName) >= MAX_ROUTING_GROUP_NAME.")); return FALSE; } __try { ec = FAX_AddOutboundGroup( FH_FAX_HANDLE(hFaxHandle), lpctstrGroupName ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_AddOutboundGroup. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } #ifndef UNICODE FaxAddOutboundGroupX ( IN HANDLE hFaxHandle, IN LPCSTR lpctstrGroupName ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (lpctstrGroupName); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } #endif // #ifndef UNICODE BOOL WINAPI FaxSetOutboundGroupA ( IN HANDLE hFaxHandle, IN PFAX_OUTBOUND_ROUTING_GROUPA pGroup ) { FAX_OUTBOUND_ROUTING_GROUPW GroupW; BOOL bRes; DEBUG_FUNCTION_NAME(TEXT("FaxSetOutboundGroupA")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!pGroup) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pGroup is NULL.")); return FALSE; } if (sizeof (FAX_OUTBOUND_ROUTING_GROUPA) != pGroup->dwSizeOfStruct) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("sizeof (FAX_OUTBOUND_ROUTING_GROUPA) != pGroup->dwSizeOfStruct.")); return FALSE; } if (!pGroup->lpctstrGroupName) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pGroup->lpctstrGroupName is NULL.")); return FALSE; } if (strlen (pGroup->lpctstrGroupName) >= MAX_ROUTING_GROUP_NAME) { SetLastError(ERROR_BUFFER_OVERFLOW); DebugPrintEx(DEBUG_ERR, _T("strlen (pGroup->lpctstrGroupName) >= MAX_ROUTING_GROUP_NAME.")); return FALSE; } if (!pGroup->lpdwDevices && pGroup->dwNumDevices) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("!pGroup->lpdwDevices && pGroup->dwNumDevices.")); return FALSE; } // // Create a UNICODE structure and pass along to UNICODE function // Ansi structure is same size as unicode structure, so we can just copy it, then // cast the string pointers correctly // CopyMemory(&GroupW, pGroup, sizeof(FAX_OUTBOUND_ROUTING_GROUPA)); GroupW.dwSizeOfStruct = sizeof (FAX_OUTBOUND_ROUTING_GROUPW); if (NULL == (GroupW.lpctstrGroupName = AnsiStringToUnicodeString(pGroup->lpctstrGroupName))) { DebugPrintEx( DEBUG_ERR, TEXT("AnsiStringToUnicodeString failed. (ec: %ld)"), GetLastError()); return FALSE; } bRes = FaxSetOutboundGroupW (hFaxHandle, &GroupW); MemFree((PVOID)GroupW.lpctstrGroupName); return bRes; } BOOL WINAPI FaxSetOutboundGroupW ( IN HANDLE hFaxHandle, IN PFAX_OUTBOUND_ROUTING_GROUPW pGroup ) /*++ Routine name : FaxSetOutboundGroupW Routine description: Sets an outbound routing group settings for a Fax server Author: Oded Sacher (OdedS), Nov, 1999 Arguments: hFaxHandle [in] - Fax server handle pGroup [in] - Pointer to a FAX_OUTBOUND_ROUTING_GROUP buffer to set Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxSetOutboundGroupW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!pGroup) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pGroup is NULL.")); return FALSE; } if (sizeof (FAX_OUTBOUND_ROUTING_GROUPW) != pGroup->dwSizeOfStruct) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("sizeof (FAX_OUTBOUND_ROUTING_GROUPW) != pGroup->dwSizeOfStruct.")); return FALSE; } if (!pGroup->lpctstrGroupName) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pGroup->lpctstrGroupName is NULL.")); return FALSE; } if (wcslen (pGroup->lpctstrGroupName) >= MAX_ROUTING_GROUP_NAME) { SetLastError(ERROR_BUFFER_OVERFLOW); DebugPrintEx(DEBUG_ERR, _T("wcslen (pGroup->lpctstrGroupName) >= MAX_ROUTING_GROUP_NAME.")); return FALSE; } if (!pGroup->lpdwDevices && pGroup->dwNumDevices) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("!pGroup->lpdwDevices && pGroup->dwNumDevices.")); return FALSE; } Assert (sizeof (RPC_FAX_OUTBOUND_ROUTING_GROUPW) == sizeof (FAX_OUTBOUND_ROUTING_GROUPW)); __try { ec = FAX_SetOutboundGroup( FH_FAX_HANDLE(hFaxHandle), (PRPC_FAX_OUTBOUND_ROUTING_GROUPW)pGroup ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_SetOutboundGroup. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } #ifndef UNICODE FaxSetOutboundGroupX ( IN HANDLE hFaxHandle, IN PFAX_OUTBOUND_ROUTING_GROUPW pGroup ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (pGroup); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } #endif // #ifndef UNICODE WINFAXAPI BOOL WINAPI FaxEnumOutboundGroupsA ( IN HANDLE hFaxHandle, OUT PFAX_OUTBOUND_ROUTING_GROUPA *ppGroups, OUT LPDWORD lpdwNumGroups ) { PFAX_OUTBOUND_ROUTING_GROUPW pGroup; DWORD i; DEBUG_FUNCTION_NAME(TEXT("FaxEnumOutboundGroupsA")); // // no need to validate parameters, FaxEnumOutboundGroupsW() will do that // if (!FaxEnumOutboundGroupsW (hFaxHandle, (PFAX_OUTBOUND_ROUTING_GROUPW*) ppGroups, lpdwNumGroups)) { DebugPrintEx(DEBUG_ERR, _T("FaxEnumOutboundGroupsW() is failed. (ec: %ld)"), GetLastError()); return FALSE; } pGroup = (PFAX_OUTBOUND_ROUTING_GROUPW) *ppGroups; for (i = 0; i < *lpdwNumGroups; i++) { if (!ConvertUnicodeStringInPlace((LPWSTR) pGroup[i].lpctstrGroupName)) { DebugPrintEx(DEBUG_ERR, _T("ConvertUnicodeStringInPlace failed, ec = %ld."), GetLastError()); MemFree (*ppGroups); return FALSE; } } return TRUE; } //FaxEnumOutboundGroupsA WINFAXAPI BOOL WINAPI FaxEnumOutboundGroupsW ( IN HANDLE hFaxHandle, OUT PFAX_OUTBOUND_ROUTING_GROUPW *ppGroups, OUT LPDWORD lpdwNumGroups ) /*++ Routine name : FaxEnumOutboundGroupsW Routine description: Enumerates all the outbound routing groups of a fax server. Author: Oded Sacher (OdedS), Dec, 1999 Arguments: hFaxHandle [in ] - Specifies a fax server handle returned by a call to the FaxConnectFaxServer function. ppGroups [out ] - A pointer to a buffer of FAX_OUTBOUND_ROUTING_GROUP structures. This buffer is allocated by the function and the client should call FaxFreeBuffer to free it. lpdwNumGroups [out ] - Pointer to a DWORD value indicating the number of groups retrieved. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DWORD dwBufferSize = 0; DWORD i; DEBUG_FUNCTION_NAME(TEXT("FaxEnumOutboundGroupsW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!ppGroups) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("ppGroups is NULL.")); return FALSE; } if (!lpdwNumGroups) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("lpdwNumGroups is NULL.")); return FALSE; } *ppGroups = NULL; *lpdwNumGroups = 0; __try { ec = FAX_EnumOutboundGroups( FH_FAX_HANDLE(hFaxHandle), (LPBYTE*) ppGroups, &dwBufferSize, lpdwNumGroups ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_EnumOutboundGroups. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } // // Unpack buffer // for (i = 0; i < *lpdwNumGroups; i++) { FixupStringPtrW( ppGroups, (*ppGroups)[i].lpctstrGroupName ); if ((*ppGroups)[i].lpdwDevices != NULL) { (*ppGroups)[i].lpdwDevices = (LPDWORD)((LPBYTE)(*ppGroups) + (ULONG_PTR)((*ppGroups)[i].lpdwDevices)); } } return TRUE; }//FaxEnumOutboundGroupsW #ifndef UNICODE WINFAXAPI BOOL WINAPI FaxEnumOutboundGroupsX ( IN HANDLE hFaxHandle, OUT PFAX_OUTBOUND_ROUTING_GROUPW *ppGroups, OUT LPDWORD lpdwNumGroups ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (ppGroups); UNREFERENCED_PARAMETER (lpdwNumGroups); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } #endif // #ifndef UNICODE WINFAXAPI BOOL WINAPI FaxRemoveOutboundGroupA ( IN HANDLE hFaxHandle, IN LPCSTR lpctstrGroupName ) { LPWSTR lpwstrGroupName; BOOL bRes; DEBUG_FUNCTION_NAME(TEXT("FaxRemoveOutboundGroupA")); if (NULL == (lpwstrGroupName = AnsiStringToUnicodeString(lpctstrGroupName))) { DebugPrintEx( DEBUG_ERR, TEXT("AnsiStringToUnicodeString failed. (ec: %ld)"), GetLastError()); return FALSE; } bRes = FaxRemoveOutboundGroupW (hFaxHandle, lpwstrGroupName); MemFree (lpwstrGroupName); return bRes; }//FaxRemoveOutboundGroupA WINFAXAPI BOOL WINAPI FaxRemoveOutboundGroupW ( IN HANDLE hFaxHandle, IN LPCWSTR lpctstrGroupName ) /*++ Routine name : FaxRemoveOutboundGroupW Routine description: Removes an existing outbound routing group for a Fax server Author: Oded Sacher (OdedS), Nov, 1999 Arguments: hFaxHandle [ in ] - Fax server handle obtained from a call to FaxConnectFaxServer lpctstrGroupName [ in ] - A pointer to a null-terminated string that uniqely identifies the group name Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxRemoveOutboundGroupW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!lpctstrGroupName) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("lpctstrGroupName is NULL.")); return FALSE; } if (_wcsicmp (lpctstrGroupName, ROUTING_GROUP_ALL_DEVICESW) == 0) { SetLastError(ERROR_INVALID_OPERATION); DebugPrintEx(DEBUG_ERR, _T("_wcsicmp (lpctstrGroupName, ROUTING_GROUP_ALL_DEVICESW) == 0.")); return FALSE; } if (wcslen (lpctstrGroupName) >= MAX_ROUTING_GROUP_NAME) { SetLastError(ERROR_BUFFER_OVERFLOW); DebugPrintEx(DEBUG_ERR, _T("wcslen (lpctstrGroupName) >= MAX_ROUTING_GROUP_NAME.")); return FALSE; } __try { ec = FAX_RemoveOutboundGroup( FH_FAX_HANDLE(hFaxHandle), lpctstrGroupName ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_RemoveOutboundGroup. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; }//FaxRemoveOutboundGroupW #ifndef UNICODE WINFAXAPI BOOL WINAPI FaxRemoveOutboundGroupX ( IN HANDLE hFaxHandle, IN LPCWSTR lpctstrGroupName ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (lpctstrGroupName); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } #endif // #ifndef UNICODE BOOL WINAPI FaxSetDeviceOrderInGroupA ( IN HANDLE hFaxHandle, IN LPCSTR lpctstrGroupName, IN DWORD dwDeviceId, IN DWORD dwNewOrder ) { LPWSTR lpwstrGroupName; BOOL bRes; DEBUG_FUNCTION_NAME(TEXT("FaxSetDeviceOrderInGroupA")); if (NULL == (lpwstrGroupName = AnsiStringToUnicodeString(lpctstrGroupName))) { DebugPrintEx( DEBUG_ERR, TEXT("AnsiStringToUnicodeString failed. (ec: %ld)"), GetLastError()); return FALSE; } bRes = FaxSetDeviceOrderInGroupW (hFaxHandle, lpwstrGroupName, dwDeviceId, dwNewOrder); MemFree (lpwstrGroupName); return bRes; }//FaxSetDeviceOrderInGroupA BOOL WINAPI FaxSetDeviceOrderInGroupW ( IN HANDLE hFaxHandle, IN LPCWSTR lpctstrGroupName, IN DWORD dwDeviceId, IN DWORD dwNewOrder ) /*++ Routine name : FaxSetDeviceOrderInGroupW Routine description: Sets the order of a single device in a group of outbound routing devices. Author: Oded Sacher (OdedS), Dec, 1999 Arguments: hFaxHandle [in] - Specifies a fax server handle returned by a call to the FaxConnectFaxServer function lpctstrGroupName [in] - A pointer to a null-terminated string that uniquely identifies a group. dwDeviceId [in] - A DWORD value specifying the id of the device in the group. The specified device must exist in the group. dwNewOrder [in] - A DWORD value specifying the new 1-based order of the device in the group. If there are N devices in the group, this value must be between 1 and N (including). Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxSetDeviceOrderInGroupW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!dwDeviceId) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("dwDeviceId is ZERO.")); return FALSE; } if (!dwNewOrder) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("dwNewOrder is ZERO.")); return FALSE; } if (!lpctstrGroupName) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("lpctstrGroupName is NULL.")); return FALSE; } if (wcslen (lpctstrGroupName) >= MAX_ROUTING_GROUP_NAME) { DebugPrintEx(DEBUG_ERR, _T("Group name length exceeded MAX_ROUTING_GROUP_NAME")); SetLastError(ERROR_BUFFER_OVERFLOW); return FALSE; } __try { ec = FAX_SetDeviceOrderInGroup( FH_FAX_HANDLE(hFaxHandle), lpctstrGroupName, dwDeviceId, dwNewOrder); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_SetDeviceOrderInGroup. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; }//FaxSetDeviceOrderInGroupW #ifndef UNICODE BOOL WINAPI FaxSetDeviceOrderInGroupX ( IN HANDLE hFaxHandle, IN LPCWSTR lpctstrGroupName, IN DWORD dwDeviceId, IN DWORD dwNewOrder ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (lpctstrGroupName); UNREFERENCED_PARAMETER (dwDeviceId); UNREFERENCED_PARAMETER (dwNewOrder); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } #endif // #ifndef UNICODE BOOL WINAPI FaxAddOutboundRuleA ( IN HANDLE hFaxHandle, IN DWORD dwAreaCode, IN DWORD dwCountryCode, IN DWORD dwDeviceID, IN LPCSTR lpctstrGroupName, IN BOOL bUseGroup ) { LPWSTR lpwstrGroupName = NULL; BOOL bRes; DEBUG_FUNCTION_NAME(TEXT("FaxAddOutboundRuleA")); if (TRUE == bUseGroup) { if (!lpctstrGroupName) { DebugPrintEx( DEBUG_ERR, TEXT("lpctstrGroupName is NULL")); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (NULL == (lpwstrGroupName = AnsiStringToUnicodeString(lpctstrGroupName))) { DebugPrintEx( DEBUG_ERR, TEXT("AnsiStringToUnicodeString failed. (ec: %ld)"), GetLastError()); return FALSE; } } bRes = FaxAddOutboundRuleW (hFaxHandle, dwAreaCode, dwCountryCode, dwDeviceID, lpwstrGroupName, bUseGroup); MemFree (lpwstrGroupName); return bRes; } BOOL WINAPI FaxAddOutboundRuleW ( IN HANDLE hFaxHandle, IN DWORD dwAreaCode, IN DWORD dwCountryCode, IN DWORD dwDeviceID, IN LPCWSTR lpctstrGroupName, IN BOOL bUseGroup ) /*++ Routine name : FaxAddOutboundRuleW Routine description: Adds a new outbound routing rule to the fax service Author: Oded Sacher (OdedS), Dec, 1999 Arguments: hFaxHandle [in] - Specifies a fax server handle returned by a call to the FaxConnectFaxServer function. dwAreaCode [in] - The area code of the rule. dwCountryCode [in] - The country code of the rule. dwDeviceID [in] - The destination device of the rule. lpctstrGroupName [in] - The destination group of the rule. This value is valid only if the bUseGroup member is TRUE. bUseGroup [in] - A Boolean value specifying whether the group should be used as the destination. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxAddOutboundRuleW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (dwCountryCode == ROUTING_RULE_COUNTRY_CODE_ANY) { // // *.* can not be added; *.AreaCode is not a valid rule dialing location. // DebugPrintEx(DEBUG_ERR, _T("dwCountryCode = 0; *.* can not be added; *.AreaCode is not a valid rule dialing location")); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (TRUE == bUseGroup) { if (!lpctstrGroupName) { DebugPrintEx(DEBUG_ERR, _T("lpctstrGroupName is NULL")); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (wcslen (lpctstrGroupName) >= MAX_ROUTING_GROUP_NAME) { DebugPrintEx(DEBUG_ERR, _T("Group name length exceeded MAX_ROUTING_GROUP_NAME")); SetLastError(ERROR_BUFFER_OVERFLOW); return FALSE; } } else { if (!dwDeviceID) { DebugPrintEx(DEBUG_ERR, _T("dwDeviceId = 0; Not a valid device ID")); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } lpctstrGroupName = NULL; } __try { ec = FAX_AddOutboundRule( FH_FAX_HANDLE(hFaxHandle), dwAreaCode, dwCountryCode, dwDeviceID, lpctstrGroupName, bUseGroup); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_AddOutboundRule. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } //FaxAddOutboundRuleW #ifndef UNICODE BOOL WINAPI FaxAddOutboundRuleX ( IN HANDLE hFaxHandle, IN DWORD dwAreaCode, IN DWORD dwCountryCode, IN DWORD dwDeviceID, IN LPCWSTR lpctstrGroupName, IN BOOL bUseGroup ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (dwAreaCode); UNREFERENCED_PARAMETER (dwCountryCode); UNREFERENCED_PARAMETER (dwDeviceID); UNREFERENCED_PARAMETER (lpctstrGroupName); UNREFERENCED_PARAMETER (bUseGroup); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } #endif // #ifndef UNICODE BOOL WINAPI FaxRemoveOutboundRule ( IN HANDLE hFaxHandle, IN DWORD dwAreaCode, IN DWORD dwCountryCode ) /*++ Routine name : FaxRemoveOutboundRule Routine description: Removes an existing outbound routing rule from the fax service Author: Oded Sacher (OdedS), Dec, 1999 Arguments: hFaxHandle [in] - Specifies a fax server handle returned by a call to the FaxConnectFaxServer function. dwAreaCode [in] - The area code of the rule. dwCountryCode [in] - The country code of the rule. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxRemoveOutboundRule")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (dwCountryCode == ROUTING_RULE_COUNTRY_CODE_ANY) { // // *.* can not be removed; *.AreaCode is not a valid rule dialing location. // DebugPrintEx(DEBUG_ERR, _T("dwCountryCode = 0; *.* can not be removed; *.AreaCode is not a valid rule dialing location")); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } __try { ec = FAX_RemoveOutboundRule( FH_FAX_HANDLE(hFaxHandle), dwAreaCode, dwCountryCode); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_RemoveOutboundRule. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxRemoveOutboundRule BOOL WINAPI FaxEnumOutboundRulesA ( IN HANDLE hFaxHandle, OUT PFAX_OUTBOUND_ROUTING_RULEA *ppRules, OUT LPDWORD lpdwNumRules ) { PFAX_OUTBOUND_ROUTING_RULEW pRule; DWORD i; DEBUG_FUNCTION_NAME(TEXT("FaxEnumOutboundRulesA")); // // no need to validate parameters, FaxEnumOutboundRulesW() will do that // if (!FaxEnumOutboundRulesW (hFaxHandle, (PFAX_OUTBOUND_ROUTING_RULEW*) ppRules, lpdwNumRules)) { DebugPrintEx(DEBUG_ERR, _T("FaxEnumOutboundRulesW() is failed. (ec: %ld)"), GetLastError()); return FALSE; } pRule = (PFAX_OUTBOUND_ROUTING_RULEW) *ppRules; for (i = 0; i < *lpdwNumRules; i++) { if (TRUE == pRule[i].bUseGroup) { if (!ConvertUnicodeStringInPlace((LPWSTR) pRule[i].Destination.lpcstrGroupName)) { DebugPrintEx(DEBUG_ERR, _T("ConvertUnicodeStringInPlace failed, ec = %ld."), GetLastError()); MemFree (*ppRules); return FALSE; } } if (!ConvertUnicodeStringInPlace((LPWSTR) pRule[i].lpctstrCountryName)) { DebugPrintEx(DEBUG_ERR, _T("ConvertUnicodeStringInPlace failed, ec = %ld."), GetLastError()); MemFree (*ppRules); return FALSE; } } return TRUE; } // FaxEnumOutboundRulesA BOOL WINAPI FaxEnumOutboundRulesW ( IN HANDLE hFaxHandle, OUT PFAX_OUTBOUND_ROUTING_RULEW *ppRules, OUT LPDWORD lpdwNumRules ) /*++ Routine name : FaxEnumOutboundRulesW Routine description: Enumerates all the outbound routing rules of a fax server. Author: Oded Sacher (OdedS), Dec, 1999 Arguments: hFaxHandle [in] - Specifies a fax server handle returned by a call to the FaxConnectFaxServer function. ppRules [out] - A pointer to a buffer of FAX_OUTBOUND_ROUTING_RULE structures. This buffer is allocated by the function and the client should call FaxFreeBuffer to free it. lpdwNumRules [out] - Pointer to a DWORD value indicating the number of rules retrieved. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DWORD dwBufferSize = 0; DWORD i; DEBUG_FUNCTION_NAME(TEXT("FaxEnumOutboundRulesW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() failed.")); return FALSE; } if (!ppRules) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("ppRules is NULL")); return FALSE; } if (!lpdwNumRules) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("lpdwNumRules is NULL.")); return FALSE; } *ppRules = NULL; *lpdwNumRules = 0; __try { ec = FAX_EnumOutboundRules( FH_FAX_HANDLE(hFaxHandle), (LPBYTE*) ppRules, &dwBufferSize, lpdwNumRules ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_EnumOutboundRules. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } // // Unpack buffer // for (i = 0; i < *lpdwNumRules; i++) { if (TRUE == (*ppRules)[i].bUseGroup) { FixupStringPtrW( ppRules, (*ppRules)[i].Destination.lpcstrGroupName ); } FixupStringPtrW( ppRules, (*ppRules)[i].lpctstrCountryName); } return TRUE; } // FaxEnumOutboundRulesW #ifndef UNICODE BOOL WINAPI FaxEnumOutboundRulesX ( IN HANDLE hFaxHandle, OUT PFAX_OUTBOUND_ROUTING_RULEW *ppRules, OUT LPDWORD lpdwNumRules ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (ppRules); UNREFERENCED_PARAMETER (lpdwNumRules); return FALSE; } // FaxEnumOutboundRulesX #endif // #ifndef UNICODE BOOL WINAPI FaxSetOutboundRuleA ( IN HANDLE hFaxHandle, IN PFAX_OUTBOUND_ROUTING_RULEA pRule ) { FAX_OUTBOUND_ROUTING_RULEW RuleW; BOOL bRes; DEBUG_FUNCTION_NAME(TEXT("FaxSetOutboundRuleA")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!pRule) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pRule is NULL.")); return FALSE; } if (pRule->dwSizeOfStruct != sizeof(FAX_OUTBOUND_ROUTING_RULEA)) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pRule->dwSizeOfStruct != sizeof(FAX_OUTBOUND_ROUTING_RULEA).")); return FALSE; } // // Create a UNICODE structure and pass along to UNICODE function // Ansi structure is same size as unicode structure, so we can just copy it, then // cast the string pointers correctly // CopyMemory(&RuleW, pRule, sizeof(FAX_OUTBOUND_ROUTING_RULEA)); RuleW.dwSizeOfStruct = sizeof (FAX_OUTBOUND_ROUTING_RULEW); if (TRUE == pRule->bUseGroup) { if (!(pRule->Destination).lpcstrGroupName) { DebugPrintEx(DEBUG_ERR, _T("lpcstrGroupName is NULL")); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (NULL == (RuleW.Destination.lpcstrGroupName = AnsiStringToUnicodeString((pRule->Destination).lpcstrGroupName))) { DebugPrintEx(DEBUG_ERR, _T("AnsiStringToUnicodeString failed. (ec: %ld)"), GetLastError()); return FALSE; } } bRes = FaxSetOutboundRuleW (hFaxHandle, &RuleW); if (TRUE == pRule->bUseGroup) { MemFree ((void*)(RuleW.Destination.lpcstrGroupName)); } return bRes; } // FaxSetOutboundRuleA BOOL WINAPI FaxSetOutboundRuleW ( IN HANDLE hFaxHandle, IN PFAX_OUTBOUND_ROUTING_RULEW pRule ) /*++ Routine name : FaxSetOutboundRuleW Routine description: Sets an outbound routing rule settings for a fax server. Author: Oded Sacher (OdedS), Dec, 1999 Arguments: hFaxHandle [in] - Specifies a fax server handle returned by a call to the FaxConnectFaxServer function. pRule [in] - A pointer to a FAX_OUTBOUND_ROUTING_RULE buffer to set. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; FAX_OUTBOUND_ROUTING_RULEW Rule; DEBUG_FUNCTION_NAME(TEXT("FaxSetOutboundRuleW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!pRule) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pRule is NULL.")); return FALSE; } if (pRule->dwSizeOfStruct != sizeof(FAX_OUTBOUND_ROUTING_RULEW)) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pRule->dwSizeOfStruct != sizeof(FAX_OUTBOUND_ROUTING_RULEW).")); return FALSE; } if (pRule->dwCountryCode == ROUTING_RULE_COUNTRY_CODE_ANY && pRule->dwAreaCode != ROUTING_RULE_AREA_CODE_ANY) { // // *.AreaCode is not a valid rule dialing location. // DebugPrintEx(DEBUG_ERR, _T("dwCountryCode = 0 , dwAreaCode != 0; *.AreaCode is not a valid rule dialing location")); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (TRUE == pRule->bUseGroup) { if (!(pRule->Destination).lpcstrGroupName) { DebugPrintEx(DEBUG_ERR, _T("lpcstrGroupName is NULL")); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (wcslen ((pRule->Destination).lpcstrGroupName) >= MAX_ROUTING_GROUP_NAME) { DebugPrintEx(DEBUG_ERR, _T("Group name length exceeded MAX_ROUTING_GROUP_NAME")); SetLastError(ERROR_BUFFER_OVERFLOW); return FALSE; } } else { if (!(pRule->Destination).dwDeviceId) { DebugPrintEx(DEBUG_ERR, _T("dwDeviceId = 0; Not a valid device ID")); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } } // // Zero the country name parameter of the rule before calling the RPC function. // This parameter is out only but the RPC client will try to marshal it if we don't NULL it. // This should be done in the IDL but due to backwards compatability issues with BOS Fax, we can't change that. // Rule = *pRule; Rule.lpctstrCountryName = NULL; __try { ec = FAX_SetOutboundRule( FH_FAX_HANDLE(hFaxHandle), (PRPC_FAX_OUTBOUND_ROUTING_RULEW)&Rule); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_SetOutboundRule. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxSetOutboundRuleW #ifndef UNICODE BOOL WINAPI FaxSetOutboundRuleX ( IN HANDLE hFaxHandle, IN PFAX_OUTBOUND_ROUTING_RULEW pRule ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (pRule); return FALSE; } // FaxSetOutboundRuleX #endif // #ifndef UNICODE BOOL WINAPI FaxGetServerActivity ( IN HANDLE hFaxHandle, OUT PFAX_SERVER_ACTIVITY pServerActivity ) /*++ Routine name : FaxGetServerActivity Routine description: Retrieves the status of the fax server queue activity and event log reports. Author: Oded Sacher (OdedS), Feb, 2000 Arguments: hFaxHandle [in] - Specifies a fax server handle returned by a call to the FaxConnectFaxServer function. pServerActivity [in] - A pointer to a FAX_SERVER_ACTIVITY object. The object will be allocated and freed by the calling client. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxGetServerActivity")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!pServerActivity) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pServerActivity is NULL.")); return FALSE; } if (sizeof (FAX_SERVER_ACTIVITY) != pServerActivity->dwSizeOfStruct) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("sizeof (FAX_SERVER_ACTIVITY) != pServerActivity->dwSizeOfStruct.")); return FALSE; } __try { ec = FAX_GetServerActivity( FH_FAX_HANDLE(hFaxHandle), pServerActivity); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_GetServerActivity. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxGetServerActivity BOOL WINAPI FaxGetReceiptsOptions ( IN HANDLE hFaxHandle, OUT PDWORD pdwReceiptsOptions ) /*++ Routine name : FaxGetReceiptsOptions Routine description: Retrieves the supported receipt options on the server. Author: Eran Yariv (EranY), July, 2000 Arguments: hFaxHandle [in] - Specifies a fax server handle returned by a call to the FaxConnectFaxServer function. pdwReceiptsOptions [out] - Buffer to receive receipts options (bit-wise combination of DRT_* constants) Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxGetReceiptsOptions")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!pdwReceiptsOptions) { DebugPrintEx(DEBUG_ERR, _T("pdwReceiptsOptions is NULL")); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } __try { ec = FAX_GetReceiptsOptions( FH_FAX_HANDLE(hFaxHandle), pdwReceiptsOptions); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_GetReceiptsOptions. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxGetReceiptsOptions BOOL WINAPI FaxGetPersonalCoverPagesOption ( IN HANDLE hFaxHandle, OUT LPBOOL lpbPersonalCPAllowed ) /*++ Routine name : FaxGetPersonalCoverPagesOption Routine description: Retrieves if the server supports personal cover pages Author: Eran Yariv (EranY), July, 2000 Arguments: hFaxHandle [in] - Specifies a fax server handle returned by a call to the FaxConnectFaxServer function. lpbPersonalCPAllowed [out] - Buffer to receive server support of personal coverpages. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxGetPersonalCoverPagesOption")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!lpbPersonalCPAllowed) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("lpbPersonalCPAllowed is NULL")); return FALSE; } __try { ec = FAX_GetPersonalCoverPagesOption( FH_FAX_HANDLE(hFaxHandle), lpbPersonalCPAllowed); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_GetPersonalCoverPagesOption. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxGetPersonalCoverPagesOption BOOL WINAPI FaxGetConfigWizardUsed ( OUT LPBOOL lpbConfigWizardUsed ) /*++ Routine name : FaxGetConfigWizardUsed Routine description: Retrieves if the configuration wizard (devices) was run on the server. Author: Eran Yariv (EranY), July, 2000 Arguments: lpbConfigWizardUsed [out] - Buffer to receive config wizard usage flag. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { DWORD dwRes = ERROR_SUCCESS; DWORD dwRes2; HKEY hKey; DEBUG_FUNCTION_NAME(TEXT("FaxGetConfigWizardUsed")); if (!lpbConfigWizardUsed) { DebugPrintEx(DEBUG_ERR, _T("lpbConfigWizardUsed is NULL")); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } dwRes = RegOpenKeyEx (HKEY_LOCAL_MACHINE, REGKEY_FAX_CLIENT, 0, KEY_READ, &hKey); if (ERROR_SUCCESS != dwRes) { DebugPrintEx( DEBUG_ERR, TEXT("Error opening server key (ec = %ld)"), dwRes); goto exit; } *lpbConfigWizardUsed = GetRegistryDword (hKey, REGVAL_CFGWZRD_DEVICE); dwRes2 = RegCloseKey (hKey); if (ERROR_SUCCESS != dwRes2) { DebugPrintEx( DEBUG_ERR, TEXT("Error closing server key (ec = %ld)"), dwRes2); } Assert (ERROR_SUCCESS == dwRes); exit: if (ERROR_SUCCESS != dwRes) { SetLastError(dwRes); return FALSE; } return TRUE; } // FaxGetConfigWizardUsed BOOL WINAPI FaxSetConfigWizardUsed ( IN HANDLE hFaxHandle, IN BOOL bConfigWizardUsed ) /*++ Routine name : FaxSetConfigWizardUsed Routine description: Sets if the configuration wizard (devices) was run on the server. Author: Eran Yariv (EranY), July, 2000 Arguments: hFaxHandle [in] - Specifies a fax server handle returned by a call to the FaxConnectFaxServer function. bConfigWizardUsed [in] - Was the configuration wizard used? Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxSetConfigWizardUsed")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!IsLocalFaxConnection(hFaxHandle)) { DebugPrintEx(DEBUG_ERR, _T("Not a local fax connection")); SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (FAX_API_VERSION_1 > FH_SERVER_VER(hFaxHandle)) { // // Servers of API version 0 don't support FAX_SetConfigWizardUsed // ASSERT_FALSE; // Can't happen - if it's local DebugPrintEx(DEBUG_ERR, _T("Server version is %ld - doesn't support this call"), FH_SERVER_VER(hFaxHandle)); SetLastError(FAX_ERR_VERSION_MISMATCH); return FALSE; } __try { ec = FAX_SetConfigWizardUsed( FH_FAX_HANDLE(hFaxHandle), bConfigWizardUsed); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_SetConfigWizardUsed. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } return TRUE; } // FaxSetConfigWizardUsed //******************************************** //* Routing extensions //******************************************** BOOL WINAPI FaxEnumRoutingExtensionsA ( IN HANDLE hFaxHandle, OUT PFAX_ROUTING_EXTENSION_INFOA *ppExts, OUT LPDWORD lpdwNumExts ) /*++ Routine name : FaxEnumRoutingExtensionsA Routine description: Enumerates routing extensions - ANSI version Author: Eran Yariv (EranY), July, 2000 Arguments: hFaxHandle [in ] - Handle to fax server ppExts [out] - Pointer to buffer to return array of extensions. lpdwNumExts [out] - Number of extensions returned in the array. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { PFAX_ROUTING_EXTENSION_INFOW pUnicodeExts; DWORD dwNumExts; DWORD dwCur; DEBUG_FUNCTION_NAME(TEXT("FaxEnumRoutingExtensionsA")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!ppExts) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("ppExts is NULL.")); return FALSE; } if (!lpdwNumExts) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pdwNumExts is NULL.")); return FALSE; } // // Call the UNICODE version first // if (!FaxEnumRoutingExtensionsW (hFaxHandle, &pUnicodeExts, &dwNumExts)) { DebugPrintEx(DEBUG_ERR, _T("FaxEnumRoutingExtensionsW() is failed. ec = %ld."), GetLastError()); return FALSE; } // // Convert returned value back into ANSI. // We keep the UNICODE structures and do a UNICODE to ANSI convert in place. // *lpdwNumExts = dwNumExts; *ppExts = (PFAX_ROUTING_EXTENSION_INFOA) pUnicodeExts; for (dwCur = 0; dwCur < dwNumExts; dwCur++) { if (!ConvertUnicodeStringInPlace(pUnicodeExts[dwCur].lpctstrFriendlyName) || !ConvertUnicodeStringInPlace(pUnicodeExts[dwCur].lpctstrImageName) || !ConvertUnicodeStringInPlace(pUnicodeExts[dwCur].lpctstrExtensionName)) { DebugPrintEx(DEBUG_ERR, _T("ConvertUnicodeStringInPlace failed, ec = %ld."), GetLastError()); MemFree (pUnicodeExts); return FALSE; } } return TRUE; } // FaxEnumRoutingExtensionsA BOOL WINAPI FaxEnumRoutingExtensionsW ( IN HANDLE hFaxHandle, OUT PFAX_ROUTING_EXTENSION_INFOW *ppExts, OUT LPDWORD lpdwNumExts ) /*++ Routine name : FaxEnumRoutingExtensionsW Routine description: Enumerates routing extensions - UNICODE version Author: Eran Yariv (EranY), July, 2000 Arguments: hFaxHandle [in ] - Handle to fax server ppExts [out] - Pointer to buffer to return array of extensions. lpdwNumExts [out] - Number of extensions returned in the array. Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { DWORD ec = ERROR_SUCCESS; DWORD dwConfigSize; DWORD dwCur; DEBUG_FUNCTION_NAME(TEXT("FaxEnumRoutingExtensionsW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle,FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!ppExts) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("ppExts is NULL.")); return FALSE; } if (!lpdwNumExts) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("pdwNumExts is NULL.")); return FALSE; } *ppExts = NULL; if (FAX_API_VERSION_1 > FH_SERVER_VER(hFaxHandle)) { // // Servers of API version 0 don't support FAX_EnumRoutingExtensions // We'll fake it and return an empty list. // DebugPrintEx(DEBUG_MSG, _T("Server version is %ld - doesn't support this call"), FH_SERVER_VER(hFaxHandle)); SetLastError(FAX_ERR_VERSION_MISMATCH); return FALSE; } // // Call the RPC function // __try { ec = FAX_EnumRoutingExtensions( FH_FAX_HANDLE(hFaxHandle), (LPBYTE*)ppExts, &dwConfigSize, lpdwNumExts ); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_EnumRoutingExtensions. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } for (dwCur = 0; dwCur < (*lpdwNumExts); dwCur++) { FixupStringPtrW( ppExts, (*ppExts)[dwCur].lpctstrFriendlyName ); FixupStringPtrW( ppExts, (*ppExts)[dwCur].lpctstrImageName ); FixupStringPtrW( ppExts, (*ppExts)[dwCur].lpctstrExtensionName ); } return TRUE; } // FaxEnumRoutingExtensionsW #ifndef UNICODE BOOL WINAPI FaxEnumRoutingExtensionsX ( IN HANDLE hFaxHandle, OUT PFAX_ROUTING_EXTENSION_INFOW *ppExts, OUT LPDWORD lpdwNumExts ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (ppExts); UNREFERENCED_PARAMETER (lpdwNumExts); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } // FaxEnumRoutingExtensionsX #endif // #ifndef UNICODE WINFAXAPI BOOL WINAPI FaxGetServicePrintersA( IN HANDLE hFaxHandle, OUT PFAX_PRINTER_INFOA *ppPrinterInfo, OUT LPDWORD lpdwPrintersReturned ) /*++ Routine name : FaxGetServicePrintersA Routine description: Retrieves Information about Printers that are known by the Service Author: Iv Garber (IvG), August, 2000 Arguments: hFaxHandle [in] - Specifies a fax server handle returned by a call to the FaxConnectFaxServer function. pPrinterInfo [out] - Buffer to receive the Printers Info PrintersReturned[out] - Count of the Printers Info structures returned Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { DEBUG_FUNCTION_NAME(TEXT("FaxGetServicePrintersA")); // // no need to validate parameters, FaxGetServicePrintersW() will do that // if (!FaxGetServicePrintersW(hFaxHandle, (PFAX_PRINTER_INFOW *)ppPrinterInfo, lpdwPrintersReturned)) { DebugPrintEx(DEBUG_ERR, _T("FaxGetServicePrintersW() failed. (ec: %ld)"), GetLastError()); return FALSE; } DWORD i; for ( i = 0 ; i < (*lpdwPrintersReturned) ; i++ ) { if (!ConvertUnicodeStringInPlace((LPWSTR) (*ppPrinterInfo)[i].lptstrPrinterName) || !ConvertUnicodeStringInPlace((LPWSTR) (*ppPrinterInfo)[i].lptstrDriverName) || !ConvertUnicodeStringInPlace((LPWSTR) (*ppPrinterInfo)[i].lptstrServerName)) { DebugPrintEx(DEBUG_ERR, _T("ConvertUnicodeStringInPlace failed, ec = %ld."), GetLastError()); MemFree (*ppPrinterInfo); return FALSE; } } return TRUE; } // FaxGetServicePrintersA WINFAXAPI BOOL WINAPI FaxGetServicePrintersW( IN HANDLE hFaxHandle, OUT PFAX_PRINTER_INFOW *ppPrinterInfo, OUT LPDWORD lpdwPrintersReturned ) /*++ Routine name : FaxGetServicePrintersW Routine description: Retrieves Information about Printers that are known by the Service Author: Iv Garber (IvG), August, 2000 Arguments: hFaxHandle [in] - Specifies a fax server handle returned by a call to the FaxConnectFaxServer function. pPrinterInfo [out] - Buffer to receive the Printers Info PrintersReturned[out] - Count of the Printers Info structures returned Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { DEBUG_FUNCTION_NAME(TEXT("FaxGetServicePrintersW")); // // Validate Parameters // if (!ValidateFaxHandle(hFaxHandle, FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; } if (!ppPrinterInfo) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("ppPrinterInfo is NULL.")); return FALSE; } if (!lpdwPrintersReturned) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("lpdwPrintersReturned is NULL.")); return FALSE; } error_status_t ec; DWORD dwBufferSize = 0; *ppPrinterInfo = NULL; *lpdwPrintersReturned = 0; __try { ec = FAX_GetServicePrinters(FH_FAX_HANDLE(hFaxHandle), (LPBYTE *)ppPrinterInfo, &dwBufferSize, lpdwPrintersReturned); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx(DEBUG_ERR, _T("Exception on RPC call to FAX_GetServicePrinters. (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); SetLastError(ec); return FALSE; } PFAX_PRINTER_INFOW pPrinter = (PFAX_PRINTER_INFOW) (*ppPrinterInfo); for ( DWORD i = 0; i < (*lpdwPrintersReturned) ; i++ ) { FixupStringPtrW( ppPrinterInfo, pPrinter[i].lptstrPrinterName); FixupStringPtrW( ppPrinterInfo, pPrinter[i].lptstrDriverName); FixupStringPtrW( ppPrinterInfo, pPrinter[i].lptstrServerName); } return TRUE; } #ifndef UNICODE WINFAXAPI BOOL WINAPI FaxGetServicePrintersX( IN HANDLE hFaxHandle, OUT PFAX_PRINTER_INFOW *pPrinterInfo, OUT LPDWORD PrintersReturned ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (pPrinterInfo); UNREFERENCED_PARAMETER (PrintersReturned); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } // FaxGetServicePrintersX #endif // #ifndef UNICODE //******************************************** //* Manual answer support //******************************************** BOOL WINAPI FaxAnswerCall( IN HANDLE hFaxHandle, IN CONST DWORD dwDeviceId ) /*++ Routine Description: Tells the server to answer specified call Arguments: FaxHandle - FAX handle obtained from FaxConnectFaxServer. dwDeviceId - TAPI Permanent Line Id (from event notification) Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec = ERROR_SUCCESS; DEBUG_FUNCTION_NAME(TEXT("FaxAnswerCall")); if (!ValidateFaxHandle(hFaxHandle, FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() failed.")); return FALSE; } if (!IsLocalFaxConnection(hFaxHandle)) { // // Only local connections are allowed to do a FaxAnswerCall // DebugPrintEx(DEBUG_ERR, _T("Not a local fax connection")); SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (FAX_API_VERSION_1 > FH_SERVER_VER(hFaxHandle)) { // // Servers of API version 0 don't support FAX_AnswerCall // DebugPrintEx(DEBUG_ERR, _T("Server version is %ld - doesn't support this call"), FH_SERVER_VER(hFaxHandle)); SetLastError(FAX_ERR_VERSION_MISMATCH); return FALSE; } __try { ec = FAX_AnswerCall (FH_FAX_HANDLE(hFaxHandle), dwDeviceId); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_AnswerCall (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); DebugPrintEx(DEBUG_ERR, _T("FAX_AnswerCall failed. (ec: %ld)"), ec); } return (ERROR_SUCCESS == ec); } // FaxAnswerCall //******************************************** //* Ivalidate archive folder //******************************************** WINFAXAPI BOOL WINAPI FaxRefreshArchive ( IN HANDLE hFaxHandle, IN FAX_ENUM_MESSAGE_FOLDER Folder ) /*++ Routine Description: Tells the server that the folder should be refreshed Arguments: FaxHandle - FAX handle obtained from FaxConnectFaxServer. Folder - Archive folder ID Return Value: TRUE - Success FALSE - Failure, call GetLastError() for more error information. --*/ { error_status_t ec = ERROR_SUCCESS; DEBUG_FUNCTION_NAME(TEXT("FaxRefreshArchive")); if (!ValidateFaxHandle(hFaxHandle, FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() failed.")); return FALSE; } if(Folder != FAX_MESSAGE_FOLDER_INBOX && Folder != FAX_MESSAGE_FOLDER_SENTITEMS) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("Folder is invalid.")); return FALSE; } __try { ec = FAX_RefreshArchive (FH_FAX_HANDLE(hFaxHandle), Folder); } __except (EXCEPTION_EXECUTE_HANDLER) { // // For some reason we got an exception. // ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_RefreshArchive (ec: %ld)"), ec); } if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus(); DebugPrintEx(DEBUG_ERR, _T("FAX_RefreshArchive failed. (ec: %ld)"), ec); } return (ERROR_SUCCESS == ec); } // FaxRefreshArchive