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.
1020 lines
27 KiB
1020 lines
27 KiB
//////////////////////////////////////////////////////////////////////////////////////
|
|
// W2K TIF files import support
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include <tiff.h>
|
|
#include <Sddl.h>
|
|
#include <shlobjp.h> // LinkWindow control
|
|
|
|
#define __FILE_ID__ 75
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#ifdef UNICODE
|
|
|
|
#define WM_IMPORT_PROGRESS_INC WM_APP + 3 // Increment Import progress bar
|
|
#define WM_IMPORT_SET_FILE_COUNT WM_APP + 4 // Set the file number to import
|
|
|
|
extern CClientConsoleApp theApp;
|
|
|
|
//
|
|
// Structure passed to the ImportArchiveFolder thread
|
|
//
|
|
struct ImportFolderParam
|
|
{
|
|
LPCWSTR cszImportFolder; // Import folder name
|
|
BOOL bSentItems; // TRUE if the folder contains outbound faxes
|
|
HWND hImportDlg; // Handle to the Import progress dialog
|
|
BOOL bCancel; // TRUE if the Cancel button has been pressed
|
|
};
|
|
|
|
|
|
DWORD
|
|
ImportArchiveFile(
|
|
LPCWSTR pszFile,
|
|
LPWSTR pszArchiveFolder,
|
|
BOOL bSentItems,
|
|
WCHAR* pszUserSid,
|
|
DWORDLONG* pdwlUniqueId
|
|
)
|
|
/*++
|
|
|
|
Routine name : ImportArchiveFile
|
|
|
|
Routine description:
|
|
|
|
Imports pszFile file to the pszArchiveFolder folder.
|
|
The pszFile should be generated by W2K MS Fax
|
|
|
|
Arguments:
|
|
|
|
pszFile - [in] Imported file name
|
|
pszArchiveFolder - [in] MS Fax archive folder name
|
|
bSentItems - [in] TRUE if the file from the sent archive, FALSE if it from receive one
|
|
pszUserSid - [in] The user string SID, can be NULL if(bSentItems == FALSE)
|
|
pdwlUniqueId - [out] Unique id for the file
|
|
|
|
Return Value:
|
|
|
|
Standard Win32 error code
|
|
|
|
--*/
|
|
{
|
|
DWORD dwRes = ERROR_SUCCESS;
|
|
DBG_ENTER(TEXT("ImportArchive"), dwRes);
|
|
|
|
WCHAR* pszFileExt = FAX_TIF_FILE_EXT;
|
|
WCHAR szArchFile[MAX_PATH] = {0};
|
|
|
|
MS_TAG_INFO msTags = {0};
|
|
|
|
//
|
|
// Generate unique file name in the archive folder
|
|
//
|
|
*pdwlUniqueId = GenerateUniqueFileName(pszArchiveFolder,
|
|
pszFileExt,
|
|
szArchFile,
|
|
ARR_SIZE(szArchFile));
|
|
if(*pdwlUniqueId == 0)
|
|
{
|
|
dwRes = GetLastError();
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("GenerateUniqueFileName"), dwRes);
|
|
goto exit;
|
|
}
|
|
|
|
if(bSentItems)
|
|
{
|
|
//
|
|
// Add user user SID to the file name for the outbound archive
|
|
//
|
|
// Delete generated file without the user SID in the name
|
|
//
|
|
if(!DeleteFile(szArchFile))
|
|
{
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("DeleteFile"), GetLastError());
|
|
}
|
|
|
|
//
|
|
// Add the user SID to the file name
|
|
//
|
|
if (_sntprintf(szArchFile,
|
|
ARR_SIZE(szArchFile) -1,
|
|
TEXT("%s\\%s$%I64X%s"),
|
|
pszArchiveFolder,
|
|
pszUserSid,
|
|
*pdwlUniqueId,
|
|
FAX_TIF_FILE_DOT_EXT) < 0)
|
|
{
|
|
dwRes = ERROR_BUFFER_OVERFLOW;
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("Insufficient szArchFile buffer"), dwRes);
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
if(!CopyFile(pszFile, szArchFile, FALSE))
|
|
{
|
|
dwRes = GetLastError();
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("CopyFile"), dwRes);
|
|
goto exit;
|
|
}
|
|
|
|
//
|
|
// Read W2K MS TIF tags from the file
|
|
//
|
|
dwRes = GetW2kMsTiffTags(szArchFile, &msTags, bSentItems);
|
|
if(ERROR_SUCCESS == dwRes)
|
|
{
|
|
//
|
|
// Add new (XP) MS TIF tags to the file
|
|
//
|
|
if(!TiffAddMsTags(szArchFile, &msTags, bSentItems))
|
|
{
|
|
dwRes = GetLastError();
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("TiffAddMsTags"), dwRes);
|
|
|
|
if(!DeleteFile(szArchFile))
|
|
{
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("DeleteFile"), GetLastError());
|
|
}
|
|
goto exit;
|
|
}
|
|
}
|
|
else if(ERROR_XP_TIF_FILE_FORMAT == dwRes)
|
|
{
|
|
//
|
|
// The TIF file already has new (XP) TIF tags
|
|
//
|
|
dwRes = ERROR_SUCCESS;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// The tiff file was not created by MS fax
|
|
//
|
|
if(!DeleteFile(szArchFile))
|
|
{
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("DeleteFile"), GetLastError());
|
|
}
|
|
}
|
|
|
|
exit:
|
|
|
|
FreeMsTagInfo(&msTags);
|
|
|
|
return dwRes;
|
|
|
|
} // ImportArchiveFile
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
ImportArchiveFolder(
|
|
LPVOID lpParameter // thread data
|
|
)
|
|
/*++
|
|
|
|
Routine name : ImportArchiveFolder
|
|
|
|
Routine description:
|
|
|
|
Imports fax (tif) files from the cstrImportFolder folder to the MS Fax archive.
|
|
Returns ERROR_FILE_NOT_FOUND if the folder does not contain TIF files
|
|
|
|
Arguments:
|
|
|
|
lpParameter - [in] pointer to ImportFolderParam structure
|
|
|
|
Return Value:
|
|
|
|
Standard Win32 error code
|
|
|
|
--*/
|
|
{
|
|
ImportFolderParam* pParam = (ImportFolderParam*)lpParameter;
|
|
|
|
DWORD dwRes = ERROR_SUCCESS;
|
|
DWORD dwError;
|
|
int nRes;
|
|
WCHAR szFindMask[MAX_PATH] = {0};
|
|
WCHAR szImportFile[MAX_PATH] = {0};
|
|
WIN32_FIND_DATA findData = {0};
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
|
|
HANDLE hFax = NULL;
|
|
PFAX_ARCHIVE_CONFIG pArchiveCfg = NULL;
|
|
|
|
PSID pUserSid = NULL;
|
|
WCHAR* pszUserSid = NULL;
|
|
|
|
DWORDLONG dwlUniqueId;
|
|
DWORD dwFileCount = 0;
|
|
DWORD dwNotifyMsgID = 0; // Windows message id used for notification
|
|
|
|
HMODULE hAdvapi32 = NULL;
|
|
BOOL (*pfConvertSidToStringSid)(PSID, LPTSTR*) = NULL; // pointer to ConvertSidToStringSid()
|
|
|
|
DBG_ENTER(TEXT("ImportFolderThread"), dwRes);
|
|
|
|
if(!IsWinXPOS())
|
|
{
|
|
//
|
|
// The Import functionality supported on XP OS only
|
|
//
|
|
ASSERTION_FAILURE;
|
|
return ERROR_CALL_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
//
|
|
// ConvertSidToStringSid() Requires Windows 2000 or later, so we connect to it dynamically
|
|
//
|
|
hAdvapi32 = LoadLibrary(TEXT("advapi32.dll"));
|
|
if(!hAdvapi32)
|
|
{
|
|
dwRes = GetLastError();
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("LoadLibrary(advapi32.dll)"), dwRes);
|
|
goto exit;
|
|
}
|
|
|
|
(FARPROC&)pfConvertSidToStringSid = GetProcAddress(hAdvapi32, "ConvertSidToStringSidW");
|
|
if(!pfConvertSidToStringSid)
|
|
{
|
|
dwRes = GetLastError();
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("GetProcAddress(ConvertSidToStringSid)"), dwRes);
|
|
goto exit;
|
|
}
|
|
|
|
//
|
|
// Compose find mask: path\*.tif
|
|
//
|
|
_snwprintf(szFindMask, MAX_PATH-1, TEXT("%s\\%s"), pParam->cszImportFolder, FAX_TIF_FILE_MASK);
|
|
|
|
//
|
|
// Count TIF files in the pParam->cszImportFolder folder
|
|
//
|
|
// Find the first tif file in the cstrImportFolder
|
|
//
|
|
hFile = FindFirstFile(szFindMask, &findData);
|
|
if(INVALID_HANDLE_VALUE == hFile)
|
|
{
|
|
dwRes = GetLastError();
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("FindFirstFile"), dwRes);
|
|
goto exit;
|
|
}
|
|
|
|
dwFileCount = 1;
|
|
for(;;)
|
|
{
|
|
//
|
|
// Find Next File
|
|
//
|
|
if(!FindNextFile(hFile, &findData))
|
|
{
|
|
dwError = GetLastError();
|
|
if(ERROR_NO_MORE_FILES != dwError)
|
|
{
|
|
dwRes = dwError;
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("FindNextFile"), dwRes);
|
|
}
|
|
break;
|
|
}
|
|
dwFileCount += 1;
|
|
}
|
|
|
|
if(INVALID_HANDLE_VALUE != hFile)
|
|
{
|
|
FindClose(hFile);
|
|
}
|
|
|
|
if(pParam->hImportDlg)
|
|
{
|
|
//
|
|
// Set progress bar range
|
|
//
|
|
SendMessage(pParam->hImportDlg, WM_IMPORT_SET_FILE_COUNT, dwFileCount, 0);
|
|
}
|
|
|
|
|
|
//
|
|
// Find the first tif file in the cstrImportFolder
|
|
//
|
|
hFile = FindFirstFile(szFindMask, &findData);
|
|
if(INVALID_HANDLE_VALUE == hFile)
|
|
{
|
|
dwRes = GetLastError();
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("FindFirstFile"), dwRes);
|
|
goto exit;
|
|
}
|
|
|
|
//
|
|
// Get fax server archive configuration
|
|
//
|
|
if(!FaxConnectFaxServer(NULL, &hFax))
|
|
{
|
|
dwRes = GetLastError();
|
|
CALL_FAIL (RPC_ERR, TEXT ("FaxConnectFaxServer"), dwRes);
|
|
goto exit;
|
|
}
|
|
|
|
//
|
|
// Get pointer to the Client Console archive folder
|
|
//
|
|
if(theApp.m_pMainWnd)
|
|
{
|
|
CClientConsoleDoc* pDoc = NULL;
|
|
pDoc = (CClientConsoleDoc*)((CFrameWnd*)theApp.m_pMainWnd)->GetActiveDocument();
|
|
if(pDoc)
|
|
{
|
|
//
|
|
// find local fax server
|
|
//
|
|
CServerNode* pServer = NULL;
|
|
pServer = pDoc->FindServerByName(NULL);
|
|
if(pServer)
|
|
{
|
|
//
|
|
// Get archive folder
|
|
//
|
|
CFolder* pFolder = NULL;
|
|
pFolder = pServer->GetFolder(pParam->bSentItems ? FOLDER_TYPE_SENT_ITEMS : FOLDER_TYPE_INBOX);
|
|
if(pFolder && pFolder->IsValid())
|
|
{
|
|
dwNotifyMsgID = pServer->GetNotifyMsgID();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Access check
|
|
//
|
|
DWORD dwAccessRights;
|
|
if (!FaxAccessCheckEx(hFax,
|
|
pParam->bSentItems ? FAX_ACCESS_MANAGE_OUT_ARCHIVE : FAX_ACCESS_MANAGE_IN_ARCHIVE,
|
|
&dwAccessRights))
|
|
{
|
|
dwRes = GetLastError();
|
|
CALL_FAIL (RPC_ERR, TEXT ("FaxAccessCheckEx"), dwRes);
|
|
|
|
AlignedAfxMessageBox(IDS_IMPORT_NO_ACCESS, MB_OK | MB_ICONSTOP | MB_APPLMODAL);
|
|
|
|
goto exit;
|
|
}
|
|
|
|
if(!FaxGetArchiveConfiguration(hFax,
|
|
pParam->bSentItems ? FAX_MESSAGE_FOLDER_SENTITEMS : FAX_MESSAGE_FOLDER_INBOX,
|
|
&pArchiveCfg))
|
|
{
|
|
dwRes = GetLastError();
|
|
CALL_FAIL (RPC_ERR, TEXT ("FaxGetArchiveConfiguration"), dwRes);
|
|
goto exit;
|
|
}
|
|
|
|
BOOL bSameDir = FALSE;
|
|
if ((dwRes = CheckToSeeIfSameDir((LPTSTR)pArchiveCfg->lpcstrFolder,(LPTSTR)pParam->cszImportFolder,&bSameDir)) != ERROR_SUCCESS)
|
|
{
|
|
CALL_FAIL (RPC_ERR, TEXT ("CheckToSeeIfSameDir"), dwRes);
|
|
goto exit;
|
|
}
|
|
|
|
if (bSameDir)
|
|
{
|
|
AlignedAfxMessageBox(pParam->bSentItems ? IDS_IMPORT_SAME_DIR_SENT : IDS_IMPORT_SAME_DIR_INBOX
|
|
, MB_OK | MB_ICONSTOP | MB_APPLMODAL);
|
|
goto exit;
|
|
}
|
|
|
|
if(pParam->bSentItems)
|
|
{
|
|
//
|
|
// Get the user string SID for the outbound archive
|
|
//
|
|
pUserSid = GetCurrentThreadSID();
|
|
if (!pUserSid)
|
|
{
|
|
dwRes = GetLastError ();
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("GetCurrentThreadSID"), dwRes);
|
|
goto exit;
|
|
}
|
|
|
|
if (!pfConvertSidToStringSid(pUserSid, &pszUserSid))
|
|
{
|
|
dwRes = GetLastError ();
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("ConvertSidToStringSid"), dwRes);
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
while(!pParam->bCancel)
|
|
{
|
|
//
|
|
// Compose full path
|
|
//
|
|
_snwprintf(szImportFile, MAX_PATH-1, TEXT("%s\\%s\0"), pParam->cszImportFolder, findData.cFileName);
|
|
|
|
nRes = IDOK;
|
|
do
|
|
{
|
|
//
|
|
// Import the file
|
|
//
|
|
dwError = ImportArchiveFile(szImportFile,
|
|
pArchiveCfg->lpcstrFolder,
|
|
pParam->bSentItems,
|
|
pszUserSid,
|
|
&dwlUniqueId);
|
|
if(ERROR_SUCCESS != dwError)
|
|
{
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("ImportArchiveFile"), dwRes);
|
|
|
|
//
|
|
// Popup "Cancel, Try Again, Continue" dialog
|
|
//
|
|
DWORD dwResId = IDS_IMPORT_ERROR;
|
|
WCHAR szFormat[MAX_PATH] = {0};
|
|
WCHAR szMsg[MAX_PATH] = {0};
|
|
|
|
if(ERROR_BAD_FORMAT == dwError)
|
|
{
|
|
dwResId = IDS_IMPORT_BAD_FORMAT;
|
|
}
|
|
else if(ERROR_XP_TIF_WITH_WRONG_ARCHIVE_TYPE == dwError)
|
|
{
|
|
dwResId = pParam->bSentItems ? IDS_IMPORT_FILE_NOT_SEND_TYPE : IDS_IMPORT_FILE_NOT_RECEIVE_TYPE;
|
|
}
|
|
|
|
if(LoadString(GetResourceHandle(),
|
|
dwResId,
|
|
szFormat,
|
|
ARR_SIZE(szFormat)))
|
|
{
|
|
_snwprintf(szMsg, MAX_PATH-1, szFormat, findData.cFileName);
|
|
|
|
nRes = AlignedAfxMessageBox(szMsg, MB_CANCELTRYCONTINUE | MB_ICONSTOP | MB_APPLMODAL);
|
|
|
|
if(IDCANCEL == nRes)
|
|
{
|
|
pParam->bCancel = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("LoadString(IDS_IMPORT_ERROR)"), GetLastError());
|
|
}
|
|
}
|
|
}
|
|
while(nRes == IDTRYAGAIN);
|
|
|
|
if(dwNotifyMsgID)
|
|
{
|
|
//
|
|
// Add the message to the archive folder
|
|
// We simulate the server notification handled by the application main thread
|
|
// The notification handler should free the event data
|
|
//
|
|
FAX_EVENT_EX* pEvent = (FAX_EVENT_EX*)MemAlloc(sizeof(FAX_EVENT_EX));
|
|
if(!pEvent)
|
|
{
|
|
dwRes = ERROR_NOT_ENOUGH_MEMORY;
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("MemAlloc"), dwRes);
|
|
goto exit;
|
|
}
|
|
ZeroMemory(pEvent, sizeof(FAX_EVENT_EX));
|
|
|
|
pEvent->dwSizeOfStruct = sizeof(FAX_EVENT_EX);
|
|
pEvent->EventType = pParam->bSentItems ? FAX_EVENT_TYPE_OUT_ARCHIVE : FAX_EVENT_TYPE_IN_ARCHIVE;
|
|
pEvent->EventInfo.JobInfo.Type = FAX_JOB_EVENT_TYPE_ADDED;
|
|
pEvent->EventInfo.JobInfo.dwlMessageId = dwlUniqueId;
|
|
|
|
theApp.m_pMainWnd->SendMessage(dwNotifyMsgID, 0, (LPARAM)pEvent);
|
|
}
|
|
|
|
if(pParam->hImportDlg)
|
|
{
|
|
//
|
|
// Increment progress bar
|
|
//
|
|
SendMessage(pParam->hImportDlg, WM_IMPORT_PROGRESS_INC, 0, 0);
|
|
}
|
|
|
|
//
|
|
// Find Next File
|
|
//
|
|
if(!FindNextFile(hFile, &findData))
|
|
{
|
|
dwError = GetLastError();
|
|
if(ERROR_NO_MORE_FILES != dwError)
|
|
{
|
|
dwRes = dwError;
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("FindNextFile"), dwRes);
|
|
}
|
|
break;
|
|
}
|
|
} // while
|
|
|
|
//
|
|
// Notify the fax service
|
|
//
|
|
if(!FaxRefreshArchive(hFax,
|
|
pParam->bSentItems ? FAX_MESSAGE_FOLDER_SENTITEMS : FAX_MESSAGE_FOLDER_INBOX))
|
|
{
|
|
dwRes = GetLastError();
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("FaxArchiveMessageAdded"), dwRes);
|
|
}
|
|
|
|
|
|
exit:
|
|
|
|
if(pParam->hImportDlg)
|
|
{
|
|
//
|
|
// Close the Progress dialog
|
|
//
|
|
SendMessage(pParam->hImportDlg, WM_CLOSE, 0, 0);
|
|
}
|
|
|
|
if(0 == dwFileCount)
|
|
{
|
|
//
|
|
// The folder does not contain faxes
|
|
//
|
|
AlignedAfxMessageBox(IDS_IMPORT_EMPTY_FOLDER, MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL);
|
|
}
|
|
|
|
if(INVALID_HANDLE_VALUE != hFile)
|
|
{
|
|
FindClose(hFile);
|
|
}
|
|
|
|
if(pArchiveCfg)
|
|
{
|
|
FaxFreeBuffer(pArchiveCfg);
|
|
}
|
|
|
|
if(hFax)
|
|
{
|
|
FaxClose(hFax);
|
|
}
|
|
|
|
if(pUserSid)
|
|
{
|
|
MemFree(pUserSid);
|
|
}
|
|
|
|
if(pszUserSid)
|
|
{
|
|
LocalFree(pszUserSid);
|
|
}
|
|
|
|
if(hAdvapi32)
|
|
{
|
|
FreeLibrary(hAdvapi32);
|
|
}
|
|
|
|
return dwRes;
|
|
|
|
} // ImportArchiveFolder
|
|
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
ImportDlgProc(
|
|
HWND hwndDlg, // handle to dialog box
|
|
UINT uMsg, // message
|
|
WPARAM wParam, // first message parameter
|
|
LPARAM lParam // second message parameter
|
|
)
|
|
/*++
|
|
|
|
Routine description:
|
|
|
|
Import fax dialog procedure
|
|
|
|
Arguments:
|
|
|
|
HWND hwndDlg, // handle to dialog box
|
|
UINT uMsg, // message
|
|
WPARAM wParam, // first message parameter
|
|
LPARAM lParam // second message parameter
|
|
|
|
Return Value:
|
|
|
|
return TRUE if it processed the message
|
|
|
|
--*/
|
|
|
|
{
|
|
static ImportFolderParam* pIpmParam = NULL;
|
|
static DWORD dwFileCount; // The number of the files to import
|
|
static DWORD dwCurrentFile; // The number of the currently imported file
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
HANDLE hImportThread = NULL;
|
|
pIpmParam = (ImportFolderParam*)lParam;
|
|
TCHAR szFolder[MAX_PATH] = {0};
|
|
|
|
DBG_ENTER(TEXT("ImportDlgProc(WM_INITDIALOG)"));
|
|
|
|
|
|
dwFileCount = 0;
|
|
dwCurrentFile = 0;
|
|
|
|
//
|
|
// Set import folder name
|
|
//
|
|
if(LoadString(GetResourceHandle(),
|
|
pIpmParam->bSentItems ? IDS_IMPORT_TO_SENT_ITEMS : IDS_IMPORT_TO_INBOX,
|
|
szFolder,
|
|
ARR_SIZE(szFolder)))
|
|
{
|
|
SetDlgItemText(hwndDlg, IDC_PROGRESS_TITLE, szFolder);
|
|
}
|
|
else
|
|
{
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("LoadString() for IDC_PROGRESS_TITLE"), GetLastError());
|
|
}
|
|
|
|
pIpmParam->hImportDlg = hwndDlg;
|
|
|
|
hImportThread = CreateThread(NULL, // SD
|
|
0, // initial stack size
|
|
ImportArchiveFolder, // thread function
|
|
(LPVOID)pIpmParam, // thread argument
|
|
0, // creation option
|
|
NULL); // thread identifier
|
|
if(!hImportThread)
|
|
{
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("CreateThread"), GetLastError());
|
|
}
|
|
else
|
|
{
|
|
CloseHandle(hImportThread);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
case WM_IMPORT_PROGRESS_INC:
|
|
{
|
|
//
|
|
// Increment progress bar
|
|
//
|
|
SendDlgItemMessage(hwndDlg, IDC_PROGRESS_BAR, PBM_STEPIT, 0, 0);
|
|
|
|
//
|
|
// Compose and set currently imported fax number
|
|
//
|
|
++dwCurrentFile;
|
|
|
|
TCHAR szFormat[MAX_PATH] = {0};
|
|
TCHAR szText[MAX_PATH] = {0};
|
|
DWORD dwParam[2];
|
|
|
|
DBG_ENTER(TEXT("ImportDlgProc(WM_IMPORT_PROGRESS_INC)"));
|
|
|
|
|
|
dwParam[0] = dwCurrentFile;
|
|
dwParam[1] = dwFileCount;
|
|
|
|
if(!LoadString(GetResourceHandle(),
|
|
IDS_PROGRESS_NUMBER,
|
|
szFormat,
|
|
ARR_SIZE(szFormat)))
|
|
{
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("LoadString(IDS_PROGRESS_NUMBER)"), GetLastError());
|
|
return TRUE;
|
|
}
|
|
|
|
if(FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
|
(LPCVOID)szFormat,
|
|
0,
|
|
0,
|
|
szText,
|
|
ARR_SIZE(szText),
|
|
(va_list*)dwParam))
|
|
{
|
|
SetDlgItemText(hwndDlg, IDC_PROGRESS_NUMBER, szText);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
case WM_IMPORT_SET_FILE_COUNT:
|
|
//
|
|
// Set the pange and step of the proggress bar
|
|
//
|
|
dwFileCount = wParam;
|
|
dwCurrentFile = 1;
|
|
|
|
SendDlgItemMessage(hwndDlg, IDC_PROGRESS_BAR, PBM_SETRANGE32, 0, dwFileCount);
|
|
SendDlgItemMessage(hwndDlg, IDC_PROGRESS_BAR, PBM_SETSTEP, 1, 0);
|
|
return TRUE;
|
|
|
|
case WM_CLOSE:
|
|
|
|
EndDialog(hwndDlg, IDCANCEL);
|
|
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case IDCANCEL:
|
|
|
|
//
|
|
// Mark cancel, don't close the dialog
|
|
//
|
|
pIpmParam->bCancel = TRUE;
|
|
EnableWindow(GetDlgItem(hwndDlg, IDCANCEL), FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
} // switch ( uMsg )
|
|
|
|
return FALSE;
|
|
|
|
} // ImportDlgProc
|
|
|
|
|
|
DWORD
|
|
ImportArchiveFolderUI(
|
|
LPCWSTR cstrImportFolder,
|
|
BOOL bSentItems,
|
|
HWND hWnd
|
|
)
|
|
/*++
|
|
|
|
Routine name : ImportArchiveFolderUI
|
|
|
|
Routine description:
|
|
|
|
Opens the Import Progress dialog
|
|
|
|
Arguments:
|
|
|
|
cstrImportFolder - [in] Import folder name
|
|
bSentItems - [in] TRUE if the folder is the sent archive, FALSE if it is receive one
|
|
hWnd - [in] Parent window
|
|
|
|
Return Value:
|
|
|
|
Standard Win32 error code
|
|
|
|
--*/
|
|
{
|
|
DWORD dwRes = ERROR_SUCCESS;
|
|
|
|
ImportFolderParam impParam = {0};
|
|
impParam.cszImportFolder = cstrImportFolder;
|
|
impParam.bSentItems = bSentItems;
|
|
|
|
DBG_ENTER(TEXT("ImportArchiveFolderUI"), dwRes);
|
|
|
|
DialogBoxParam(GetResourceHandle(), // handle to module
|
|
MAKEINTRESOURCE(IDD_FAX_PROGRESS), // dialog box template
|
|
hWnd, // handle to owner window
|
|
ImportDlgProc, // dialog box procedure
|
|
(LPARAM)&impParam); // initialization value
|
|
|
|
return dwRes;
|
|
|
|
} // ImportArchiveFolderUI
|
|
|
|
|
|
BOOL
|
|
IsFaxArchive(
|
|
WCHAR* szFolder
|
|
)
|
|
/*++
|
|
|
|
Routine name : IsFaxArchive
|
|
|
|
Routine description:
|
|
|
|
Determine if the folder contains at least one TIF file
|
|
|
|
Arguments:
|
|
|
|
szFolder - [in] folder name
|
|
|
|
Return Value:
|
|
|
|
TRUE if if the folder contains at least one TIF file
|
|
FALSE otherwise
|
|
|
|
--*/
|
|
{
|
|
WCHAR szFindMask[MAX_PATH] = {0};
|
|
WIN32_FIND_DATA findData = {0};
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
|
|
DBG_ENTER(TEXT("IsFaxArchive"));
|
|
|
|
//
|
|
// Compose find mask: path\*.tif
|
|
//
|
|
_snwprintf(szFindMask, MAX_PATH-1, TEXT("%s\\%s"), szFolder, FAX_TIF_FILE_MASK);
|
|
|
|
//
|
|
// Find the first tif file in the cstrImportFolder
|
|
//
|
|
hFile = FindFirstFile(szFindMask, &findData);
|
|
if(INVALID_HANDLE_VALUE == hFile)
|
|
{
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("FindFirstFile"), GetLastError());
|
|
return FALSE;
|
|
}
|
|
|
|
FindClose(hFile);
|
|
return TRUE;
|
|
}
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
ImportInfoDlgProc(
|
|
HWND hwndDlg, // handle to dialog box
|
|
UINT uMsg, // message
|
|
WPARAM wParam, // first message parameter
|
|
LPARAM lParam // second message parameter
|
|
)
|
|
/*++
|
|
|
|
Routine description:
|
|
|
|
Import information fax dialog procedure
|
|
|
|
Arguments:
|
|
|
|
HWND hwndDlg, // handle to dialog box
|
|
UINT uMsg, // message
|
|
WPARAM wParam, // first message parameter
|
|
LPARAM lParam // second message parameter
|
|
|
|
Return Value:
|
|
|
|
return TRUE if it processed the message
|
|
|
|
--*/
|
|
|
|
{
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
//
|
|
// Set focus on the OK button
|
|
//
|
|
SetFocus(GetDlgItem(hwndDlg, IDOK));
|
|
return FALSE;
|
|
|
|
case WM_NOTIFY :
|
|
{
|
|
LPNMHDR lpnm = (LPNMHDR) lParam;
|
|
if(((NM_CLICK == lpnm->code) || (NM_RETURN == lpnm->code)) &&
|
|
lpnm->idFrom == IDC_IMPORT_HELP_LINK)
|
|
{
|
|
//
|
|
// Display import help
|
|
//
|
|
HtmlHelpTopic(hwndDlg, FAX_HELP_IMPORT);
|
|
return TRUE;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDOK:
|
|
case IDCANCEL:
|
|
EndDialog(hwndDlg, IDOK);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
}
|
|
return FALSE;
|
|
} // ImportInfoDlgProc
|
|
|
|
DWORD
|
|
DetectImportFiles()
|
|
/*++
|
|
|
|
Routine name : DetectImportFiles
|
|
|
|
Routine description:
|
|
|
|
Determine if the system has W2K fax archives.
|
|
If yes warning dialog will be displayed for the first time.
|
|
|
|
Return Value:
|
|
|
|
Standard Win32 error code
|
|
|
|
--*/
|
|
{
|
|
DWORD dwRes = ERROR_SUCCESS;
|
|
HKEY hRegKey;
|
|
DWORD dwImportWrn = 0; // 1 if the import warning has been displayed
|
|
|
|
WCHAR* pszInbox = NULL;
|
|
WCHAR* pszSentItems = NULL;
|
|
DWORD dwSize = 0;
|
|
BOOL bHaveFax = FALSE; // TRUE if the archives contain at least one TIF file
|
|
|
|
DBG_ENTER(TEXT("DetectImportFiles"), dwRes);
|
|
|
|
if(!IsWinXPOS())
|
|
{
|
|
return dwRes;
|
|
}
|
|
|
|
//
|
|
// Check if the Import warning has been displayed
|
|
//
|
|
if ((hRegKey = OpenRegistryKey(HKEY_CURRENT_USER, REGKEY_FAX_SETUP, TRUE, KEY_ALL_ACCESS)))
|
|
{
|
|
dwImportWrn = GetRegistryDword(hRegKey, REGVAL_IMPORT_INFO);
|
|
|
|
if(!dwImportWrn)
|
|
{
|
|
SetRegistryDword(hRegKey, REGVAL_IMPORT_INFO, TRUE);
|
|
}
|
|
|
|
RegCloseKey(hRegKey);
|
|
}
|
|
else
|
|
{
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("OpenRegistryKey"), GetLastError());
|
|
}
|
|
|
|
if(dwImportWrn)
|
|
{
|
|
//
|
|
// Import warning has been displayed
|
|
//
|
|
return dwRes;
|
|
}
|
|
|
|
//
|
|
// Read W2K archives location
|
|
//
|
|
if (!(hRegKey = OpenRegistryKey(HKEY_LOCAL_MACHINE, REGKEY_FAX_SETUP, TRUE, KEY_QUERY_VALUE)))
|
|
{
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("OpenRegistryKey"), GetLastError());
|
|
return dwRes;
|
|
}
|
|
|
|
pszInbox = GetRegistryStringMultiSz(hRegKey, REGVAL_W2K_INBOX, NULL, &dwSize);
|
|
pszSentItems = GetRegistryString(hRegKey, REGVAL_W2K_SENT_ITEMS, NULL);
|
|
|
|
RegCloseKey(hRegKey);
|
|
|
|
//
|
|
// Determine if the archives have at least one TIF file
|
|
//
|
|
bHaveFax = IsFaxArchive(pszSentItems);
|
|
|
|
WCHAR* pszFolder = pszInbox;
|
|
while(!bHaveFax && pszFolder && *pszFolder)
|
|
{
|
|
//
|
|
// Walk though the multiline pszInbox string
|
|
//
|
|
bHaveFax = IsFaxArchive(pszFolder);
|
|
|
|
pszFolder = _wcsninc(pszFolder, wcslen(pszFolder)+1);
|
|
}
|
|
|
|
MemFree(pszInbox);
|
|
MemFree(pszSentItems);
|
|
|
|
if(bHaveFax)
|
|
{
|
|
if(!LinkWindow_RegisterClass())
|
|
{
|
|
dwRes = ERROR_CAN_NOT_COMPLETE;
|
|
CALL_FAIL (GENERAL_ERR, TEXT ("LinkWindow_RegisterClass"), dwRes);
|
|
return dwRes;
|
|
}
|
|
|
|
DialogBoxParam(GetResourceHandle(), // handle to module
|
|
MAKEINTRESOURCE(IDD_IMPORT_INFO), // dialog box template
|
|
theApp.m_pMainWnd->m_hWnd, // handle to owner window
|
|
ImportInfoDlgProc, // dialog box procedure
|
|
NULL); // initialization value
|
|
|
|
LinkWindow_UnregisterClass(theApp.m_hInstance);
|
|
}
|
|
|
|
return dwRes;
|
|
}
|
|
|
|
#endif //UNICODE
|