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.
 
 
 
 
 
 

372 lines
8.7 KiB

// VarSetEditDlg.cpp : implementation file
//
#include "stdafx.h"
#import "\bin\McsVarSetMin.tlb" no_namespace, named_guids
#include "Driver.h"
#include "VSEdit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CVarSetEditDlg dialog
CVarSetEditDlg::CVarSetEditDlg(CWnd* pParent /*=NULL*/)
: CDialog(CVarSetEditDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CVarSetEditDlg)
m_bCaseSensitive = FALSE;
m_Filename = _T("");
m_Key = _T("");
m_Value = _T("");
m_varset = NULL;
m_bIndexed = FALSE;
//}}AFX_DATA_INIT
}
void CVarSetEditDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CVarSetEditDlg)
DDX_Control(pDX, IDC_LIST, m_List);
DDX_Check(pDX, IDC_CASE_SENSITIVE, m_bCaseSensitive);
DDX_Text(pDX, IDC_FILENAME, m_Filename);
DDX_Text(pDX, IDC_KEY, m_Key);
DDX_Text(pDX, IDC_VALUE, m_Value);
DDX_Check(pDX, IDC_INDEXED, m_bIndexed);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CVarSetEditDlg, CDialog)
//{{AFX_MSG_MAP(CVarSetEditDlg)
ON_BN_CLICKED(IDC_CASE_SENSITIVE, OnCaseSensitive)
ON_BN_CLICKED(IDC_CLEAR, OnClear)
ON_BN_CLICKED(IDC_DUMP, OnDump)
ON_BN_CLICKED(IDC_ENUM, OnEnum)
ON_BN_CLICKED(IDC_GET_COUNT, OnGetCount)
ON_BN_CLICKED(IDC_GETVALUE, OnGetvalue)
ON_BN_CLICKED(IDC_INDEXED, OnIndexed)
ON_BN_CLICKED(IDC_LOAD, OnLoad)
ON_BN_CLICKED(IDC_SAVE, OnSave)
ON_BN_CLICKED(IDC_SETVALUE, OnSetvalue)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CVarSetEditDlg message handlers
void CVarSetEditDlg::OnCaseSensitive()
{
CWaitCursor w;
UpdateData(TRUE);
if ( m_varset )
{
m_varset->CaseSensitive = m_bCaseSensitive;
}
}
void CVarSetEditDlg::OnClear()
{
CWaitCursor w;
UpdateData(TRUE);
HRESULT hr;
IVarSet * pVS = NULL;
if ( m_varset )
{
hr = m_varset->raw_getReference(m_Key.AllocSysString(),&pVS);
if ( SUCCEEDED(hr) )
{
pVS->Clear();
pVS->Release();
}
else
{
MessageBox(L"ERROR!");
}
}
UpdateData(FALSE);
}
void CVarSetEditDlg::OnDump()
{
CWaitCursor w;
UpdateData(TRUE);
if ( m_varset )
{
m_varset->DumpToFile(m_Filename.AllocSysString());
MessageBox(L"Finished!");
}
}
void CVarSetEditDlg::OnEnum()
{
DoEnum(m_varset);
}
void CVarSetEditDlg::DoEnum(IVarSet * vs)
{
CWaitCursor w;
_variant_t value;
CString key;
CString val;
CString result;
IEnumVARIANT * henum = NULL;
HRESULT hr = 0;
ULONG nGot;
_bstr_t keyB;
if ( vs )
{
m_List.ResetContent();
// This exercises the method used by VB's For Each.
// Get an IEnumVARIANT interface
hr = vs->get__NewEnum((LPUNKNOWN*)&henum);
// use the IEnumVARIANT interface to get the values
// for simplicity, retrieve them one at a time
if ( SUCCEEDED(hr) )
{
while ( SUCCEEDED(hr = henum->Next(1,&value,&nGot)) )
{
if ( nGot==1 )
{
key = value.bstrVal;
keyB = key;
value = vs->get(keyB);
if ( value.vt == VT_BSTR )
{
val = value.bstrVal;
result.Format(L"%s : %s",key,val);
}
else if ( value.vt == VT_I4 )
{
result.Format(L"%s : %ld",key,value.lVal);
}
else if ( value.vt == VT_EMPTY )
{
result.Format(L"%s : <Empty>",key);
}
else
{
result.Format(L"%s : vt=0x%lx",key,value.vt);
}
m_List.AddString(result);
}
else
{
break;
}
}
if ( henum )
henum->Release();
}
henum = NULL;
}
if (FAILED(hr) )
{
CString errMsg;
errMsg.Format(L"Error: hr=%lx",hr);
MessageBox(errMsg);
}
}
void CVarSetEditDlg::OnGetCount()
{
CWaitCursor w;
CString msg;
// This is the total number of items in the VarSet.
if ( m_varset )
{
msg.Format(L"%ld items.",m_varset->Count);
MessageBox(msg);
}
}
void CVarSetEditDlg::OnGetvalue()
{
CWaitCursor w;
UpdateData(TRUE);
_variant_t value;
_bstr_t key;
// This retrieves a value from the VarSet
// If the value does not exist, m_varset->get will return a variant of type VT_EMPTY.
if ( m_varset )
{
key = m_Key;
value = m_varset->get(key);
if ( value.vt == VT_BSTR )
{
m_Value = (WCHAR *)(_bstr_t)value;
}
else if ( value.vt == VT_I4 )
{
m_Value.Format(L"%ld",value.lVal);
}
else
{
m_Value.Format(L"Variant: Type=%ld",value.vt);
}
}
UpdateData(FALSE);
}
void CVarSetEditDlg::OnIndexed()
{
CWaitCursor w;
UpdateData(TRUE);
// Turning indexing off is always fast, but turning indexing on
// may be very slow if the VarSet is large.
// It takes O(n lg n) to build the index.
if ( m_varset )
{
m_varset->Indexed = m_bIndexed;
}
}
void CVarSetEditDlg::OnLoad()
{
CWaitCursor w;
IPersistStoragePtr ps = NULL;
HRESULT hr = 0;
IStoragePtr store = NULL;
IVarSetPtr vs = NULL;
IOleClientSite * site = NULL;
UpdateData(TRUE);
if ( m_varset )
{
hr = m_varset->QueryInterface(IID_IPersistStorage,(void**)&ps);
if ( SUCCEEDED(hr) )
{
hr = StgOpenStorage(m_Filename.GetBuffer(0),NULL,STGM_DIRECT | STGM_READ | STGM_SHARE_EXCLUSIVE,NULL,0,&store);
if ( SUCCEEDED(hr) )
{
// Load the data into a new varset
hr = OleLoad(store,IID_IUnknown,site,(void **)&vs);
if ( SUCCEEDED(hr) )
{
// release the old varset
vs->AddRef();
if ( m_varset ) m_varset->Release();
m_varset = vs;
// reload the property values
m_bCaseSensitive = m_varset->CaseSensitive;
m_bIndexed = m_varset->Indexed;
UpdateData(FALSE);
}
}
}
if ( FAILED(hr) )
MessageBox(L"Failed");
else
MessageBox(L"Finished!");
}
}
void CVarSetEditDlg::OnSave()
{
CWaitCursor w;
IPersistStoragePtr ps = NULL;
HRESULT hr = 0;
IStoragePtr store = NULL;
UpdateData(TRUE);
// Save the varset to a file
if ( m_varset )
{
hr = m_varset->QueryInterface(IID_IPersistStorage,(void**)&ps);
if ( SUCCEEDED(hr) )
{
hr = StgCreateDocfile(m_Filename.GetBuffer(0),STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE |STGM_FAILIFTHERE,0,&store);
if ( SUCCEEDED(hr) )
{
hr = OleSave(ps,store,FALSE);
}
}
if ( FAILED(hr) )
MessageBox(L"Failed");
else
MessageBox(L"Finished!");
}
}
void CVarSetEditDlg::OnSetvalue()
{
CWaitCursor w;
UpdateData(TRUE);
_variant_t value;
_bstr_t key;
HRESULT hr = 0;
CString myKey;
CString myValue;
if ( m_varset )
{
// add a single item to the VarSet
// Keys are represented as BSTRs, and values are represented as VARIANTs
key = m_Key;
value = m_Value;
hr = m_varset->put(key,value);
if ( FAILED(hr) )
{
MessageBox(L"Failed");
}
else
{
m_Value.Empty();
}
}
GetDlgItem(IDC_KEY)->SetFocus();
OnEnum();
UpdateData(FALSE); }
void CVarSetEditDlg::OnOK()
{
CDialog::OnOK();
}
BOOL CVarSetEditDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if ( ! m_varset )
{
HRESULT hr = CoCreateInstance(CLSID_VarSet,NULL,CLSCTX_ALL,IID_IVarSet,(void**)&m_varset);
if ( FAILED(hr) )
{
CString msg;
msg.Format(L"Failed to create varset. CoCreateInstance returned %lx",hr);
MessageBox(msg);
}
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}