|
|
/*************************************************************************
FileName : DlgWindow.cpp
Purpose : To accomodate the functions called for display of dialogs for the user to choose the name of the file which is to be saved to or to choose a file for filexfer by RA.
Functions defined : InitializeOpenFileName, SaveTheFile, OpenTheFile, ResolveIt
Author : Sudha Srinivasan (a-sudsi) *************************************************************************/ #include "stdafx.h"
#include "DlgWindow.h"
#include "Resource.h"
extern "C" { #include <shlobj.h>
#include <objbase.h>
}
HINSTANCE g_hInst = NULL; extern CComBSTR g_bstrFileName; extern BOOL g_bFileNameSet; extern CComBSTR g_bstrFileType;
extern CComBSTR g_bstrOpenFileName; extern CComBSTR g_bstrOpenFileSize; extern BOOL g_bOpenFileNameSet;
OPENFILENAME g_OpenFileName;
//
// FUNCTION: InitializeOpenFileName()
//
// PURPOSE: Invokes common dialog function to save a file.
//
// COMMENTS:
//
// This function initializes the OPENFILENAME structure and calls
// the GetSaveFileName() common dialog function.
//
// RETURN VALUES:
// TRUE - The file name is chosen successfully and read into the buffer.
// FALSE - No filename is chosen.
//
//
void InitializeOpenFileName() { g_OpenFileName.lStructSize = sizeof(OPENFILENAME); g_OpenFileName.hwndOwner = GetFocus(); g_OpenFileName.hInstance = g_hInst; g_OpenFileName.lpstrCustomFilter = NULL; g_OpenFileName.nMaxCustFilter = 0; g_OpenFileName.nFilterIndex = 0; g_OpenFileName.lpstrFileTitle = NULL; g_OpenFileName.nMaxFileTitle = 0; g_OpenFileName.lpstrInitialDir = NULL; g_OpenFileName.nFileOffset = 0; g_OpenFileName.nFileExtension = 0; g_OpenFileName.lpstrDefExt = NULL; g_OpenFileName.lCustData = NULL; g_OpenFileName.lpfnHook = NULL; g_OpenFileName.lpTemplateName = NULL;
return; }
//
// FUNCTION: SaveTheFile()
//
// PURPOSE: Invokes common dialog function to save a file.
//
// COMMENTS:
//
// This function initializes the OPENFILENAME structure and calls
// the GetSaveFileName() common dialog function.
//
// RETURN VALUES:
// TRUE - The file name is chosen successfully and read into the buffer.
// FALSE - No filename is chosen.
//
//
DWORD SaveTheFile() { USES_CONVERSION; TCHAR szFile[MAX_PATH] = "\0"; TCHAR szFilter[MAX_PATH+1] = "\0"; TCHAR *tszFile =NULL; DWORD dwSuc = TRUE;
HRESULT hr=S_OK;
//Incase the user has given a filename to be displayed in the dialog.
if (g_bFileNameSet) { tszFile = OLE2T(g_bstrFileName); if(NULL != tszFile) { //SWI
//strcpy( szFile, tszFile);
hr=StringCchCopy(szFile,ARRAYSIZE(szFile),tszFile); if(FAILED(hr)) { dwSuc = FALSE; g_bstrFileName = ""; goto DoneSaveTheFile; } } else { //
// Error condition
//
dwSuc = FALSE; g_bstrFileName = ""; goto DoneSaveTheFile; } } else { //SWI
//strcpy( szFile, "");
//the length of szFile is obviously greater than 1.
//So return value not checked
StringCchCopy(szFile,ARRAYSIZE(szFile),tszFile);
}
//To display file types.
if (g_bstrFileType.Length() > 0) { //SWI
//strcpy (szFilter, OLE2T(g_bstrFileType));
hr=StringCchCopy(szFilter,ARRAYSIZE(szFilter), OLE2T(g_bstrFileType)); if(FAILED(hr)) { dwSuc = FALSE; g_bstrFileName = ""; goto DoneSaveTheFile; } //SWI
//lstrcat(szFilter, "\0\0");
hr=StringCchCat(szFilter,ARRAYSIZE(szFilter),"\0\0"); if(FAILED(hr)) { dwSuc = FALSE; g_bstrFileName = ""; goto DoneSaveTheFile; }
} else { TCHAR szAllFilesFilter[MAX_PATH+1]; LoadString(g_hInst, IDS_ALLFILESFILTER, szAllFilesFilter,MAX_PATH); //SWI
//strcpy( szFilter, szAllFilesFilter);
hr=StringCchCopy(szFilter,ARRAYSIZE(szFilter),szAllFilesFilter); if(FAILED(hr)) { dwSuc = FALSE; g_bstrFileName = ""; goto DoneSaveTheFile; } }
// Fill in the OPENFILENAME structure to support a template and hook.
InitializeOpenFileName(); g_OpenFileName.lpstrFilter = szFilter; g_OpenFileName.lpstrFile = szFile; g_OpenFileName.nMaxFile = sizeof(szFile);
TCHAR szSaveFile[MAX_PATH+1]; LoadString(g_hInst, IDS_SAVEFILE, szSaveFile,MAX_PATH); g_OpenFileName.lpstrTitle = szSaveFile;
g_OpenFileName.nFilterIndex = 1; g_OpenFileName.Flags = OFN_HIDEREADONLY | OFN_EXPLORER | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST;
// Call the common dialog function.
dwSuc = GetSaveFileName(&g_OpenFileName); if (dwSuc) { g_bstrFileName = g_OpenFileName.lpstrFile; } else { g_bstrFileName = ""; }
DoneSaveTheFile: return dwSuc; }
//
// FUNCTION: OpenTheFile()
//
// PURPOSE: Invokes common dialog function to open a file.
//
// COMMENTS:
//
// This function initializes the OPENFILENAME structure and calls
// the GetOpenFileName() common dialog function.
//
// INPUTS:
// The initial folder which has to be displayed in the open file dialog.
// If this is NULL, it means that the default initial folder is to be
// displayed. Hence this value is not checked explicitly when the
// control enters the function.
//
// RETURN VALUES:
// TRUE - The file name is chosen successfully and read into the buffer.
// FALSE - No filename is chosen.
//
//
DWORD OpenTheFile(TCHAR *pszInitialDir) { USES_CONVERSION; TCHAR szFile[MAX_PATH] = "\0"; TCHAR szFilter[MAX_PATH+1] = "\0"; ZeroMemory(szFilter, sizeof(TCHAR));
HRESULT hr=S_OK; DWORD dwSuc = 0;
//SWI
//strcpy( szFile, "");
StringCchCopy(szFile,ARRAYSIZE(szFile),"");
TCHAR szAllFilesFilter[MAX_PATH+1]; LoadString(g_hInst, IDS_ALLFILESFILTER, szAllFilesFilter,MAX_PATH); //SWI
//strcpy( szFilter, szAllFilesFilter);
hr=StringCchCopy(szFilter,ARRAYSIZE(szFilter),szAllFilesFilter); if(FAILED(hr)) { return FALSE; }
// Fill in the OPENFILENAME structure.
InitializeOpenFileName(); g_OpenFileName.lpstrFilter = szFilter; g_OpenFileName.lpstrFile = szFile; g_OpenFileName.nMaxFile = sizeof(szFile); g_OpenFileName.lpstrInitialDir = pszInitialDir;
TCHAR szChooseFile[MAX_PATH+1]; LoadString(g_hInst, IDS_CHOOSEFILE, szChooseFile,MAX_PATH); g_OpenFileName.lpstrTitle = szChooseFile; g_OpenFileName.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER ;
// Call the common dialog function.
dwSuc = GetOpenFileName(&g_OpenFileName); if (dwSuc) { g_bstrOpenFileName = g_OpenFileName.lpstrFile;
// Grab the filesize and put it in g_bstrOpenFileSize
HANDLE hFile = NULL; TCHAR fileSize[100];
memset(fileSize, 0, sizeof(TCHAR) * 100);
hFile = CreateFile(g_OpenFileName.lpstrFile, FILE_READ_ATTRIBUTES, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) { DWORD low = 0x0, high = 0x0;
low = GetFileSize(hFile, &high); if (low != INVALID_FILE_SIZE) { wsprintf(fileSize, TEXT("%d"), low); g_bstrOpenFileSize = fileSize;
}
CloseHandle(hFile); }
TCHAR *pstrTemp = NULL; pstrTemp = g_OpenFileName.lpstrFile; if (NULL == pstrTemp) { g_bstrOpenFileName = ""; } // Find out whether it is a LNK file.
else if (_tcsstr(pstrTemp, ".lnk") != NULL) { // Make the call to ResolveIt here.
dwSuc = (DWORD)ResolveIt(pstrTemp); g_bstrOpenFileName = pstrTemp; } } else { g_bstrOpenFileName = ""; }
return dwSuc; }
//
// FUNCTION: ResolveIt
//
// PURPOSE: Find the destination of a shortcut.
//
// COMMENTS:
//
// This function resolves the short-cut and populates the global variables
// and calls back the OpenTheFile to display the appropriate folder.
//
// RETURN VALUES:
// standard hres codes
//
//
HRESULT ResolveIt(TCHAR *pszShortcutFile) { HRESULT hres = S_OK; IShellLink *psl;
USES_CONVERSION; TCHAR szGotPath[MAX_PATH]; TCHAR szDescription[MAX_PATH]; WIN32_FIND_DATA wfd;
if ( NULL == pszShortcutFile ) { return hres; }
// Get a pointer to the IShellLink interface.
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl);
if (SUCCEEDED(hres)) { // If hres is success, it means that psl is not NULL. Hence no explicit
// check is done for NULL values.
IPersistFile *ppf;
// Get a pointer to the IPersistFile interface.
hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf); if (SUCCEEDED(hres)) { // If hres is success, it means that ppf is not NULL. Hence no explicit
// check is done for NULL values.
WORD wsz[MAX_PATH]; // buffer for Unicode string
// Ensure that the string consists of Unicode characters.
MultiByteToWideChar(CP_ACP, 0, pszShortcutFile, -1, wsz, MAX_PATH); // Load the shortcut.
hres = ppf->Load(wsz, STGM_READ); if (SUCCEEDED(hres)) { // Resolve the shortcut.
hres = psl->Resolve(GetFocus(), SLR_ANY_MATCH);
if (SUCCEEDED(hres)) {
//SWI
//_tcscpy(szGotPath, pszShortcutFile);
hres=StringCchCopy(szGotPath,ARRAYSIZE(szGotPath),pszShortcutFile); if(FAILED(hres)) { ppf->Release(); psl->Release(); return hres; } // Get the parth to the shortcut target.
hres = psl->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATA *)&wfd, SLGP_SHORTPATH ); if (!SUCCEEDED(hres)) { TCHAR szErrMsg[MAX_PATH+1]; LoadString(g_hInst, IDS_URECLNKFILE, szErrMsg,MAX_PATH);
TCHAR szErrCaption[MAX_PATH+1]; LoadString(g_hInst, IDS_GETPATHFAILED, szErrCaption,MAX_PATH); MessageBox(GetFocus(), szErrMsg, szErrCaption, MB_OK); }
// Get the description of the target.
hres = psl->GetDescription(szDescription, MAX_PATH); if (!SUCCEEDED(hres)) { TCHAR szErrMsg[MAX_PATH+1]; LoadString(g_hInst, IDS_URECLNKFILE, szErrMsg,MAX_PATH);
TCHAR szErrCaption[MAX_PATH+1]; LoadString(g_hInst, IDS_GETDESCFAILED, szErrCaption,MAX_PATH); MessageBox(GetFocus(), szErrMsg, szErrCaption, MB_OK); } //hres = OpenTheFile(szGotPath);
lstrcpy(pszShortcutFile,szGotPath); hres = 1; } } // Release the pointer to IPersistFile.
// ppf is not checked for NULL value because the control wouldn't come here
// otherwise (in the case where QueryInterface would have failed).
ppf->Release(); }
// Release the pointer to IShellLink.
// psl is not checked for NULL value because the control comes here only if it is
// not NULL when the CoCreateInstance succeeds.
psl->Release(); } return hres; }
|