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(); }