// 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 : ",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 }