STDMETHODIMP COPCBrowserImpl::ShowBranches() { // Clear out the list ClearNames(); // Get the Branch names IEnumString* pEnumString = NULL; HRESULT hr = m_pOPCBrowser->BrowseOPCItemIDs(OPC_BRANCH, m_filter, m_dataType, m_accessRights, &pEnumString); if( SUCCEEDED(hr) ) { // Enumerate all the names, saving them in the list LPWSTR pName[NEXT_COUNT]; ULONG count = 0; do { hr = pEnumString->Next(NEXT_COUNT, &pName[0], &count); for( ULONG index=0; index<count; index++ ) { m_names.push_back( new CComBSTR( pName[index] ) ); CoTaskMemFree( pName[index] ); } } while( hr == S_OK ); pEnumString->Release(); } return hr; }
//************************************************************************** void AddItemDlg::OnItemexpandingTree(NMHDR* pNMHDR, LRESULT* pResult) { USES_CONVERSION; if( !browse.IsOk() ) return; CWaitCursor wait; NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; HTREEITEM start = pNMTreeView->itemNew.hItem; DWORD expanded = m_tree.GetItemData( start ); if( !expanded ) { m_tree.SetItemData( start, 1 ); // mark this item expanded // remove existing children HTREEITEM hItem = m_tree.GetNextItem (start, TVGN_CHILD); while (hItem) { m_tree.DeleteItem( hItem ); hItem = m_tree.GetNextItem(start, TVGN_CHILD); } // browse new children HRESULT hr = BrowseHere( start ); // move browse position here if( SUCCEEDED(hr) ) { IEnumString* pEnumString = NULL; hr = browse.BrowseOPCItemIDs( OPC_BRANCH, L"*", VT_EMPTY, 0, // no filtering (or OPC_READABLE|OPC_WRITEABLE) &pEnumString); if( SUCCEEDED(hr) ) { LPWSTR pName[NEXT_COUNT]; ULONG count = 0; do { hr = pEnumString->Next(NEXT_COUNT, &pName[0], &count); // CString does translation from UNICODE to native type // (depends on the way the application is built) for( ULONG index=0; index<count; index++ ) { CString name( pName[index] ); HTREEITEM item = m_tree.InsertItem( name, start ); m_tree.SetItemData( item, 0 ); m_tree.InsertItem( _T("Dummy"), item ); CoTaskMemFree( pName[index] ); } } while( hr == S_OK ); pEnumString->Release(); } } // return browse position to root hr = S_OK; for( int i=0; i<10 && SUCCEEDED(hr); i++ ) hr = browse.ChangeBrowsePosition( OPC_BROWSE_UP, empty ); } *pResult = 0; }
// utility function to print initial state of // a chat session void PrintToDate(IChatSession *pcs) { IEnumString *pes = 0; HRESULT hr = pcs->GetStatements(&pes); if (SUCCEEDED(hr)) { PrintAllStrings(pes); pes->Release(); } }
//************************************************************************** // When the user selects a branch, fill the list of tags void AddItemDlg::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) { USES_CONVERSION; if( !browse.IsOk() ) return; CWaitCursor wait; HTREEITEM item = m_tree.GetSelectedItem( ); HRESULT hr = BrowseHere( item ); // move browse position here if( SUCCEEDED(hr) ) { // get the tags m_tags.ResetContent(); IEnumString* pEnumString = NULL; hr = browse.BrowseOPCItemIDs(OPC_LEAF, T2OLE(m_filter.GetBuffer(0)), m_vt, 0, // no filtering (or OPC_READABLE|OPC_WRITEABLE) &pEnumString); if( hr == S_OK ) { LPWSTR pName[NEXT_COUNT]; ULONG count = 0; do { hr = pEnumString->Next(NEXT_COUNT, &pName[0], &count); // CString does translation from UNICODE to native type // (depends on the way the application is built) for( ULONG index=0; index<count; index++ ) { CString name( pName[index] ); m_tags.AddString( name ); CoTaskMemFree( pName[index] ); } } while( hr == S_OK ); pEnumString->Release(); } } hr = S_OK; for( int i=0; i<10 && SUCCEEDED(hr); i++ ) hr = browse.ChangeBrowsePosition( OPC_BROWSE_UP, empty ); if( pResult ) *pResult = 0; }
STDMETHODIMP COPCBrowserImpl::ShowLeafs( VARIANT Flat) { // Clear out the list ClearNames(); // Get the Leaf names IEnumString* pEnumString = NULL; HRESULT hr = S_OK; if ((Flat.vt==VT_BOOL) && (Flat.boolVal)) { hr = m_pOPCBrowser->BrowseOPCItemIDs(OPC_FLAT, m_filter, m_dataType, m_accessRights, &pEnumString); } else { hr = m_pOPCBrowser->BrowseOPCItemIDs(OPC_LEAF, m_filter, m_dataType, m_accessRights, &pEnumString); } if( SUCCEEDED(hr) ) { // Enumerate all the names, saving them in the list LPWSTR pName[NEXT_COUNT]; ULONG count = 0; do { hr = pEnumString->Next(NEXT_COUNT, &pName[0], &count); for( ULONG index=0; index<count; index++ ) { m_names.push_back( new CComBSTR( pName[index] ) ); CoTaskMemFree( pName[index] ); } } while( hr == S_OK ); pEnumString->Release(); } return hr; }
//************************************************************************** void AddItemDlg::UpdateFlat() { USES_CONVERSION; if( !browse.IsOk() ) return; CWaitCursor wait; // get the tags m_flat.ResetContent(); IEnumString* pEnumString = NULL; HRESULT hr = browse.BrowseOPCItemIDs(OPC_FLAT, T2OLE(m_filter.GetBuffer(0)), m_vt, 0, // no filtering (or OPC_READABLE|OPC_WRITEABLE) &pEnumString); if( SUCCEEDED(hr) ) { LPWSTR pName[NEXT_COUNT]; ULONG count = 0; do { hr = pEnumString->Next(NEXT_COUNT, &pName[0], &count); // CString does translation from UNICODE to native type // (depends on the way the application is built) for( ULONG index=0; index<count; index++ ) { CString name( pName[index] ); m_flat.AddString( name ); CoTaskMemFree( pName[index] ); } } while( hr == S_OK ); pEnumString->Release(); } m_flat.SetCurSel( 0 ); }
//************************************************************************** BOOL AddItemDlg::OnInitDialog() { USES_CONVERSION; CWaitCursor wait; CDialog::OnInitDialog(); GetDlgItem(ID_OPC_ITEMPARAMETERS)->EnableWindow(FALSE); CheckRadioButton( IDC_NATIVE, IDC_STRING, IDC_NATIVE ); // Fill the tree with the server's hierarchy if( !browse.IsOk() ) { m_tree.ShowWindow( FALSE ); m_tags.ShowWindow( FALSE ); m_flat.ShowWindow( TRUE ); m_flat.AddString( _T("Browsing not supported") ); return TRUE; } HRESULT hr = browse.QueryOrganization(&nameSpaceType); if( FAILED(hr) ) { browse.Detach(); return TRUE; } if( nameSpaceType == OPC_NS_HIERARCHIAL ) // show a tree { HTREEITEM Root = m_tree.InsertItem( _T("Root") ); m_tree.SetItemData( Root, 1 ); IEnumString* pEnumString = NULL; hr = browse.BrowseOPCItemIDs(OPC_BRANCH, L"*", m_vt, 0, // no filtering (or OPC_READABLE|OPC_WRITEABLE) &pEnumString); if( SUCCEEDED(hr) ) { LPWSTR pName[NEXT_COUNT]; ULONG count = 0; do { hr = pEnumString->Next(NEXT_COUNT, &pName[0], &count); // CString does translation from UNICODE to native type // (depends on the way the application is built) for( ULONG index=0; index<count; index++ ) { CString name( pName[index] ); HTREEITEM item = m_tree.InsertItem( name, Root ); m_tree.SetItemData( item, 0 ); m_tree.InsertItem( _T("Dummy"), item ); CoTaskMemFree( pName[index] ); } } while( hr == S_OK ); pEnumString->Release(); } m_tree.SelectItem( Root ); m_tree.Expand( Root, TVE_EXPAND ); } else // namespace must be flat, only display in one listbox { m_tree.ShowWindow( FALSE ); m_tags.ShowWindow( FALSE ); m_flat.ShowWindow( TRUE ); UpdateFlat(); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }