/// <summary> /// TODO: Remove event if not called after a hour. /// </summary> /// <param name="listenerGuid"></param> /// <param name="e"></param> public void AddEvent(Guid listenerGuid, GXEvent e) { lock (Sessions) { GXSession session = GetSession(listenerGuid); if (session != null) { //Check that we are not listen this client. foreach (GXEvent e1 in session.NotifyClients) { if (e1.Instance == e.Instance) { session.NotifyClients.Remove(e1); break; } } session.NotifyClients.Add(e); } else { GXSession ses = new GXSession(e.Instance); Sessions.Add(ses); ses.NotifyClients.Add(e); } } }
/// <summary> /// Start listen events. /// </summary> /// <param name="request"></param> /// <returns></returns> public GXEventsRegisterResponse Post(GXEventsRegisterRequest request) { if (request.SessionListener.Equals(Guid.Empty) || request.Instance.Equals(Guid.Empty)) { throw new Exception("Listener Guid is empty."); } if (request.Actions == Actions.None && request.Targets == ActionTargets.None) { return new GXEventsRegisterResponse(); } IAuthSession s = this.GetSession(false); long id = 0; bool superAdmin = false; Guid guid = request.DataCollectorGuid; //Guid is set if DC is retreaving new tasks. if (long.TryParse(s.Id, out id)) { superAdmin = GuruxAMI.Server.GXBasicAuthProvider.IsSuperAdmin(s); } else { if (request.DataCollectorGuid.Equals(Guid.Empty)) { throw new Exception("Data collector Guid is empty."); } } AppHost host = this.ResolveService<AppHost>(); //Check that there are no several DCs with same Guid. //Note! This might happend when DC is restarted wrong. //For this reason we are only give a warning. List<GXEventsItem> events = new List<GXEventsItem>(); if (host.IsDCRegistered(guid)) { lock (Db) { GXAmiSystemError e = new GXAmiSystemError(1, ActionTargets.SystemError, Actions.State, new Exception("Data collector already exists.")); Db.Insert<GXAmiSystemError>(e); events.Add(new GXEventsItem(ActionTargets.SystemError, Actions.Add, e)); } } ulong mask = (ulong)(((int)request.Targets << 16) | (int)request.Actions); GXEvent e1 = new GXEvent(id, superAdmin, guid, request.Instance, mask); host.AddEvent(request.SessionListener, e1); if (guid != Guid.Empty) { //Notify that DC is connected. lock (Db) { GXAmiDataCollector dc = Db.Select<GXAmiDataCollector>(q => q.Guid == guid)[0]; dc.State = Gurux.Device.DeviceStates.Connected; Db.UpdateOnly(dc, p => p.StatesAsInt, p => p.Id == dc.Id); events.Add(new GXEventsItem(ActionTargets.DataCollector, Actions.State, dc)); } host.SetEvents(Db, this.Request, 0, events); } return new GXEventsRegisterResponse(); }