public bool AddFrontend(CoreDispatcher d, ISignalFrontend w)
 {
     Logger.LogTrace("AddFrontend() locking");
     SemaphoreSlim.Wait(CancelSource.Token);
     try
     {
         Logger.LogTrace("AddFrontend() locked");
         if (Running && LikelyHasValidStore)
         {
             Logger.LogInformation("Registering frontend of dispatcher {0}", w.GetHashCode());
             Frames.Add(d, w);
             w.ReplaceConversationList(GetConversations());
             DisappearingMessagesManager.AddFrontend(d, w);
             return(true);
         }
         else
         {
             Logger.LogInformation("Ignoring AddFrontend call");
             return(false);
         }
     }
     finally
     {
         SemaphoreSlim.Release();
         Logger.LogTrace("AddFrontend() released");
     }
 }
        internal void UpdateMessageExpiration(SignalMessage message, uint conversationExpireTimeSeconds)
        {
            if (message.Type == Signal_Windows.Models.SignalMessageType.Normal && message.ExpiresAt == 0)
            {
                long messageExpiration;
                if (conversationExpireTimeSeconds == 0)
                {
                    messageExpiration = 0;
                }
                else
                {
                    messageExpiration = Util.CurrentTimeMillis() + (long)TimeSpan.FromSeconds(conversationExpireTimeSeconds).TotalMilliseconds;
                }

                if (messageExpiration > 0)
                {
                    message.ExpiresAt = messageExpiration;
                    SignalDBContext.UpdateMessageExpiresAt(message);
                    DisappearingMessagesManager.QueueForDeletion(message);
                }
            }
        }
        public async Task RemoveFrontend(CoreDispatcher d)
        {
            Logger.LogTrace("RemoveFrontend() locking");
            await SemaphoreSlim.WaitAsync(CancelSource.Token);

            try
            {
                Logger.LogTrace("RemoveFrontend() locked");
                Logger.LogInformation("Unregistering frontend of dispatcher {0}", d.GetHashCode());
                DisappearingMessagesManager.RemoveFrontend(d);
                Frames.Remove(d);
            }
            catch (Exception e)
            {
                Logger.LogCritical($"RemoveFrontend failed(): {e.Message} ({e.GetType()})\n{e.StackTrace}");
            }
            finally
            {
                SemaphoreSlim.Release();
                Logger.LogTrace("RemoveFrontend() released");
            }
        }