windows-nt/Source/XPSP1/NT/ds/security/services/ca/certlib/crfile.cpp

332 lines
9 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: crfile.cpp
//
// Contents: Cert Server wrapper routines
//
//---------------------------------------------------------------------------
#include <pch.cpp>
#pragma hdrstop
HRESULT
myFixupRCFilterString(WCHAR *szFilter)
{
if (NULL == szFilter)
return S_OK;
// translate to end of string
for(LPWSTR szTmpPtr=szFilter; szTmpPtr=wcschr(szTmpPtr, L'|'); )
{
// replace every "|" with NULL termination
szTmpPtr[0] = L'\0';
szTmpPtr++;
}
return S_OK;
}
HRESULT
myGetFileName(
IN HWND hwndOwner,
IN HINSTANCE hInstance,
IN BOOL fOpen,
OPTIONAL IN int iRCTitle,
OPTIONAL IN WCHAR const *pwszTitleInsert,
OPTIONAL IN int iRCFilter,
OPTIONAL IN int iRCDefExt,
OPTIONAL IN DWORD Flags,
OPTIONAL IN WCHAR const *pwszDefaultFile,
OUT WCHAR **ppwszFile)
{
HRESULT hr;
WCHAR *pwszTitle = NULL;
WCHAR *pwszExpandedTitle = NULL;
WCHAR *pwszFilter = NULL;
WCHAR *pwszDefExt = NULL;
WCHAR wszFileName[MAX_PATH] = L"\0";
WCHAR wszEmptyFilter[] = L"\0";
WCHAR wszPath[MAX_PATH];
WCHAR *pwszFilePortion;
DWORD dwFileAttr;
BOOL fGetFile;
OPENFILENAME ofn;
CSASSERT(NULL != ppwszFile);
// init
*ppwszFile = NULL;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
if (0 != iRCTitle)
{
// load title
hr = myLoadRCString(hInstance, iRCTitle, &pwszTitle);
if (S_OK != hr)
{
CSASSERT(NULL == pwszTitle);
_PrintError(hr, "myLoadECString(iRCTitle)");
}
else if (NULL != pwszTitleInsert)
{
// replace %1
if (FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_STRING |
FORMAT_MESSAGE_ARGUMENT_ARRAY,
pwszTitle,
0,
0,
reinterpret_cast<WCHAR *>(&pwszExpandedTitle),
0,
reinterpret_cast<va_list *>
(const_cast<WCHAR **>(&pwszTitleInsert))) )
{
CSASSERT(NULL != pwszExpandedTitle);
// free title with %1
LocalFree(pwszTitle);
pwszTitle = pwszExpandedTitle;
pwszExpandedTitle = NULL;
}
}
}
if (0 != iRCFilter)
{
// load filter
hr = myLoadRCString(hInstance, iRCFilter, &pwszFilter);
if (S_OK != hr)
{
CSASSERT(NULL == pwszFilter);
_PrintError(hr, "myLoadECString(iRCFilter)");
}
if (NULL == pwszFilter)
{
//point to empty one
pwszFilter = wszEmptyFilter;
}
else
{
hr = myFixupRCFilterString(pwszFilter);
_JumpIfError(hr, error , "myFixupRCFilterString");
}
}
if (0 != iRCDefExt)
{
// load default extension
hr = myLoadRCString(hInstance, iRCDefExt, &pwszDefExt);
if (S_OK != hr)
{
CSASSERT(NULL == pwszDefExt);
_PrintError(hr, "myLoadECString(iRCDefExt)");
}
}
ofn.lStructSize = CCSIZEOF_STRUCT(OPENFILENAME, lpTemplateName);
ofn.hwndOwner = hwndOwner;
ofn.hInstance = hInstance;
ofn.lpstrTitle = pwszTitle;
ofn.lpstrFilter = pwszFilter;
ofn.lpstrDefExt = pwszDefExt;
ofn.Flags = Flags;
ofn.lpstrFile = wszFileName; // for out
ofn.nMaxFile = ARRAYSIZE(wszFileName);
if (NULL != pwszDefaultFile)
{
// analysis of default directory and file
dwFileAttr = GetFileAttributes(pwszDefaultFile);
if (0xFFFFFFFF == dwFileAttr &&
HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) != (hr = myHLastError()) )
{
// error, ignore, pop up file dialog without defaults
_PrintError(hr, "GetFileAttributes");
}
else
{
if (0xFFFFFFFF != dwFileAttr &&
FILE_ATTRIBUTE_DIRECTORY & dwFileAttr)
{
// only pass a dircetory path
ofn.lpstrInitialDir = pwszDefaultFile;
}
else
{
// full path
pwszFilePortion = NULL; // init
if (0 == GetFullPathName(
pwszDefaultFile,
ARRAYSIZE(wszPath),
wszPath,
&pwszFilePortion) )
{
// error, ignore
hr = myHLastError();
_PrintError(hr, "GetFullPathName");
}
else
{
if (NULL != pwszFilePortion)
{
wcscpy(wszFileName, pwszFilePortion);
}
*pwszFilePortion = L'\0'; // make init dir
ofn.lpstrInitialDir = wszPath;
}
}
}
}
if (fOpen)
{
fGetFile = GetOpenFileName(&ofn);
}
else
{
fGetFile = GetSaveFileName(&ofn);
}
if (!fGetFile)
{
hr = CommDlgExtendedError();
if (S_OK == hr)
{
// cancel would make Get?FileName return FALSE but no error
goto done;
}
_JumpError(hr, error, "GetOpenFileName");
}
// ok get file name
hr = myDupString(wszFileName, ppwszFile);
_JumpIfError(hr, error, "myDupString");
done:
hr = S_OK;
error:
if (NULL != pwszTitle)
{
LocalFree(pwszTitle);
}
if (NULL != pwszExpandedTitle)
{
LocalFree(pwszExpandedTitle);
}
if (NULL != pwszFilter && pwszFilter != wszEmptyFilter)
{
LocalFree(pwszFilter);
}
if (NULL != pwszDefExt)
{
LocalFree(pwszDefExt);
}
return hr;
}
HRESULT
myGetOpenFileName(
IN HWND hwndOwner,
IN HINSTANCE hInstance,
OPTIONAL IN int iRCTitle,
OPTIONAL IN int iRCFilter,
OPTIONAL IN int iRCDefExt,
OPTIONAL IN DWORD Flags,
OPTIONAL IN WCHAR const *pwszDefaultFile,
OUT WCHAR **ppwszFile)
{
return myGetFileName(
hwndOwner,
hInstance,
TRUE, // open file
iRCTitle,
NULL,
iRCFilter,
iRCDefExt,
Flags,
pwszDefaultFile,
ppwszFile);
}
HRESULT
myGetSaveFileName(
IN HWND hwndOwner,
IN HINSTANCE hInstance,
OPTIONAL IN int iRCTitle,
OPTIONAL IN int iRCFilter,
OPTIONAL IN int iRCDefExt,
OPTIONAL IN DWORD Flags,
OPTIONAL IN WCHAR const *pwszDefaultFile,
OUT WCHAR **ppwszFile)
{
return myGetFileName(
hwndOwner,
hInstance,
FALSE, // save file
iRCTitle,
NULL,
iRCFilter,
iRCDefExt,
Flags,
pwszDefaultFile,
ppwszFile);
}
HRESULT
myGetOpenFileNameEx(
IN HWND hwndOwner,
IN HINSTANCE hInstance,
OPTIONAL IN int iRCTitle,
OPTIONAL IN WCHAR const *pwszTitleInsert,
OPTIONAL IN int iRCFilter,
OPTIONAL IN int iRCDefExt,
OPTIONAL IN DWORD Flags,
OPTIONAL IN WCHAR const *pwszDefaultFile,
OUT WCHAR **ppwszFile)
{
return myGetFileName(
hwndOwner,
hInstance,
TRUE, // open file
iRCTitle,
pwszTitleInsert,
iRCFilter,
iRCDefExt,
Flags,
pwszDefaultFile,
ppwszFile);
}
HRESULT
myGetSaveFileNameEx(
IN HWND hwndOwner,
IN HINSTANCE hInstance,
OPTIONAL IN int iRCTitle,
OPTIONAL IN WCHAR const *pwszTitleInsert,
OPTIONAL IN int iRCFilter,
OPTIONAL IN int iRCDefExt,
OPTIONAL IN DWORD Flags,
OPTIONAL IN WCHAR const *pwszDefaultFile,
OUT WCHAR **ppwszFile)
{
return myGetFileName(
hwndOwner,
hInstance,
FALSE, // save file
iRCTitle,
pwszTitleInsert,
iRCFilter,
iRCDefExt,
Flags,
pwszDefaultFile,
ppwszFile);
}