373 lines
8.7 KiB
C++
373 lines
8.7 KiB
C++
// 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
|
|
}
|