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());
             return(true);
         }
         else
         {
             Logger.LogInformation("Ignoring AddFrontend call");
             return(false);
         }
     }
     finally
     {
         SemaphoreSlim.Release();
         Logger.LogTrace("AddFrontend() released");
     }
 }
 public static void AddFrontend(CoreDispatcher coreDispatcher, ISignalFrontend frontend)
 {
     if (!frames.ContainsKey(coreDispatcher))
     {
         frames.Add(coreDispatcher, frontend);
     }
 }
        public async Task <bool> Acquire(CoreDispatcher d, ISignalFrontend w) //TODO wrap trycatch dispatch auth failure
        {
            Logger.LogTrace("Acquire() locking");
            CancelSource = new CancellationTokenSource();
            SemaphoreSlim.Wait(CancelSource.Token);
            try
            {
                GlobalResetEvent = LibUtils.OpenResetEventSet();
                LibUtils.Lock();
                GlobalResetEvent.Reset();
                MainWindowDispatcher = d;
                MainWindow           = w;
                Logger.LogDebug("Acquire() locked (global and local)");
                var getConversationsTask = Task.Run(() =>
                {
                    return(GetConversations()); // we want to display the conversations asap!
                });
                Instance = this;
                Frames.Add(d, w);
                w.ReplaceConversationList(await getConversationsTask);
                var failTask = Task.Run(() =>
                {
                    SignalDBContext.FailAllPendingMessages(); // TODO GetMessages needs to be protected by semaphoreslim as we fail defered
                });
                Store = await Task.Run(() =>
                {
                    return(LibsignalDBContext.GetSignalStore());
                });

                if (Store == null)
                {
                    return(false);
                }
                else
                {
                    LikelyHasValidStore = true;
                }
                var initNetwork = Task.Run(async() =>
                {
                    await InitNetwork();
                });
                var recoverDownloadsTask = Task.Run(() =>
                {
                    RecoverDownloads().Wait();
                });
                await failTask; // has to complete before messages are loaded
                await recoverDownloadsTask;
                Running = true;
                return(true);
            }
            finally
            {
                SemaphoreSlim.Release();
                Logger.LogTrace("Acquire() released");
            }
        }
 public void AddFrontend(CoreDispatcher d, ISignalFrontend w)
 {
     Logger.LogTrace("AddFrontend() locking");
     SemaphoreSlim.Wait(CancelSource.Token);
     Logger.LogTrace("AddFrontend() locked");
     if (Running)
     {
         Logger.LogInformation("Registering frontend of dispatcher {0}", w.GetHashCode());
         Frames.Add(d, w);
         w.ReplaceConversationList(GetConversations());
     }
     else
     {
         Logger.LogInformation("Ignoring AddFrontend call, release in progress");
     }
     SemaphoreSlim.Release();
     Logger.LogTrace("AddFrontend() released");
 }
        public async Task Acquire(CoreDispatcher d, ISignalFrontend w) //TODO wrap trycatch dispatch auth failure
        {
            Logger.LogTrace("Acquire() locking");
            CancelSource = new CancellationTokenSource();
            SemaphoreSlim.Wait(CancelSource.Token);
            GlobalResetEvent = LibUtils.OpenResetEventSet();
            LibUtils.Lock();
            GlobalResetEvent.Reset();
            var getConversationsTask = Task.Run(() =>
            {
                return(GetConversations()); // we want to display the conversations asap!
            });

            Logger.LogDebug("Acquire() locked (global and local)");
            Instance = this;
            Frames.Add(d, w);
            w.ReplaceConversationList(await getConversationsTask);
            var failTask = Task.Run(() =>
            {
                SignalDBContext.FailAllPendingMessages(); // TODO GetMessages needs to be protected by semaphoreslim as we fail defered
            });

            Store = await Task.Run(() =>
            {
                return(LibsignalDBContext.GetSignalStore());
            });

            if (Store == null)
            {
                SemaphoreSlim.Release();
                throw new Exception("Signal Store has not been setup yet.");
            }
            await Task.Run(() =>
            {
                InitNetwork();
            });

            await failTask; // has to complete before messages are loaded

            Running = true;
            Logger.LogTrace("Acquire() releasing");
            SemaphoreSlim.Release();
        }