windows-nt/Source/XPSP1/NT/printscan/fax/service/client/config.c
2020-09-26 16:20:57 +08:00

1151 lines
26 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
print.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
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;
if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (!FaxConfig) {
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
*FaxConfig = NULL;
ec = FAX_GetConfiguration(
FH_FAX_HANDLE(FaxHandle),
(LPBYTE*)FaxConfig,
&FaxConfigSize
);
if (ec) {
SetLastError( ec );
return FALSE;
}
FixupStringPtr( FaxConfig, (*FaxConfig)->ArchiveDirectory );
FixupStringPtr( FaxConfig, (*FaxConfig)->InboundProfile );
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.
--*/
{
if (!FaxGetConfigurationW(
FaxHandle,
(PFAX_CONFIGURATIONW*) FaxConfigA
))
{
return FALSE;
}
ConvertUnicodeStringInPlace( (LPWSTR) (*FaxConfigA)->ArchiveDirectory );
ConvertUnicodeStringInPlace( (LPWSTR) (*FaxConfigA)->InboundProfile );
return TRUE;
}
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;
if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (!FaxConfig) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
ec = FAX_SetConfiguration( FH_FAX_HANDLE(FaxHandle), FaxConfig );
if (ec) {
SetLastError( ec );
return FALSE;
}
return TRUE;
}
BOOL
WINAPI
FaxSetConfigurationA(
IN HANDLE FaxHandle,
IN const FAX_CONFIGURATIONA *FaxConfig
)
{
error_status_t ec;
FAX_CONFIGURATIONW FaxConfigW;
if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (!FaxConfig) {
SetLastError(ERROR_INVALID_PARAMETER);
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) {
FaxConfigW.ArchiveDirectory = AnsiStringToUnicodeString(FaxConfig->ArchiveDirectory);
}
if (FaxConfig->InboundProfile) {
FaxConfigW.InboundProfile = AnsiStringToUnicodeString(FaxConfig->InboundProfile);
}
ec = FAX_SetConfiguration( FH_FAX_HANDLE(FaxHandle), (PFAX_CONFIGURATIONW)&FaxConfigW );
if (FaxConfigW.ArchiveDirectory) {
MemFree((PVOID)FaxConfigW.ArchiveDirectory);
}
if (FaxConfigW.InboundProfile) {
MemFree((PVOID)FaxConfigW.InboundProfile);
}
if (ec != ERROR_SUCCESS) {
SetLastError(ec);
return FALSE;
}
return TRUE;
}
BOOL
WINAPI
FaxGetLoggingCategoriesA(
IN HANDLE FaxHandle,
OUT PFAX_LOG_CATEGORYA *Categories,
OUT LPDWORD NumberCategories
)
{
BOOL retval;
DWORD i;
if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (!Categories || !NumberCategories) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
retval = FaxGetLoggingCategoriesW(FaxHandle,(PFAX_LOG_CATEGORYW *)Categories , NumberCategories);
if (!retval) {
return FALSE;
}
for (i=0; i<*NumberCategories; i++) {
ConvertUnicodeStringInPlace( (LPWSTR)(*Categories)[i].Name );
}
return TRUE;
}
BOOL
WINAPI
FaxGetLoggingCategoriesW(
IN HANDLE FaxHandle,
OUT PFAX_LOG_CATEGORYW *Categories,
OUT LPDWORD NumberCategories
)
{
error_status_t ec;
DWORD BufferSize = 0;
DWORD i;
if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (!Categories || !NumberCategories) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
*Categories = NULL;
*NumberCategories = 0;
ec = FAX_GetLoggingCategories(
FH_FAX_HANDLE(FaxHandle),
(LPBYTE*)Categories,
&BufferSize,
NumberCategories
);
if (ec != ERROR_SUCCESS) {
SetLastError(ec);
return FALSE;
}
for (i=0; i<*NumberCategories; i++) {
FixupStringPtr( 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;
if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (!Categories || !NumberCategories) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
CategoryW = MemAlloc( sizeof(FAX_LOG_CATEGORYW) * NumberCategories );
if (!CategoryW) {
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
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) {
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_CATEGORY *Categories,
IN DWORD NumberCategories
)
{
error_status_t ec;
DWORD BufferSize;
DWORD i;
LPBYTE Buffer;
ULONG_PTR Offset;
PFAX_LOG_CATEGORY LogCat;
if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (!Categories || !NumberCategories) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
Offset = BufferSize = sizeof(FAX_LOG_CATEGORY) * NumberCategories;
for (i=0; i<NumberCategories; i++) {
BufferSize += StringSize( Categories[i].Name );
}
Buffer = (LPBYTE) MemAlloc( BufferSize );
if (Buffer == NULL) {
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
return FALSE;
}
LogCat = (PFAX_LOG_CATEGORY) Buffer;
for (i=0; i<NumberCategories; i++) {
LogCat[i].Category = Categories[i].Category;
LogCat[i].Level = Categories[i].Level;
StoreString(
Categories[i].Name,
(PULONG_PTR) &LogCat[i].Name,
Buffer,
&Offset
);
}
ec = FAX_SetLoggingCategories(
FH_FAX_HANDLE(FaxHandle),
Buffer,
BufferSize,
NumberCategories
);
MemFree( Buffer );
if (ec != ERROR_SUCCESS) {
SetLastError(ec);
return FALSE;
}
return TRUE;
}
BOOL
WINAPI
FaxGetTapiLocationsW(
IN HANDLE FaxHandle,
OUT PFAX_TAPI_LOCATION_INFOW *TapiLocationInfo
)
/*++
Routine Description:
Gets the tapi location information from the fax server.
Arguments:
FaxHandle - FAX handle obtained from FaxConnectFaxServer.
LocationSize, - Size of the TapiLocationInfo buffer.
TapiLocationInfo - Buffer to receive the data.
BytesNeeded - Required size.
Return Value:
ERROR_SUCCESS for success, otherwise a WIN32 error code.
--*/
{
error_status_t ec;
DWORD i;
DWORD LocationSize = 0;
if (!FaxHandle || !TapiLocationInfo) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
ec = FAX_GetTapiLocations(
FH_FAX_HANDLE(FaxHandle),
(LPBYTE*) TapiLocationInfo,
&LocationSize
);
if (ec) {
SetLastError( ec );
return FALSE;
}
(*TapiLocationInfo)->TapiLocations =
(PFAX_TAPI_LOCATIONS) ((LPBYTE)*TapiLocationInfo + (ULONG_PTR)(*TapiLocationInfo)->TapiLocations);
for (i=0; i<(*TapiLocationInfo)->NumLocations; i++) {
if ((*TapiLocationInfo)->TapiLocations[i].LocationName) {
(*TapiLocationInfo)->TapiLocations[i].LocationName =
(LPWSTR) ((LPBYTE)*TapiLocationInfo + (ULONG_PTR)(*TapiLocationInfo)->TapiLocations[i].LocationName);
}
if ((*TapiLocationInfo)->TapiLocations[i].TollPrefixes) {
(*TapiLocationInfo)->TapiLocations[i].TollPrefixes =
(LPWSTR) ((LPBYTE)*TapiLocationInfo + (ULONG_PTR)(*TapiLocationInfo)->TapiLocations[i].TollPrefixes);
}
}
return TRUE;
}
BOOL
WINAPI
FaxGetTapiLocationsA(
IN HANDLE FaxHandle,
OUT PFAX_TAPI_LOCATION_INFOA *TapiLocationInfo
)
/*++
Routine Description:
Gets the tapi location information from the fax server.
Arguments:
FaxHandle - FAX handle obtained from FaxConnectFaxServer.
LocationSize, - Size of the TapiLocationInfo buffer.
TapiLocationInfo - Buffer to receive the data.
BytesNeeded - Required size.
Return Value:
ERROR_SUCCESS for success, otherwise a WIN32 error code.
--*/
{
DWORD i;
if (!FaxGetTapiLocationsW( FaxHandle, (PFAX_TAPI_LOCATION_INFOW*) TapiLocationInfo )) {
return FALSE;
}
for (i=0; i<(*TapiLocationInfo)->NumLocations; i++) {
ConvertUnicodeStringInPlace( (LPWSTR) (*TapiLocationInfo)->TapiLocations[i].LocationName );
ConvertUnicodeStringInPlace( (LPWSTR) (*TapiLocationInfo)->TapiLocations[i].TollPrefixes );
}
return TRUE;
}
BOOL
WINAPI
FaxSetTapiLocationsW(
IN HANDLE FaxHandle,
IN PFAX_TAPI_LOCATION_INFOW TapiLocationInfo
)
/*++
Routine Description:
Changes the tapi location information on the fax server.
Arguments:
FaxHandle - FAX handle obtained from FaxConnectFaxServer.
TapiLocationInfo - Buffer containing the data.
Return Value:
ERROR_SUCCESS for success, otherwise a WIN32 error code.
--*/
{
error_status_t ec;
PFAX_TAPI_LOCATION_INFOW Tmp;
DWORD Size;
DWORD i,j;
ULONG_PTR Offset;
LPWSTR p,s;
//
// do some parameter validation
//
if (!FaxHandle || !TapiLocationInfo) {
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
for (i=0; i<TapiLocationInfo->NumLocations; i++) {
if (TapiLocationInfo->TapiLocations[i].TollPrefixes) {
s = (LPTSTR)TapiLocationInfo->TapiLocations[i].TollPrefixes;
while( s && *s ) {
p = wcschr( s, L',' );
if (p) {
*p = 0;
}
for (j=0; j<wcslen(s); j++) {
if (!iswdigit(s[j])) {
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
}
j = _wtoi( s );
if ((j < 200) || (j > 999)) {
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
if (p) {
*p = L',';
s = p + 1;
} else {
s += wcslen( s );
}
}
}
}
//
// calculate the required size
//
Size = sizeof(FAX_TAPI_LOCATION_INFOW) + (TapiLocationInfo->NumLocations * sizeof(FAX_TAPI_LOCATIONSW));
for (i=0; i<TapiLocationInfo->NumLocations; i++) {
Size += StringSize( TapiLocationInfo->TapiLocations[i].TollPrefixes );
Size += StringSize( TapiLocationInfo->TapiLocations[i].LocationName );
}
//
// allocate the memory
//
Tmp = (PFAX_TAPI_LOCATION_INFOW) MemAlloc( Size );
if (!Tmp) {
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
return FALSE;
}
//
// fill in the temporary FAX_TAPI_LOCATION_INFO structure
//
Tmp->CurrentLocationID = TapiLocationInfo->CurrentLocationID;
Tmp->NumLocations = TapiLocationInfo->NumLocations;
Offset = sizeof(FAX_TAPI_LOCATION_INFOW);
Tmp->TapiLocations = (PFAX_TAPI_LOCATIONSW) ((LPBYTE)Tmp + Offset);
Offset += (TapiLocationInfo->NumLocations * sizeof(FAX_TAPI_LOCATIONSW));
for (i=0; i<TapiLocationInfo->NumLocations; i++) {
Tmp->TapiLocations[i].PermanentLocationID = TapiLocationInfo->TapiLocations[i].PermanentLocationID;
Tmp->TapiLocations[i].CountryCode = TapiLocationInfo->TapiLocations[i].CountryCode;
Tmp->TapiLocations[i].AreaCode = TapiLocationInfo->TapiLocations[i].AreaCode;
Tmp->TapiLocations[i].NumTollPrefixes = TapiLocationInfo->TapiLocations[i].NumTollPrefixes;
StoreString(
TapiLocationInfo->TapiLocations[i].LocationName,
(PULONG_PTR) &Tmp->TapiLocations[i].LocationName,
(LPBYTE) Tmp,
&Offset
);
StoreString(
TapiLocationInfo->TapiLocations[i].TollPrefixes,
(PULONG_PTR) &Tmp->TapiLocations[i].TollPrefixes,
(LPBYTE) Tmp,
&Offset
);
}
Tmp->TapiLocations = (PFAX_TAPI_LOCATIONSW) ((LPBYTE)Tmp->TapiLocations - (ULONG_PTR)Tmp);
//
// call the server to change the tapi locations
//
ec = FAX_SetTapiLocations(
FH_FAX_HANDLE(FaxHandle),
(LPBYTE) Tmp,
Size
);
//
// free the temporary FAX_TAPI_LOCATION_INFO structure
//
MemFree( Tmp );
//
// return
//
if (ec) {
SetLastError( ec );
return FALSE;
}
return TRUE;
}
BOOL
WINAPI
FaxSetTapiLocationsA(
IN HANDLE FaxHandle,
IN PFAX_TAPI_LOCATION_INFOA TapiLocationInfo
)
/*++
Routine Description:
Changes the tapi location information on the fax server.
Arguments:
FaxHandle - FAX handle obtained from FaxConnectFaxServer.
TapiLocationInfo - Buffer containing the data.
Return Value:
ERROR_SUCCESS for success, otherwise a WIN32 error code.
--*/
{
error_status_t ec;
PFAX_TAPI_LOCATION_INFOA Tmp;
DWORD Size;
DWORD i,j;
ULONG_PTR Offset;
LPSTR p,s;
//
// do some parameter validation
//
if (!FaxHandle || !TapiLocationInfo) {
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
for (i=0; i<TapiLocationInfo->NumLocations; i++) {
if (TapiLocationInfo->TapiLocations[i].TollPrefixes) {
s = (LPSTR)TapiLocationInfo->TapiLocations[i].TollPrefixes;
while( s && *s ) {
p = strchr( s, ',' );
if (p) {
*p = 0;
}
for (j=0; j<strlen(s); j++) {
if (!isdigit(s[j])) {
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
}
j = atoi( s );
if ((j < 200) || (j > 999)) {
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
if (p) {
*p = ',';
s = p + 1;
} else {
s += strlen( s );
}
}
}
}
//
// calculate the required size
//
Size = sizeof(FAX_TAPI_LOCATION_INFOA) + (TapiLocationInfo->NumLocations * sizeof(FAX_TAPI_LOCATIONSA));
for (i=0; i<TapiLocationInfo->NumLocations; i++) {
Size += ((strlen(TapiLocationInfo->TapiLocations[i].TollPrefixes) + 1) * sizeof(WCHAR));
Size += ((strlen(TapiLocationInfo->TapiLocations[i].LocationName) + 1) * sizeof(WCHAR));
}
//
// allocate the memory
//
Tmp = (PFAX_TAPI_LOCATION_INFOA) MemAlloc( Size );
if (!Tmp) {
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
return FALSE;
}
//
// fill in the temporary FAX_TAPI_LOCATION_INFO structure
//
Tmp->CurrentLocationID = TapiLocationInfo->CurrentLocationID;
Tmp->NumLocations = TapiLocationInfo->NumLocations;
Offset = sizeof(FAX_TAPI_LOCATION_INFOA);
Tmp->TapiLocations = (PFAX_TAPI_LOCATIONSA) ((LPBYTE)Tmp + Offset);
Offset += (TapiLocationInfo->NumLocations * sizeof(FAX_TAPI_LOCATIONSA));
for (i=0; i<TapiLocationInfo->NumLocations; i++) {
Tmp->TapiLocations[i].PermanentLocationID = TapiLocationInfo->TapiLocations[i].PermanentLocationID;
Tmp->TapiLocations[i].CountryCode = TapiLocationInfo->TapiLocations[i].CountryCode;
Tmp->TapiLocations[i].AreaCode = TapiLocationInfo->TapiLocations[i].AreaCode;
Tmp->TapiLocations[i].NumTollPrefixes = TapiLocationInfo->TapiLocations[i].NumTollPrefixes;
StoreStringA(
TapiLocationInfo->TapiLocations[i].LocationName,
(PULONG_PTR) &Tmp->TapiLocations[i].LocationName,
(LPBYTE) Tmp,
&Offset
);
StoreStringA(
TapiLocationInfo->TapiLocations[i].TollPrefixes,
(PULONG_PTR) &Tmp->TapiLocations[i].TollPrefixes,
(LPBYTE) Tmp,
&Offset
);
}
Tmp->TapiLocations = (PFAX_TAPI_LOCATIONSA) ((LPBYTE)Tmp->TapiLocations - (ULONG_PTR)Tmp);
//
// call the server to change the tapi locations
//
ec = FAX_SetTapiLocations(
FH_FAX_HANDLE(FaxHandle),
(LPBYTE) Tmp,
Size
);
//
// free the temporary FAX_TAPI_LOCATION_INFO structure
//
MemFree( Tmp );
//
// return
//
if (ec) {
SetLastError( ec );
return FALSE;
}
return TRUE;
}
BOOL
WINAPI
FaxGetMapiProfilesA(
IN HANDLE FaxHandle,
OUT LPBYTE *MapiProfiles
)
/*++
Routine Description:
Queries the server for the MAPI profiles.
Arguments:
FaxHandle - FAX handle obtained from FaxConnectFaxServer.
MapiProfiles - Multi-SZ string containing all MAPI profiles
ProfileSize - Size of the MapiProfiles array
Return Value:
ERROR_SUCCESS for success, otherwise a WIN32 error code.
--*/
{
error_status_t ec;
DWORD ProfileSize = 0;
if (!FaxHandle || !MapiProfiles) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
ec = FAX_GetMapiProfiles(
FH_FAX_HANDLE(FaxHandle),
MapiProfiles,
&ProfileSize
);
if (ec) {
SetLastError(ec);
return FALSE;
}
if (!ConvertUnicodeMultiSZInPlace( (LPWSTR) *MapiProfiles, ProfileSize )) {
SetLastError(ERROR_NOT_ENOUGH_SERVER_MEMORY);
return FALSE;
}
return TRUE;
}
BOOL
WINAPI
FaxGetMapiProfilesW(
IN HANDLE FaxHandle,
OUT LPBYTE *MapiProfiles
)
/*++
Routine Description:
Queries the server for the MAPI profiles.
Arguments:
FaxHandle - FAX handle obtained from FaxConnectFaxServer.
MapiProfiles - Multi-SZ string containing all MAPI profiles
ProfileSize - Size of the MapiProfiles array
Return Value:
ERROR_SUCCESS for success, otherwise a WIN32 error code.
--*/
{
error_status_t ec;
DWORD ProfileSize = 0;
if (!FaxHandle || !MapiProfiles) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
ec = FAX_GetMapiProfiles(
FH_FAX_HANDLE(FaxHandle),
MapiProfiles,
&ProfileSize
);
if (ec) {
SetLastError(ec);
return FALSE;
}
return TRUE;
}
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;
if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (!RoutingInfoBuffer || !MethodsReturned) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
*RoutingInfoBuffer = NULL;
ec = FAX_EnumGlobalRoutingInfo(
FH_FAX_HANDLE(FaxHandle),
(LPBYTE*)RoutingInfoBuffer,
&RoutingInfoBufferSize,
MethodsReturned
);
if (ec) {
SetLastError( ec );
return FALSE;
}
FaxRoutingInfo = (PFAX_GLOBAL_ROUTING_INFOW) *RoutingInfoBuffer;
for (i=0; i<*MethodsReturned; i++) {
FixupStringPtr( RoutingInfoBuffer, FaxRoutingInfo[i].Guid );
FixupStringPtr( RoutingInfoBuffer, FaxRoutingInfo[i].FunctionName );
FixupStringPtr( RoutingInfoBuffer, FaxRoutingInfo[i].FriendlyName );
FixupStringPtr( RoutingInfoBuffer, FaxRoutingInfo[i].ExtensionImageName );
FixupStringPtr( 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;
if (!FaxEnumGlobalRoutingInfoW(
FaxHandle,
(PFAX_GLOBAL_ROUTING_INFOW *)RoutingInfoBuffer,
MethodsReturned
))
{
return FALSE;
}
FaxRoutingMethod = (PFAX_GLOBAL_ROUTING_INFOW) *RoutingInfoBuffer;
for (i=0; i<*MethodsReturned; i++) {
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 );
}
return TRUE;
}
BOOL
WINAPI
FaxSetGlobalRoutingInfoW(
IN HANDLE FaxHandle,
IN const FAX_GLOBAL_ROUTING_INFOW *RoutingInfo
)
{
error_status_t ec;
if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (!RoutingInfo) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if (RoutingInfo->SizeOfStruct != sizeof(FAX_GLOBAL_ROUTING_INFOW)) {
SetLastError(ERROR_INVALID_PARAMETER);
}
ec = FAX_SetGlobalRoutingInfo( FH_FAX_HANDLE(FaxHandle), RoutingInfo );
if (ec) {
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;
if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) {
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (!RoutingInfo || RoutingInfo->SizeOfStruct != sizeof(FAX_GLOBAL_ROUTING_INFOA)) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
RoutingInfoW.SizeOfStruct = sizeof(FAX_GLOBAL_ROUTING_INFOW);
RoutingInfoW.Priority = RoutingInfo->Priority;
RoutingInfoW.Guid = AnsiStringToUnicodeString( RoutingInfo->Guid );
RoutingInfoW.FriendlyName = AnsiStringToUnicodeString( RoutingInfo->FriendlyName );
RoutingInfoW.FunctionName = AnsiStringToUnicodeString( RoutingInfo->FunctionName );
RoutingInfoW.ExtensionImageName = AnsiStringToUnicodeString( RoutingInfo->ExtensionImageName );
RoutingInfoW.ExtensionFriendlyName = AnsiStringToUnicodeString( RoutingInfo->ExtensionFriendlyName );
Rval = FaxSetGlobalRoutingInfoW( FaxHandle, &RoutingInfoW);
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;
if (!ValidateFaxHandle(FaxHandle,FHT_SERVICE)) {
SetLastError( ERROR_INVALID_HANDLE );
}
ec = FAX_AccessCheck( FH_FAX_HANDLE( FaxHandle ), AccessMask, &fPermission );
if (ec) {
SetLastError( ec );
} else {
SetLastError( ERROR_SUCCESS ) ;
}
return fPermission;
}