Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

178 lines
3.7 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1993 - 2000.
//
// File: CommonDialog.cpp
//
// Contents: implementation of CCommonDialog
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "commondialog.h"
HWND _VariantToHWND(const VARIANT& varOwner); // passportmanager.cpp
//
// ICommonDialog Interface
//
STDMETHODIMP CCommonDialog::get_Filter(BSTR* pbstrFilter)
{
if (!pbstrFilter)
return E_POINTER;
*pbstrFilter = _strFilter.Copy();
return S_OK;
}
STDMETHODIMP CCommonDialog::put_Filter(BSTR bstrFilter)
{
_strFilter = bstrFilter;
return S_OK;
}
STDMETHODIMP CCommonDialog::get_FilterIndex(UINT *puiFilterIndex)
{
if (!puiFilterIndex)
return E_POINTER;
*puiFilterIndex = _dwFilterIndex;
return S_OK;
}
STDMETHODIMP CCommonDialog::put_FilterIndex(UINT uiFilterIndex)
{
_dwFilterIndex = uiFilterIndex;
return S_OK;
}
STDMETHODIMP CCommonDialog::get_FileName(BSTR* pbstrFileName)
{
if (!pbstrFileName)
return E_POINTER;
*pbstrFileName = _strFileName.Copy();
return S_OK;
}
STDMETHODIMP CCommonDialog::put_FileName(BSTR bstrFileName)
{
_strFileName = bstrFileName;
return S_OK;
}
STDMETHODIMP CCommonDialog::get_Flags(UINT *puiFlags)
{
if (!puiFlags)
return E_POINTER;
*puiFlags = _dwFlags;
return S_OK;
}
STDMETHODIMP CCommonDialog::put_Flags(UINT uiFlags)
{
_dwFlags = uiFlags;
return S_OK;
}
STDMETHODIMP CCommonDialog::put_Owner(VARIANT varOwner)
{
HRESULT hr = E_INVALIDARG;
_hwndOwner = _VariantToHWND(varOwner);
if (_hwndOwner)
hr = S_OK;
return hr;
}
STDMETHODIMP CCommonDialog::get_InitialDir(BSTR* pbstrInitialDir)
{
if (!pbstrInitialDir)
return E_POINTER;
*pbstrInitialDir = _strInitialDir.Copy();
return S_OK;
}
STDMETHODIMP CCommonDialog::put_InitialDir(BSTR bstrInitialDir)
{
_strInitialDir = bstrInitialDir;
return S_OK;
}
STDMETHODIMP CCommonDialog::ShowOpen(VARIANT_BOOL *pbSuccess)
{
OPENFILENAMEW ofn = { 0 };
WCHAR szFileName[MAX_PATH];
// Null characters can't be passed through script, so we separated
// name filter string combinations with the '|' character.
// The CommDlg32 api expects name/filter pairs to be separated by
// a null character, and the entire string to be double
// null terminated.
// copy the filter string (plus one for double null at the end)
CComBSTR strFilter(_strFilter.Length()+1, _strFilter);
if (strFilter)
{
LPWSTR pch;
int cch = lstrlenW(strFilter);
for (pch = strFilter; cch > 0; ++pch, --cch)
{
if ( *pch == L'|' )
{
*pch = L'\0';
}
}
// Double null terminate the string
++pch;
*pch = L'\0';
}
// copy the initial file name, if any
if (_strFileName)
{
lstrcpynW(szFileName, _strFileName, ARRAYSIZE(szFileName));
}
else
{
szFileName[0] = L'\0';
}
// set the struct members
ofn.lStructSize = SIZEOF(ofn);
ofn.hwndOwner = _hwndOwner;
ofn.lpstrFilter = strFilter;
ofn.nFilterIndex = _dwFilterIndex;
ofn.lpstrFile = szFileName;
ofn.nMaxFile = ARRAYSIZE(szFileName);
ofn.lpstrInitialDir = _strInitialDir;
ofn.Flags = _dwFlags;
// make the call
if (GetOpenFileNameW(&ofn))
{
_strFileName = szFileName;
*pbSuccess = VARIANT_TRUE;
}
else
{
*pbSuccess = VARIANT_FALSE;
}
return S_OK;
}