You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
5.0 KiB
211 lines
5.0 KiB
#include "faxrtp.h"
|
|
#pragma hdrstop
|
|
|
|
#include <strsafe.h>
|
|
|
|
static
|
|
DWORD
|
|
CreateUniqueTIFfile (
|
|
IN LPCTSTR wszDstDir,
|
|
OUT LPTSTR wszDstFile,
|
|
IN DWORD dwDstFileSize
|
|
)
|
|
/*++
|
|
|
|
Routine name : CreateUniqueTIFfile
|
|
|
|
Routine description:
|
|
|
|
Finds a unique TIF file name in the specified directory.
|
|
The file is in the format path\FaxXXXXXXXX.TIF
|
|
where:
|
|
path = wszDstDir
|
|
XXXXXXXX = Hexadecimal representation of a unique ID
|
|
|
|
Author:
|
|
|
|
Eran Yariv (EranY), Jun, 1999
|
|
|
|
Arguments:
|
|
|
|
wszDstDir [in] - Destiantion directory fo the file (must exist)
|
|
wszDstFile [out] - Resulting unique file name
|
|
dwDstFileSize [in] - The size of the buffer, pointed to by wszDstFile in TCHARs
|
|
|
|
Return Value:
|
|
|
|
DWORD - Win32 error code
|
|
|
|
--*/
|
|
{
|
|
DEBUG_FUNCTION_NAME(TEXT("CreateUniqueTIFfile"));
|
|
|
|
static DWORD dwLastID = 0xffffffff;
|
|
DWORD dwPrevLastID = dwLastID;
|
|
|
|
for (DWORD dwCurID = dwLastID + 1; dwCurID != dwPrevLastID; dwCurID++)
|
|
{
|
|
//
|
|
// Try with the current Id
|
|
//
|
|
HRESULT hr = StringCchPrintf( wszDstFile,
|
|
dwDstFileSize,
|
|
_T("%s\\Fax%08x.TIF"),
|
|
wszDstDir,
|
|
dwCurID );
|
|
if (FAILED(hr))
|
|
{
|
|
return HRESULT_CODE(hr);
|
|
}
|
|
|
|
HANDLE hFile;
|
|
|
|
hFile = SafeCreateFile (
|
|
wszDstFile,
|
|
GENERIC_WRITE,
|
|
0,
|
|
NULL,
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
if (INVALID_HANDLE_VALUE == hFile)
|
|
{
|
|
DWORD dwErr = GetLastError ();
|
|
if (ERROR_FILE_EXISTS == dwErr)
|
|
{
|
|
//
|
|
// This ID is already in use
|
|
//
|
|
continue;
|
|
}
|
|
//
|
|
// Otherwise, this is another error
|
|
//
|
|
DebugPrintEx (DEBUG_ERR,
|
|
L"Error while calling CreateFile on %s (ec = %ld)",
|
|
wszDstFile,
|
|
dwErr
|
|
);
|
|
return dwErr;
|
|
}
|
|
//
|
|
// Otherwise, we succeeded.
|
|
//
|
|
CloseHandle (hFile);
|
|
dwLastID = dwCurID;
|
|
return ERROR_SUCCESS;
|
|
}
|
|
//
|
|
// All IDs are occupied
|
|
//
|
|
DebugPrintEx (DEBUG_ERR,
|
|
L"All IDs are occupied");
|
|
return ERROR_NO_MORE_FILES;
|
|
} // CreateUniqueTIFfile
|
|
|
|
|
|
BOOL
|
|
FaxMoveFile(
|
|
LPCTSTR TiffFileName,
|
|
LPCTSTR DestDir
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Stores a FAX in the specified directory. This routine will also
|
|
cached network connections.
|
|
|
|
Arguments:
|
|
|
|
TiffFileName - Name of TIFF file to store
|
|
DestDir - Name of directory to store it in
|
|
|
|
Return Value:
|
|
|
|
TRUE for success, FALSE on error
|
|
|
|
--*/
|
|
|
|
{
|
|
WCHAR TempDstDir [MAX_PATH + 1];
|
|
WCHAR DstFile[MAX_PATH * 2] = {0};
|
|
DWORD dwErr = ERROR_SUCCESS;
|
|
int iDstPathLen;
|
|
DEBUG_FUNCTION_NAME(TEXT("FaxMoveFile"));
|
|
|
|
Assert (DestDir);
|
|
//
|
|
// Remove any '\' characters at end of destination directory
|
|
//
|
|
HRESULT hr = StringCchCopy(
|
|
TempDstDir,
|
|
ARR_SIZE(TempDstDir),
|
|
DestDir );
|
|
if (FAILED(hr))
|
|
{
|
|
DebugPrintEx (
|
|
DEBUG_ERR,
|
|
L"Store folder name exceeds MAX_PATH chars");
|
|
dwErr = HRESULT_CODE(hr);
|
|
goto end;
|
|
}
|
|
|
|
iDstPathLen = lstrlen (TempDstDir);
|
|
Assert (iDstPathLen);
|
|
if ('\\' == TempDstDir[iDstPathLen - 1])
|
|
{
|
|
TempDstDir[iDstPathLen - 1] = L'\0';
|
|
}
|
|
|
|
//
|
|
// Create unique destiantion file name
|
|
//
|
|
dwErr = CreateUniqueTIFfile (TempDstDir, DstFile, ARR_SIZE(TempDstDir));
|
|
if (ERROR_SUCCESS != dwErr)
|
|
{
|
|
goto end;
|
|
}
|
|
//
|
|
// Try to copy the file.
|
|
// We use FALSE as 3rd parameter because CreateUniqueTIFfile creates
|
|
// and empty unique file.
|
|
//
|
|
if (!CopyFile (TiffFileName, DstFile, FALSE))
|
|
{
|
|
dwErr = GetLastError ();
|
|
DebugPrintEx (DEBUG_ERR,
|
|
L"Can't copy file (ec = %ld)",
|
|
dwErr
|
|
);
|
|
goto end;
|
|
}
|
|
|
|
end:
|
|
if (ERROR_SUCCESS != dwErr)
|
|
{
|
|
FaxLog(
|
|
FAXLOG_CATEGORY_INBOUND,
|
|
FAXLOG_LEVEL_MIN,
|
|
3,
|
|
MSG_FAX_SAVE_FAILED,
|
|
TiffFileName,
|
|
(*DstFile)?DstFile:TempDstDir,
|
|
DWORD2HEX(dwErr)
|
|
);
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
FaxLog(
|
|
FAXLOG_CATEGORY_INBOUND,
|
|
FAXLOG_LEVEL_MAX,
|
|
2,
|
|
MSG_FAX_SAVE_SUCCESS,
|
|
TiffFileName,
|
|
(*DstFile)?DstFile:TempDstDir
|
|
);
|
|
return TRUE;
|
|
}
|
|
}
|