public void WhenSearchAndIsActive_ThenReturnsActiveSubscriptionsOnly() { var config1 = new SubscriptionConfig(); var config2 = new SubscriptionConfig(); var subscription1 = new WebhookSubscription { Event = "aneventname", Config = config1, IsActive = false }; var subscription2 = new WebhookSubscription { Event = "aneventname", Config = config2, IsActive = true }; cacheClient.As <ICacheClientExtended>().Setup(cc => cc.GetKeysByPattern(It.IsAny <string>())) .Returns(new List <string> { "akey1", "akey2" }); cacheClient.Setup(cc => cc.Get <object>("akey1")) .Returns(subscription1); cacheClient.Setup(cc => cc.Get <object>("akey2")) .Returns(subscription2); var result = store.Search("aneventname", true); Assert.That(result[0].Config, Is.EqualTo(config2)); cacheClient.As <ICacheClientExtended>().Verify(cc => cc.GetKeysByPattern(CacheClientSubscriptionStore.CachekeyPrefix + "*")); cacheClient.Verify(cc => cc.Get <object>("akey1")); cacheClient.Verify(cc => cc.Get <object>("akey2")); }
public long CreateSubscription(SubscriptionCriteria criteria) { long id = -1; using (Database.IdentityLock.Lock()) { Database.TransactionalStorage.Batch(accessor => { id = accessor.General.GetNextIdentityValue(Constants.RavenSubscriptionsPrefix); try { if (criteria.StartEtag == null || criteria.StartEtag == Etag.Empty) { TryFigureOutFirstEtagForSubscription(criteria); } } catch (Exception e) { Log.InfoException("Could not figure out start etag for subscription automatically", e); } var config = new SubscriptionConfig { SubscriptionId = id, Criteria = criteria, AckEtag = criteria.StartEtag ?? Etag.Empty, }; SaveSubscriptionConfig(id, config); }); } return(id); }
public static async Task <JToken> CreateSubscriptionAndWaitSubscribed( this IRtmClient client, string channel, string position, ISubscriptionObserver observer) { var tcs = new TaskCompletionSource <JToken>(); var sobs = new SubscriptionObserver(); sobs.OnEnterSubscribed += (s) => { tcs.TrySetResult(s.Position); }; sobs.OnEnterFailed += (_) => { tcs.TrySetException(new Exception("subscription was removed")); }; sobs.OnDeleted += (_) => { tcs.TrySetException(new Exception("subscription was removed")); }; var subCfg = new SubscriptionConfig(SubscriptionModes.Advanced) { Position = position, Observer = new SubscriptionCompoundObserver(sobs, observer) }; client.CreateSubscription(channel, subCfg); return(await tcs.Task.ConfigureAwait(false)); }
public void WhenFromEntity_ThenReturnsDto() { var datum = DateTime.UtcNow; var config = new SubscriptionConfig { Url = "aurl" }; var result = new WebhookSubscriptionEntity { Id = "asubscriptionid", Config = config.ToJson(), IsActive = true.ToString().ToLowerInvariant(), CreatedById = "auserid", CreatedDateUtc = datum, Event = "anevent", Name = "aname", LastModifiedDateUtc = datum }.FromEntity(); Assert.That(result.Id, Is.EqualTo("asubscriptionid")); Assert.That(result.Config.Url, Is.EqualTo("aurl")); Assert.That(result.IsActive, Is.EqualTo(true)); Assert.That(result.CreatedById, Is.EqualTo("auserid")); Assert.That(result.CreatedDateUtc, Is.EqualTo(datum)); Assert.That(result.Event, Is.EqualTo("anevent")); Assert.That(result.Event, Is.EqualTo("anevent")); Assert.That(result.Name, Is.EqualTo("aname")); Assert.That(result.LastModifiedDateUtc, Is.EqualTo(datum)); }
/// <summary> /// Creates a new subscription node according to the subscription configuration. /// </summary> private static TreeNode CreateSubscriptionNode(SubscriptionConfig subscriptionConfig) { return(TreeViewExtensions.CreateNode( GetDisplayName(subscriptionConfig.DisplayName, DriverPhrases.UnnamedSubscription), ImageKey.FolderClosed, subscriptionConfig)); }
public async Task TwoSubscriptionsWithDifferentNames() { var client = new RtmClientBuilder(Config.Endpoint, Config.AppKey).Build(); var channel = GenerateRandomChannelName(); var subId1 = "s1_" + channel; var subId2 = "s2_" + channel; await client.StartAndWaitConnected(); var subCfg = new SubscriptionConfig(SubscriptionModes.Advanced) { Filter = $"select * FROM `{channel}`" }; var queue1 = new TestSubscriptionObserverQueue(); queue1.ObserveSubscriptionState(); queue1.ObserveSubscriptionPdu(); subCfg.Observer = queue1; client.CreateSubscription(subId1, subCfg); Assert.That(await queue1.Dequeue(), Is.EqualTo("rtm:created")); Assert.That(await queue1.Dequeue(), Is.EqualTo("rtm:enter-unsubscribed")); Assert.That(await queue1.Dequeue(), Is.EqualTo("rtm:leave-unsubscribed")); Assert.That(await queue1.Dequeue(), Is.EqualTo("rtm:enter-subscribing")); Assert.That(await queue1.Dequeue(), Is.EqualTo("rtm:leave-subscribing")); Assert.That(await queue1.Dequeue(), Is.EqualTo("rtm:enter-subscribed")); var queue2 = new TestSubscriptionObserverQueue(); queue2.ObserveSubscriptionState(); queue2.ObserveSubscriptionPdu(); subCfg.Observer = queue2; client.CreateSubscription(subId2, subCfg); Assert.That(await queue2.Dequeue(), Is.EqualTo("rtm:created")); Assert.That(await queue2.Dequeue(), Is.EqualTo("rtm:enter-unsubscribed")); Assert.That(await queue2.Dequeue(), Is.EqualTo("rtm:leave-unsubscribed")); Assert.That(await queue2.Dequeue(), Is.EqualTo("rtm:enter-subscribing")); Assert.That(await queue2.Dequeue(), Is.EqualTo("rtm:leave-subscribing")); Assert.That(await queue2.Dequeue(), Is.EqualTo("rtm:enter-subscribed")); var msg = new JObject(new JProperty("filed", "value")); await client.Publish(channel, msg, Ack.Yes); Assert.That(await queue1.Dequeue(), Is.EqualTo($"rtm:subscription-data:{msg}")); Assert.That(await queue2.Dequeue(), Is.EqualTo($"rtm:subscription-data:{msg}")); await Task.Delay(200); await client.Yield(); Assert.That(queue1.TryDequeue(), Is.EqualTo(null)); Assert.That(queue2.TryDequeue(), Is.EqualTo(null)); await client.Dispose(); }
/// <summary> /// Creates a new subscription node according to the subscription configuration. /// </summary> private TreeNode CreateSubscriptionNode(SubscriptionConfig subscriptionConfig) { TreeNode subscriptionNode = TreeViewUtils.CreateNode( GetDisplayName(subscriptionConfig.DisplayName, KpPhrases.EmptySubscription), FolderClosedImageKey); subscriptionNode.Tag = subscriptionConfig; return(subscriptionNode); }
/// <summary> /// Shows the subscription properties. /// </summary> private void ShowSubscriptionProps(SubscriptionConfig subscriptionConfig) { if (subscriptionConfig != null) { chkSubscrActive.Checked = subscriptionConfig.Active; txtDisplayName.Text = subscriptionConfig.DisplayName; numPublishingInterval.SetValue(subscriptionConfig.PublishingInterval); } }
public void Initialize() { dto = new SubscriptionConfig { Url = "http://localhost", ContentType = MimeTypes.Json, Secret = Convert.ToBase64String(Encoding.Default.GetBytes("asecret")) }; validator = new SubscriptionConfigValidator(); }
private void btnAddSubscription_Click(object sender, EventArgs e) { // add a new subscription SubscriptionConfig subscriptionConfig = new SubscriptionConfig(); TreeNode subscriptionNode = CreateSubscriptionNode(subscriptionConfig); tvDevice.Insert(subscriptionsNode, subscriptionNode, deviceConfig.Subscriptions, subscriptionConfig); ctrlSubscription.SetFocus(); Modified = true; }
public void ShouldCreateProductSubscriptionTemplateResourceFromCreatorConfigWithCorrectContent() { // arrange SubscriptionTemplateCreator subscriptionTemplateCreator = new SubscriptionTemplateCreator(); CreatorConfig creatorConfig = new CreatorConfig() { products = new List <ProductConfig>() }; ProductConfig product = new ProductConfig() { name = "productName", displayName = "displayName", description = "description", terms = "terms", subscriptionRequired = true, approvalRequired = true, subscriptionsLimit = 1, state = "state", }; SubscriptionConfig subscription = new SubscriptionConfig() { name = "subscriptionName", ownerId = "user/ownerId", displayName = "displayName", primaryKey = "primaryKey", secondaryKey = "secondaryKey", state = "active", allowTracing = true, }; product.subscriptions = new List <SubscriptionConfig>(); product.subscriptions.Add(subscription); creatorConfig.products.Add(product); var dependsOn = new[] { $"[resourceId('Microsoft.ApiManagement/service/products', parameters('ApimServiceName'), '{product.name}')]" }; // act var subscriptionsTemplateResources = subscriptionTemplateCreator.CreateSubscriptionsTemplateResources(product, dependsOn); // assert var subscriptionsTemplateResource = subscriptionsTemplateResources[0]; Assert.Equal($"/products/{product.name}", subscriptionsTemplateResource.properties.scope); Assert.Equal(subscription.displayName, subscriptionsTemplateResource.properties.displayName); Assert.Equal(subscription.primaryKey, subscriptionsTemplateResource.properties.primaryKey); Assert.Equal(subscription.secondaryKey, subscriptionsTemplateResource.properties.secondaryKey); Assert.Equal(subscription.state, subscriptionsTemplateResource.properties.state); Assert.Equal(subscription.allowTracing, subscriptionsTemplateResource.properties.allowTracing); }
static void Main() { // Log messages from SDK to the console Trace.Listeners.Add(new ConsoleTraceListener()); IRtmClient client = new RtmClientBuilder(endpoint, appkey).Build(); client.OnEnterConnected += cn => Console.WriteLine("Connected to Satori RTM!"); client.OnError += ex => Console.WriteLine("Failed to connect: " + ex.Message); client.Start(); var observer = new SubscriptionObserver(); observer.OnEnterSubscribed += (ISubscription sub) => Console.WriteLine("Subscribed to: " + sub.SubscriptionId); observer.OnLeaveSubscribed += (ISubscription sub) => Console.WriteLine("Unsubscribed from: " + sub.SubscriptionId); observer.OnSubscriptionData += (ISubscription sub, RtmSubscriptionData data) => { foreach (JToken jToken in data.Messages) { Console.WriteLine("Got message: " + jToken); } }; observer.OnSubscribeError += (ISubscription sub, Exception err) => Console.WriteLine("Failed to subscribe: " + err.Message); observer.OnSubscriptionError += (ISubscription sub, RtmSubscriptionError err) => Console.WriteLine("Subscription failed. RTM sent the unsolicited error {0}: {1}", err.Code, err.Reason); client.CreateSubscription("animals", SubscriptionModes.Simple, observer); client.RemoveSubscription("animals"); var cfg = new SubscriptionConfig(SubscriptionModes.Simple, observer) { Filter = "SELECT * FROM `animals` WHERE who LIKE 'z%'" }; client.CreateSubscription("animals", cfg); Console.ReadKey(); // Stop and clean up the client before exiting the program client.Dispose().Wait(); }
static async Task Async(IRtmClient client) { RtmPublishReply reply = null; try { var message = new Animal { Who = "zebra", Where = new float[] { 34.134358f, -118.321506f } }; reply = await client.Publish("animals", message, Ack.Yes); Console.WriteLine("Publish confirmed"); } catch (Exception ex) { Console.WriteLine("Failed to publish: " + ex.Message); } var observer = new SubscriptionObserver(); observer.OnEnterSubscribed += (ISubscription sub) => Console.WriteLine("Subscribed to: " + sub.SubscriptionId); observer.OnLeaveSubscribed += (ISubscription sub) => Console.WriteLine("Unsubscribed from: " + sub.SubscriptionId); observer.OnSubscriptionData += (ISubscription sub, RtmSubscriptionData data) => { foreach (JToken jToken in data.Messages) { Console.WriteLine("Got message: " + jToken); } }; observer.OnSubscribeError += (ISubscription sub, Exception err) => Console.WriteLine("Failed to subscribe: " + err.Message); observer.OnSubscriptionError += (ISubscription sub, RtmSubscriptionError err) => Console.WriteLine("Subscription failed. RTM sent the unsolicited error {0}: {1}", err.Code, err.Reason); var cfg = new SubscriptionConfig(SubscriptionModes.Simple, observer) { Position = reply?.Position }; client.CreateSubscription("animals", cfg); }
public SubscriptionConfig GetSubscriptionConfig(long id) { SubscriptionConfig config = null; TransactionalStorage.Batch(accessor => { var listItem = accessor.Lists.Read(Constants.RavenSubscriptionsPrefix, id.ToString("D19")); if (listItem == null) { throw new SubscriptionDoesNotExistException("There is no subscription configuration for specified identifier (id: " + id + ")"); } config = listItem.Data.JsonDeserialization <SubscriptionConfig>(); }); return(config); }
public void WhenSearch_ThenReturnsSubscriptions() { var config = new SubscriptionConfig(); var subscription = new WebhookSubscription { Event = "aneventname", Config = config }; cacheClient.Setup(cc => cc.Get <object>("akey")) .Returns(subscription); var result = store.Search("aneventname"); Assert.That(result[0].Config, Is.EqualTo(config)); cacheClient.As <ICacheClientExtended>().Verify(cc => cc.GetKeysByPattern(CacheClientSubscriptionStore.CachekeyPrefix + "*")); cacheClient.Verify(cc => cc.Get <object>("akey")); }
public Task Subscribe(List <ushort> signalIds, Action <SubscriptionStateEventArgs> callBack) { _callBack = callBack; TryConnect(); var subConfig = new SubscriptionConfig() .Identity(_identity) .Timeout(TimeSpan.FromMilliseconds(_timeout)); foreach (var id in signalIds) { subConfig.AddSignal(id); } subConfig.AddAoI(); _subscription = _connection.CreateNewSubscription(subConfig); SubscribeInternal(); return(Task.CompletedTask); }
/// <summary> /// Adds a new subscription item to the configuration. /// </summary> private void AddItemToSubscription(ServerNodeTag serverNodeTag) { // create new monitored item ItemConfig itemConfig = new() { NodeID = serverNodeTag.NodeIdStr, DisplayName = serverNodeTag.DisplayName, TagCode = GetTagCode(serverNodeTag), Tag = new ItemConfigTag(0) }; if (GetDataTypeName(serverNodeTag.NodeId, out string dataTypeName)) { itemConfig.DataTypeName = dataTypeName; } // find subscription TreeNode deviceNode = tvDevice.SelectedNode; TreeNode subscriptionNode = deviceNode?.FindClosest(typeof(SubscriptionConfig)) ?? subscriptionsNode.LastNode; SubscriptionConfig subscriptionConfig; // add new subscription if (subscriptionNode == null) { subscriptionConfig = new SubscriptionConfig(); subscriptionNode = CreateSubscriptionNode(subscriptionConfig); tvDevice.Insert(subscriptionsNode, subscriptionNode, deviceConfig.Subscriptions, subscriptionConfig); } else { subscriptionConfig = (SubscriptionConfig)subscriptionNode.Tag; } // add monitored item TreeNode itemNode = CreateItemNode(itemConfig); tvDevice.Insert(subscriptionNode, itemNode, subscriptionConfig.Items, itemConfig); UpdateTagNums(itemNode); Modified = true; }
public long CreateSubscription(SubscriptionCriteria criteria) { long id = -1; Database.TransactionalStorage.Batch(accessor => { id = accessor.General.GetNextIdentityValue(Constants.RavenSubscriptionsPrefix); var config = new SubscriptionConfig { SubscriptionId = id, Criteria = criteria, AckEtag = Etag.Empty }; SaveSubscriptionConfig(id, config); }); return(id); }
public SubscriptionsTemplateResource CreateSubscriptionsTemplateResource(SubscriptionConfig subscription, string[] dependsOn) { return(new SubscriptionsTemplateResource { Name = $"[concat(parameters('ApimServiceName'), '/{subscription.name}')]", Type = "Microsoft.ApiManagement/service/subscriptions", ApiVersion = "2019-01-01", Properties = new SubscriptionsTemplateProperties { ownerId = subscription.ownerId, scope = subscription.scope, displayName = subscription.displayName, primaryKey = subscription.primaryKey, secondaryKey = subscription.secondaryKey, state = subscription.state, allowTracing = subscription.allowTracing, }, DependsOn = dependsOn, }); }
public void ShouldCreateSubscriptionResourceFromSubscriptionConfig() { // arrange SubscriptionTemplateCreator subscriptionTemplateCreator = new SubscriptionTemplateCreator(); CreatorConfig creatorConfig = new CreatorConfig() { subscriptions = new List <SubscriptionConfig>() }; SubscriptionConfig subscription = new SubscriptionConfig() { name = "subscriptionName", ownerId = "user/ownerId", scope = "/products/productId", displayName = "displayName", primaryKey = "primaryKey", secondaryKey = "secondaryKey", state = "active", allowTracing = true, }; string[] dependsOn = new string[] { "dependsOn" }; // act SubscriptionsTemplateResource subscriptionsTemplateResource = subscriptionTemplateCreator.CreateSubscriptionsTemplateResource(subscription, dependsOn); // assert Assert.Equal($"[concat(parameters('ApimServiceName'), '/{subscription.name}')]", subscriptionsTemplateResource.name); Assert.Equal($"Microsoft.ApiManagement/service/subscriptions", subscriptionsTemplateResource.type); Assert.Equal("2019-01-01", subscriptionsTemplateResource.apiVersion); Assert.Equal(subscription.scope, subscriptionsTemplateResource.properties.scope); Assert.Equal(subscription.displayName, subscriptionsTemplateResource.properties.displayName); Assert.Equal(subscription.primaryKey, subscriptionsTemplateResource.properties.primaryKey); Assert.Equal(subscription.secondaryKey, subscriptionsTemplateResource.properties.secondaryKey); Assert.Equal(subscription.state, subscriptionsTemplateResource.properties.state); Assert.Equal(subscription.allowTracing, subscriptionsTemplateResource.properties.allowTracing); Assert.Equal(dependsOn, subscriptionsTemplateResource.dependsOn); }
public void GenerateSubscriptions() { stringOperator.Add("!="); stringOperator.Add("=="); numberOperator.Add(">"); numberOperator.Add("<"); numberOperator.Add(">="); numberOperator.Add("<="); numberOperator.Add("=="); numberOperator.Add("!="); var subscriptionConfig = new SubscriptionConfig(); var numberOfSubscriptions = subscriptionConfig.NumberOfSubscriptions; var subscriptions = new List <Subscription>(); var subscriptionsToFill = numberOfSubscriptions; for (int i = 0; i < numberOfSubscriptions; i++) { subscriptions.Add(new Subscription()); } var companies = GenerateCompanies(_subscriptionConfig.CompaniesFrequency); var values = GenerateValues(_subscriptionConfig.ValueFrequency); var drops = GenerateDrops(_subscriptionConfig.DropFrequency); var variations = GenerateVariations(_subscriptionConfig.VariationFrequency); var dates = GenerateDates(_subscriptionConfig.DatesFrequency); var remainingEqualOperatorFrequency = subscriptionConfig.EqualOperatorFrequency; foreach (var company in companies) { int index = _random.Next(subscriptions.Count); if (subscriptionsToFill > 0) { while (subscriptions[index].Company != null || subscriptions[index].HasAtLeastOneField == true) { index = _random.Next(subscriptions.Count); } } else { while (subscriptions[index].Company != null) { index = _random.Next(subscriptions.Count); } } if (remainingEqualOperatorFrequency > 0) { subscriptions[index].Company = new CompanyModel(company, "=="); remainingEqualOperatorFrequency--; } else { subscriptions[index].Company = new CompanyModel(company, GenerateRandomStringOperator()); } subscriptions[index].HasAtLeastOneField = true; subscriptionsToFill--; } foreach (var value in values) { int index = _random.Next(subscriptions.Count); if (subscriptionsToFill > 0) { while (subscriptions[index].Value != null || subscriptions[index].HasAtLeastOneField == true) { index = _random.Next(subscriptions.Count); } } else { while (subscriptions[index].Value != null) { index = _random.Next(subscriptions.Count); } } subscriptions[index].Value = new ValueModel(value, GenerateRandomNumberOperator()); subscriptions[index].HasAtLeastOneField = true; subscriptionsToFill--; } foreach (var drop in drops) { int index = _random.Next(subscriptions.Count); if (subscriptionsToFill > 0) { while (subscriptions[index].Drop != null || subscriptions[index].HasAtLeastOneField == true) { index = _random.Next(subscriptions.Count); } } else { while (subscriptions[index].Drop != null) { index = _random.Next(subscriptions.Count); } } subscriptions[index].Drop = new DropModel(drop, GenerateRandomNumberOperator()); subscriptions[index].HasAtLeastOneField = true; subscriptionsToFill--; } foreach (var variation in variations) { int index = _random.Next(subscriptions.Count); if (subscriptionsToFill > 0) { while (subscriptions[index].Variation != null || subscriptions[index].HasAtLeastOneField == true) { index = _random.Next(subscriptions.Count); } } else { while (subscriptions[index].Variation != null) { index = _random.Next(subscriptions.Count); } } subscriptions[index].Variation = new VariationModel(variation, GenerateRandomNumberOperator()); subscriptions[index].HasAtLeastOneField = true; subscriptionsToFill--; } foreach (var date in dates) { int index = _random.Next(subscriptions.Count); if (subscriptionsToFill > 0) { while (subscriptions[index].Date != null || subscriptions[index].HasAtLeastOneField == true) { index = _random.Next(subscriptions.Count); } } else { while (subscriptions[index].Date != null) { index = _random.Next(subscriptions.Count); } } subscriptions[index].Date = new DateModel(date, GenerateRandomStringOperator()); subscriptions[index].HasAtLeastOneField = true; subscriptionsToFill--; } StringBuilder stringBuilder = new StringBuilder(); foreach (var subscription in subscriptions) { if (stringBuilder.Length >= 2) { stringBuilder.Append("\n"); } stringBuilder.Append("{"); if (subscription.Company != null) { stringBuilder.Append($"(company,{subscription.Company.Operator},\"{subscription.Company.Value}\");"); } if (subscription.Value != null) { stringBuilder.Append($"(value,{subscription.Value.Operator},{subscription.Value.Value});"); } if (subscription.Drop != null) { stringBuilder.Append($"(drop,{subscription.Drop.Operator},{subscription.Drop.Value});"); } if (subscription.Variation != null) { stringBuilder.Append($"(variation,{subscription.Variation.Operator},{subscription.Variation.Value});"); } if (subscription.Date != null) { stringBuilder.Append($"(date,{subscription.Date.Operator},{subscription.Date.Value});"); } stringBuilder.Append("}"); stringBuilder.Remove(stringBuilder.Length - 2, 1); } System.IO.File.WriteAllText("subscriptions.txt", stringBuilder.ToString()); Console.WriteLine(stringBuilder.ToString()); Console.WriteLine(); }
private void SaveSubscriptionConfig(long id, SubscriptionConfig config) { Database.TransactionalStorage.Batch(accessor => accessor.Lists.Set(Constants.RavenSubscriptionsPrefix, id.ToString("D19"), RavenJObject.FromObject(config), UuidType.Subscriptions)); }
public void Subscribe(Func <object, Task <HandleResult> > handler, SubscriptionType type = SubscriptionType.SharedBetweenConsumers, SubscriptionConfig configuration = null) { _bus.Subscribe <TPayload>(this, handler, type, configuration); }
private void ForceReleaseAndOpenForNewClient(long id, SubscriptionConnectionOptions oldOptions, SubscriptionConnectionOptions newOptions, SubscriptionConfig config, bool allowExistingClientToAcknowledge = false) { if (allowExistingClientToAcknowledge && config.TimeOfLastAcknowledgment < config.TimeOfSendingLastBatch) { // we know that there is active client with unconfirmed batch // allow him to send ack in nearest future if has enough time var now = SystemTime.UtcNow; var timeSinceBatchSent = now - config.TimeOfSendingLastBatch; if (timeSinceBatchSent < oldOptions.BatchOptions.AcknowledgmentTimeout) { var ackMustBeDeliveredBefore = config.TimeOfSendingLastBatch + oldOptions.BatchOptions.AcknowledgmentTimeout; allowedOneTimeAcknowledgements.TryAdd(id, new OneTimeAcknowledgement { ConnectionId = oldOptions.ConnectionId, ValidUntil = ackMustBeDeliveredBefore, AckDelivered = new ManualResetEventSlim(false) }); } } ReleaseSubscription(id); openSubscriptions.TryAdd(id, newOptions); UpdateClientActivityDate(id); }
/// <summary> /// Gets a text for the subscription tree node. /// </summary> private static string GetSubscriptionNodeText(SubscriptionConfig subscription) { return(string.IsNullOrEmpty(subscription.DisplayName) ? DriverPhrases.UnnamedSubscription : subscription.DisplayName); }
/// <summary> /// Creates a tree node according to the subscription configuration. /// </summary> private static TreeNode CreateSubscriptionNode(SubscriptionConfig subscription) { return(TreeViewExtensions.CreateNode(GetSubscriptionNodeText(subscription), ImageKey.Elem, subscription)); }
/// <summary> /// Adds a new item to the configuration. /// </summary> private bool AddItem(TreeNode serverNode) { if (serverNode?.Tag is ServerNodeTag serverNodeTag && serverNodeTag.NodeClass == NodeClass.Variable) { TreeNode deviceNode = tvDevice.SelectedNode; object deviceNodeTag = deviceNode?.Tag; if (GetTopParentNode(tvDevice.SelectedNode) == commandsNode) { // add a new command if (GetDataTypeName(serverNodeTag.OpcNodeId, out string dataTypeName)) { CommandConfig commandConfig = new CommandConfig { NodeID = serverNodeTag.OpcNodeId.ToString(), DisplayName = serverNodeTag.DisplayName, DataTypeName = dataTypeName, CmdNum = GetNextCmdNum() }; tvDevice.Insert(commandsNode, CreateCommandNode(commandConfig), deviceConfig.Commands, commandConfig); Modified = true; return(true); } } else { // create a new monitored item ItemConfig itemConfig = new ItemConfig { NodeID = serverNodeTag.OpcNodeId.ToString(), DisplayName = serverNodeTag.DisplayName, }; itemConfig.Tag = new ItemConfigTag(0, itemConfig.IsArray, itemConfig.ArrayLen); // find a subscription TreeNode subscriptionNode = deviceNode?.FindClosest(typeof(SubscriptionConfig)) ?? subscriptionsNode.LastNode; SubscriptionConfig subscriptionConfig; // add a new subscription if (subscriptionNode == null) { subscriptionConfig = new SubscriptionConfig(); subscriptionNode = CreateSubscriptionNode(subscriptionConfig); tvDevice.Insert(subscriptionsNode, subscriptionNode, deviceConfig.Subscriptions, subscriptionConfig); } else { subscriptionConfig = (SubscriptionConfig)subscriptionNode.Tag; } // add the monitored item TreeNode itemNode = CreateItemNode(itemConfig); tvDevice.Insert(subscriptionNode, itemNode, subscriptionConfig.Items, itemConfig); UpdateSignals(itemNode); Modified = true; return(true); } } return(false); }