//======================================================================
        // BrowseNext

        /// <summary>
        /// Continues a browse operation with previously specified search criteria.
        /// </summary>
        /// <param name="position">An object containing the browse operation state information.</param>
        /// <returns>The set of elements found.</returns>
        public BrowseElement[] BrowseNext(ref Opc.Da.BrowsePosition position)
        {
            if (position == null)
            {
                throw new ArgumentNullException("position");
            }
            if (m_proxy == null)
            {
                throw new NotConnectedException();
            }

            lock (this)
            {
                BrowsePosition pos = (BrowsePosition)position;

                if (pos.ContinuationPoint == null || pos.ContinuationPoint == "")
                {
                    throw new BrowseCannotContinueException();
                }

                OpcXml.Da10.BrowseElement[] elements = null;
                OpcXml.Da10.OPCError[]      errors   = null;

                OpcXml.Da10.ReplyBase reply = m_proxy.Browse(
                    OpcXml.Da10.Request.GetPropertyNames(pos.Filters.PropertyIDs),
                    pos.Locale,
                    "",
                    (pos.ItemID != null)?pos.ItemID.ItemPath:null,
                    (pos.ItemID != null)?pos.ItemID.ItemName:null,
                    ref pos.ContinuationPoint,
                    pos.Filters.MaxElementsReturned,
                    OpcXml.Da10.Request.GetBrowseFilter(pos.Filters.BrowseFilter),
                    pos.Filters.ElementNameFilter,
                    pos.Filters.VendorFilter,
                    pos.Filters.ReturnAllProperties,
                    pos.Filters.ReturnPropertyValues,
                    pos.ReturnErrorText,
                    out elements,
                    out errors,
                    out pos.MoreElements);

                CacheResponse(pos.Locale, reply, errors);

                position = null;

                if (pos.MoreElements || (pos.ContinuationPoint != null && pos.ContinuationPoint != ""))
                {
                    position = pos;
                }

                return(OpcXml.Da10.Request.GetBrowseElements(elements));
            }
        }
        //======================================================================
        // Browse

        /// <summary>
        /// Fetches the children of a branch that meet the filter criteria.
        /// </summary>
        /// <param name="itemID">The identifier of branch which is the target of the search.</param>
        /// <param name="filters">The filters to use to limit the set of child elements returned.</param>
        /// <param name="position">An object used to continue a browse that could not be completed.</param>
        /// <returns>The set of elements found.</returns>
        public BrowseElement[] Browse(
            ItemIdentifier itemID,
            BrowseFilters filters,
            out Opc.Da.BrowsePosition position)
        {
            position = null;

            lock (this)
            {
                if (m_proxy == null)
                {
                    throw new NotConnectedException();
                }

                // use default filters if none specified.
                if (filters == null)
                {
                    filters = new BrowseFilters();
                }

                BrowsePosition pos = new BrowsePosition(itemID, filters, m_options.Locale, ((m_options.Filters & (int)ResultFilter.ErrorText) != 0));

                OpcXml.Da10.BrowseElement[] elements = null;
                OpcXml.Da10.OPCError[]      errors   = null;

                OpcXml.Da10.ReplyBase reply = m_proxy.Browse(
                    OpcXml.Da10.Request.GetPropertyNames(filters.PropertyIDs),
                    pos.Locale,
                    "",
                    (itemID != null)?itemID.ItemPath:null,
                    (itemID != null)?itemID.ItemName:null,
                    ref pos.ContinuationPoint,
                    filters.MaxElementsReturned,
                    OpcXml.Da10.Request.GetBrowseFilter(filters.BrowseFilter),
                    filters.ElementNameFilter,
                    filters.VendorFilter,
                    filters.ReturnAllProperties,
                    filters.ReturnPropertyValues,
                    pos.ReturnErrorText,
                    out elements,
                    out errors,
                    out pos.MoreElements);

                CacheResponse(pos.Locale, reply, errors);

                if (pos.MoreElements || (pos.ContinuationPoint != null && pos.ContinuationPoint != ""))
                {
                    position = pos;
                }

                return(OpcXml.Da10.Request.GetBrowseElements(elements));
            }
        }