Exemple #1
0
 /// <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();
 }