コード例 #1
0
 public void Clear()
 {
     _req = new BrowseRequest();
     _req.Offset = 0;
     _req.Count = 5;
     _req.FetchStoredFields = true;
     _qString = null;
 }
コード例 #2
0
        /// <summary>
        /// Method executes when the SelectionChanged command is invoked.
        /// The parameter <paramref name="p"/> can be an array of objects
        /// containing objects of the <seealso cref="IFolderItemViewModel"/> type
        /// or p can also be string.
        ///
        /// Each parameter item that adheres to the above types results in
        /// a OnCurrentPathChanged event being fired with the folder path
        /// as parameter.
        ///
        /// This mwthod can typically be invoked by:
        /// 1> Edit the text portion + Enter in the control or
        /// 2> By selecting an entry from the drop down list of the combobox.
        /// </summary>
        /// <param name="p"></param>
        private async Task SelectionChanged_ExecutedAsync(object p)
        {
            if (p == null)
            {
                return;
            }

            // Check if the given parameter is a string, fire a corresponding event if so...
            if (p is string)
            {
                IPathModel param = null;
                try
                {
                    param = PathFactory.Create(p as string);
                }
                catch
                {
                    return;                       // Control will refuse to select an unknown/non-existing item
                }

                // This breaks a possible recursion, if a new view is requested even though its
                // already available, because this could, otherwise, change the SelectedItem
                // which in turn could request another PopulateView(...) -> SelectedItem etc ...
                if (SelectedItem != null)
                {
                    if (SelectedItem.Equals(param))
                    {
                        return;
                    }
                }

                if (param != null)
                {
                    var request = new BrowseRequest(param);
                    await InternalPopulateViewAsync(request, true);
                }
            }
            else
            {
                if (p is object[])
                {
                    var param = p as object[];

                    if (param != null)
                    {
                        if (param.Length > 0)
                        {
                            var newPath = param[param.Length - 1] as IFolderItemViewModel;

                            if (newPath != null)
                            {
                                IPathModel location          = null;
                                IPathModel selectedItemModel = null;
                                try
                                {
                                    location          = PathFactory.Create(newPath.ItemPath, newPath.ItemType);
                                    selectedItemModel = PathFactory.Create(SelectedItem.ItemPath, SelectedItem.ItemType);
                                }
                                catch
                                {
                                }

                                if (location == null || selectedItemModel == null)
                                {
                                    return;
                                }

                                // This breaks a possible recursion, if a new view is requested even though its
                                // already available, because this could, otherwise, change the SelectedItem
                                // which in turn could request another PopulateView(...) -> SelectedItem etc ...
                                if (location.Equals(selectedItemModel))
                                {
                                    return;
                                }

                                var request = new BrowseRequest(location);
                                await InternalPopulateViewAsync(request, true);
                            }
                        }
                    }
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// Discovers the References of a specified Node.
        /// </summary>
        /// <param name="channel">A instance of <see cref="IRequestChannel"/>.</param>
        /// <param name="request">A <see cref="BrowseRequest"/>.</param>
        /// <returns>A <see cref="Task"/> representing the asynchronous operation that returns a <see cref="BrowseResponse"/>.</returns>
        public static async Task <BrowseResponse> BrowseAsync(this IRequestChannel channel, BrowseRequest request, CancellationToken token = default)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            return((BrowseResponse)await channel.RequestAsync(request, token).ConfigureAwait(false));
        }
コード例 #4
0
 private void BrowseForChatServers()
 {
     BrowseRequest req = new BrowseRequest(_sm.LocalUser.ServerJID);
     _sm.BeginSend(req.ToPacket, new AsyncCallback(BrowseCompleteCallback));
 }
コード例 #5
0
ファイル: Opc.Ua.Client.cs プロジェクト: zryska/UA-.NET
        /// <summary>
        /// Invokes the Browse service.
        /// </summary>
        public virtual ResponseHeader Browse(
            RequestHeader                requestHeader,
            ViewDescription              view,
            uint                         requestedMaxReferencesPerNode,
            BrowseDescriptionCollection  nodesToBrowse,
            out BrowseResultCollection   results,
            out DiagnosticInfoCollection diagnosticInfos)
        {
            BrowseRequest request = new BrowseRequest();
            BrowseResponse response = null;

            request.RequestHeader                 = requestHeader;
            request.View                          = view;
            request.RequestedMaxReferencesPerNode = requestedMaxReferencesPerNode;
            request.NodesToBrowse                 = nodesToBrowse;

            UpdateRequestHeader(request, requestHeader == null, "Browse");

            try
            {
                if (UseTransportChannel)
                {
                    IServiceResponse genericResponse = TransportChannel.SendRequest(request);

                    if (genericResponse == null)
                    {
                        throw new ServiceResultException(StatusCodes.BadUnknownResponse);
                    }

                    ValidateResponse(genericResponse.ResponseHeader);
                    response = (BrowseResponse)genericResponse;
                }
                else
                {
                    BrowseResponseMessage responseMessage = InnerChannel.Browse(new BrowseMessage(request));

                    if (responseMessage == null || responseMessage.BrowseResponse == null)
                    {
                        throw new ServiceResultException(StatusCodes.BadUnknownResponse);
                    }

                    response = responseMessage.BrowseResponse;
                    ValidateResponse(response.ResponseHeader);
                }

                results         = response.Results;
                diagnosticInfos = response.DiagnosticInfos;
            }
            finally
            {
                RequestCompleted(request, response, "Browse");
            }

            return response.ResponseHeader;
        }
コード例 #6
0
        private BrowseResult PerformSearch(Query query, string indexPath, IEnumerable<Models.SelectionGroup> selectionGroups)
        {
            string[] FieldNames = new string[] { "Material", "Style", "Mounting", "Brand" };

            var handlers = new List<FacetHandler>();

            foreach (string field in FieldNames)
            {
                handlers.Add(new SimpleFacetHandler(field));
            }

            // Run the search

            // create the index reader
            var directory = FSDirectory.Open(new System.IO.DirectoryInfo(indexPath));
            var indexReader = DirectoryReader.Open(directory, true);

            //// This is how to get a searcher for executing the search, not for working with facets
            //IndexSearcher indexSearcher = new IndexSearcher(directory, true);
            //indexSearcher.Search(

            // Decorate it with the Bobo index reader
            BoboIndexReader boboReader = BoboIndexReader.GetInstance(indexReader, handlers);

            // create a browse request
            BrowseRequest browseRequest = new BrowseRequest();

            // NOTE: these must be used in production to page the results
            browseRequest.Count = 50;
            browseRequest.Offset = 0;

            browseRequest.FetchStoredFields = true;

            //Query query = new QueryParser(
            //        Lucene.Net.Util.Version.LUCENE_29,
            //        "title",
            //        new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29)
            //    ).Parse(model.Phrase);

            if (selectionGroups != null)
            {
                // Add the selections to the search

                foreach (var group in selectionGroups)
                {
                    BrowseSelection sel = new BrowseSelection(group.Name);
                    foreach (var value in group.Selections)
                    {
                        sel.AddValue(value);
                    }
                    browseRequest.AddSelection(sel);
                }

            }

            browseRequest.Query = query;

            //// add the facet output specs
            //FacetSpec brandSpec = new FacetSpec();
            //brandSpec.OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc;

            //browseRequest.SetFacetSpec("Brand", brandSpec);

            foreach (var name in FieldNames)
            {
                // add the facet output specs
                FacetSpec spec = new FacetSpec();
                //spec.OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc;

                // NOTE: if this is a secondary search, we want to get the facets with 0
                // hits so the checkboxes can be set on the UI...or otherwise program the UI
                // to disable and set to 0 all of the selections that aren't in the result
                if (selectionGroups != null)
                {
                    spec.MinHitCount = 0;
                }

                browseRequest.SetFacetSpec(name, spec);
            }

            // perform browse
            IBrowsable browser = new BoboBrowser(boboReader);

            BrowseResult result = browser.Browse(browseRequest);

            return result;
        }
コード例 #7
0
ファイル: Program.cs プロジェクト: Dicondur/opc-ua-samples
        private static async Task TestAsync()
        {
            var discoveryUrl = "opc.tcp://*****:*****@"%LOCALAPPDATA%\Workstation.ConsoleApp\pki")),
                       userIdentity,
                       remoteEndpoint))
            {
                try
                {
                    await session.OpenAsync();
                }
                catch (ServiceResultException ex)
                {
                    if ((uint)ex.HResult == StatusCodes.BadSecurityChecksFailed)
                    {
                        Console.WriteLine("Error connecting to endpoint. Did the server reject our certificate?");
                    }

                    throw ex;
                }

                Console.WriteLine("Step 5 - Browse the server namespace.");
                Console.WriteLine("+ Root");
                BrowseRequest browseRequest = new BrowseRequest
                {
                    NodesToBrowse = new BrowseDescription[] { new BrowseDescription {
                                                                  NodeId = NodeId.Parse(ObjectIds.RootFolder), BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, IncludeSubtypes = true, ResultMask = (uint)BrowseResultMask.All
                                                              } },
                };
                BrowseResponse browseResponse = await session.BrowseAsync(browseRequest);

                foreach (var rd1 in browseResponse.Results[0].References ?? new ReferenceDescription[0])
                {
                    Console.WriteLine("  + {0}: {1}, {2}", rd1.DisplayName, rd1.BrowseName, rd1.NodeClass);
                    browseRequest = new BrowseRequest
                    {
                        NodesToBrowse = new BrowseDescription[] { new BrowseDescription {
                                                                      NodeId = ExpandedNodeId.ToNodeId(rd1.NodeId, session.NamespaceUris), BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, IncludeSubtypes = true, ResultMask = (uint)BrowseResultMask.All
                                                                  } },
                    };
                    browseResponse = await session.BrowseAsync(browseRequest);

                    foreach (var rd2 in browseResponse.Results[0].References ?? new ReferenceDescription[0])
                    {
                        Console.WriteLine("    + {0}: {1}, {2}", rd2.DisplayName, rd2.BrowseName, rd2.NodeClass);
                        browseRequest = new BrowseRequest
                        {
                            NodesToBrowse = new BrowseDescription[] { new BrowseDescription {
                                                                          NodeId = ExpandedNodeId.ToNodeId(rd2.NodeId, session.NamespaceUris), BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, IncludeSubtypes = true, ResultMask = (uint)BrowseResultMask.All
                                                                      } },
                        };
                        browseResponse = await session.BrowseAsync(browseRequest);

                        foreach (var rd3 in browseResponse.Results[0].References ?? new ReferenceDescription[0])
                        {
                            Console.WriteLine("      + {0}: {1}, {2}", rd3.DisplayName, rd3.BrowseName, rd3.NodeClass);
                        }
                    }
                }

                Console.WriteLine("Press any key to continue...");
                Console.ReadKey(true);

                Console.WriteLine("Step 6 - Create a subscription.");
                var subscriptionRequest = new CreateSubscriptionRequest
                {
                    RequestedPublishingInterval = 1000,
                    RequestedMaxKeepAliveCount  = 10,
                    RequestedLifetimeCount      = 30,
                    PublishingEnabled           = true
                };
                var subscriptionResponse = await session.CreateSubscriptionAsync(subscriptionRequest).ConfigureAwait(false);

                var id = subscriptionResponse.SubscriptionId;

                Console.WriteLine("Step 7 - Add items to the subscription.");
                var itemsToCreate = new MonitoredItemCreateRequest[]
                {
                    new MonitoredItemCreateRequest {
                        ItemToMonitor = new ReadValueId {
                            NodeId = NodeId.Parse("i=2258"), AttributeId = AttributeIds.Value
                        }, MonitoringMode = MonitoringMode.Reporting, RequestedParameters = new MonitoringParameters {
                            ClientHandle = 12345, SamplingInterval = -1, QueueSize = 0, DiscardOldest = true
                        }
                    }
                };
                var itemsRequest = new CreateMonitoredItemsRequest
                {
                    SubscriptionId = id,
                    ItemsToCreate  = itemsToCreate,
                };
                var itemsResponse = await session.CreateMonitoredItemsAsync(itemsRequest).ConfigureAwait(false);

                Console.WriteLine("Step 8 - Publish the subscription.");
                var publishRequest = new PublishRequest
                {
                    SubscriptionAcknowledgements = new SubscriptionAcknowledgement[0]
                };
                Console.WriteLine("Press any key to delete the subscription...");
                while (!Console.KeyAvailable)
                {
                    var publishResponse = await session.PublishAsync(publishRequest).ConfigureAwait(false);

                    // loop thru all the data change notifications
                    var dcns = publishResponse.NotificationMessage.NotificationData.OfType <DataChangeNotification>();
                    foreach (var dcn in dcns)
                    {
                        foreach (var min in dcn.MonitoredItems)
                        {
                            Console.WriteLine($"clientHandle: {min.ClientHandle}; value: {min.Value}");
                        }
                    }

                    publishRequest = new PublishRequest
                    {
                        SubscriptionAcknowledgements = new[] { new SubscriptionAcknowledgement {
                                                                   SequenceNumber = publishResponse.NotificationMessage.SequenceNumber, SubscriptionId = publishResponse.SubscriptionId
                                                               } }
                    };
                }

                Console.ReadKey(true);

                Console.WriteLine("Step 9 - Delete the subscription.");
                var request = new DeleteSubscriptionsRequest
                {
                    SubscriptionIds = new uint[] { id }
                };
                await session.DeleteSubscriptionsAsync(request).ConfigureAwait(false);

                Console.WriteLine("Press any key to close the session...");
                Console.ReadKey(true);
                Console.WriteLine("Step 10 - Close the session.");
                await session.CloseAsync();
            }
        }
コード例 #8
0
 public virtual BrowseResult Browse(BrowseRequest req) // throws BrowseException
 {
     return(BrowseServiceFactory.CreateBrowseService(_reader).Browse(req));
 }
コード例 #9
0
 //public void Browse(string ObjectID, string BrowseFlag, string Filter, ulong StartingIndex, ulong RequestedCount, string SortCriteria, out string Result, out ulong NumberReturned, out ulong TotalMatches, out ulong UpdateID)
 //{
 //    Result = null;
 //    NumberReturned = 0;
 //    TotalMatches = 0;
 //    UpdateID = 0;
 //}
 public BrowseResponse Browse(BrowseRequest request)
 {
     return(new BrowseResponse {
         NumberReturned = 0, Result = null, TotalMatches = 0, UpdateID = 0
     });
 }
コード例 #10
0
        /// <summary>
        /// Fills the CurrentItems property for display in ItemsControl
        /// based view (ListBox, ListView etc.).
        ///
        /// This method wraps a parameterized version of the same method
        /// with a call that contains the standard data field.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="browseEvent">Defines whether a request should result
        /// in an explicit event relayed to a controller or not.</param>
        protected FinalBrowseResult PopulateView(BrowseRequest request,
                                                 bool browseEvent)
        {
            Logger.DebugFormat("PopulateView method");
            Logger.DebugFormat("Populating view for request id: {0} - '{1}'", request.RequestId, request.NewLocation.Path);

            // This can happen when the viewmodel is configured at start-up
            // but the current folder is not configured, yet
            if (request == null)
            {
                return(FinalBrowseResult.FromRequest(request, BrowseResult.InComplete));
            }

            IPathModel newPathToNavigateTo = request.NewLocation;

            bool result = false;

            IsBrowsing = true;
            try
            {
                if (newPathToNavigateTo != null && browseEvent == true)
                {
                    if (this.BrowseEvent != null)
                    {
                        this.BrowseEvent(this,
                                         new BrowsingEventArgs(newPathToNavigateTo, true));
                    }
                }

                DirectoryInfo cur = new DirectoryInfo(newPathToNavigateTo.Path);

                if (cur.Exists == false)
                {
                    return(FinalBrowseResult.FromRequest(request, BrowseResult.InComplete));
                }

                CurrentItemClear();

                result = InternalPopulateView(_ParsedFilter, cur, ShowIcons);

                if (result == true)
                {
                    SetCurrentLocation(newPathToNavigateTo);
                    return(FinalBrowseResult.FromRequest(request, BrowseResult.Complete));
                }

                return(FinalBrowseResult.FromRequest(request, BrowseResult.InComplete));
            }
            catch (Exception exp)
            {
                var bresult = FinalBrowseResult.FromRequest(request, BrowseResult.InComplete);
                bresult.UnexpectedError = exp;
                return(bresult);
            }
            finally
            {
                if (newPathToNavigateTo != null && browseEvent == true)
                {
                    if (this.BrowseEvent != null)
                    {
                        this.BrowseEvent(this,
                                         new BrowsingEventArgs(newPathToNavigateTo, false,
                                                               (result == true ? BrowseResult.Complete :
                                                                BrowseResult.InComplete)));
                    }
                }

                IsBrowsing = false;
            }
        }
コード例 #11
0
        /// <summary>
        /// Sends the browse command.
        /// </summary>
        /// <param name="sessionId">The session id.</param>
        /// <param name="command">The command.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>Task.</returns>
        public Task SendBrowseCommand(Guid sessionId, BrowseRequest command, CancellationToken cancellationToken)
        {
            var session = GetSessionForRemoteControl(sessionId);

            return(session.SessionController.SendBrowseCommand(command, cancellationToken));
        }
コード例 #12
0
        public async Task BrowseObjectFolder()
        {
            // describe this client application.
            var clientDescription = new ApplicationDescription
            {
                ApplicationName = "Workstation.UaClient.FeatureTests",
                ApplicationUri  = $"urn:{System.Net.Dns.GetHostName()}:Workstation.UaClient.FeatureTests",
                ApplicationType = ApplicationType.Client
            };

            // place to store certificates
            var certificateStore = new DirectoryStore("./pki");

            // create a 'UaTcpSessionChannel', a client-side channel that opens a 'session' with the server.
            var channel = new UaTcpSessionChannel(
                clientDescription,
                certificateStore,
                new AnonymousIdentity(),
                "opc.tcp://localhost:48010"); // the endpoint of Unified Automation's UaCPPServer.

            try
            {
                // try opening a session and reading a few nodes.
                await channel.OpenAsync();

                Console.WriteLine($"Opened session with endpoint '{channel.RemoteEndpoint.EndpointUrl}'.");
                Console.WriteLine($"SecurityPolicy: '{channel.RemoteEndpoint.SecurityPolicyUri}'.");
                Console.WriteLine($"SecurityMode: '{channel.RemoteEndpoint.SecurityMode}'.");
                Console.WriteLine($"UserIdentityToken: '{channel.UserIdentity}'.");

                // build a BrowseRequest. See 'OPC UA Spec Part 4' section 5.8.2
                var browseRequest = new BrowseRequest
                {
                    NodesToBrowse = new[] {
                        new BrowseDescription {
                            // gather references of this nodeid.
                            NodeId = NodeId.Parse(ObjectIds.ObjectsFolder),
                            // include just 'Forward' references
                            BrowseDirection = BrowseDirection.Forward,
                            // include 'HierarchicalReferences'
                            ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences),
                            // include 'HierarchicalReferences' and all subtypes of 'HierarchicalReferences'
                            IncludeSubtypes = true,
                            // include all classes of node
                            NodeClassMask = (uint)NodeClass.Unspecified,
                            // return reference descriptions with all the fields filled out
                            ResultMask = (uint)BrowseResultMask.All,
                        }
                    },
                    RequestedMaxReferencesPerNode = 1000
                };

                // send the request to the server
                var browseResponse = await channel.BrowseAsync(browseRequest).ConfigureAwait(false);

                Console.WriteLine("\n+ Objects, 0:Objects, Object, i=85");

                Assert.IsNotNull(browseResponse.Results[0].References);
                foreach (var rd in browseResponse.Results[0].References)
                {
                    Console.WriteLine("   + {0}, {1}, {2}, {3}", rd.DisplayName, rd.BrowseName, rd.NodeClass, rd.NodeId);
                }

                // it is good practice to be prepared to receive a continuationPoint.
                // ContinuationPoints are returned when the server has more information
                // than can be delivered in current response.
                // To test this code, you can reduce the above RequestedMaxReferencesPerNode
                // to 1.
                var cp = browseResponse.Results[0].ContinuationPoint;
                while (cp != null)
                {
                    var browseNextRequest = new BrowseNextRequest {
                        ContinuationPoints = new[] { cp }, ReleaseContinuationPoints = false
                    };
                    var browseNextResponse = await channel.BrowseNextAsync(browseNextRequest);

                    Assert.IsNotNull(browseNextResponse.Results[0].References);
                    foreach (var rd in browseNextResponse.Results[0].References)
                    {
                        Console.WriteLine("   + {0}, {1}, {2}", rd.DisplayName, rd.BrowseName, rd.NodeClass);
                    }
                    cp = browseNextResponse.Results[0].ContinuationPoint;
                }

                Console.WriteLine($"\nClosing session '{channel.SessionId}'.");
                await channel.CloseAsync();
            }
            catch (Exception ex)
            {
                await channel.AbortAsync();

                Console.WriteLine(ex.Message);
            }
        }
コード例 #13
0
            public static IDictionary <string, IFacetAccessible> MergeSimpleFacetContainers(IEnumerable <IDictionary <string, IFacetAccessible> > subMaps, BrowseRequest req)
            {
                Dictionary <string, Dictionary <object, BrowseFacet> > counts = new Dictionary <string, Dictionary <object, BrowseFacet> >();

                foreach (Dictionary <string, IFacetAccessible> subMap in subMaps)
                {
                    foreach (KeyValuePair <string, IFacetAccessible> entry in subMap)
                    {
                        Dictionary <object, BrowseFacet> count = counts[entry.Key];
                        if (count == null)
                        {
                            count = new Dictionary <object, BrowseFacet>();
                            counts.Add(entry.Key, count);
                        }
                        foreach (BrowseFacet facet in entry.Value.GetFacets())
                        {
                            string      val      = facet.Value;
                            BrowseFacet oldValue = count[val];
                            if (oldValue == null)
                            {
                                count.Add(val, new BrowseFacet(val, facet.FacetValueHitCount));
                            }
                            else
                            {
                                oldValue.FacetValueHitCount = oldValue.FacetValueHitCount + facet.FacetValueHitCount;
                            }
                        }
                    }
                }

                Dictionary <string, IFacetAccessible> mergedFacetMap = new Dictionary <string, IFacetAccessible>();

                foreach (string facet in counts.Keys)
                {
                    FacetSpec fs = req.GetFacetSpec(facet);

                    FacetSpec.FacetSortSpec sortSpec = fs.OrderBy;

                    IComparer <BrowseFacet> comparer;
                    if (FacetSpec.FacetSortSpec.OrderValueAsc.Equals(sortSpec))
                    {
                        comparer = FACET_VAL_COMPARER;
                    }
                    else if (FacetSpec.FacetSortSpec.OrderHitsDesc.Equals(sortSpec))
                    {
                        comparer = FacetHitcountComparerFactory.FACET_HITS_COMPARER;
                    }
                    else
                    {
                        comparer = fs.CustomComparerFactory.NewComparer();
                    }

                    Dictionary <object, BrowseFacet> facetValueCounts = counts[facet];
                    BrowseFacet[] facetArray = facetValueCounts.Values.ToArray();
                    Array.Sort(facetArray, comparer);

                    int numToShow = facetArray.Length;
                    if (req != null)
                    {
                        FacetSpec fspec = req.GetFacetSpec(facet);
                        if (fspec != null)
                        {
                            int maxCount = fspec.MaxCount;
                            if (maxCount > 0)
                            {
                                numToShow = Math.Min(maxCount, numToShow);
                            }
                        }
                    }

                    BrowseFacet[] facets;
                    if (numToShow == facetArray.Length)
                    {
                        facets = facetArray;
                    }
                    else
                    {
                        facets = new BrowseFacet[numToShow];
                        Array.Copy(facetArray, 0, facets, 0, numToShow);
                    }

                    MappedFacetAccessible mergedFacetAccessible = new MappedFacetAccessible(facets);
                    mergedFacetMap.Add(facet, mergedFacetAccessible);
                }
                return(mergedFacetMap);
            }
コード例 #14
0
 public void QueueTask(BrowseRequest <IDirectoryBrowser> request)
 {
     TaskQueue.AddTaskToQueue(request);
 }
コード例 #15
0
        /// <summary>
        /// Most important method - reading the tags.
        /// </summary>
        public async Task <List <Tag> > OPCReadAsync(string OPCAdress)
        {
            //Preparing data to connect to OPC server
            Tags = new List <Tag>();
            var loggerFactory = new LoggerFactory();

            var appDescription = new ApplicationDescription()
            {
                ApplicationName = "OPC",
                ApplicationUri  = $"urn:{System.Net.Dns.GetHostName()}:OPC",
                ApplicationType = ApplicationType.Client,
            };

            var certificateStore = new DirectoryStore(
                Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Workstation.ConsoleApp", "pki"));

            var channel = new UaTcpSessionChannel(
                appDescription,
                certificateStore,
                new AnonymousIdentity(), //by now doesn't support signing in
                OPCAdress,
                loggerFactory: loggerFactory);

            try
            {
                Stopwatch stopwatch = new Stopwatch(); //measuring operations time
                stopwatch.Start();

                await channel.OpenAsync(); //opening channel

                OnNewEvent(new LogEventArgs("Connected to OPC Server"));

                //opening OPC tree branches to find actual tags - only proper for B&R X20 PLC
                BrowseRequest browseRequest = new BrowseRequest {
                    NodesToBrowse = new BrowseDescription[] { new BrowseDescription {
                                                                  NodeId = NodeId.Parse(ObjectIds.RootFolder), BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, IncludeSubtypes = true, ResultMask = (uint)BrowseResultMask.All
                                                              } },
                };
                BrowseResponse browseResponse = await channel.BrowseAsync(browseRequest);

                browseRequest = new BrowseRequest {
                    NodesToBrowse = new BrowseDescription[] { new BrowseDescription {
                                                                  NodeId = ExpandedNodeId.ToNodeId(browseResponse.Results[0].References[0].NodeId, channel.NamespaceUris), BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, IncludeSubtypes = true, ResultMask = (uint)BrowseResultMask.All
                                                              } },
                };
                browseResponse = await channel.BrowseAsync(browseRequest);

                browseRequest = new BrowseRequest {
                    NodesToBrowse = new BrowseDescription[] { new BrowseDescription {
                                                                  NodeId = ExpandedNodeId.ToNodeId(browseResponse.Results[0].References[1].NodeId, channel.NamespaceUris), BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, IncludeSubtypes = true, ResultMask = (uint)BrowseResultMask.All
                                                              } },
                };
                browseResponse = await channel.BrowseAsync(browseRequest);

                browseRequest = new BrowseRequest {
                    NodesToBrowse = new BrowseDescription[] { new BrowseDescription {
                                                                  NodeId = ExpandedNodeId.ToNodeId(browseResponse.Results[0].References[0].NodeId, channel.NamespaceUris), BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, IncludeSubtypes = true, ResultMask = (uint)BrowseResultMask.All
                                                              } },
                };
                browseResponse = await channel.BrowseAsync(browseRequest);

                browseRequest = new BrowseRequest {
                    NodesToBrowse = new BrowseDescription[] { new BrowseDescription {
                                                                  NodeId = ExpandedNodeId.ToNodeId(browseResponse.Results[0].References[0].NodeId, channel.NamespaceUris), BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, IncludeSubtypes = true, ResultMask = (uint)BrowseResultMask.All
                                                              } },
                };
                browseResponse = await channel.BrowseAsync(browseRequest);

                browseRequest = new BrowseRequest {
                    NodesToBrowse = new BrowseDescription[] { new BrowseDescription {
                                                                  NodeId = ExpandedNodeId.ToNodeId(browseResponse.Results[0].References[1].NodeId, channel.NamespaceUris), BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, IncludeSubtypes = true, ResultMask = (uint)BrowseResultMask.All
                                                              } },
                };
                browseResponse = await channel.BrowseAsync(browseRequest);

                browseRequest = new BrowseRequest {
                    NodesToBrowse = new BrowseDescription[] { new BrowseDescription {
                                                                  NodeId = ExpandedNodeId.ToNodeId(browseResponse.Results[0].References[10].NodeId, channel.NamespaceUris), BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, IncludeSubtypes = true, ResultMask = (uint)BrowseResultMask.All
                                                              } },
                };
                BrowseResponse browseResponse0 = await channel.BrowseAsync(browseRequest);

                int nestingLevel = 0;                                                       //nesting level counter
                Tag tag          = new Tag();                                               //initializing first tag
                int allTagsCount = browseResponse0.Results[0].References.Length - 1;        //for counting progress percentage

                for (int i = browseResponse0.Results[0].References.Length - 1; i >= 0; i--) //first level loop
                {
                    var rd = browseResponse0.Results[0].References[i];
                    if (Tags.Count > 0 && rd.DisplayName.ToString() == Tags[0].Name)
                    {
                        break;
                    }                                                                           //to avoid getting the same tags second time

                    nestingLevel = 0;
                    ReadValueId[] items = new ReadValueId[1];
                    items[0] = new ReadValueId {
                        NodeId = NodeId.Parse(rd.NodeId.ToString()), AttributeId = AttributeIds.DataType
                    };
                    ReadRequest readRequest = new ReadRequest {
                        NodesToRead = items
                    };
                    ReadResponse readResponse = await channel.ReadAsync(readRequest);


                    if (string.IsNullOrEmpty(tag.Name))
                    {
                        tag = new Tag(rd.DisplayName.ToString());
                    }


                    if (readResponse.Results[0].Value != null)
                    {
                        tag.ConversionFunction = Typ(readResponse.Results[0].Value.ToString());
                    }

                    browseRequest = new BrowseRequest {
                        NodesToBrowse = new BrowseDescription[] { new BrowseDescription {
                                                                      NodeId = ExpandedNodeId.ToNodeId(rd.NodeId, channel.NamespaceUris), BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, IncludeSubtypes = true, ResultMask = (uint)BrowseResultMask.All
                                                                  } },
                    };
                    browseResponse = await channel.BrowseAsync(browseRequest);

                    foreach (var rd1 in browseResponse.Results[0].References ?? new ReferenceDescription[0]) //second level loop (nesting=1)
                    {
                        if (!rd1.NodeId.ToString().Contains("#"))
                        {
                            nestingLevel = 1;
                            tag          = await ReadTag(new ReferenceDescription[] { rd, rd1 }, channel, tag);

                            browseRequest = new BrowseRequest {
                                NodesToBrowse = new BrowseDescription[] { new BrowseDescription {
                                                                              NodeId = ExpandedNodeId.ToNodeId(rd1.NodeId, channel.NamespaceUris), BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, IncludeSubtypes = true, ResultMask = (uint)BrowseResultMask.All
                                                                          } },
                            };
                            browseResponse = await channel.BrowseAsync(browseRequest);

                            foreach (var rd2 in browseResponse.Results[0].References ?? new ReferenceDescription[0]) //third level loop (nesting=2)
                            {
                                if (!rd2.NodeId.ToString().Contains("#"))
                                {
                                    nestingLevel = 2;
                                    tag          = await ReadTag(new ReferenceDescription[] { rd, rd1, rd2 }, channel, tag);

                                    browseRequest = new BrowseRequest {
                                        NodesToBrowse = new BrowseDescription[] { new BrowseDescription {
                                                                                      NodeId = ExpandedNodeId.ToNodeId(rd2.NodeId, channel.NamespaceUris), BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, IncludeSubtypes = true, ResultMask = (uint)BrowseResultMask.All
                                                                                  } },
                                    };
                                    browseResponse = await channel.BrowseAsync(browseRequest);

                                    foreach (var rd3 in browseResponse.Results[0].References ?? new ReferenceDescription[0]) //fourth level loop (nesting=3)
                                    {
                                        if (!rd3.NodeId.ToString().Contains("#"))
                                        {
                                            nestingLevel = 3;
                                            tag          = await ReadTag(new ReferenceDescription[] { rd, rd1, rd2, rd3 }, channel, tag);
                                        }
                                        else if (rd3.NodeId.ToString().Contains("#EngineeringUnits"))
                                        {
                                            await ReadUnit(new ReferenceDescription[] { rd, rd1, rd2, rd3 }, channel, tag);
                                        }

                                        if (nestingLevel == 3 && !string.IsNullOrEmpty(tag.Name))
                                        {
                                            tag = SaveTag(tag);
                                        }
                                    }
                                }
                                else if (rd2.NodeId.ToString().Contains("#EngineeringUnits"))
                                {
                                    await ReadUnit(new ReferenceDescription[] { rd, rd1, rd2 }, channel, tag);
                                }


                                if (nestingLevel == 2 && !string.IsNullOrEmpty(tag.Name))
                                {
                                    tag = SaveTag(tag);
                                }
                            }
                        }

                        else if (rd1.NodeId.ToString().Contains("#EngineeringUnits"))
                        {
                            await ReadUnit(new ReferenceDescription[] { rd, rd1 }, channel, tag);
                        }


                        if (nestingLevel == 1 && !string.IsNullOrEmpty(tag.Name))
                        {
                            tag = SaveTag(tag);
                        }
                    }
                    if (nestingLevel == 0 && !string.IsNullOrEmpty(tag.Name))
                    {
                        tag = SaveTag(tag);
                    }

                    OnProgressChanged(new ProgressChangedArgs((allTagsCount - i) * 100 / allTagsCount)); //computing progress percentage
                }


                await channel.CloseAsync(); //closing the channel

                stopwatch.Stop();

                OnNewEvent(new LogEventArgs(Tags.Count + " tags read, time elapsed: " + stopwatch.Elapsed.TotalSeconds.ToString("F3") + " s"));
            }
            catch (Exception ex)
            {
                OnNewEvent(new LogEventArgs("Error connecting to OPC server."));
                await channel.AbortAsync();
            }

            return(Tags);
        }
コード例 #16
0
        private async Task LoadChildrenAsync(ReferenceDescriptionViewModel parent)
        {
            try
            {
                var token = this.cts.Token;
                await [email protected](token);

                this.NotifyPropertyChanged("IsLoading");
                try
                {
                    do
                    {
                        try
                        {
                            if (this.session == null || this.session.State != CommunicationState.Opened)
                            {
                                var getEndpointsRequest = new GetEndpointsRequest
                                {
                                    EndpointUrl = this.endpointUrl,
                                    ProfileUris = new[] { TransportProfileUris.UaTcpTransport }
                                };
                                var getEndpointsResponse = await UaTcpDiscoveryClient.GetEndpointsAsync(getEndpointsRequest);

                                token.ThrowIfCancellationRequested();
                                var selectedEndpoint = getEndpointsResponse.Endpoints.OrderByDescending(e => e.SecurityLevel).First();
                                if (selectedEndpoint.UserIdentityTokens.Any(p => p.TokenType == UserTokenType.Anonymous))
                                {
                                    this.HideLoginPanel();
                                    this.userIdentity = new AnonymousIdentity();
                                }
                                else if (selectedEndpoint.UserIdentityTokens.Any(p => p.TokenType == UserTokenType.UserName))
                                {
                                    if (!this.showingLoginPanel)
                                    {
                                        this.ShowLoginPanel();
                                        return;
                                    }
                                    else if (!this.ValidateLoginCredentials())
                                    {
                                        return;
                                    }
                                    else
                                    {
                                        this.userIdentity = new UserNameIdentity(this.userName, this.password);
                                    }
                                }
                                else
                                {
                                    throw new NotImplementedException("Browser supports only UserName and Anonymous identity, for now.");
                                }

                                this.session = new UaTcpSessionChannel(
                                    this.localDescription,
                                    this.CertificateStore,
                                    this.userIdentity,
                                    selectedEndpoint);
                                await this.session.OpenAsync();
                            }

                            token.ThrowIfCancellationRequested();
                            var browseRequest = new BrowseRequest {
                                NodesToBrowse = new[] { new BrowseDescription {
                                                            NodeId = ExpandedNodeId.ToNodeId(parent.NodeId, this.session.NamespaceUris), ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences), ResultMask = (uint)BrowseResultMask.All, NodeClassMask = (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, BrowseDirection = BrowseDirection.Forward, IncludeSubtypes = true
                                                        } }, RequestedMaxReferencesPerNode = 64
                            };
                            var browseResponse = await this.session.BrowseAsync(browseRequest);

                            var refs = browseResponse.Results.Where(result => result.References != null).SelectMany(result => result.References).ToArray();
                            if (refs.Length == 0)
                            {
                                return;
                            }

                            var nodes           = refs.Select(r => ExpandedNodeId.ToNodeId(r.NodeId, this.session.NamespaceUris)).ToArray();
                            var readTypeRequest = new ReadRequest {
                                NodesToRead = nodes.Select(n => new ReadValueId {
                                    NodeId = n, AttributeId = AttributeIds.DataType
                                }).ToArray()
                            };
                            var readTypeResponse = await this.session.ReadAsync(readTypeRequest);

                            var readRankRequest = new ReadRequest {
                                NodesToRead = nodes.Select(n => new ReadValueId {
                                    NodeId = n, AttributeId = AttributeIds.ValueRank
                                }).ToArray()
                            };
                            var readRankResponse = await this.session.ReadAsync(readRankRequest);

                            var readNotifierRequest = new ReadRequest {
                                NodesToRead = nodes.Select(n => new ReadValueId {
                                    NodeId = n, AttributeId = AttributeIds.EventNotifier
                                }).ToArray()
                            };
                            var readNotifierResponse = await this.session.ReadAsync(readNotifierRequest);

                            var readAccessLevelRequest = new ReadRequest {
                                NodesToRead = nodes.Select(n => new ReadValueId {
                                    NodeId = n, AttributeId = AttributeIds.UserAccessLevel
                                }).ToArray()
                            };
                            var readAccessLevelResponse = await this.session.ReadAsync(readAccessLevelRequest);

                            NodeId               dataTypeNode;
                            Type                 dataType;
                            int                  valueRank;
                            EventNotifierFlags   notifier;
                            AccessLevelFlags     accessLevel;
                            ExpandedNodeId       dataTypeId;
                            ReferenceDescription dataTypeRef;
                            for (int i = 0; i < refs.Length; i++)
                            {
                                dataTypeNode = readTypeResponse.Results[i].GetValueOrDefault(NodeId.Null);
                                if (dataTypeNode != NodeId.Null)
                                {
                                    dataTypeId = NodeId.ToExpandedNodeId(dataTypeNode, this.session.NamespaceUris);
                                    if (!UaTcpSecureChannel.DataTypeIdToTypeDictionary.TryGetValue(dataTypeId, out dataType))
                                    {
                                        do
                                        {
                                            dataTypeNode = ExpandedNodeId.ToNodeId(dataTypeId, this.session.NamespaceUris);
                                            var browseRequest2 = new BrowseRequest {
                                                NodesToBrowse = new[] { new BrowseDescription {
                                                                            NodeId = dataTypeNode, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HasSubtype), ResultMask = (uint)BrowseResultMask.None, NodeClassMask = (uint)NodeClass.DataType, BrowseDirection = BrowseDirection.Inverse, IncludeSubtypes = false
                                                                        } }
                                            };
                                            var browseResponse2 = await this.session.BrowseAsync(browseRequest2);

                                            dataTypeRef = browseResponse2.Results[0].References?.FirstOrDefault();
                                            dataTypeId  = dataTypeRef?.NodeId;
                                        }while (dataTypeId != null && !UaTcpSecureChannel.DataTypeIdToTypeDictionary.TryGetValue(dataTypeId, out dataType));

                                        if (dataTypeId == null)
                                        {
                                            dataType = typeof(object);
                                        }
                                    }

                                    valueRank = readRankResponse.Results[i].GetValueOrDefault(-1);
                                    if (valueRank == 1)
                                    {
                                        dataType = dataType.MakeArrayType();
                                    }

                                    if (valueRank > 1)
                                    {
                                        dataType = dataType.MakeArrayType(valueRank);
                                    }
                                }
                                else
                                {
                                    dataType = typeof(object);
                                }

                                notifier    = (EventNotifierFlags)Enum.ToObject(typeof(EventNotifierFlags), readNotifierResponse.Results[i].GetValueOrDefault <byte>());
                                accessLevel = (AccessLevelFlags)Enum.ToObject(typeof(AccessLevelFlags), readAccessLevelResponse.Results[i].GetValueOrDefault <byte>());
                                parent.Children.Add(new ReferenceDescriptionViewModel(refs[i], dataType, accessLevel, notifier, parent, this.LoadChildrenAsync));
                                await Task.Yield();
                            }

                            var continuationPoints = browseResponse.Results.Select(br => br.ContinuationPoint).Where(cp => cp != null).ToArray();
                            while (continuationPoints.Length > 0)
                            {
                                token.ThrowIfCancellationRequested();
                                var browseNextRequest = new BrowseNextRequest {
                                    ContinuationPoints = continuationPoints, ReleaseContinuationPoints = false
                                };
                                var browseNextResponse = await this.session.BrowseNextAsync(browseNextRequest);

                                refs = browseNextResponse.Results.Where(result => result.References != null).SelectMany(result => result.References).ToArray();
                                if (refs.Length == 0)
                                {
                                    return;
                                }

                                nodes           = refs.Select(r => ExpandedNodeId.ToNodeId(r.NodeId, this.session.NamespaceUris)).ToArray();
                                readTypeRequest = new ReadRequest {
                                    NodesToRead = nodes.Select(n => new ReadValueId {
                                        NodeId = n, AttributeId = AttributeIds.DataType
                                    }).ToArray()
                                };
                                readTypeResponse = await this.session.ReadAsync(readTypeRequest);

                                readRankRequest = new ReadRequest {
                                    NodesToRead = nodes.Select(n => new ReadValueId {
                                        NodeId = n, AttributeId = AttributeIds.ValueRank
                                    }).ToArray()
                                };
                                readRankResponse = await this.session.ReadAsync(readRankRequest);

                                readNotifierRequest = new ReadRequest {
                                    NodesToRead = nodes.Select(n => new ReadValueId {
                                        NodeId = n, AttributeId = AttributeIds.EventNotifier
                                    }).ToArray()
                                };
                                readNotifierResponse = await this.session.ReadAsync(readNotifierRequest);

                                readAccessLevelRequest = new ReadRequest {
                                    NodesToRead = nodes.Select(n => new ReadValueId {
                                        NodeId = n, AttributeId = AttributeIds.UserAccessLevel
                                    }).ToArray()
                                };
                                readAccessLevelResponse = await this.session.ReadAsync(readAccessLevelRequest);

                                for (int i = 0; i < refs.Length; i++)
                                {
                                    dataTypeNode = readTypeResponse.Results[i].GetValueOrDefault(NodeId.Null);
                                    if (dataTypeNode != NodeId.Null)
                                    {
                                        dataTypeId = NodeId.ToExpandedNodeId(dataTypeNode, this.session.NamespaceUris);
                                        if (!UaTcpSecureChannel.DataTypeIdToTypeDictionary.TryGetValue(dataTypeId, out dataType))
                                        {
                                            do
                                            {
                                                dataTypeNode = ExpandedNodeId.ToNodeId(dataTypeId, this.session.NamespaceUris);
                                                var browseRequest2 = new BrowseRequest {
                                                    NodesToBrowse = new[] { new BrowseDescription {
                                                                                NodeId = dataTypeNode, ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HasSubtype), ResultMask = (uint)BrowseResultMask.None, NodeClassMask = (uint)NodeClass.DataType, BrowseDirection = BrowseDirection.Inverse, IncludeSubtypes = false
                                                                            } }
                                                };
                                                var browseResponse2 = await this.session.BrowseAsync(browseRequest2);

                                                dataTypeRef = browseResponse2.Results[0].References?.FirstOrDefault();
                                                dataTypeId  = dataTypeRef?.NodeId;
                                            }while (dataTypeId != null && !UaTcpSecureChannel.DataTypeIdToTypeDictionary.TryGetValue(dataTypeId, out dataType));

                                            if (dataTypeId == null)
                                            {
                                                dataType = typeof(object);
                                            }
                                        }

                                        valueRank = readRankResponse.Results[i].GetValueOrDefault(-1);
                                        if (valueRank == 1)
                                        {
                                            dataType = dataType.MakeArrayType();
                                        }

                                        if (valueRank > 1)
                                        {
                                            dataType = dataType.MakeArrayType(valueRank);
                                        }
                                    }
                                    else
                                    {
                                        dataType = typeof(object);
                                    }

                                    notifier    = (EventNotifierFlags)Enum.ToObject(typeof(EventNotifierFlags), readNotifierResponse.Results[i].GetValueOrDefault <byte>());
                                    accessLevel = (AccessLevelFlags)Enum.ToObject(typeof(AccessLevelFlags), readAccessLevelResponse.Results[i].GetValueOrDefault <byte>());
                                    parent.Children.Add(new ReferenceDescriptionViewModel(refs[i], dataType, accessLevel, notifier, parent, this.LoadChildrenAsync));
                                    await Task.Yield();
                                }

                                continuationPoints = browseNextResponse.Results.Select(br => br.ContinuationPoint).Where(cp => cp != null).ToArray();
                            }

                            break;
                        }
                        catch (OperationCanceledException)
                        {
                        }
                        catch (ServiceResultException ex)
                        {
                            Trace.TraceInformation("ServiceResultException: {0}", ex);
                            if (this.session != null)
                            {
                                await this.session.AbortAsync(token);

                                this.session = null;
                            }

                            if (ex.HResult == unchecked ((int)StatusCodes.BadSessionIdInvalid))
                            {
                                continue;
                            }
                        }
                        catch (Exception ex)
                        {
                            Trace.TraceInformation("Exception {0}", ex);
                            if (this.session != null)
                            {
                                await this.session.AbortAsync(token);

                                this.session = null;
                            }
                        }

                        try
                        {
                            await Task.Delay(5000, token);
                        }
                        catch (OperationCanceledException)
                        {
                        }
                    }while (!token.IsCancellationRequested);
                }
                catch (Exception ex)
                {
                    Trace.TraceInformation("Exception {0}", ex);
                }
                finally
                {
                    [email protected]();
                    this.NotifyPropertyChanged("IsLoading");
                }
            }
            catch (OperationCanceledException)
            {
            }
        }
コード例 #17
0
 public Task SendBrowseCommand(BrowseRequest command, CancellationToken cancellationToken)
 {
     return(Task.FromResult(true));
 }
コード例 #18
0
        /// <summary>
        /// Master controler interface method to navigate all views
        /// to the folder indicated in <paramref name="folder"/>
        /// - updates all related viewmodels.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="requestor"</param>
        private async Task <FinalBrowseResult> NavigateToFolderAsync(BrowseRequest request,
                                                                     object sender)
        {
            // Make sure the task always processes the last input but is not started twice
            await _SlowStuffSemaphore.WaitAsync();

            try
            {
                var newPath = request.NewLocation;
                var cancel  = request.CancelTok;

                if (cancel != null)
                {
                    cancel.ThrowIfCancellationRequested();
                }

                FolderItemsView.SetExternalBrowsingState(true);
                FolderTextPath.SetExternalBrowsingState(true);

                FinalBrowseResult browseResult = null;

                if (FolderTextPath != sender)
                {
                    // Navigate Folder ComboBox to this folder
                    browseResult = await FolderTextPath.NavigateToAsync(request);
                }

                if (cancel != null)
                {
                    cancel.ThrowIfCancellationRequested();
                }

                if (FolderItemsView != sender && browseResult.Result == BrowseResult.Complete)
                {
                    // Navigate Folder/File ListView to this folder
                    browseResult = await FolderItemsView.NavigateToAsync(request);
                }

                if (cancel != null)
                {
                    cancel.ThrowIfCancellationRequested();
                }

                if (browseResult.Result == BrowseResult.Complete)
                {
                    SelectedFolder = newPath.Path;
                    NaviHistory.Forward(newPath);  // Log location into history of recent locations
                }

                return(browseResult);
            }
            catch (Exception exp)
            {
                var result = FinalBrowseResult.FromRequest(request, BrowseResult.InComplete);
                result.UnexpectedError = exp;
                return(result);
            }
            finally
            {
                FolderItemsView.SetExternalBrowsingState(false);
                FolderTextPath.SetExternalBrowsingState(false);

                _SlowStuffSemaphore.Release();
            }
        }
コード例 #19
0
ファイル: Opc.Ua.Messages.cs プロジェクト: yuriik83/UA-.NET
 /// <summary>
 /// Initializes the message with the body.
 /// </summary>
 public BrowseMessage(BrowseRequest BrowseRequest)
 {
     this.BrowseRequest = BrowseRequest;
 }
コード例 #20
0
        private BrowseResult PerformAutoCompleteLookup(string prefix, string indexPath)
        {
            FacetHandler handler = new MultiValueFacetHandler("title");

            Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo(indexPath));
            IndexReader indexReader = IndexReader.Open(directory, true);

            // decorate it with a bobo index reader
            BoboIndexReader boboReader = BoboIndexReader.GetInstance(indexReader, new FacetHandler[] { handler });

            BrowseRequest browseRequest = new BrowseRequest();
            browseRequest.Count = 8;
            browseRequest.Offset = 0;
            browseRequest.FetchStoredFields = true;

            // add a selection
            BrowseSelection sel = new BrowseSelection("title");
            //sel.AddValue("alexey");
            browseRequest.AddSelection(sel);

            // parse a query
            // NOTE: this was "Entity" originally
            QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "title", new KeywordAnalyzer());
            Query q = parser.Parse("SPListItem");
            browseRequest.Query = q;

            // add the facet output specs
            FacetSpec spec = new FacetSpec();
            spec.Prefix = prefix;
            spec.OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc;

            browseRequest.SetFacetSpec("title", spec);

            // perform browse
            IBrowsable browser = new BoboBrowser(boboReader);

            BrowseResult result = browser.Browse(browseRequest);

            return result;

            //// Showing results now
            //Dictionary<String, IFacetAccessible> facetMap = result.FacetMap;

            //IFacetAccessible colorFacets = facetMap["Body"];

            //IEnumerable<BrowseFacet> facetVals = colorFacets.GetFacets();

            //Debug.WriteLine("Facets:");

            //int count = 0;
            //foreach (BrowseFacet facet in facetVals)
            //{
            //    count++;
            //    Debug.WriteLine(facet.ToString());
            //}
            //Debug.WriteLine("Total = " + count);
        }
コード例 #21
0
 /// <summary>
 /// Controller can start browser process if IsBrowsing = false
 /// </summary>
 /// <param name="request"></param>
 /// <returns></returns>
 FinalBrowseResult INavigateable.NavigateTo(BrowseRequest request)
 {
     return(InternalNavigateTo(request, false));
 }
コード例 #22
0
        public BrowseRequest CreateRequest(int minHitCount, BrowseSelection.ValueOperation operation, params string[] terms)
        {
            BrowseRequest req = new BrowseRequest();

            BrowseSelection sel = new BrowseSelection(AttributeHandlerName);
            foreach (String term in terms)
            {
                sel.AddValue(term);
            }
            sel.SetSelectionProperties(selectionProperties);
            sel.SelectionOperation = (operation);
            req.AddSelection(sel);
            req.Count = (50);
            FacetSpec fs = new FacetSpec();
            fs.MinHitCount = (minHitCount);
            req.SetFacetSpec(AttributeHandlerName, fs);
            return req;
        }
コード例 #23
0
        /// <summary>
        /// One of the controls has changed its location in the filesystem.
        /// This method is invoked to synchronize this change with all other controls.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Control_BrowseEvent(object sender,
                                         FileSystemModels.Browse.BrowsingEventArgs e)
        {
            var location = e.Location;

            SelectedFolder = location.Path;

            if (e.IsBrowsing == false && e.Result == BrowseResult.Complete)
            {
                // XXX Todo Keep task reference, support cancel, and remove on end?
                try
                {
                    var timeout    = TimeSpan.FromSeconds(5);
                    var actualTask = new Task(() =>
                    {
                        var request = new BrowseRequest(location, _CancelTokenSourc.Token);

                        var t = Task.Factory.StartNew(() => NavigateToFolderAsync(request, sender),
                                                      request.CancelTok,
                                                      TaskCreationOptions.LongRunning,
                                                      _OneTaskScheduler);

                        if (t.Wait(timeout) == true)
                        {
                            return;
                        }

                        _CancelTokenSourc.Cancel();     // Task timed out so lets abort it
                        return;                         // Signal timeout here...
                    });

                    actualTask.Start();
                    actualTask.Wait();
                }
                catch (System.AggregateException ex)
                {
                    Logger.Error(ex);
                }
                catch (Exception ex)
                {
                    Logger.Error(ex);
                }
            }
            else
            {
                if (e.IsBrowsing == true)
                {
                    // The sender has messaged: "I am changing location..."
                    // So, we set this property to tell the others:
                    // 1) Don't change your location now (eg.: Disable UI)
                    // 2) We'll be back to tell you the location when we know it
                    if (TreeBrowser != sender)
                    {
                        TreeBrowser.SetExternalBrowsingState(true);
                    }

                    if (FolderTextPath != sender)
                    {
                        FolderTextPath.SetExternalBrowsingState(true);
                    }

                    if (FolderItemsView != sender)
                    {
                        FolderItemsView.SetExternalBrowsingState(true);
                    }
                }
            }
        }
コード例 #24
0
ファイル: Opc.Ua.Client.cs プロジェクト: zryska/UA-.NET
        /// <summary>
        /// Begins an asynchronous invocation of the Browse service.
        /// </summary>
        public IAsyncResult BeginBrowse(
            RequestHeader               requestHeader,
            ViewDescription             view,
            uint                        requestedMaxReferencesPerNode,
            BrowseDescriptionCollection nodesToBrowse,
            AsyncCallback               callback,
            object                      asyncState)
        {
            BrowseRequest request = new BrowseRequest();

            request.RequestHeader                 = requestHeader;
            request.View                          = view;
            request.RequestedMaxReferencesPerNode = requestedMaxReferencesPerNode;
            request.NodesToBrowse                 = nodesToBrowse;

            UpdateRequestHeader(request, requestHeader == null, "Browse");

            if (UseTransportChannel)
            {
                return TransportChannel.BeginSendRequest(request, callback, asyncState);
            }

            return InnerChannel.BeginBrowse(new BrowseMessage(request), callback, asyncState);
        }
コード例 #25
0
 /// <summary>
 /// Controller can start browser process if IsBrowsing = false
 /// </summary>
 /// <param name="request"></param>
 /// <returns></returns>
 FinalBrowseResult INavigateable.NavigateTo(BrowseRequest request)
 {
     return(PopulateView(request));
 }
コード例 #26
0
 /// <summary>
 /// Controller can start browser process if IsBrowsing = false
 /// </summary>
 /// <param name="request"></param>
 /// <returns></returns>
 async Task <FinalBrowseResult> INavigateable.NavigateToAsync(BrowseRequest request)
 {
     return(await Task.Run(() => { return PopulateView(request); }));
 }
コード例 #27
0
        private void ProcessCommand(string line)
        {
            if (string.IsNullOrEmpty(line))
            {
                return;
            }
            string[] parsed = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            if (parsed.Length == 0)
            {
                return;
            }

            string cmd = parsed[0];

            string[] args = new string[parsed.Length - 1];
            if (args.Length > 0)
            {
                Array.Copy(parsed, 1, args, 0, args.Length);
            }

            if ("help".Equals(cmd, StringComparison.OrdinalIgnoreCase) || "?".Equals(cmd, StringComparison.OrdinalIgnoreCase))
            {
                Console.WriteLine(@"help or ? - prints this message");
                Console.WriteLine(@"exit or q - quits");
                Console.WriteLine(@"query <query string> - sets query text");
                Console.WriteLine(@"facetspec <name>:<minHitCount>,<maxCount>,<isExpand>,<orderby> - add facet spec");
                Console.WriteLine(@"page <offset>:<count> - set paging parameters");
                Console.WriteLine(@"select <name>:<value1>,<value2>... - add selection, with ! in front of value indicates a not");
                Console.WriteLine(@"sort <name>:<dir>,... - set sort specs (false for ascending, true for descending)");
                Console.WriteLine(@"showReq: shows current request");
                Console.WriteLine(@"clear: clears current request");
                Console.WriteLine(@"clearSelections: clears all selections");
                Console.WriteLine(@"clearSelection <name>: clear selection specified");
                Console.WriteLine(@"clearFacetSpecs: clears all facet specs");
                Console.WriteLine(@"clearFacetSpec <name>: clears specified facetspec");
                Console.WriteLine(@"browse - executes a search");
            }
            else if ("query".Equals(cmd, StringComparison.OrdinalIgnoreCase))
            {
                if (parsed.Length < 2)
                {
                    Console.WriteLine(@"query not defined.");
                }
                else
                {
                    string queryString = parsed[1];
                    if (!string.IsNullOrEmpty(queryString))
                    {
                        var   qparser = new QueryParser(Lucene.Net.Util.Version.LUCENE_CURRENT, "contents", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_CURRENT));
                        Query q;
                        try
                        {
                            q = qparser.Parse(queryString);
                            _reqBuilder.Request.Query = q;
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e.ToString());
                        }
                    }
                }
            }
            else if ("facetspec".Equals(cmd, StringComparison.OrdinalIgnoreCase))
            {
                if (parsed.Length < 2)
                {
                    Console.WriteLine("facetspec not defined.");
                }
                else
                {
                    try
                    {
                        string   fspecString = parsed[1];
                        string[] parts       = fspecString.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                        string   name        = parts[0];
                        string   fvalue      = parts[1];
                        string[] valParts    = fvalue.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                        if (valParts.Length != 4)
                        {
                            Console.WriteLine(@"spec must of of the form <minhitcount>,<maxcount>,<isExpand>,<orderby>");
                        }
                        else
                        {
                            int  minHitCount             = 1;
                            int  maxCount                = 5;
                            bool expand                  = false;
                            FacetSpec.FacetSortSpec sort = FacetSpec.FacetSortSpec.OrderHitsDesc;
                            try
                            {
                                minHitCount = int.Parse(valParts[0]);
                            }
                            catch
                            {
                                Console.WriteLine("default min hitcount = 1 is applied.");
                            }
                            try
                            {
                                maxCount = int.Parse(valParts[1]);
                            }
                            catch
                            {
                                Console.WriteLine("default maxCount = 5 is applied.");
                            }
                            try
                            {
                                expand = bool.Parse(valParts[2]);
                            }
                            catch
                            {
                                Console.WriteLine("default expand=false is applied.");
                            }

                            if ("hits".Equals(valParts[3]))
                            {
                                sort = FacetSpec.FacetSortSpec.OrderHitsDesc;
                            }
                            else
                            {
                                sort = FacetSpec.FacetSortSpec.OrderValueAsc;
                            }

                            _reqBuilder.ApplyFacetSpec(name, minHitCount, maxCount, expand, sort);
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.ToString());
                    }
                }
            }
            else if ("select".Equals(cmd, StringComparison.OrdinalIgnoreCase))
            {
                if (parsed.Length < 2)
                {
                    Console.WriteLine("selection not defined.");
                }
                else
                {
                    try
                    {
                        string   selString = parsed[1];
                        string[] parts     = selString.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                        string   name      = parts[0];
                        string   selList   = parts[1];
                        string[] sels      = selList.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                        foreach (string sel in sels)
                        {
                            bool   isNot = false;
                            string val   = sel;
                            if (sel.StartsWith("!"))
                            {
                                isNot = true;
                                val   = sel.Substring(1);
                            }
                            if (!string.IsNullOrEmpty(val))
                            {
                                _reqBuilder.AddSelection(name, val, isNot);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.ToString());
                    }
                }
            }
            else if ("page".Equals(cmd, StringComparison.OrdinalIgnoreCase))
            {
                try
                {
                    string   pageString = parsed[1];
                    string[] parts      = pageString.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                    _reqBuilder.Offset = int.Parse(parts[0]);
                    _reqBuilder.Count  = int.Parse(parts[1]);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
            }
            else if ("clearFacetSpec".Equals(cmd, StringComparison.OrdinalIgnoreCase))
            {
                if (parsed.Length < 2)
                {
                    Console.WriteLine("facet spec not defined.");
                }
                else
                {
                    string name = parsed[1];
                    _reqBuilder.ClearFacetSpec(name);
                }
            }
            else if ("clearSelection".Equals(cmd, StringComparison.OrdinalIgnoreCase))
            {
                if (parsed.Length < 2)
                {
                    Console.WriteLine("selection name not defined.");
                }
                else
                {
                    string name = parsed[1];
                    _reqBuilder.ClearSelection(name);
                }
            }
            else if ("clearSelections".Equals(cmd, StringComparison.OrdinalIgnoreCase))
            {
                _reqBuilder.ClearSelections();
            }
            else if ("clearFacetSpecs".Equals(cmd, StringComparison.OrdinalIgnoreCase))
            {
                _reqBuilder.ClearFacetSpecs();
            }
            else if ("clear".Equals(cmd, StringComparison.OrdinalIgnoreCase))
            {
                _reqBuilder.Clear();
            }
            else if ("showReq".Equals(cmd, StringComparison.OrdinalIgnoreCase))
            {
                BrowseRequest req = _reqBuilder.Request;
                Console.WriteLine(req.ToString());
            }
            else if ("sort".Equals(cmd, StringComparison.OrdinalIgnoreCase))
            {
                if (parsed.Length == 2)
                {
                    string   sortString = parsed[1];
                    string[] sorts      = sortString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                    var      sortList   = new List <SortField>();
                    foreach (var sort in sorts)
                    {
                        string[] sortParams = sort.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                        bool     rev        = false;
                        if (sortParams.Length > 0)
                        {
                            string sortName = sortParams[0];
                            if (sortParams.Length > 1)
                            {
                                try
                                {
                                    rev = bool.Parse(sortParams[1]);
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine(e.Message + ", default rev to false");
                                }
                            }
                            sortList.Add(new SortField(sortName, SortField.STRING, rev));
                        }
                    }
                    _reqBuilder.ApplySort(sortList.ToArray());
                }
                else
                {
                    _reqBuilder.ApplySort(null);
                }
            }
            else if ("browse".Equals(cmd, StringComparison.OrdinalIgnoreCase))
            {
                BrowseRequest req = _reqBuilder.Request;

                BrowseResult res    = _svc.Browse(req);
                string       output = BrowseResultFormatter.FormatResults(res);
                Console.WriteLine(output);
            }
            else
            {
                Console.WriteLine("Unknown command: " + cmd + ", do help for list of supported commands");
            }
        }