Exemplo n.º 1
0
        private List <SignalConversation> GetConversations()
        {
            List <SignalConversation> conversations = new List <SignalConversation>();
            List <SignalContact>      contacts      = SignalDBContext.GetAllContactsLocked();
            List <SignalGroup>        groups        = SignalDBContext.GetAllGroupsLocked();
            int amountContacts = contacts.Count;
            int amountGroups   = groups.Count;
            int contactsIdx    = 0;
            int groupsIdx      = 0;

            while (contactsIdx < amountContacts || groupsIdx < amountGroups)
            {
                if (contactsIdx < amountContacts)
                {
                    SignalConversation contact = contacts[contactsIdx];
                    if (groupsIdx < amountGroups)
                    {
                        SignalConversation group = groups[groupsIdx];
                        if (contact.LastActiveTimestamp > group.LastActiveTimestamp)
                        {
                            contactsIdx++;
                            conversations.Add(contact);
                        }
                        else
                        {
                            groupsIdx++;
                            conversations.Add(group);
                        }
                    }
                    else
                    {
                        contactsIdx++;
                        conversations.Add(contact);
                    }
                }
                else if (groupsIdx < amountGroups)
                {
                    SignalConversation group = groups[groupsIdx];
                    groupsIdx++;
                    conversations.Add(group);
                }
            }
            return(conversations);
        }
 public async Task Init()
 {
     Debug.WriteLine("Init lock wait");
     using (await ActionInProgress.LockAsync(CancelSource.Token))
     {
         Debug.WriteLine("Init lock grabbed");
         Running      = true;
         CancelSource = new CancellationTokenSource();
         try
         {
             await Task.Run(async() =>
             {
                 SignalDBContext.FailAllPendingMessages();
                 List <SignalContact> contacts = SignalDBContext.GetAllContactsLocked();
                 List <SignalGroup> groups     = SignalDBContext.GetAllGroupsLocked();
                 await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                 {
                     try
                     {
                         int amountContacts = contacts.Count;
                         int amountGroups   = groups.Count;
                         int contactsIdx    = 0;
                         int groupsIdx      = 0;
                         while (contactsIdx < amountContacts || groupsIdx < amountGroups)
                         {
                             if (contactsIdx < amountContacts)
                             {
                                 SignalConversation contact = contacts[contactsIdx];
                                 if (groupsIdx < amountGroups)
                                 {
                                     SignalConversation group = groups[groupsIdx];
                                     if (contact.LastActiveTimestamp > group.LastActiveTimestamp)
                                     {
                                         contactsIdx++;
                                         AddThread(contact);
                                     }
                                     else
                                     {
                                         groupsIdx++;
                                         AddThread(group);
                                     }
                                 }
                                 else
                                 {
                                     contactsIdx++;
                                     AddThread(contact);
                                 }
                             }
                             else if (groupsIdx < amountGroups)
                             {
                                 SignalConversation group = groups[groupsIdx];
                                 groupsIdx++;
                                 AddThread(group);
                             }
                         }
                     }
                     catch (Exception e)
                     {
                         Debug.WriteLine(e.Message);
                         Debug.WriteLine(e.StackTrace);
                     }
                 });
                 MessageReceiver      = new SignalServiceMessageReceiver(CancelSource.Token, App.ServiceUrls, new StaticCredentialsProvider(App.Store.Username, App.Store.Password, App.Store.SignalingKey, (int)App.Store.DeviceId), App.USER_AGENT);
                 Pipe                 = MessageReceiver.createMessagePipe();
                 MessageSender        = new SignalServiceMessageSender(CancelSource.Token, App.ServiceUrls, App.Store.Username, App.Store.Password, (int)App.Store.DeviceId, new Store(), Pipe, null, App.USER_AGENT);
                 IncomingMessagesTask = Task.Factory.StartNew(HandleIncomingMessages, TaskCreationOptions.LongRunning);
                 OutgoingMessagesTask = Task.Factory.StartNew(HandleOutgoingMessages, TaskCreationOptions.LongRunning);
             });
         }
         catch (AuthorizationFailedException)
         {
             Debug.WriteLine("OWS server rejected our credentials - redirecting to StartPage");
             Running = false;
             CancelSource.Cancel();
             View.Frame.Navigate(typeof(StartPage));
         }
         catch (Exception e)
         {
             Debug.WriteLine(e.Message);
             Debug.WriteLine(e.StackTrace);
         }
     }
     Debug.WriteLine("Init lock released");
 }