private OpcDaBrowseElement CreateBranchBrowseElement(string name)
 {
     return(new OpcDaBrowseElement
     {
         Name = name,
         HasChildren = true,
         IsItem = false,
         ItemId = OpcBrowseServerAddressSpace.TryGetItemId(name)
     });
 }
 public static string TryGetItemId(this OpcBrowseServerAddressSpace opcBrowseServerAddressSpace, string itemName)
 {
     try
     {
         return(opcBrowseServerAddressSpace.GetItemId(itemName));
     }
     catch (Exception ex)
     {
         return(null);
     }
 }
 private void MoveToRoot()
 {
     try
     {
         for (int i = 0; i < MaxDepth; ++i)
         {
             // will throw if we aleady at root
             OpcBrowseServerAddressSpace.ChangeBrowsePosition(OPCBROWSEDIRECTION.OPC_BROWSE_UP);
         }
     }
     catch (COMException ex)
     {
         if (ex.ErrorCode == HRESULT.E_FAIL) // E_FAIL when change position on root element;
         {
             return;
         }
         throw;
     }
 }
        protected override void ChangeBrowsePositionTo(string itemId)
        {
            IEnumerable <string> path;

            if (!_itemIdToPath.TryGetValue(itemId, out path))
            {
                throw new ArgumentException("Item not discovered yet. In OPC DA 1.X all parent branches should be expanded before expanding the element.", "itemId");
            }

            MoveToRoot();
            if (String.IsNullOrEmpty(itemId)) // Already at root
            {
                return;
            }

            // Browse down using path
            foreach (var itemName in path)
            {
                OpcBrowseServerAddressSpace.ChangeBrowsePosition(OPCBROWSEDIRECTION.OPC_BROWSE_DOWN, itemName);
            }

            _currentPath = path;
        }
 protected virtual void ChangeBrowsePositionTo(string itemId)
 {
     OpcBrowseServerAddressSpace.ChangeBrowsePosition(OPCBROWSEDIRECTION.OPC_BROWSE_TO, itemId);
 }
        private OpcDaBrowseElement[] GetElementsImpl(string itemId, OpcDaElementFilter filter)
        {
            IEnumerable <OpcDaBrowseElement> elements;
            var     namespaceType  = OpcBrowseServerAddressSpace.Organization;
            VarEnum dataTypeFilter = TypeConverter.ToVarEnum(filter.DataType);

            switch (namespaceType)
            {
            case OpcDaNamespaceType.Hierarchial:
                ChangeBrowsePositionTo(itemId);

                switch (filter.ElementType)
                {
                case OpcDaBrowseFilter.All:
                    var branches = OpcBrowseServerAddressSpace.BrowseOpcItemIds(OpcDaBrowseType.Branch,
                                                                                filter.Name, dataTypeFilter,
                                                                                filter.AccessRights)
                                   .Select(CreateBranchBrowseElement);
                    var leafs = OpcBrowseServerAddressSpace.BrowseOpcItemIds(OpcDaBrowseType.Leaf, filter.Name,
                                                                             dataTypeFilter,
                                                                             filter.AccessRights)
                                .Select(CreateLeafBrowseElement);
                    elements = branches.Union(leafs);
                    break;

                case OpcDaBrowseFilter.Branches:
                    elements = OpcBrowseServerAddressSpace.BrowseOpcItemIds(OpcDaBrowseType.Branch, filter.Name,
                                                                            dataTypeFilter,
                                                                            filter.AccessRights)
                               .Select(CreateBranchBrowseElement);
                    break;

                case OpcDaBrowseFilter.Items:
                    elements = OpcBrowseServerAddressSpace.BrowseOpcItemIds(OpcDaBrowseType.Leaf, filter.Name,
                                                                            dataTypeFilter,
                                                                            filter.AccessRights)
                               .Select(CreateLeafBrowseElement);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
                break;

            case OpcDaNamespaceType.Flat:
                if (filter.ElementType == OpcDaBrowseFilter.Branches)     // no branches in flat namespace
                {
                    elements = Enumerable.Empty <OpcDaBrowseElement>();
                }
                else
                {
                    elements = OpcBrowseServerAddressSpace.BrowseOpcItemIds(OpcDaBrowseType.Flat, filter.Name,
                                                                            dataTypeFilter,
                                                                            filter.AccessRights)
                               .Select(CreateLeafBrowseElement);
                }
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            return(elements.ToArray());
        }