示例#1
0
        public static void SaveFavourites(ConversationListObject obj) // this is to save individual file
        {
            if (obj == null)
            {
                return;
            }
            lock (favReadWriteLock)
            {
                using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    if (!store.DirectoryExists("FAVS"))
                    {
                        store.CreateDirectory("FAVS");
                    }

                    string fName = "FAVS" + "\\" + obj.Msisdn.Replace(":", "_"); // ttoohis will handle GC
                    using (var file = store.OpenFile(fName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
                    {
                        using (BinaryWriter writer = new BinaryWriter(file))
                        {
                            writer.Seek(0, SeekOrigin.Begin);
                            obj.WriteFavOrPending(writer);
                            writer.Flush();
                            writer.Close();
                        }
                        file.Close();
                        file.Dispose();
                    }
                }
            }
        }
示例#2
0
        public static void deleteMultipleRows(List <ContactInfo.DelContacts> ids)
        {
            if (ids == null || ids.Count == 0)
            {
                return;
            }
            bool shouldSubmit = false;

            using (HikeUsersDb context = new HikeUsersDb(App.UsersDBConnectionstring))
            {
                //using (HikeChatsDb chats = new HikeChatsDb(App.MsgsDBConnectionstring))
                {
                    for (int i = 0; i < ids.Count; i++)
                    {
                        context.users.DeleteAllOnSubmit <ContactInfo>(DbCompiledQueries.GetUsersWithGivenId(context, ids[i].Id));
                        if (App.ViewModel.ConvMap.ContainsKey(ids[i].Msisdn))
                        {
                            ConversationListObject obj = App.ViewModel.ConvMap[ids[i].Msisdn];
                            obj.ContactName = null;
                            ConversationTableUtils.saveConvObject(obj, obj.Msisdn);
                            //ConversationTableUtils.saveConvObjectList();
                        }
                    }
                }
                SubmitWithConflictResolve(context);
            }
        }
示例#3
0
        public HikeViewModel(List <ConversationListObject> convList)
        {
            _convMap    = new Dictionary <string, ConversationListObject>(convList.Count);
            _pendingReq = new ObservableCollection <ConversationListObject>();
            _favList    = new ObservableCollection <ConversationListObject>();

            List <ConversationBox> listConversationBox = new List <ConversationBox>();

            // this order should be maintained as _convMap should be populated before loading fav list
            for (int i = 0; i < convList.Count; i++)
            {
                ConversationListObject convListObj = convList[i];
                _convMap[convListObj.Msisdn] = convListObj;
                convListObj.ConvBoxObj       = new ConversationBox(convListObj);//context menu wil bind on page load
                listConversationBox.Add(convListObj.ConvBoxObj);
            }
            _messageListPageCollection = new ObservableCollection <ConversationBox>(listConversationBox);
            MiscDBUtil.LoadFavourites(_favList, _convMap);
            int count = 0;

            App.appSettings.TryGetValue <int>(HikeViewModel.NUMBER_OF_FAVS, out count);
            if (count != _favList.Count) // values are not loaded, move to backup plan
            {
                _favList.Clear();
                MiscDBUtil.LoadFavouritesFromIndividualFiles(_favList, _convMap);
            }
            RegisterListeners();
        }
示例#4
0
        public static ConversationListObject addGroupConversation(ConvMessage convMessage, string groupName)
        {
            /*
             * Msisdn : GroupId
             * Contactname : GroupOwner
             */
            byte[] avatar = MiscDBUtil.getThumbNailForMsisdn(convMessage.Msisdn);
            ConversationListObject obj = new ConversationListObject(convMessage.Msisdn, groupName, convMessage.Message,
                                                                    true, convMessage.Timestamp, avatar, convMessage.MessageStatus, convMessage.MessageId);

            if (convMessage.GrpParticipantState == ConvMessage.ParticipantInfoState.MEMBERS_JOINED)
            {
                string[] vals = convMessage.Message.Split(';');
                if (vals.Length == 2)
                {
                    obj.LastMessage = vals[1];
                }
                else
                {
                    obj.LastMessage = convMessage.Message;
                }
            }
            string msisdn = obj.Msisdn.Replace(":", "_");

            saveConvObject(obj, msisdn);
            int convs = 0;

            App.appSettings.TryGetValue <int>(HikeViewModel.NUMBER_OF_CONVERSATIONS, out convs);
            App.WriteToIsoStorageSettings(HikeViewModel.NUMBER_OF_CONVERSATIONS, convs + 1);
            //saveNewConv(obj);
            return(obj);
        }
示例#5
0
 public static void SavePendingRequests()
 {
     lock (pendingReadWriteLock)
     {
         using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
         {
             if (!store.DirectoryExists(MISC_DIR))
             {
                 store.CreateDirectory(MISC_DIR);
             }
             string fName = MISC_DIR + "\\" + PENDING_REQ_FILE;
             using (var file = store.OpenFile(fName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
             {
                 using (BinaryWriter writer = new BinaryWriter(file))
                 {
                     writer.Seek(0, SeekOrigin.Begin);
                     writer.Write(App.ViewModel.PendingRequests.Count);
                     for (int i = 0; i < App.ViewModel.PendingRequests.Count; i++)
                     {
                         ConversationListObject item = App.ViewModel.PendingRequests[i];
                         item.WriteFavOrPending(writer);
                     }
                     writer.Flush();
                     writer.Close();
                 }
                 file.Close();
                 file.Dispose();
             }
         }
     }
 }
示例#6
0
 public static void updateOnHikeStatus(string msisdn, bool joined)
 {
     if (App.ViewModel.ConvMap.ContainsKey(msisdn))
     {
         ConversationListObject obj = App.ViewModel.ConvMap[msisdn];
         obj.IsOnhike = joined;
         saveConvObject(obj, msisdn);
         //saveConvObjectList();
     }
 }
示例#7
0
 public ConversationBox(ConversationListObject c)
 {
     InitializeComponent();
     this.AvatarImage  = c.AvatarImage;
     this.UserName     = c.NameToShow;
     this.LastMessage  = c.LastMessage;
     this.Timestamp    = c.TimeStamp;
     this.MessageState = c.MessageStatus;
     this.Msisdn       = c.Msisdn;
 }
        private void btnGetSelected_Click(object sender, System.Windows.Input.GestureEventArgs e)
        {
            ConversationListObject obj = myListBox.SelectedItem as ConversationListObject;

            if (obj == null)
            {
                return;
            }
            PhoneApplicationService.Current.State["objFromConversationPage"] = obj;
            string uri = "/View/ChatThread.xaml";

            NavigationService.Navigate(new Uri(uri, UriKind.Relative));
        }
示例#9
0
 public static void LoadFavouritesFromIndividualFiles(ObservableCollection <ConversationListObject> favList, Dictionary <string, ConversationListObject> _convmap)
 {
     lock (favReadWriteLock)
     {
         using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
         {
             if (!store.DirectoryExists("FAVS"))
             {
                 store.CreateDirectory("FAVS");
                 return;
             }
             string[] files = store.GetFileNames("FAVS\\*");
             foreach (string fname in files)
             {
                 using (var file = store.OpenFile("FAVS\\" + fname, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                 {
                     using (var reader = new BinaryReader(file))
                     {
                         ConversationListObject item = new ConversationListObject();
                         try
                         {
                             item.ReadFavOrPending(reader);
                             if (_convmap.ContainsKey(item.Msisdn)) // if this item is in convList, just mark IsFav to true
                             {
                                 favList.Add(_convmap[item.Msisdn]);
                                 _convmap[item.Msisdn].IsFav = true;
                             }
                             else
                             {
                                 favList.Add(item);
                             }
                         }
                         catch (Exception ex)
                         {
                             Debug.WriteLine(ex);
                         }
                         reader.Close();
                     }
                     try
                     {
                         file.Close();
                         file.Dispose();
                     }
                     catch { }
                 }
             }
         }
     }
 }
示例#10
0
        internal static void updateConversation(List <ContactInfo> cn)
        {
            //saveConvObjectList();

            for (int i = 0; i < cn.Count; i++)
            {
                if (App.ViewModel.ConvMap.ContainsKey(cn[i].Msisdn))
                {
                    ConversationListObject obj = App.ViewModel.ConvMap[cn[i].Msisdn]; //update UI
                    obj.ContactName = cn[i].Name;
                    obj.IsOnhike    = cn[i].OnHike;
                    saveConvObject(obj, obj.Msisdn.Replace(":", "_"));
                }
            }
        }
示例#11
0
        public static bool updateGroupName(string grpId, string groupName)
        {
            if (!App.ViewModel.ConvMap.ContainsKey(grpId))
            {
                return(false);
            }
            ConversationListObject obj = App.ViewModel.ConvMap[grpId];

            obj.ContactName = groupName;
            string msisdn = grpId.Replace(":", "_");

            saveConvObject(obj, msisdn);
            //saveConvObjectList();
            return(true);
        }
示例#12
0
        public void updateProfile_Callback(JObject obj)
        {
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                if (obj != null && HikeConstants.OK == (string)obj[HikeConstants.STAT])
                {
                    App.ViewModel.ConvMap[groupId].Avatar = fullViewImageBytes;
                    groupImage.Source = grpImage;
                    groupImage.Height = 83;
                    groupImage.Width  = 83;

                    string msg                  = string.Format(AppResources.GroupImgChangedByGrpMember_Txt, AppResources.You_Txt);
                    ConvMessage cm              = new ConvMessage(msg, groupId, TimeUtils.getCurrentTimeStamp(), ConvMessage.State.RECEIVED_READ, -1, -1);
                    cm.GrpParticipantState      = ConvMessage.ParticipantInfoState.GROUP_PIC_CHANGED;
                    cm.GroupParticipant         = App.MSISDN;
                    JObject jo                  = new JObject();
                    jo[HikeConstants.TYPE]      = HikeConstants.MqttMessageTypes.GROUP_DISPLAY_PIC;
                    cm.MetaDataString           = jo.ToString(Newtonsoft.Json.Formatting.None);
                    ConversationListObject cobj = MessagesTableUtils.addChatMessage(cm, false);
                    if (cobj == null)
                    {
                        return;
                    }

                    // handle msgs
                    object[] vs = new object[2];
                    vs[0]       = cm;
                    vs[1]       = cobj;
                    mPubSub.publish(HikePubSub.MESSAGE_RECEIVED, vs);

                    // handle saving image
                    object[] vals = new object[3];
                    vals[0]       = groupId;
                    vals[1]       = fullViewImageBytes;
                    vals[2]       = thumbnailBytes;
                    mPubSub.publish(HikePubSub.ADD_OR_UPDATE_PROFILE, vals);
                }
                else
                {
                    MessageBox.Show(AppResources.CannotChangeGrpImg_Txt, AppResources.Something_Wrong_Txt, MessageBoxButton.OK);
                }
                //progressBar.IsEnabled = false;
                shellProgress.IsVisible = false;
                isProfilePicTapped      = false;
            });
        }
示例#13
0
        /* This function gets all the conversations shown on the message list page*/

        public static List <ConversationListObject> getAllConversations()
        {
            byte[] data = null;
            List <ConversationListObject> convList = null;

            using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (!store.DirectoryExists(CONVERSATIONS_DIRECTORY))
                {
                    return(null);
                }
                string[] files = store.GetFileNames(CONVERSATIONS_DIRECTORY + "\\*");
                if (files == null || files.Length == 0)
                {
                    return(null);
                }
                convList = new List <ConversationListObject>(files.Length);
                foreach (string fileName in files)
                {
                    using (var file = store.OpenFile(CONVERSATIONS_DIRECTORY + "\\" + fileName, FileMode.Open, FileAccess.Read))
                    {
                        using (var reader = new BinaryReader(file))
                        {
                            ConversationListObject co = new ConversationListObject();
                            co.ReadVer_1_0_0_0(reader);
                            if (IsValidConv(co))
                            {
                                convList.Add(co);
                            }
                        }
                    }
                }
            }
            convList.Sort();
            return(convList);

            /*
             * using (HikeChatsDb context = new HikeChatsDb(App.MsgsDBConnectionstring+";Max Buffer Size=1024"))
             * {
             *  var q = from o in DbCompiledQueries.chatsDbContext.conversations select o;
             *  //var q = from o in DbCompiledQueries.chatsDbContext.conversations orderby o.TimeStamp descending select o;
             *  return q.ToList();
             * }
             * */
        }
示例#14
0
 /// <summary>
 /// Single conv object is serialized to file
 /// </summary>
 /// <param name="obj"></param>
 public static void saveConvObject(ConversationListObject obj, string msisdn)
 {
     lock (readWriteLock)
     {
         string FileName = CONVERSATIONS_DIRECTORY + "\\" + msisdn;
         using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) // grab the storage
         {
             using (var file = store.OpenFile(FileName, FileMode.Create, FileAccess.Write))
             {
                 using (var writer = new BinaryWriter(file))
                 {
                     writer.Seek(0, SeekOrigin.Begin);
                     obj.Write(writer);
                 }
             }
         }
     }
 }
示例#15
0
        public void onEventReceived(string type, object obj)
        {
            #region MESSAGE_RECEIVED
            if (HikePubSub.MESSAGE_RECEIVED == type)
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    object[] vals = (object[])obj;
                    ConversationListObject mObj = (ConversationListObject)vals[1];
                    if (mObj == null)
                    {
                        return;
                    }

                    if (mObj.ConvBoxObj == null)
                    {
                        mObj.ConvBoxObj = new ConversationBox(mObj);
                        if (App.ViewModel.ConversationListPage != null)
                        {
                            ContextMenuService.SetContextMenu(mObj.ConvBoxObj, App.ViewModel.ConversationListPage.createConversationContextMenu(mObj));
                        }
                    }
                    App.ViewModel.MessageListPageCollection.Remove(mObj.ConvBoxObj);
                    App.ViewModel.ConvMap[mObj.Msisdn] = mObj;
                    App.ViewModel.MessageListPageCollection.Insert(0, mObj.ConvBoxObj);
                });
            }
            #endregion
            #region USER_LEFT USER_JOINED
            else if ((HikePubSub.USER_LEFT == type) || (HikePubSub.USER_JOINED == type))
            {
                string msisdn = (string)obj;
                try
                {
                    ConversationListObject convObj = App.ViewModel.ConvMap[msisdn];
                    convObj.IsOnhike = HikePubSub.USER_JOINED == type;
                }
                catch (KeyNotFoundException)
                {
                }
            }
            #endregion
        }
        private void LoadMessages()
        {
            List <Conversation> conversationList = ConversationTableUtils.getAllConversations();

            if (conversationList == null)
            {
                return;
            }
            for (int i = 0; i < conversationList.Count; i++)
            {
                Conversation conv        = conversationList[i];
                ConvMessage  lastMessage = MessagesTableUtils.getLastMessageForMsisdn(conv.Msisdn); // why we are not getting only lastmsg as string
                ContactInfo  contact     = UsersTableUtils.getContactInfoFromMSISDN(conv.Msisdn);

                Thumbnails             thumbnail = MiscDBUtil.getThumbNailForMSisdn(conv.Msisdn);
                ConversationListObject mObj      = new ConversationListObject((contact == null) ? conv.Msisdn : contact.Msisdn, (contact == null) ? conv.Msisdn : contact.Name, lastMessage.Message, (contact == null) ? conv.OnHike : contact.OnHike,
                                                                              TimeUtils.getTimeString(lastMessage.Timestamp), thumbnail == null ? null : thumbnail.Avatar);
                convMap.Add(conv.Msisdn, mObj);
                App.ViewModel.MessageListPageCollection.Add(mObj);
            }
        }
        private void MenuItem_Click_Delete(object sender, RoutedEventArgs e)
        {
            MessageBoxResult result = MessageBox.Show("Are you sure about deleting conversation.", "Delete Conversation ?", MessageBoxButton.OKCancel);

            if (result == MessageBoxResult.Cancel)
            {
                return;
            }
            ListBoxItem selectedListBoxItem = this.myListBox.ItemContainerGenerator.ContainerFromItem((sender as MenuItem).DataContext) as ListBoxItem;

            if (selectedListBoxItem == null)
            {
                return;
            }
            ConversationListObject convObj = selectedListBoxItem.DataContext as ConversationListObject;

            convMap.Remove(convObj.Msisdn);                                // removed entry from map
            App.ViewModel.MessageListPageCollection.Remove(convObj);       // removed from observable collection
            ConversationTableUtils.deleteConversation(convObj.Msisdn);     // removed entry from conversation table
            MessagesTableUtils.deleteAllMessagesForMsisdn(convObj.Msisdn); //removed all chat messages for this msisdn
        }
示例#18
0
        public static List <ConversationListObject> GetConvsFromIndividualFiles()
        {
            byte[] data = null;
            List <ConversationListObject> convList = null;

            using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (!store.DirectoryExists(CONVERSATIONS_DIRECTORY))
                {
                    return(null);
                }
                string[] files = store.GetFileNames(CONVERSATIONS_DIRECTORY + "\\*");
                if (files == null || files.Length == 0)
                {
                    return(null);
                }
                convList = new List <ConversationListObject>(files.Length);
                foreach (string fileName in files)
                {
                    if (fileName == "Convs" || fileName == "Convs_bkp" || fileName == "_Convs")
                    {
                        continue;
                    }
                    using (var file = store.OpenFile(CONVERSATIONS_DIRECTORY + "\\" + fileName, FileMode.Open, FileAccess.Read))
                    {
                        using (var reader = new BinaryReader(file))
                        {
                            ConversationListObject co = new ConversationListObject();
                            co.ReadVer_Latest(reader); // we know we have to read from latest file system
                            if (IsValidConv(co))
                            {
                                convList.Add(co);
                            }
                        }
                    }
                }
            }
            convList.Sort();
            return(convList);
        }
示例#19
0
 // this function will validate the conversation object
 public static bool IsValidConv(ConversationListObject item)
 {
     try
     {
         if (string.IsNullOrWhiteSpace(item.Msisdn))
         {
             return(false);
         }
         else if (item.Msisdn == "+hike+")
         {
             return(true);
         }
         else if (item.Msisdn.Contains(":"))
         {
             double num;
             int    idx = item.Msisdn.IndexOf(':');
             if (idx > 0 && double.TryParse(item.Msisdn.Substring(idx + 1), out num))
             {
                 return(true);
             }
             return(false);
         }
         else if (item.Msisdn[0] == '+')
         {
             double num;
             if (double.TryParse(item.Msisdn.Substring(1), out num))
             {
                 return(true);
             }
             return(false);
         }
         return(false);
     }
     catch (Exception ex)
     {
         Debug.WriteLine("Exception while reading Conversations : {0}", ex.StackTrace);
         return(false);
     }
 }
示例#20
0
        public static void updateLastMsgStatus(long id, string msisdn, int status)
        {
            if (msisdn == null)
            {
                return;
            }
            ConversationListObject obj = null;

            if (App.ViewModel.ConvMap.ContainsKey(msisdn))
            {
                obj = App.ViewModel.ConvMap[msisdn];
                if (obj.LastMsgId != id)
                {
                    return;
                }
                if (obj.MessageStatus != ConvMessage.State.UNKNOWN) // no D,R for notification msg so dont update
                {
                    obj.MessageStatus = (ConvMessage.State)status;
                    saveConvObject(obj, msisdn.Replace(":", "_"));
                    //saveConvObjectList();
                }
            }
        }
示例#21
0
        public static void saveNewConv(ConversationListObject obj)
        {
            int       convs = 0;
            Stopwatch st    = Stopwatch.StartNew();
            Dictionary <string, ConversationListObject> convMap = App.ViewModel.ConvMap;

            lock (readWriteLock)
            {
                using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) // grab the storage
                {
                    string FileName = CONVERSATIONS_DIRECTORY + "\\" + "_Convs";
                    using (var file = store.OpenFile(FileName, FileMode.Create, FileAccess.Write))
                    {
                        using (var writer = new BinaryWriter(file))
                        {
                            int count = (convMap == null ? 0 : convMap.Count) + 1;
                            writer.Write(count);
                            obj.Write(writer);
                            if (convMap != null && convMap.Count > 0)
                            {
                                foreach (ConversationListObject item in convMap.Values)
                                {
                                    item.Write(writer);
                                    convs++;
                                }
                            }
                        }
                    }
                    store.DeleteFile(CONVERSATIONS_DIRECTORY + "\\" + "Convs");
                    store.MoveFile(CONVERSATIONS_DIRECTORY + "\\" + "_Convs", CONVERSATIONS_DIRECTORY + "\\" + "Convs");
                }
            }
            st.Stop();
            long mSec = st.ElapsedMilliseconds;

            Debug.WriteLine("Time to save {0} conversations : {1}", convs, mSec);
        }
        public void onEventReceived(string type, object obj)
        {
            if (HikePubSub.MESSAGE_RECEIVED == type || HikePubSub.SEND_NEW_MSG == type)
            {
                ConvMessage            convMessage = (ConvMessage)obj;
                ConversationListObject mObj;
                bool isNewConversation = false;

                /*This is used to avoid cross thread invokation exception*/

                if (convMap.ContainsKey(convMessage.Msisdn))
                {
                    mObj             = convMap[convMessage.Msisdn];
                    mObj.LastMessage = convMessage.Message;
                    mObj.TimeStamp   = TimeUtils.getTimeString(convMessage.Timestamp);
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        App.ViewModel.MessageListPageCollection.Remove(mObj);
                    });
                }
                else
                {
                    ContactInfo contact   = UsersTableUtils.getContactInfoFromMSISDN(convMessage.Msisdn);
                    Thumbnails  thumbnail = MiscDBUtil.getThumbNailForMSisdn(convMessage.Msisdn);
                    mObj = new ConversationListObject(convMessage.Msisdn, contact == null ? convMessage.Msisdn : contact.Name, convMessage.Message,
                                                      contact == null ? !convMessage.IsSms : contact.OnHike, TimeUtils.getTimeString(convMessage.Timestamp),
                                                      thumbnail == null ? null : thumbnail.Avatar);

                    convMap.Add(convMessage.Msisdn, mObj);
                    isNewConversation = true;
                }
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    if (App.ViewModel.MessageListPageCollection == null)
                    {
                        App.ViewModel.MessageListPageCollection = new ObservableCollection <ConversationListObject>();
                    }
                    App.ViewModel.MessageListPageCollection.Insert(0, mObj);
                });
                object[] vals = new object[2];
                vals[0] = convMessage;
                vals[1] = isNewConversation;
                if (HikePubSub.SEND_NEW_MSG == type)
                {
                    mPubSub.publish(HikePubSub.MESSAGE_SENT, vals);
                }
            }
            else if (HikePubSub.MSG_READ == type)
            {
                string msisdn = (string)obj;
                try
                {
                    ConversationListObject convObj = convMap[msisdn];
                    convObj.MessageStatus = ConvMessage.State.RECEIVED_READ;
                    //TODO : update the UI here also.
                }
                catch (KeyNotFoundException)
                {
                }
            }
            else if ((HikePubSub.USER_LEFT == type) || (HikePubSub.USER_JOINED == type))
            {
                string msisdn = (string)obj;
                try
                {
                    ConversationListObject convObj = convMap[msisdn];
                    convObj.IsOnhike = HikePubSub.USER_JOINED == type;
                }
                catch (KeyNotFoundException)
                {
                }
            }
            else if (HikePubSub.UPDATE_UI == type)
            {
                string msisdn = (string)obj;
                try
                {
                    ConversationListObject convObj = convMap[msisdn];
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        convObj.NotifyPropertyChanged("Msisdn");
                    });
                }
                catch (KeyNotFoundException)
                {
                }
            }
            else if (HikePubSub.SMS_CREDIT_CHANGED == type)
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    creditsTxtBlck.Text = Convert.ToString((int)obj);
                });
            }
        }
示例#23
0
 public static void LoadPendingRequests()
 {
     lock (pendingReadWriteLock)
     {
         using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
         {
             if (!store.DirectoryExists(MISC_DIR))
             {
                 store.CreateDirectory(MISC_DIR);
                 return;
             }
             string fname = MISC_DIR + "\\" + PENDING_REQ_FILE;
             if (!store.FileExists(fname))
             {
                 return;
             }
             using (var file = store.OpenFile(fname, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
             {
                 using (var reader = new BinaryReader(file))
                 {
                     int count = 0;
                     try
                     {
                         count = reader.ReadInt32();
                     }
                     catch { }
                     if (count > 0)
                     {
                         for (int i = 0; i < count; i++)
                         {
                             ConversationListObject item = new ConversationListObject();
                             try
                             {
                                 item.ReadFavOrPending(reader);
                                 if (App.ViewModel.ConvMap.ContainsKey(item.Msisdn))
                                 {
                                     App.ViewModel.PendingRequests.Add(App.ViewModel.ConvMap[item.Msisdn]);
                                 }
                                 else
                                 {
                                     item.Avatar = MiscDBUtil.getThumbNailForMsisdn(item.Msisdn);
                                     App.ViewModel.PendingRequests.Add(item);
                                 }
                             }
                             catch
                             {
                                 item = null;
                             }
                         }
                     }
                     reader.Close();
                 }
                 try
                 {
                     file.Close();
                     file.Dispose();
                 }
                 catch { }
             }
         }
     }
 }
示例#24
0
        public static ConversationListObject addConversation(ConvMessage convMessage, bool isNewGroup)
        {
            ConversationListObject obj = null;

            if (isNewGroup)
            {
                string groupName = convMessage.Msisdn;
                if (PhoneApplicationService.Current.State.ContainsKey(convMessage.Msisdn))
                {
                    groupName = (string)PhoneApplicationService.Current.State[convMessage.Msisdn];
                    PhoneApplicationService.Current.State.Remove(convMessage.Msisdn);
                }
                obj = new ConversationListObject(convMessage.Msisdn, groupName, convMessage.Message, true, convMessage.Timestamp, null, convMessage.MessageStatus, convMessage.MessageId);
            }
            else
            {
                ContactInfo contactInfo = UsersTableUtils.getContactInfoFromMSISDN(convMessage.Msisdn);
                byte[]      avatar      = MiscDBUtil.getThumbNailForMsisdn(convMessage.Msisdn);
                obj = new ConversationListObject(convMessage.Msisdn, contactInfo == null ? null : contactInfo.Name, convMessage.Message,
                                                 contactInfo == null ? !convMessage.IsSms : contactInfo.OnHike, convMessage.Timestamp, avatar, convMessage.MessageStatus, convMessage.MessageId);
                if (App.ViewModel.Isfavourite(convMessage.Msisdn))
                {
                    obj.IsFav = true;
                }
            }

            /*If ABCD join grp chat convObj should show D joined grp chat as D is last in sorted order*/
            if (convMessage.GrpParticipantState == ConvMessage.ParticipantInfoState.PARTICIPANT_JOINED)
            {
                obj.LastMessage = convMessage.Message;
            }
            else if (convMessage.GrpParticipantState == ConvMessage.ParticipantInfoState.USER_OPT_IN)
            {
                obj.LastMessage     = obj.NameToShow + AppResources.USER_OPTED_IN_MSG;
                convMessage.Message = obj.LastMessage;
            }
            else if (convMessage.GrpParticipantState == ConvMessage.ParticipantInfoState.CREDITS_GAINED)
            {
                obj.LastMessage = convMessage.Message;
            }
            else if (convMessage.GrpParticipantState == ConvMessage.ParticipantInfoState.DND_USER)
            {
                obj.LastMessage     = string.Format(AppResources.DND_USER, obj.NameToShow);
                convMessage.Message = obj.LastMessage;
            }
            else if (convMessage.GrpParticipantState == ConvMessage.ParticipantInfoState.USER_JOINED)
            {
                obj.LastMessage     = string.Format(AppResources.USER_JOINED_HIKE, obj.NameToShow);
                convMessage.Message = obj.LastMessage;
            }

            Stopwatch st1     = Stopwatch.StartNew();
            bool      success = MessagesTableUtils.addMessage(convMessage);

            if (!success)
            {
                return(null);
            }
            obj.LastMsgId = convMessage.MessageId;
            st1.Stop();
            long msec1 = st1.ElapsedMilliseconds;

            Debug.WriteLine("Time to add chat msg : {0}", msec1);

            Stopwatch st = Stopwatch.StartNew();

            //saveNewConv(obj);
            saveConvObject(obj, obj.Msisdn.Replace(":", "_"));
            int convs = 0;

            App.appSettings.TryGetValue <int>(HikeViewModel.NUMBER_OF_CONVERSATIONS, out convs);
            App.WriteToIsoStorageSettings(HikeViewModel.NUMBER_OF_CONVERSATIONS, convs + 1);
            st.Stop();
            long msec = st.ElapsedMilliseconds;

            Debug.WriteLine("Time to write conversation to iso storage {0}", msec);

            return(obj);
        }
示例#25
0
 public static void updateConversation(ConversationListObject obj)
 {
     saveConvObject(obj, obj.Msisdn.Replace(":", "_"));
     //saveConvObjectList();
 }
示例#26
0
        public static ConversationListObject addChatMessage(ConvMessage convMsg, bool isNewGroup)
        {
            if (convMsg == null)
            {
                return(null);
            }
            ConversationListObject obj = null;

            if (!App.ViewModel.ConvMap.ContainsKey(convMsg.Msisdn))
            {
                if (Utils.isGroupConversation(convMsg.Msisdn) && !isNewGroup) // if its a group chat msg and group does not exist , simply ignore msg.
                {
                    return(null);
                }

                obj = ConversationTableUtils.addConversation(convMsg, isNewGroup);
                App.ViewModel.ConvMap.Add(convMsg.Msisdn, obj);
            }
            else
            {
                obj = App.ViewModel.ConvMap[convMsg.Msisdn];
                #region PARTICIPANT_JOINED
                if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.PARTICIPANT_JOINED)
                {
                    obj.LastMessage = convMsg.Message;

                    GroupInfo gi = GroupTableUtils.getGroupInfoForId(convMsg.Msisdn);
                    if (gi == null)
                    {
                        return(null);
                    }
                    if (string.IsNullOrEmpty(gi.GroupName)) // no group name is set
                    {
                        obj.ContactName = GroupManager.Instance.defaultGroupName(convMsg.Msisdn);
                    }
                }
                #endregion
                #region PARTICIPANT_LEFT
                else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.PARTICIPANT_LEFT || convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.INTERNATIONAL_GROUP_USER)
                {
                    obj.LastMessage = convMsg.Message;
                    GroupInfo gi = GroupTableUtils.getGroupInfoForId(convMsg.Msisdn);
                    if (gi == null)
                    {
                        return(null);
                    }
                    if (string.IsNullOrEmpty(gi.GroupName)) // no group name is set
                    {
                        obj.ContactName = GroupManager.Instance.defaultGroupName(convMsg.Msisdn);
                    }
                }
                #endregion
                #region GROUP_JOINED_OR_WAITING
                else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.GROUP_JOINED_OR_WAITING) // shows invite msg
                {
                    string[]      vals = Utils.splitUserJoinedMessage(convMsg.Message);
                    List <string> waitingParticipants = null;
                    for (int i = 0; i < vals.Length; i++)
                    {
                        string[] vars = vals[i].Split(HikeConstants.DELIMITERS, StringSplitOptions.RemoveEmptyEntries); // msisdn:0 or msisdn:1

                        // every participant is either on DND or not on DND
                        GroupParticipant gp = GroupManager.Instance.getGroupParticipant(null, vars[0], convMsg.Msisdn);
                        if (vars[1] == "0") // DND USER and not OPTED IN
                        {
                            if (waitingParticipants == null)
                            {
                                waitingParticipants = new List <string>();
                            }
                            waitingParticipants.Add(gp.FirstName);
                        }
                    }
                    if (waitingParticipants != null && waitingParticipants.Count > 0) // show waiting msg
                    {
                        StringBuilder msgText = new StringBuilder();
                        if (waitingParticipants.Count == 1)
                        {
                            msgText.Append(waitingParticipants[0]);
                        }
                        else if (waitingParticipants.Count == 2)
                        {
                            msgText.Append(waitingParticipants[0] + AppResources.And_txt + waitingParticipants[1]);
                        }
                        else
                        {
                            for (int i = 0; i < waitingParticipants.Count; i++)
                            {
                                msgText.Append(waitingParticipants[0]);
                                if (i == waitingParticipants.Count - 2)
                                {
                                    msgText.Append(AppResources.And_txt);
                                }
                                else if (i < waitingParticipants.Count - 2)
                                {
                                    msgText.Append(",");
                                }
                            }
                        }
                        obj.LastMessage = string.Format(AppResources.WAITING_TO_JOIN, msgText.ToString());
                    }
                    else
                    {
                        string[]         vars = vals[vals.Length - 1].Split(':');
                        GroupParticipant gp   = GroupManager.Instance.getGroupParticipant(null, vars[0], convMsg.Msisdn);
                        string           text = AppResources.USER_JOINED_GROUP_CHAT;
                        obj.LastMessage = gp.FirstName + text;
                    }
                }
                #endregion
                #region USER_OPT_IN
                else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.USER_OPT_IN)
                {
                    if (Utils.isGroupConversation(obj.Msisdn))
                    {
                        GroupParticipant gp = GroupManager.Instance.getGroupParticipant(null, convMsg.Message, obj.Msisdn);
                        obj.LastMessage = gp.FirstName + AppResources.USER_JOINED_GROUP_CHAT;
                    }
                    else
                    {
                        obj.LastMessage = obj.NameToShow + AppResources.USER_OPTED_IN_MSG;
                    }
                    convMsg.Message = obj.LastMessage;
                }
                #endregion
                #region CREDITS_GAINED
                else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.CREDITS_GAINED)
                {
                    obj.LastMessage = convMsg.Message;
                }
                #endregion
                #region DND_USER
                else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.DND_USER)
                {
                    obj.LastMessage = string.Format(AppResources.DND_USER, obj.NameToShow);
                    convMsg.Message = obj.LastMessage;
                }
                #endregion
                #region USER_JOINED
                else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.USER_JOINED)
                {
                    if (Utils.isGroupConversation(obj.Msisdn))
                    {
                        GroupParticipant gp = GroupManager.Instance.getGroupParticipant(null, convMsg.Message, obj.Msisdn);
                        obj.LastMessage = string.Format(AppResources.USER_JOINED_HIKE, gp.FirstName);
                    }
                    else // 1-1 chat
                    {
                        obj.LastMessage = string.Format(AppResources.USER_JOINED_HIKE, obj.NameToShow);
                    }
                    convMsg.Message = obj.LastMessage;
                }
                #endregion \
                #region GROUP NAME/PIC CHANGED
                else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.GROUP_NAME_CHANGE || convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.GROUP_PIC_CHANGED)
                {
                    obj.LastMessage = convMsg.Message;
                }
                #endregion
                #region NO_INFO
                else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.NO_INFO)
                {
                    //convMsg.GroupParticipant is null means message sent by urself
                    if (convMsg.GroupParticipant != null && Utils.isGroupConversation(convMsg.Msisdn))
                    {
                        GroupParticipant gp = GroupManager.Instance.getGroupParticipant(null, convMsg.GroupParticipant, convMsg.Msisdn);
                        obj.LastMessage = gp != null ? (gp.FirstName + "- " + convMsg.Message) : convMsg.Message;
                    }
                    else
                    {
                        obj.LastMessage = convMsg.Message;
                    }
                }
                #endregion
                #region OTHER MSGS
                else
                {
                    obj.LastMessage = convMsg.Message;
                }
                #endregion

                Stopwatch st1     = Stopwatch.StartNew();
                bool      success = addMessage(convMsg);
                if (!success)
                {
                    return(null);
                }
                st1.Stop();
                long msec1 = st1.ElapsedMilliseconds;
                Debug.WriteLine("Time to add chat msg : {0}", msec1);

                obj.MessageStatus = convMsg.MessageStatus;
                obj.TimeStamp     = convMsg.Timestamp;
                obj.LastMsgId     = convMsg.MessageId;
                Stopwatch st = Stopwatch.StartNew();
                ConversationTableUtils.updateConversation(obj);
                st.Stop();
                long msec = st.ElapsedMilliseconds;
                Debug.WriteLine("Time to update conversation  : {0}", msec);
            }

            return(obj);
        }
示例#27
0
        // this is called in case of gcj from Network manager
        public static ConversationListObject addGroupChatMessage(ConvMessage convMsg, JObject jsonObj)
        {
            ConversationListObject obj = null;

            if (!App.ViewModel.ConvMap.ContainsKey(convMsg.Msisdn)) // represents group is new
            {
                bool success = addMessage(convMsg);
                if (!success)
                {
                    return(null);
                }
                string groupName = GroupManager.Instance.defaultGroupName(convMsg.Msisdn);
                obj = ConversationTableUtils.addGroupConversation(convMsg, groupName);
                App.ViewModel.ConvMap[convMsg.Msisdn] = obj;
                GroupInfo gi = new GroupInfo(convMsg.Msisdn, null, convMsg.GroupParticipant, true);
                GroupTableUtils.addGroupInfo(gi);
            }
            else // add a member to a group
            {
                List <GroupParticipant> existingMembers = null;
                GroupManager.Instance.GroupCache.TryGetValue(convMsg.Msisdn, out existingMembers);
                if (existingMembers == null)
                {
                    return(null);
                }

                obj = App.ViewModel.ConvMap[convMsg.Msisdn];
                GroupInfo gi = GroupTableUtils.getGroupInfoForId(convMsg.Msisdn);

                if (string.IsNullOrEmpty(gi.GroupName)) // no group name is set
                {
                    obj.ContactName = GroupManager.Instance.defaultGroupName(obj.Msisdn);
                }

                if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.MEMBERS_JOINED)
                {
                    string[] vals = convMsg.Message.Split(';');
                    if (vals.Length == 2)
                    {
                        obj.LastMessage = vals[1];
                    }
                    else
                    {
                        obj.LastMessage = convMsg.Message;
                    }
                }
                else
                {
                    obj.LastMessage = convMsg.Message;
                }

                bool success = addMessage(convMsg);
                if (!success)
                {
                    return(null);
                }

                obj.MessageStatus = convMsg.MessageStatus;
                obj.TimeStamp     = convMsg.Timestamp;
                obj.LastMsgId     = convMsg.MessageId;
                ConversationTableUtils.updateConversation(obj);
            }

            return(obj);
        }
示例#28
0
        public static List <ContactInfo> getContactList(JObject obj, Dictionary <string, List <ContactInfo> > new_contacts_by_id, bool isRefresh)
        {
            try
            {
                if ((obj == null) || HikeConstants.FAIL == (string)obj[HikeConstants.STAT])
                {
                    return(null);
                }

                JObject addressbook = (JObject)obj["addressbook"];

                if (addressbook == null || new_contacts_by_id == null || new_contacts_by_id.Count == 0)
                {
                    return(null);
                }

                bool isFavSaved = false;
                bool isPendingSaved = false;
                int  hikeCount = 1, smsCount = 1;
                List <ContactInfo>             msgToShow = null;
                List <string>                  msisdns = null;
                Dictionary <string, GroupInfo> allGroupsInfo = null;
                if (!isRefresh)
                {
                    msgToShow = new List <ContactInfo>(5);
                    msisdns   = new List <string>();
                }
                else // if refresh case load groups in cache
                {
                    GroupManager.Instance.LoadGroupCache();
                    List <GroupInfo> gl = GroupTableUtils.GetAllGroups();
                    for (int i = 0; i < gl.Count; i++)
                    {
                        if (allGroupsInfo == null)
                        {
                            allGroupsInfo = new Dictionary <string, GroupInfo>();
                        }
                        allGroupsInfo[gl[i].GroupId] = gl[i];
                    }
                }

                List <ContactInfo> server_contacts = new List <ContactInfo>();
                IEnumerator <KeyValuePair <string, JToken> > keyVals = addressbook.GetEnumerator();
                KeyValuePair <string, JToken> kv;
                int count         = 0;
                int totalContacts = 0;

                while (keyVals.MoveNext())
                {
                    try
                    {
                        kv = keyVals.Current;
                        JArray             entries = (JArray)addressbook[kv.Key];
                        List <ContactInfo> cList   = new_contacts_by_id[kv.Key];
                        for (int i = 0; i < entries.Count; ++i)
                        {
                            JObject entry  = (JObject)entries[i];
                            string  msisdn = (string)entry["msisdn"];
                            if (string.IsNullOrWhiteSpace(msisdn))
                            {
                                count++;
                                continue;
                            }
                            bool        onhike = (bool)entry["onhike"];
                            ContactInfo cinfo  = cList[i];
                            ContactInfo cn     = new ContactInfo(kv.Key, msisdn, cinfo.Name, onhike, cinfo.PhoneNo);

                            if (!isRefresh)                                                   // this is case for new installation
                            {
                                if (cn.Msisdn != (string)App.appSettings[App.MSISDN_SETTING]) // do not add own number
                                {
                                    if (onhike && hikeCount <= 3 && !msisdns.Contains(cn.Msisdn))
                                    {
                                        msisdns.Add(cn.Msisdn);
                                        msgToShow.Add(cn);
                                        hikeCount++;
                                    }
                                    if (!onhike && smsCount <= 2 && cn.Msisdn.StartsWith("+91") && !msisdns.Contains(cn.Msisdn)) // allow only indian numbers for sms
                                    {
                                        msisdns.Add(cn.Msisdn);
                                        msgToShow.Add(cn);
                                        smsCount++;
                                    }
                                }
                            }
                            else // this is refresh contacts case
                            {
                                if (App.ViewModel.ConvMap.ContainsKey(cn.Msisdn)) // update convlist
                                {
                                    try
                                    {
                                        App.ViewModel.ConvMap[cn.Msisdn].ContactName = cn.Name;
                                    }
                                    catch (Exception e)
                                    {
                                        Debug.WriteLine("REFRESH CONTACTS :: Update contact exception " + e.StackTrace);
                                    }
                                }
                                else // fav and pending case
                                {
                                    ConversationListObject c = App.ViewModel.GetFav(cn.Msisdn);
                                    if (c != null) // this user is in favs
                                    {
                                        c.ContactName = cn.Name;
                                        MiscDBUtil.SaveFavourites(c);
                                        isFavSaved = true;
                                    }
                                    else
                                    {
                                        c = App.ViewModel.GetPending(cn.Msisdn);
                                        if (c != null)
                                        {
                                            c.ContactName  = cn.Name;
                                            isPendingSaved = true;
                                        }
                                    }
                                }
                                GroupManager.Instance.RefreshGroupCache(cn, allGroupsInfo);
                            }
                            server_contacts.Add(cn);
                            totalContacts++;
                        }
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine("AccountUtils : getContactList : Exception : " + ex.StackTrace);
                    }
                }
                if (isFavSaved)
                {
                    MiscDBUtil.SaveFavourites();
                }
                if (isPendingSaved)
                {
                    MiscDBUtil.SavePendingRequests();
                }
                msisdns = null;
                Debug.WriteLine("Total contacts with no msisdn : {0}", count);
                Debug.WriteLine("Total contacts inserted : {0}", totalContacts);
                if (!isRefresh)
                {
                    App.WriteToIsoStorageSettings(HikeConstants.AppSettings.CONTACTS_TO_SHOW, msgToShow);
                }
                return(server_contacts);
            }
            catch (ArgumentException)
            {
                return(null);
            }
            catch (Exception e)
            {
                return(null);
            }
        }
示例#29
0
        private void Invite_Or_Fav_Click(object sender, EventArgs e)
        {
            #region FAV SECTION
            if (_isAddToFavPage)
            {
                bool isPendingRemoved = false;
                for (int i = 0; i < (hikeFavList == null ? 0 : hikeFavList.Count); i++)
                {
                    if (!App.ViewModel.Isfavourite(hikeFavList[i].Msisdn) && hikeFavList[i].Msisdn != App.MSISDN) // if not already favourite then only add to fav
                    {
                        ConversationListObject favObj = null;
                        if (App.ViewModel.ConvMap.ContainsKey(hikeFavList[i].Msisdn))
                        {
                            favObj       = App.ViewModel.ConvMap[hikeFavList[i].Msisdn];
                            favObj.IsFav = true;
                        }
                        else
                        {
                            favObj = new ConversationListObject(hikeFavList[i].Msisdn, hikeFavList[i].Name, hikeFavList[i].OnHike, hikeFavList[i].Avatar);
                        }

                        App.ViewModel.FavList.Insert(0, favObj);
                        if (App.ViewModel.IsPending(favObj.Msisdn)) // if this is in pending already , remove from pending and add to fav
                        {
                            App.ViewModel.PendingRequests.Remove(favObj);
                            isPendingRemoved = true;
                        }
                        int count = 0;
                        App.appSettings.TryGetValue <int>(HikeViewModel.NUMBER_OF_FAVS, out count);
                        App.WriteToIsoStorageSettings(HikeViewModel.NUMBER_OF_FAVS, count + 1);

                        JObject data = new JObject();
                        data["id"] = hikeFavList[i].Msisdn;
                        JObject obj = new JObject();
                        obj[HikeConstants.TYPE] = HikeConstants.MqttMessageTypes.ADD_FAVOURITE;
                        obj[HikeConstants.DATA] = data;
                        App.HikePubSubInstance.publish(HikePubSub.MQTT_PUBLISH, obj);
                        MiscDBUtil.SaveFavourites(favObj);
                        App.AnalyticsInstance.addEvent(Analytics.ADD_FAVS_INVITE_USERS);
                    }
                }
                MiscDBUtil.SaveFavourites();
                if (isPendingRemoved)
                {
                    MiscDBUtil.SavePendingRequests();
                }
                App.HikePubSubInstance.publish(HikePubSub.ADD_REMOVE_FAV_OR_PENDING, null);
            }
            #endregion
            #region INVITE
            else
            {
                string inviteToken = "";
                //App.appSettings.TryGetValue<string>(HikeConstants.INVITE_TOKEN, out inviteToken);
                int count = 0;
                foreach (string key in contactsList.Keys)
                {
                    if (key == App.MSISDN)
                    {
                        continue;
                    }
                    JObject obj  = new JObject();
                    JObject data = new JObject();
                    data[HikeConstants.SMS_MESSAGE] = string.Format(AppResources.sms_invite_message, inviteToken);
                    data[HikeConstants.TIMESTAMP]   = TimeUtils.getCurrentTimeStamp();
                    data[HikeConstants.MESSAGE_ID]  = -1;
                    obj[HikeConstants.TO]           = key;
                    obj[HikeConstants.DATA]         = data;
                    obj[HikeConstants.TYPE]         = NetworkManager.INVITE;
                    App.MqttManagerInstance.mqttPublishToServer(obj);
                    count++;
                }
                if (count > 0)
                {
                    MessageBox.Show(string.Format(AppResources.InviteUsers_TotalInvitesSent_Txt, count), AppResources.InviteUsers_FriendsInvited_Txt, MessageBoxButton.OK);
                }
            }
            #endregion
            NavigationService.GoBack();
        }
示例#30
0
        /// <summary>
        /// this function will automatically read which read function version should be used to read file
        /// </summary>
        /// <returns></returns>

        public static List <ConversationListObject> getAllConvs()
        {
            List <ConversationListObject> convList = null;

            // when reading a file , nobody should write it
            lock (readWriteLock)
            {
                using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    if (!store.DirectoryExists(CONVERSATIONS_DIRECTORY))
                    {
                        return(null);
                    }
                    string fname;
                    if (store.FileExists(CONVERSATIONS_DIRECTORY + "\\" + "Convs"))
                    {
                        fname = CONVERSATIONS_DIRECTORY + "\\" + "Convs";
                    }
                    else if (store.FileExists(CONVERSATIONS_DIRECTORY + "\\" + "Convs_bkp"))
                    {
                        fname = CONVERSATIONS_DIRECTORY + "\\" + "Convs_bkp";
                    }
                    else
                    {
                        return(null);
                    }

                    using (var file = store.OpenFile(fname, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    {
                        using (var reader = new BinaryReader(file))
                        {
                            int count = 0;
                            try
                            {
                                count = reader.ReadInt32();
                            }
                            catch
                            {
                            }
                            if (count > 0)
                            {
                                bool isLessThanEqualTo_1500 = false;
                                if (Utils.compareVersion(App.CURRENT_VERSION, "1.5.0.0") != 1) // current_ver <= 1.5.0.0
                                {
                                    isLessThanEqualTo_1500 = true;
                                }

                                convList = new List <ConversationListObject>(count);
                                for (int i = 0; i < count; i++)
                                {
                                    ConversationListObject item = new ConversationListObject();
                                    try
                                    {
                                        if (isLessThanEqualTo_1500)
                                        {
                                            item.ReadVer_1_4_0_0(reader);
                                        }
                                        else
                                        {
                                            item.ReadVer_Latest(reader);
                                        }
                                    }
                                    catch
                                    {
                                        item = null;
                                    }
                                    if (IsValidConv(item))
                                    {
                                        convList.Add(item);
                                    }
                                }
                                convList.Sort();
                            }
                            reader.Close();
                        }
                        try
                        {
                            file.Close();
                            file.Dispose();
                        }
                        catch { }
                    }
                    store.Dispose();
                }
                return(convList);
            }
        }