public static void deleteAllGroups() { using (HikeChatsDb context = new HikeChatsDb(App.MsgsDBConnectionstring)) { context.groupInfo.DeleteAllOnSubmit <GroupInfo>(context.GetTable <GroupInfo>()); MessagesTableUtils.SubmitWithConflictResolve(context); } }
public static void deleteGroupWithId(string groupId) { using (HikeChatsDb context = new HikeChatsDb(App.MsgsDBConnectionstring)) { context.groupInfo.DeleteAllOnSubmit <GroupInfo>(DbCompiledQueries.GetGroupInfoForID(context, groupId)); MessagesTableUtils.SubmitWithConflictResolve(context); } }
public static void SetGroupAlive(string groupId) { using (HikeChatsDb context = new HikeChatsDb(App.MsgsDBConnectionstring)) { GroupInfo cObj = DbCompiledQueries.GetGroupInfoForID(context, groupId).FirstOrDefault(); if (cObj == null) { return; } cObj.GroupAlive = true; MessagesTableUtils.SubmitWithConflictResolve(context); } }
public static bool updateGroupName(string groupId, string groupName) { using (HikeChatsDb context = new HikeChatsDb(App.MsgsDBConnectionstring)) { GroupInfo cObj = DbCompiledQueries.GetGroupInfoForID(context, groupId).FirstOrDefault(); if (cObj == null) { return(false); } cObj.GroupName = groupName; MessagesTableUtils.SubmitWithConflictResolve(context); } return(true); }
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); }
public static Dictionary <long, Attachment> getAllFileAttachment(string msisdn) { if (msisdn == null) // this is imp as explicit handling of null is required to check exception { return(null); } msisdn = msisdn.Replace(":", "_"); string fileDirectory = HikeConstants.FILES_ATTACHMENT + "/" + msisdn; Dictionary <long, Attachment> msgIdAttachmentMap = new Dictionary <long, Attachment>(); using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) { if (store.DirectoryExists(fileDirectory)) { string[] msgIds = store.GetFileNames(fileDirectory + "/*"); foreach (string msgId in msgIds) { using (var file = store.OpenFile(fileDirectory + "/" + msgId, FileMode.Open, FileAccess.Read)) { using (var reader = new BinaryReader(file)) { Attachment attachment = new Attachment(); attachment.Read(reader); long messageId = Int64.Parse(msgId); if (attachment.FileState == Attachment.AttachmentState.FAILED_OR_NOT_STARTED && MessagesTableUtils.isUploadingOrDownloadingMessage(messageId)) { attachment.FileState = Attachment.AttachmentState.STARTED; } msgIdAttachmentMap.Add(Int64.Parse(msgId), attachment); } } } } return(msgIdAttachmentMap); } }
private void updateDbBatch(long[] ids, int status) { string msisdn = MessagesTableUtils.updateAllMsgStatus(null, ids, status); ConversationTableUtils.updateLastMsgStatus(ids[ids.Length - 1], msisdn, status); }
public void onEventReceived(string type, object obj) { #region MESSAGE_SENT if (HikePubSub.MESSAGE_SENT == type) { object[] vals = (object[])obj; ConvMessage convMessage = (ConvMessage)vals[0]; bool isNewGroup = (bool)vals[1]; SentChatBubble chatBubble = (SentChatBubble)vals[2]; ConversationListObject convObj = MessagesTableUtils.addChatMessage(convMessage, isNewGroup); if (convObj == null) { return; } if (chatBubble != null) { chatBubble.MessageId = convMessage.MessageId; } Deployment.Current.Dispatcher.BeginInvoke(() => { if (chatBubble != null) { addSentMessageToMsgMap(chatBubble); } if (convObj.ConvBoxObj == null) { convObj.ConvBoxObj = new ConversationBox(convObj); if (App.ViewModel.ConversationListPage != null) { ContextMenuService.SetContextMenu(convObj.ConvBoxObj, App.ViewModel.ConversationListPage.createConversationContextMenu(convObj)); } } else if (App.ViewModel.MessageListPageCollection.Contains(convObj.ConvBoxObj))//cannot use convMap here because object has pushed to map but not to ui { App.ViewModel.MessageListPageCollection.Remove(convObj.ConvBoxObj); } App.ViewModel.MessageListPageCollection.Insert(0, convObj.ConvBoxObj); if (!isNewGroup) { mPubSub.publish(HikePubSub.MQTT_PUBLISH, convMessage.serialize(convMessage.IsSms ? false : true)); } }); //if (!isNewGroup) // mPubSub.publish(HikePubSub.MQTT_PUBLISH, convMessage.serialize(convMessage.IsSms ? false : true)); } #endregion #region FORWARD_ATTACHMENT else if (HikePubSub.FORWARD_ATTACHMENT == type) { object[] vals = (object[])obj; ConvMessage convMessage = (ConvMessage)vals[0]; string sourceFilePath = (string)vals[1]; SentChatBubble chatBubble = (SentChatBubble)vals[2]; ConversationListObject convObj = MessagesTableUtils.addChatMessage(convMessage, false); chatBubble.MessageId = convMessage.MessageId; Deployment.Current.Dispatcher.BeginInvoke(() => { addSentMessageToMsgMap(chatBubble); if (convObj.ConvBoxObj == null) { convObj.ConvBoxObj = new ConversationBox(convObj); if (App.ViewModel.ConversationListPage != null) { ContextMenuService.SetContextMenu(convObj.ConvBoxObj, App.ViewModel.ConversationListPage.createConversationContextMenu(convObj)); } } else if (App.ViewModel.MessageListPageCollection.Contains(convObj.ConvBoxObj))//cannot use convMap here because object has pushed to map but not to ui { App.ViewModel.MessageListPageCollection.Remove(convObj.ConvBoxObj); } App.ViewModel.MessageListPageCollection.Insert(0, convObj.ConvBoxObj); //forward attachment message string destinationFilePath = HikeConstants.FILES_BYTE_LOCATION + "/" + convMessage.Msisdn + "/" + convMessage.MessageId; //while writing in iso, we write it as failed and then revert to started MiscDBUtil.saveAttachmentObject(convMessage.FileAttachment, convMessage.Msisdn, convMessage.MessageId); //since, Location & Contact has required info in metadata string, no need to use raw files if (!convMessage.FileAttachment.ContentType.Contains(HikeConstants.CT_CONTACT) && !convMessage.FileAttachment.ContentType.Contains(HikeConstants.LOCATION)) { MiscDBUtil.copyFileInIsolatedStorage(sourceFilePath, destinationFilePath); } mPubSub.publish(HikePubSub.MQTT_PUBLISH, convMessage.serialize(true)); }); } #endregion #region ATTACHMENT_SEND else if (HikePubSub.ATTACHMENT_SENT == type) { object[] vals = (object[])obj; ConvMessage convMessage = (ConvMessage)vals[0]; byte[] fileBytes = (byte[])vals[1]; SentChatBubble chatBubble = (SentChatBubble)vals[2]; //In case of sending attachments, here message state should be unknown instead of sent_unconfirmed //convMessage.MessageStatus = ConvMessage.State.SENT_UNCONFIRMED; ConversationListObject convObj = MessagesTableUtils.addChatMessage(convMessage, false); // in case of db failure convObj returned will be null if (convObj == null) { return; } chatBubble.MessageId = convMessage.MessageId; Deployment.Current.Dispatcher.BeginInvoke(() => { addSentMessageToMsgMap(chatBubble); if (convObj.ConvBoxObj == null) { convObj.ConvBoxObj = new ConversationBox(convObj); if (App.ViewModel.ConversationListPage != null) { ContextMenuService.SetContextMenu(convObj.ConvBoxObj, App.ViewModel.ConversationListPage.createConversationContextMenu(convObj)); } } else if (App.ViewModel.MessageListPageCollection.Contains(convObj.ConvBoxObj)) { App.ViewModel.MessageListPageCollection.Remove(convObj.ConvBoxObj); } App.ViewModel.MessageListPageCollection.Insert(0, convObj.ConvBoxObj); //send attachment message (new attachment - upload case) MessagesTableUtils.addUploadingOrDownloadingMessage(convMessage.MessageId, chatBubble); convMessage.FileAttachment.FileState = Attachment.AttachmentState.FAILED_OR_NOT_STARTED; MiscDBUtil.saveAttachmentObject(convMessage.FileAttachment, convMessage.Msisdn, convMessage.MessageId); convMessage.FileAttachment.FileState = Attachment.AttachmentState.STARTED; AccountUtils.postUploadPhotoFunction finalCallbackForUploadFile = new AccountUtils.postUploadPhotoFunction(uploadFileCallback); if (!convMessage.FileAttachment.ContentType.Contains(HikeConstants.CT_CONTACT)) { MiscDBUtil.storeFileInIsolatedStorage(HikeConstants.FILES_BYTE_LOCATION + "/" + convMessage.Msisdn + "/" + Convert.ToString(convMessage.MessageId), fileBytes); } AccountUtils.uploadFile(fileBytes, finalCallbackForUploadFile, convMessage, chatBubble); }); } #endregion #region ATTACHMENT_RESEND_OR_FORWARD else if (HikePubSub.ATTACHMENT_RESEND == type) { object[] vals = (object[])obj; ConvMessage convMessage = (ConvMessage)vals[0]; SentChatBubble chatBubble = (SentChatBubble)vals[1]; byte[] fileBytes; if (convMessage.FileAttachment.ContentType.Contains(HikeConstants.CT_CONTACT)) { fileBytes = Encoding.UTF8.GetBytes(convMessage.MetaDataString); } else { MiscDBUtil.readFileFromIsolatedStorage(HikeConstants.FILES_BYTE_LOCATION + "/" + convMessage.Msisdn + "/" + Convert.ToString(convMessage.MessageId), out fileBytes); } AccountUtils.postUploadPhotoFunction finalCallbackForUploadFile = new AccountUtils.postUploadPhotoFunction(uploadFileCallback); AccountUtils.uploadFile(fileBytes, finalCallbackForUploadFile, convMessage, chatBubble); } #endregion #region MESSAGE_RECEIVED_READ else if (HikePubSub.MESSAGE_RECEIVED_READ == type) // represents event when a msg is read by this user { long[] ids = (long[])obj; updateDbBatch(ids, (int)ConvMessage.State.RECEIVED_READ); } #endregion #region MESSAGE_DELETED else if (HikePubSub.MESSAGE_DELETED == type) { object[] o = (object[])obj; long msgId = (long)o[0]; MessagesTableUtils.deleteMessage(msgId); // delete msg with given msgId from messages table ConversationListObject c = (ConversationListObject)o[1]; bool delConv = (bool)o[2]; if (delConv) { // delete the conversation from DB. ConversationTableUtils.deleteConversation(c.Msisdn); //ConversationTableUtils.saveConvObjectList(); } else { //update conversation ConversationTableUtils.updateConversation(c); } // TODO :: persistence.removeMessage(msgId); } #endregion #region BLOCK_USER else if (HikePubSub.BLOCK_USER == type) { string msisdn = (string)obj; UsersTableUtils.block(msisdn); JObject blockObj = blockUnblockSerialize("b", msisdn); mPubSub.publish(HikePubSub.MQTT_PUBLISH, blockObj); } #endregion #region UNBLOCK_USER else if (HikePubSub.UNBLOCK_USER == type) { string msisdn = (string)obj; UsersTableUtils.unblock(msisdn); JObject unblockObj = blockUnblockSerialize("ub", msisdn); mPubSub.publish(HikePubSub.MQTT_PUBLISH, unblockObj); } #endregion #region ADD_OR_UPDATE_PROFILE else if (HikePubSub.ADD_OR_UPDATE_PROFILE == type) { object[] vals = (object[])obj; string msisdn = (string)vals[0]; byte[] fullViewBytes = (byte[])vals[1]; byte[] thumbnailBytes = (byte[])vals[2]; if (Utils.isGroupConversation(msisdn)) { string grpId = msisdn.Replace(":", "_"); MiscDBUtil.saveAvatarImage(grpId + HikeConstants.FULL_VIEW_IMAGE_PREFIX, fullViewBytes, false); MiscDBUtil.saveAvatarImage(grpId, thumbnailBytes, false); } else { MiscDBUtil.saveAvatarImage(HikeConstants.MY_PROFILE_PIC, thumbnailBytes, false); } } #endregion #region GROUP LEFT else if (HikePubSub.GROUP_LEFT == type) { /* * 1. Delete conversation with this groupId * 2. Delete ConvMessages * 3. Delete GroupInfo * 4. Delete GroupMembers */ string groupId = (string)obj; ConversationTableUtils.deleteConversation(groupId); //ConversationTableUtils.saveConvObjectList(); MessagesTableUtils.deleteAllMessagesForMsisdn(groupId); GroupTableUtils.deleteGroupWithId(groupId); GroupManager.Instance.GroupCache.Remove(groupId); GroupManager.Instance.DeleteGroup(groupId); } #endregion #region BLOCK GROUP OWNER else if (HikePubSub.BLOCK_GROUPOWNER == type) { string groupOwner = (string)obj; UsersTableUtils.block(groupOwner); JObject blockObj = blockUnblockSerialize("b", groupOwner); mPubSub.publish(HikePubSub.MQTT_PUBLISH, blockObj); } #endregion #region UNBLOCK GROUP OWNER else if (HikePubSub.UNBLOCK_GROUPOWNER == type) { string groupOwner = (string)obj; UsersTableUtils.unblock(groupOwner); JObject unblockObj = blockUnblockSerialize("ub", groupOwner); mPubSub.publish(HikePubSub.MQTT_PUBLISH, unblockObj); } #endregion #region DELETE CONVERSATION else if (HikePubSub.DELETE_CONVERSATION == type) { string convMsisdn = (string)obj; if (Utils.isGroupConversation(convMsisdn)) // if Group Conversation delete groups too { GroupTableUtils.deleteGroupWithId(convMsisdn); // remove entry from Group Table GroupManager.Instance.GroupCache.Remove(convMsisdn); GroupManager.Instance.DeleteGroup(convMsisdn); // delete the group file } MessagesTableUtils.deleteAllMessagesForMsisdn(convMsisdn); //removed all chat messages for this msisdn ConversationTableUtils.deleteConversation(convMsisdn); // removed entry from conversation table //ConversationTableUtils.saveConvObjectList(); MiscDBUtil.deleteMsisdnData(convMsisdn); } #endregion }