/// <summary> /// Updates a subscription in the list. /// </summary> private void Update(ListViewItem item) { Ae.TsCAeSubscription subscription = (Ae.TsCAeSubscription)item.Tag; item.Text = subscription.Name; item.SubItems[1].Text = (subscription.Active)?"Yes":"No"; }
/// <summary> /// Removes a subscription from the control. /// </summary> public void RemoveSubscription(Ae.TsCAeSubscription subscription) { State state = (State)m_subscriptions[subscription.ClientHandle]; if (state != null) { // unregister call backs. subscription.DataChangedEvent -= state.EventHandler; // remove subscription. m_subscriptions.Remove(subscription.ClientHandle); // compile list of item to delete. ArrayList itemsToDelete = new ArrayList(); foreach (ListViewItem item in NotificationsLV.Items) { TsCAeEventNotification notification = (TsCAeEventNotification)item.Tag; if (notification.ClientHandle.Equals(subscription.ClientHandle)) { itemsToDelete.Add(item); } } // delete items. foreach (ListViewItem item in itemsToDelete) { item.Remove(); } } }
/// <summary> /// Called when the close button is clicked. /// </summary> private void DoneBTN_Click(object sender, System.EventArgs e) { try { m_areas = AreaSourcesListCTRL.GetAreas(); m_sources = AreaSourcesListCTRL.GetSources(); // don't activate until all the filters are applied. bool active = m_state.Active; bool update = m_subscription != null; // create new subscription. if (m_subscription == null) { m_state.Active = false; m_state.ClientHandle = Guid.NewGuid().ToString(); m_subscription = (Ae.TsCAeSubscription)m_server.CreateSubscription(m_state); } // update existing subscription. else { m_subscription.ModifyState(((int)TsCAeStateMask.All & ~(int)TsCAeStateMask.Active), m_state); } // select filters. m_filters.Areas.Clear(); m_filters.Areas.AddRange(m_areas); m_filters.Sources.Clear(); m_filters.Sources.AddRange(m_sources); m_subscription.SetFilters(m_filters); // select attributes. IDictionaryEnumerator enumerator = m_attributes.GetEnumerator(); while (enumerator.MoveNext()) { int categoryID = (int)enumerator.Key; OpcClientSdk.Ae.TsCAeAttributeCollection attributeIDs = (OpcClientSdk.Ae.TsCAeAttributeCollection)enumerator.Value; m_subscription.SelectReturnedAttributes(categoryID, attributeIDs.ToArray()); } // activate the subscription. if (active || update) { m_state.Active = active; m_subscription.ModifyState((int)TsCAeStateMask.Active, m_state); } // close the dialog. DialogResult = DialogResult.OK; Close(); } catch (Exception exception) { MessageBox.Show(exception.Message); } }
/////////////////////////////////////////////////////////////////////// #region Private Methods /// <summary> /// Called when a subscription object is disposed. /// </summary> /// <param name="subscription"></param> internal void SubscriptionDisposed(Ae.TsCAeSubscription subscription) { if (!_disposing) { _subscriptions.Remove(subscription); } }
/////////////////////////////////////////////////////////////////////// #region ICloneable Members /// <summary> /// Returns an unconnected copy of the subscription with the same items. /// </summary> public virtual object Clone() { // do a memberwise clone. Ae.TsCAeSubscription clone = (Ae.TsCAeSubscription)MemberwiseClone(); /* * // place clone in disconnected state. * clone.server = null; * clone.subscription = null; * clone.state = (SubscriptionState)state.Clone(); * * // clear server handles. * clone.state.ServerHandle = null; * * // always make cloned subscriptions inactive. * clone.state.Active = false; * * // clone items. * if (clone.items != null) * { * ArrayList items = new ArrayList(); * * foreach (Item item in clone.items) * { * items.Add(item.Clone()); * } * * clone.items = (Item[])items.ToArray(typeof(Item)); * } */ // return clone. return(clone); }
/// <summary> /// Toggles the active/inactive state for a subscription. /// </summary> private void ActiveMI_Click(object sender, System.EventArgs e) { try { ListViewItem item = SubscriptionsLV.SelectedItems[0]; Ae.TsCAeSubscription subscription = (Ae.TsCAeSubscription)item.Tag; Ae.TsCAeSubscriptionState state = new Ae.TsCAeSubscriptionState(); state.Active = !ActiveMI.Checked; subscription.ModifyState((int)TsCAeStateMask.Active, state); // toggle checkbox. ActiveMI.Checked = !ActiveMI.Checked; // update list. Update(item); // receive notifications. if (m_SubscriptionAction != null) { m_SubscriptionAction(subscription, !subscription.Active); } // adjust columns. AdjustColumns(SubscriptionsLV); } catch (Exception exception) { MessageBox.Show(exception.Message); } }
/// <summary> /// Adds a subscription to the control. /// </summary> public void AddSubscription(Ae.TsCAeSubscription subscription) { if (subscription == null) { throw new ArgumentNullException(); } if (m_subscriptions.Contains(subscription.ClientHandle)) { throw new ArgumentException("Subscription exists"); } // update current server. if (m_server != subscription.Server) { m_server = subscription.Server; } State state = new State(); state.Subscription = subscription; state.EventHandler = new TsCAeDataChangedEventHandler(Subscription_EventChanged); subscription.DataChangedEvent += new TsCAeDataChangedEventHandler(Subscription_EventChanged); m_subscriptions.Add(subscription.ClientHandle, state); }
/// <summary> /// Adds a subscription to the end of the collection. /// </summary> internal void Add(Ae.TsCAeSubscription subscription) { TsCAeSubscription[] array = new TsCAeSubscription[Count + 1]; Array.CopyTo(array, 0); array[Count] = subscription; Array = array; }
/// <summary> /// Adds a subscription to the list. /// </summary> private void Add(Ae.TsCAeSubscription subscription) { ListViewItem item = new ListViewItem(subscription.Name, Resources.IMAGE_ENVELOPE); item.SubItems.Add((subscription.Active)?"Yes":"No"); item.Tag = subscription; SubscriptionsLV.Items.Add(item); }
/// <summary> /// Prompts a user to create a new subscription with a modal dialog. /// </summary> public Ae.TsCAeSubscription ShowDialog(TsCAeServer server, Ae.TsCAeSubscription subscription) { if (server == null) { throw new ArgumentNullException("server"); } m_server = server; m_subscription = subscription; // go to the initial stage. m_stage = 0; ChangeStage(0); // initialize controls. StateCTRL.SetDefaults(); FiltersCTRL.SetDefaults(); CategoriesCTRL.ShowCategories(m_server); AttributesCTRL.ShowAttributes(m_server); BrowseCTRL.ShowAreas(m_server); if (m_subscription != null) { m_state = m_subscription.GetState(); m_filters = m_subscription.GetFilters(); m_attributes = m_subscription.GetAttributes(); m_areas = m_subscription.Areas.ToArray(); m_sources = m_subscription.Sources.ToArray(); } else { m_state.Name = String.Format("Subscription{0,3:000}", ++m_count); } // set current values. StateCTRL.Set(m_state); FiltersCTRL.Set(m_filters); CategoriesCTRL.SetSelectedCategories(m_filters.Categories.ToArray()); AttributesCTRL.SetSelectedAttributes(m_attributes); AreaSourcesListCTRL.AddAreas(m_areas); AreaSourcesListCTRL.AddSources(m_sources); // show dialog. if (ShowDialog() != DialogResult.OK) { return(null); } // return updated/created subscription. return(m_subscription); }
/// <summary> /// Contructs a server by de-serializing its OpcUrl from the stream. /// </summary> protected TsCAeServer(SerializationInfo info, StreamingContext context) : base(info, context) { int count = (int)info.GetValue(Names.COUNT, typeof(int)); _subscriptions = new SubscriptionCollection(); for (int ii = 0; ii < count; ii++) { Ae.TsCAeSubscription subscription = (Ae.TsCAeSubscription)info.GetValue(Names.SUBSCRIPTION + ii.ToString(), typeof(Ae.TsCAeSubscription)); _subscriptions.Add(subscription); } }
/// <summary> /// Refreshes the current subscription. /// </summary> private void RefreshMI_Click(object sender, System.EventArgs e) { try { ListViewItem item = SubscriptionsLV.SelectedItems[0]; Ae.TsCAeSubscription subscription = (Ae.TsCAeSubscription)item.Tag; subscription.Refresh(); } catch (Exception exception) { MessageBox.Show(exception.Message); } }
/// <summary> /// Displays the event notifications. /// </summary> public void ShowDialog(Ae.TsCAeSubscription subscription, TsCAeEventNotification notification) { if (subscription == null) { throw new ArgumentNullException("subscription"); } m_subscription = subscription; m_notification = notification; AcknowledgeBTN.Enabled = notification.AckRequired; NotificationCTRL.ShowNotification(subscription, notification); ShowDialog(); }
/// <summary> /// Establishes a subscription based on the template provided. /// </summary> private Ae.TsCAeSubscription EstablishSubscription(Ae.TsCAeSubscription template) { ITsCAeSubscription remoteServer = null; try { // create remote object. remoteServer = ((ITsCAeServer)_server).CreateSubscription(template.State); if (remoteServer == null) { return(null); } // create wrapper. Ae.TsCAeSubscription subscription = new Ae.TsCAeSubscription(this, remoteServer, template.State); // set filters. subscription.SetFilters(template.Filters); // set attributes. IDictionaryEnumerator enumerator = template.Attributes.GetEnumerator(); while (enumerator.MoveNext()) { subscription.SelectReturnedAttributes( (int)enumerator.Key, ((Ae.TsCAeSubscription.AttributeCollection)enumerator.Value).ToArray()); } // return new subscription return(subscription); } catch { if (remoteServer != null) { remoteServer.Dispose(); remoteServer = null; } } // return null. return(null); }
/// <summary> /// Removes a subscription to the from the collection. /// </summary> internal void Remove(Ae.TsCAeSubscription subscription) { TsCAeSubscription[] array = new TsCAeSubscription[Count - 1]; int index = 0; for (int ii = 0; ii < Array.Length; ii++) { TsCAeSubscription element = (TsCAeSubscription)Array.GetValue(ii); if (subscription != element) { array[index++] = element; } } Array = array; }
/// <summary> /// Adds or removes a subscription from the event notifications control. /// </summary> private void SubscriptionsCTRL_SubscriptionAction(Ae.TsCAeSubscription subscription, bool deleted) { try { if (deleted) { EventListCTRL.RemoveSubscription(subscription); } else { EventListCTRL.AddSubscription(subscription); } } catch (Exception exception) { MessageBox.Show(exception.Message); } }
/// <summary> /// Creates a new event subscription. /// </summary> /// <param name="state">The initial state for the subscription.</param> /// <returns>The new subscription object.</returns> public ITsCAeSubscription CreateSubscription(Ae.TsCAeSubscriptionState state) { if (_server == null) { throw new NotConnectedException(); } // create remote object. ITsCAeSubscription subscription = ((ITsCAeServer)_server).CreateSubscription(state); if (subscription != null) { // create wrapper. Ae.TsCAeSubscription wrapper = new Ae.TsCAeSubscription(this, subscription, state); _subscriptions.Add(wrapper); return(wrapper); } // should never happen. return(null); }
/// <summary> /// Deletes a subscription. /// </summary> private void DeleteMI_Click(object sender, System.EventArgs e) { try { ListViewItem item = SubscriptionsLV.SelectedItems[0]; Ae.TsCAeSubscription subscription = (Ae.TsCAeSubscription)item.Tag; // send notifications. if (m_SubscriptionAction != null) { m_SubscriptionAction(subscription, true); } // remove from list. item.Remove(); } catch (Exception exception) { MessageBox.Show(exception.Message); } }
/// <summary> /// Edits the state of a subscription. /// </summary> private void EditMI_Click(object sender, System.EventArgs e) { try { ListViewItem item = SubscriptionsLV.SelectedItems[0]; Ae.TsCAeSubscription subscription = (Ae.TsCAeSubscription)item.Tag; // show properties dialog. bool active = subscription.Active; new SubscriptionEditDlg().ShowDialog(m_server, subscription); if (subscription == null) { return; } // update list. Update(item); // send notifications. if (active != subscription.Active) { if (m_SubscriptionAction != null) { m_SubscriptionAction(subscription, !subscription.Active); } } // adjust columns. AdjustColumns(SubscriptionsLV); } catch (Exception exception) { MessageBox.Show(exception.Message); } }
/// <summary> /// Displays the notification in the control. /// </summary> public void ShowNotification(Ae.TsCAeSubscription subscription, TsCAeEventNotification notification) { // check for null value. if (notification == null) { SourceTB.Text = ""; TimeTB.Text = ""; MessageTB.Text = ""; EventTypeTB.Text = ""; EventCategoryTB.Text = ""; ConditionNameTB.Text = ""; SubConditionNameTB.Text = ""; NewStateTB.Text = ""; AckRequiredTB.Text = ""; QualityTB.Text = ""; ActiveTimeTB.Text = ""; ActorTB.Text = ""; AttributesLV.Items.Clear(); return; } // find category. OpcClientSdk.Ae.TsCAeCategory category = null; try { OpcClientSdk.Ae.TsCAeCategory[] categories = subscription.Server.QueryEventCategories((int)notification.EventType); for (int ii = 0; ii < categories.Length; ii++) { if (categories[ii].ID == notification.EventCategory) { category = categories[ii]; break; } } } catch { category = null; } // find attributes. ArrayList attributes = new ArrayList(); try { // get attribute descriptions. OpcClientSdk.Ae.TsCAeAttribute[] descriptions = subscription.Server.QueryEventAttributes(notification.EventCategory); // get selected attributes. int[] attributeIDs = null; if (subscription.Attributes.Contains(notification.EventCategory)) { attributeIDs = subscription.Attributes[notification.EventCategory].ToArray(); } // find decriptions for selected attributes. if (attributeIDs != null) { for (int ii = 0; ii < attributeIDs.Length; ii++) { for (int jj = 0; jj < descriptions.Length; jj++) { if (descriptions[jj].ID == attributeIDs[ii]) { attributes.Add(descriptions[jj]); break; } } } } } catch { // ignore errors. } SourceTB.Text = notification.SourceID; TimeTB.Text = OpcClientSdk.OpcConvert.ToString(notification.Time); MessageTB.Text = notification.Message; EventTypeTB.Text = OpcClientSdk.OpcConvert.ToString(notification.EventType); EventCategoryTB.Text = (category != null)?category.Name:""; ConditionNameTB.Text = notification.ConditionName; SubConditionNameTB.Text = notification.SubConditionName; NewStateTB.Text = ""; AckRequiredTB.Text = OpcClientSdk.OpcConvert.ToString(notification.AckRequired); QualityTB.Text = OpcClientSdk.OpcConvert.ToString(notification.Quality); ActiveTimeTB.Text = OpcClientSdk.OpcConvert.ToString(notification.ActiveTime); ActorTB.Text = notification.ActorID; // convert state to a string. if ((notification.NewState & (int)Ae.TsCAeConditionState.Active) != 0) { NewStateTB.Text += Ae.TsCAeConditionState.Active.ToString(); } if ((notification.NewState & (int)Ae.TsCAeConditionState.Enabled) != 0) { if (NewStateTB.Text != "") { NewStateTB.Text += " AND "; } NewStateTB.Text += Ae.TsCAeConditionState.Enabled.ToString(); } if ((notification.NewState & (int)Ae.TsCAeConditionState.Acknowledged) != 0) { if (NewStateTB.Text != "") { NewStateTB.Text += " AND "; } NewStateTB.Text += Ae.TsCAeConditionState.Acknowledged.ToString(); } // fill attributes list. AttributesLV.Items.Clear(); for (int ii = 0; ii < notification.Attributes.Count; ii++) { OpcClientSdk.Ae.TsCAeAttribute attribute = (ii < attributes.Count)?(OpcClientSdk.Ae.TsCAeAttribute)attributes[ii]:null; ListViewItem item = new ListViewItem((attribute != null)?attribute.Name:"Unknown"); item.SubItems.Add(OpcClientSdk.OpcConvert.ToString(notification.Attributes[ii])); AttributesLV.Items.Add(item); } AdjustColumns(AttributesLV); }