private void DeleteMessage(TLDecryptedMessageMediaPhoto photo) { if (photo == null) { return; } var encryptedChat = Chat as TLEncryptedChatCommon; if (encryptedChat == null) { return; } TLDecryptedMessage mediaMessage = null; for (var i = 0; i < Items.Count; i++) { var message = Items[i] as TLDecryptedMessage; if (message != null && message.Media == photo) { mediaMessage = message; break; } } if (mediaMessage == null) { return; } DeleteMessage(mediaMessage); }
public void CopyMessage(TLDecryptedMessage message) { if (message == null) { return; } Clipboard.SetText(message.Message.ToString()); }
private void UpdateApplicationBar(TLDecryptedMessage message) { var isTTLMessage = message != null && message.TTL.Value > 0; _savePhotoMenuItem.IsEnabled = #if WP8 !isTTLMessage; #else !isTTLMessage && message != null && message.Media is TLMessageMediaPhoto; #endif _sharePhotoMenuItem.IsEnabled = !isTTLMessage && message != null && message.Media is TLDecryptedMessageMediaPhoto; }
public static void AddToTTLQueue(TLDecryptedMessage message, TTLParams ttlParams, Action <TLDecryptedMessage> callback) { if (message == null) { return; } if (ttlParams == null) { return; } if (_ttlQueue == null) { _ttlQueue = new DecryptedTTLQueue(); } _ttlQueue.Add(message, ttlParams, callback); }
public static TLDecryptedMessage GetDecryptedMessage(TLObject obj) { TLDecryptedMessage message = null; var messageLayer17 = obj as TLDecryptedMessageLayer17; if (messageLayer17 != null) { message = messageLayer17.Message as TLDecryptedMessage17; } var decryptedMessage = obj as TLDecryptedMessage; if (decryptedMessage != null) { message = decryptedMessage; } return(message); }
private void DeleteMessage(TLDecryptedMessage message) { if (message == null) { return; } var chat = Chat as TLEncryptedChat; if (chat == null) { return; } var messageId = new TLVector <TLLong> { message.RandomId }; if (message.Status == MessageStatus.Failed) { Items.Remove(message); NotifyOfPropertyChange(() => DescriptionVisibility); CacheService.DeleteDecryptedMessages(messageId); } else { var deleteMessagesAction = new TLDecryptedMessageActionDeleteMessages { RandomIds = messageId }; var decryptedTuple = GetDecryptedServiceMessageAndObject(deleteMessagesAction, chat, MTProtoService.CurrentUserId, CacheService); SendEncryptedService(chat, decryptedTuple.Item2, MTProtoService, CacheService, result => BeginOnUIThread(() => { Items.Remove(message); NotifyOfPropertyChange(() => DescriptionVisibility); CacheService.DeleteDecryptedMessages(messageId); })); } }
private static bool IsDocument(TLDecryptedMessage message) { if (message == null) { return(false); } var mediaDocument = message.Media as TLDecryptedMessageMediaDocument45; if (mediaDocument == null) { return(false); } var document = mediaDocument.Document as IAttributes; if (document == null) { return(false); } foreach (var attribute in document.Attributes) { if (attribute is TLDocumentAttributeAnimated || attribute is TLDocumentAttributeSticker || attribute is TLDocumentAttributeVideo ) { return(false); } var documentAttributeAudio = attribute as TLDocumentAttributeAudio46; if (documentAttributeAudio != null && documentAttributeAudio.Voice) { return(false); } } return(true); }
private void OpenLocation(TLDecryptedMessage message) { if (LocationPicker == null) { LocationPicker = IoC.Get <MapViewModel>(); LocationPicker.LiveLocations.Clear(); LocationPicker.With = With; LocationPicker.MessageGeo = message; LocationPicker.MessageGeoLive = new TLMessageEmpty(); LocationPicker.ContinueAction = ContinueSendLocation; LocationPicker.StopLiveLocationAction = StopLiveLocation; NotifyOfPropertyChange(() => LocationPicker); } else { LocationPicker.LiveLocations.Clear(); LocationPicker.With = With; LocationPicker.MessageGeo = message; LocationPicker.MessageGeoLive = new TLMessageEmpty(); BeginOnUIThread(() => LocationPicker.OpenEditor()); } }
private static bool IsShortFooter(TLDecryptedMessage message, bool isGrouped, bool isPhoto, bool isVideo, bool isGeoPoint, bool isDocument, bool isVoice, bool isSticker, bool isWebPage, bool isEmptyMedia) { if (message != null) { var mediaCaption = message.Media as IMediaCaption; if (mediaCaption != null && !TLString.IsNullOrEmpty(mediaCaption.Caption)) { return(false); } if (isWebPage) { return(false); } if (isGrouped || isPhoto || isVideo || isGeoPoint) { return(true); } if (isSticker) { return(true); } if (isEmptyMedia) { return(true); } if (isDocument || isVoice) { return(true); } } return(false); }
public void Add(TLDecryptedMessage message, TTLParams ttlParams, Action <TLDecryptedMessage> callback) { _timer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan); var newItem = new Tuple <TLDecryptedMessage, TTLParams, Action <TLDecryptedMessage> >(message, ttlParams, callback); var added = false; for (var i = 0; i < _items.Count; i++) { if (_items[i].Item2.StartTime.AddSeconds(_items[i].Item2.Total) >= ttlParams.StartTime.AddSeconds(ttlParams.Total)) { _items.Insert(i, newItem); added = true; break; } } if (!added) { _items.Add(newItem); } SetTimer(_items[0]); }
public static void SendEncryptedMultiMediaInternal(TLEncryptedChat chat, TLDecryptedMessage message, IMTProtoService mtProtoService, ICacheService cacheService) { Execute.BeginOnUIThread(() => { var chat17 = chat as TLEncryptedChat17; if (chat17 == null) { return; } var randomId = new TLVector <TLLong>(); var data = new TLVector <TLString>(); var inputFile = new TLVector <TLInputEncryptedFileBase>(); var mediaGroup = message.Media as TLDecryptedMessageMediaGroup; if (mediaGroup != null) { for (var i = 0; i < mediaGroup.Group.Count; i++) { var message73 = mediaGroup.Group[i] as TLDecryptedMessage73; if (message73 == null) { return; } if (message73.InputFile == null) { return; } randomId.Add(message73.RandomId); var messageLayer = TLUtils.GetDecryptedMessageLayer(chat17.Layer, message73.InSeqNo, message73.OutSeqNo, message73) as TLDecryptedMessageLayer17; if (message73.InSeqNo.Value == -1 && message73.OutSeqNo.Value == -1) { var inSeqNo = TLUtils.GetInSeqNo(mtProtoService.CurrentUserId, chat17); var outSeqNo = TLUtils.GetOutSeqNo(mtProtoService.CurrentUserId, chat17); message73.InSeqNo = inSeqNo; message73.OutSeqNo = outSeqNo; message73.NotifyOfPropertyChange(() => message73.InSeqNo); message73.NotifyOfPropertyChange(() => message73.OutSeqNo); messageLayer.InSeqNo = inSeqNo; messageLayer.OutSeqNo = outSeqNo; chat17.RawOutSeqNo = new TLInt(chat17.RawOutSeqNo.Value + 1); } data.Add(TLUtils.EncryptMessage(messageLayer, mtProtoService.CurrentUserId, chat)); inputFile.Add(message73.InputFile); System.Diagnostics.Debug.WriteLine("Send photo random_id={0} in_seq_no={1} out_seq_no={2}", message73.RandomId, message73.InSeqNo, message73.OutSeqNo); } } if (randomId.Count == 0) { return; } System.Diagnostics.Debug.WriteLine("Send photo random_id=[{0}]", string.Join(",", randomId)); mtProtoService.SendEncryptedMultiMediaAsync( new TLInputEncryptedChat { AccessHash = chat.AccessHash, ChatId = chat.Id }, randomId, data, inputFile, result => Execute.BeginOnUIThread(() => { message.Media.UploadingProgress = 0.0; message.Status = MessageStatus.Confirmed; message.NotifyOfPropertyChange(() => message.Status); if (mediaGroup != null) { for (var i = mediaGroup.Group.Count - 1; i >= 0; i--) { var item = mediaGroup.Group[i] as TLDecryptedMessage; if (item != null) { item.Media.UploadingProgress = 0.0; item.Status = MessageStatus.Confirmed; item.NotifyOfPropertyChange(() => message.Status); ProcessSentEncryptedFile(item, result[i]); cacheService.SyncSendingDecryptedMessage(chat.Id, result[i].Date, mediaGroup.Group[i].RandomId, m => { }); } } } }), () => { message.Status = MessageStatus.Confirmed; message.NotifyOfPropertyChange(() => message.Status); }, error => { message.Status = MessageStatus.Failed; message.NotifyOfPropertyChange(() => message.Status); Execute.ShowDebugMessage("messages.sendEncryptedFile error " + error); }); }); }
public Telegram.Api.WindowsPhone.Tuple <TLDecryptedMessageBase, TLObject> GetDecryptedMessageAndObject(TLString text, TLDecryptedMessageMediaBase media, TLEncryptedChat chat, bool delaySeq = false) { TLDecryptedMessageBase decryptedMessage; TLObject decryptedObject; var randomId = TLLong.Random(); var encryptedChat17 = chat as TLEncryptedChat17; if (encryptedChat17 != null) { var cachedEncryptedChat17 = (TLEncryptedChat17)CacheService.GetEncryptedChat(encryptedChat17.Id); TLInt inSeqNo; TLInt outSeqNo; if (!delaySeq) { inSeqNo = TLUtils.GetInSeqNo(MTProtoService.CurrentUserId, cachedEncryptedChat17); outSeqNo = TLUtils.GetOutSeqNo(MTProtoService.CurrentUserId, cachedEncryptedChat17); cachedEncryptedChat17.RawOutSeqNo = new TLInt(cachedEncryptedChat17.RawOutSeqNo.Value + 1); } else { inSeqNo = new TLInt(-1); outSeqNo = new TLInt(-1); } TLDecryptedMessageBase decryptedMessageBase; if (encryptedChat17.Layer.Value >= 73) { decryptedMessageBase = new TLDecryptedMessage73 { Flags = new TLInt(0), Media = media, Message = text, RandomId = randomId, RandomBytes = TLString.Random(Telegram.Api.Constants.MinRandomBytesLength), //Entities = new TLVector<TLMessageEntityBase>(), //ViaBotName = TLString.Empty, //ReplyToRandomMsgId = new TLLong(0), ChatId = chat.Id, FromId = new TLInt(StateService.CurrentUserId), Out = new TLBool(true), Unread = new TLBool(true), Date = TLUtils.DateToUniversalTimeTLInt(MTProtoService.ClientTicksDelta, DateTime.Now), Status = MessageStatus.Sending, TTL = chat.MessageTTL ?? new TLInt(0), InSeqNo = inSeqNo, OutSeqNo = outSeqNo }; media.TTLSeconds = decryptedMessageBase.TTL; if (!(media is TLDecryptedMessageMediaEmpty)) { ((TLDecryptedMessage45)decryptedMessageBase).SetMedia(); } } else if (encryptedChat17.Layer.Value >= 45) { decryptedMessageBase = new TLDecryptedMessage45 { Flags = new TLInt(0), Media = media, Message = text, RandomId = randomId, RandomBytes = TLString.Random(Telegram.Api.Constants.MinRandomBytesLength), //Entities = new TLVector<TLMessageEntityBase>(), //ViaBotName = TLString.Empty, //ReplyToRandomMsgId = new TLLong(0), ChatId = chat.Id, FromId = new TLInt(StateService.CurrentUserId), Out = new TLBool(true), Unread = new TLBool(true), Date = TLUtils.DateToUniversalTimeTLInt(MTProtoService.ClientTicksDelta, DateTime.Now), Status = MessageStatus.Sending, TTL = chat.MessageTTL ?? new TLInt(0), InSeqNo = inSeqNo, OutSeqNo = outSeqNo }; if (!(media is TLDecryptedMessageMediaEmpty)) { ((TLDecryptedMessage45)decryptedMessageBase).SetMedia(); } } else { decryptedMessageBase = new TLDecryptedMessage17 { Media = media, Message = text, RandomId = randomId, RandomBytes = TLString.Random(Telegram.Api.Constants.MinRandomBytesLength), ChatId = chat.Id, FromId = new TLInt(StateService.CurrentUserId), Out = new TLBool(true), Unread = new TLBool(true), Date = TLUtils.DateToUniversalTimeTLInt(MTProtoService.ClientTicksDelta, DateTime.Now), Status = MessageStatus.Sending, TTL = chat.MessageTTL ?? new TLInt(0), InSeqNo = inSeqNo, OutSeqNo = outSeqNo }; } var decryptedMessageLayer17 = TLUtils.GetDecryptedMessageLayer(encryptedChat17.Layer, inSeqNo, outSeqNo, decryptedMessageBase); decryptedMessage = decryptedMessageBase; decryptedObject = decryptedMessageLayer17; } else { var decryptedMessage8 = new TLDecryptedMessage { Media = media, Message = text, RandomId = randomId, RandomBytes = TLString.Random(Telegram.Api.Constants.MinRandomBytesLength), ChatId = chat.Id, FromId = new TLInt(StateService.CurrentUserId), Out = new TLBool(true), Unread = new TLBool(true), Date = TLUtils.DateToUniversalTimeTLInt(MTProtoService.ClientTicksDelta, DateTime.Now), Status = MessageStatus.Sending, TTL = chat.MessageTTL }; decryptedMessage = decryptedMessage8; decryptedObject = decryptedMessage; } return(new Telegram.Api.WindowsPhone.Tuple <TLDecryptedMessageBase, TLObject>(decryptedMessage, decryptedObject)); }
public void Resend(TLDecryptedMessage message) #endif { if (message == null) { return; } var chat = Chat as TLEncryptedChat; if (chat == null) { return; } TLObject obj = message; var decryptedMessage17 = message as TLDecryptedMessage17; if (decryptedMessage17 != null) { var encryptedChat17 = chat as TLEncryptedChat17; if (encryptedChat17 == null) { return; } var messageLayer17 = new TLDecryptedMessageLayer17(); messageLayer17.RandomBytes = TLString.Empty; messageLayer17.InSeqNo = decryptedMessage17.InSeqNo; messageLayer17.OutSeqNo = decryptedMessage17.OutSeqNo; messageLayer17.Layer = encryptedChat17.Layer; messageLayer17.Message = decryptedMessage17; obj = messageLayer17; } message.Status = MessageStatus.Sending; if (message.Media is TLDecryptedMessageMediaEmpty) { SendEncrypted(chat, obj, MTProtoService, CacheService); } else { message.Media.UploadingProgress = 0.001; if (message.Media is TLDecryptedMessageMediaPhoto) { SendPhotoInternal(null, obj); } else if (message.Media is TLDecryptedMessageMediaVideo) { SendVideoInternal(null, obj); } else if (message.Media is TLDecryptedMessageMediaDocument) { #if WP81 var file = await GetStorageFile(message.Media); if (file != null) { SendDocumentInternal(file, message); } else { MessageBox.Show(AppResources.UnableToAccessDocument, AppResources.Error, MessageBoxButton.OK); message.Status = MessageStatus.Failed; DeleteMessage(message); return; } #else SendDocumentInternal(null, message); #endif } else if (message.Media is TLDecryptedMessageMediaAudio) { #if WP8 SendAudioInternal(obj); #endif } else if (message.Media is TLDecryptedMessageMediaContact) { } } message.NotifyOfPropertyChange(() => message.Status); }
public StartGifPlayerEventArgs(TLDecryptedMessage decryptedMessage) { DecryptedMessage = decryptedMessage; }
private void ToMessageTemplate(TLDecryptedMessage message) { DrawBubble(message); }
public bool OpenSecretPhoto(TLDecryptedMessageMediaPhoto mediaPhoto) { if (mediaPhoto == null) { return(false); } TLDecryptedMessage17 message = null; for (var i = 0; i < Items.Count; i++) { var message17 = Items[i] as TLDecryptedMessage17; if (message17 != null && message17.Media == mediaPhoto) { message = message17; break; } } if (message == null) { return(false); } if (message.Status == MessageStatus.Sending) { return(false); } var result = false; if (!message.Out.Value) { if (message.TTL != null && message.TTL.Value > 0 && message.TTL.Value <= 60.0) { if (mediaPhoto.TTLParams == null) { message.IsTTLStarted = true; message.DeleteDate = new TLLong(DateTime.Now.Ticks + message.TTL.Value * TimeSpan.TicksPerSecond); mediaPhoto.TTLParams = new TTLParams { StartTime = DateTime.Now, IsStarted = true, Total = message.TTL.Value }; message.Unread = new TLBool(false); message.Status = MessageStatus.Read; CacheService.SyncDecryptedMessage(message, Chat, r => { var chat = Chat as TLEncryptedChat; if (chat == null) { return; } var action = new TLDecryptedMessageActionReadMessages(); action.RandomIds = new TLVector <TLLong> { message.RandomId }; var decryptedTuple = GetDecryptedServiceMessageAndObject(action, chat, MTProtoService.CurrentUserId, CacheService); SendEncryptedService(chat, decryptedTuple.Item2, MTProtoService, CacheService, sentEncryptedMessage => { }); }); } SecretPhoto = message; NotifyOfPropertyChange(() => SecretPhoto); result = true; } } else { SecretPhoto = message; NotifyOfPropertyChange(() => SecretPhoto); result = true; } return(result); }
public void OpenMedia(TLDecryptedMessage message) #endif { if (message == null) { return; } if (message.Status == MessageStatus.Sending) { return; } var mediaPhoto = message.Media as TLDecryptedMessageMediaPhoto; if (mediaPhoto != null) { if (message.TTL != null && message.TTL.Value > 0 && message.TTL.Value <= 60.0) { var decryptedMessage = message as TLDecryptedMessage17; if (decryptedMessage != null) { return; } } message.Unread = new TLBool(false); message.Status = MessageStatus.Read; CacheService.SyncDecryptedMessage(message, Chat, r => { }); { StateService.CurrentDecryptedPhotoMessage = message; StateService.CurrentDecryptedMediaMessages = Items .OfType <TLDecryptedMessage>() .Where(x => x.Media is TLDecryptedMessageMediaPhoto || x.Media is TLDecryptedMessageMediaVideo) .ToList(); if (ImageViewer == null) { ImageViewer = new DecryptedImageViewerViewModel(StateService, true) { DialogDetails = this }; NotifyOfPropertyChange(() => ImageViewer); } ImageViewer.OpenViewer(); } return; } var mediaGeo = message.Media as TLDecryptedMessageMediaGeoPoint; if (mediaGeo != null) { StateService.DecryptedMediaMessage = message; NavigationService.UriFor <MapViewModel>().Navigate(); return; } var mediaVideo = message.Media as TLDecryptedMessageMediaVideo; if (mediaVideo != null) { var fileLocation = mediaVideo.File as TLEncryptedFile; if (fileLocation == null) { return; } var fileName = String.Format("{0}_{1}_{2}.mp4", fileLocation.Id, fileLocation.DCId, fileLocation.AccessHash); using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (store.FileExists(fileName)) { var mediaVideo17 = mediaVideo as TLDecryptedMessageMediaVideo17; if (mediaVideo17 != null) { if (!message.Out.Value) { if (message.TTL != null && message.TTL.Value > 0 && message.TTL.Value <= 60.0) { if (mediaVideo17.TTLParams == null) { message.IsTTLStarted = true; message.DeleteDate = new TLLong(DateTime.Now.Ticks + Math.Max(mediaVideo17.Duration.Value + 1, message.TTL.Value) * TimeSpan.TicksPerSecond); mediaVideo17.TTLParams = new TTLParams { StartTime = DateTime.Now, IsStarted = true, Total = message.TTL.Value }; message.Unread = new TLBool(false); message.Status = MessageStatus.Read; CacheService.SyncDecryptedMessage(message, Chat, r => { var chat = Chat as TLEncryptedChat; if (chat == null) { return; } var action = new TLDecryptedMessageActionReadMessages(); action.RandomIds = new TLVector <TLLong> { message.RandomId }; var decryptedTuple = GetDecryptedServiceMessageAndObject(action, chat, MTProtoService.CurrentUserId, CacheService); SendEncryptedService(chat, decryptedTuple.Item2, MTProtoService, CacheService, sentEncryptedMessage => { }); }); } } } } var launcher = new MediaPlayerLauncher(); launcher.Location = MediaLocationType.Data; launcher.Media = new Uri(fileName, UriKind.Relative); launcher.Show(); } else { mediaVideo.DownloadingProgress = 0.001; var fileManager = IoC.Get <IEncryptedFileManager>(); fileManager.DownloadFile(fileLocation, mediaVideo); } } return; } var mediaAudio = message.Media as TLDecryptedMessageMediaAudio; if (mediaAudio != null) { var fileLocation = mediaAudio.File as TLEncryptedFile; if (fileLocation == null) { return; } var fileName = String.Format("audio{0}_{1}.wav", fileLocation.Id, fileLocation.AccessHash); using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (!store.FileExists(fileName)) { mediaAudio.DownloadingProgress = 0.001; var fileManager = IoC.Get <IEncryptedFileManager>(); fileManager.DownloadFile(fileLocation, mediaAudio); } else { var mediaAudio17 = mediaAudio as TLDecryptedMessageMediaAudio17; if (mediaAudio17 != null) { if (!message.Out.Value) { if (message.TTL != null && message.TTL.Value > 0 && message.TTL.Value <= 60.0) { if (mediaAudio17.TTLParams == null) { message.IsTTLStarted = true; message.DeleteDate = new TLLong(DateTime.Now.Ticks + Math.Max(mediaAudio17.Duration.Value + 1, message.TTL.Value) * TimeSpan.TicksPerSecond); mediaAudio17.TTLParams = new TTLParams { StartTime = DateTime.Now, IsStarted = true, Total = message.TTL.Value }; message.Unread = new TLBool(false); message.Status = MessageStatus.Read; CacheService.SyncDecryptedMessage(message, Chat, r => { var chat = Chat as TLEncryptedChat; if (chat == null) { return; } var action = new TLDecryptedMessageActionReadMessages(); action.RandomIds = new TLVector <TLLong> { message.RandomId }; var decryptedTuple = GetDecryptedServiceMessageAndObject(action, chat, MTProtoService.CurrentUserId, CacheService); SendEncryptedService(chat, decryptedTuple.Item2, MTProtoService, CacheService, sentEncryptedMessage => { }); }); } } } } } } return; } var mediaDocument = message.Media as TLDecryptedMessageMediaDocument; if (mediaDocument != null) { var fileLocation = mediaDocument.File as TLEncryptedFile; if (fileLocation == null) { return; } var fileName = String.Format("{0}_{1}_{2}.{3}", fileLocation.Id, fileLocation.DCId, fileLocation.AccessHash, fileLocation.FileExt); using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (store.FileExists(fileName)) { #if WP8 StorageFile pdfFile = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName); Windows.System.Launcher.LaunchFileAsync(pdfFile); #endif } else { mediaDocument.DownloadingProgress = 0.001; var fileManager = IoC.Get <IEncryptedFileManager>(); fileManager.DownloadFile(fileLocation, mediaDocument); } } return; } #if DEBUG MessageBox.Show("Tap on media"); #endif }
public async void OpenMedia(TLDecryptedMessage message)
public async void Resend(TLDecryptedMessage message)
private static void ProcessSentEncryptedFile(TLDecryptedMessage message, TLSentEncryptedFile result) { var media = message.Media; if (media != null) { var oldFile = media.File as TLEncryptedFile; media.File = result.EncryptedFile; if (oldFile != null) { var newFile = media.File as TLEncryptedFile; if (newFile != null) { newFile.FileName = oldFile.FileName; newFile.Duration = oldFile.Duration; var mediaPhoto = media as TLDecryptedMessageMediaPhoto; if (mediaPhoto != null) { var sourceFileName = String.Format("{0}_{1}_{2}.jpg", oldFile.Id, oldFile.DCId, oldFile.AccessHash); var destinationFileName = String.Format("{0}_{1}_{2}.jpg", newFile.Id, newFile.DCId, newFile.AccessHash); try { using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (store.FileExists(sourceFileName)) { store.CopyFile(sourceFileName, destinationFileName); store.DeleteFile(sourceFileName); } } } catch (Exception ex) { } } var mediaDocument = media as TLDecryptedMessageMediaDocument45; if (mediaDocument != null) { if (message.IsVoice()) { var originalFileName = String.Format("audio{0}_{1}.mp3", oldFile.Id, oldFile.AccessHash); var sourceFileName = String.Format("audio{0}_{1}.wav", oldFile.Id, oldFile.AccessHash); var destinationFileName = String.Format("audio{0}_{1}.wav", newFile.Id, newFile.AccessHash); try { using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (store.FileExists(sourceFileName)) { store.CopyFile(sourceFileName, destinationFileName); store.DeleteFile(sourceFileName); } if (store.FileExists(originalFileName)) { store.DeleteFile(originalFileName); } } } catch (Exception ex) { } } else { var sourceFileName = String.Format("{0}_{1}_{2}.{3}", oldFile.Id, oldFile.DCId, oldFile.AccessHash, oldFile.FileExt ?? mediaDocument.FileExt); var destinationFileName = String.Format("{0}_{1}_{2}.{3}", newFile.Id, newFile.DCId, newFile.AccessHash, newFile.FileExt ?? mediaDocument.FileExt); try { using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (store.FileExists(sourceFileName)) { store.CopyFile(sourceFileName, destinationFileName); store.DeleteFile(sourceFileName); } } } catch (Exception ex) { } } } var mediaAudio = media as TLDecryptedMessageMediaAudio; if (mediaAudio != null) { var originalFileName = String.Format("audio{0}_{1}.mp3", oldFile.Id, oldFile.AccessHash); var sourceFileName = String.Format("audio{0}_{1}.wav", oldFile.Id, oldFile.AccessHash); var destinationFileName = String.Format("audio{0}_{1}.wav", newFile.Id, newFile.AccessHash); try { using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (store.FileExists(sourceFileName)) { store.CopyFile(sourceFileName, destinationFileName); store.DeleteFile(sourceFileName); } if (store.FileExists(originalFileName)) { store.DeleteFile(originalFileName); } } } catch (Exception ex) { } } } } } }
public Telegram.Api.WindowsPhone.Tuple <TLDecryptedMessageBase, TLObject> GetDecryptedMessageAndObject(TLString text, TLDecryptedMessageMediaBase media, TLEncryptedChat chat, bool delaySeq = false) { TLDecryptedMessageBase decryptedMessage; TLObject decryptedObject; var random = new Random(); var randomId = TLLong.Random(); var textString = text.ToString(); var randomBytes = new byte[] { }; if (string.IsNullOrEmpty(textString) || textString.Length < 16) { randomBytes = new byte[16]; random.NextBytes(randomBytes); } var encryptedChat17 = chat as TLEncryptedChat17; if (encryptedChat17 != null) { var cachedEncryptedChat17 = (TLEncryptedChat17)CacheService.GetEncryptedChat(encryptedChat17.Id); TLInt inSeqNo; TLInt outSeqNo; if (!delaySeq) { inSeqNo = TLUtils.GetInSeqNo(MTProtoService.CurrentUserId, cachedEncryptedChat17); outSeqNo = TLUtils.GetOutSeqNo(MTProtoService.CurrentUserId, cachedEncryptedChat17); cachedEncryptedChat17.RawOutSeqNo = new TLInt(cachedEncryptedChat17.RawOutSeqNo.Value + 1); } else { inSeqNo = new TLInt(-1); outSeqNo = new TLInt(-1); } var decryptedMessage17 = new TLDecryptedMessage17 { Media = media, Message = text, RandomId = randomId, RandomBytes = TLString.FromBigEndianData(randomBytes), ChatId = chat.Id, FromId = new TLInt(StateService.CurrentUserId), Out = new TLBool(true), Unread = new TLBool(true), Date = TLUtils.DateToUniversalTimeTLInt(MTProtoService.ClientTicksDelta, DateTime.Now), Status = MessageStatus.Sending, TTL = chat.MessageTTL ?? new TLInt(0), InSeqNo = inSeqNo, OutSeqNo = outSeqNo }; var decryptedMessageLayer17 = new TLDecryptedMessageLayer17(); decryptedMessageLayer17.Layer = encryptedChat17.Layer; decryptedMessageLayer17.InSeqNo = inSeqNo; decryptedMessageLayer17.OutSeqNo = outSeqNo; decryptedMessageLayer17.RandomBytes = TLString.Empty; decryptedMessageLayer17.Message = decryptedMessage17; decryptedMessage = decryptedMessage17; decryptedObject = decryptedMessageLayer17; } else { var decryptedMessage8 = new TLDecryptedMessage { Media = media, Message = text, RandomId = randomId, RandomBytes = TLString.FromBigEndianData(randomBytes), ChatId = chat.Id, FromId = new TLInt(StateService.CurrentUserId), Out = new TLBool(true), Unread = new TLBool(true), Date = TLUtils.DateToUniversalTimeTLInt(MTProtoService.ClientTicksDelta, DateTime.Now), Status = MessageStatus.Sending, TTL = chat.MessageTTL }; decryptedMessage = decryptedMessage8; decryptedObject = decryptedMessage; } return(new Telegram.Api.WindowsPhone.Tuple <TLDecryptedMessageBase, TLObject>(decryptedMessage, decryptedObject)); }
public void OpenMedia(TLDecryptedMessage message) #endif { if (message == null) { return; } if (message.Status == MessageStatus.Sending) { return; } if (message.Media.UploadingProgress > 0.0 && message.Media.UploadingProgress < 1.0) { return; } var mediaPhoto = message.Media as TLDecryptedMessageMediaPhoto; if (mediaPhoto != null) { var location = mediaPhoto.File as TLEncryptedFile; if (location != null) { var fileName = String.Format("{0}_{1}_{2}.jpg", location.Id, location.DCId, location.AccessHash); using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (!store.FileExists(fileName)) { message.Media.IsCanceled = false; message.Media.DownloadingProgress = 0.01; var fileManager = IoC.Get <IEncryptedFileManager>(); fileManager.DownloadFile(location, mediaPhoto); return; } } } if (!message.Out.Value && message.TTL != null && message.TTL.Value > 0 && message.TTL.Value <= 60.0 && mediaPhoto.TTLParams == null) { message.IsTTLStarted = true; message.DeleteDate = new TLLong(DateTime.Now.Ticks + message.TTL.Value * TimeSpan.TicksPerSecond); mediaPhoto.TTLParams = new TTLParams { StartTime = DateTime.Now, IsStarted = true, Total = message.TTL.Value }; AddToTTLQueue(message, mediaPhoto.TTLParams, result => { DeleteMessage(false, message); SplitGroupedMessages(new List <TLLong> { message.RandomId }); }); CacheService.SyncDecryptedMessage(message, Chat, r => { var chat = Chat as TLEncryptedChat; if (chat == null) { return; } var action = new TLDecryptedMessageActionReadMessages(); action.RandomIds = new TLVector <TLLong> { message.RandomId }; var decryptedTuple = GetDecryptedServiceMessageAndObject(action, chat, MTProtoService.CurrentUserId, CacheService); #if DEBUG Execute.BeginOnUIThread(() => Items.Insert(0, decryptedTuple.Item1)); #endif SendEncryptedService(chat, decryptedTuple.Item2, MTProtoService, CacheService, sentEncryptedMessage => { }); }); } message.Unread = new TLBool(false); message.Status = MessageStatus.Read; CacheService.SyncDecryptedMessage(message, Chat, r => { }); if (mediaPhoto.IsCanceled) { mediaPhoto.IsCanceled = false; mediaPhoto.NotifyOfPropertyChange(() => mediaPhoto.Photo); mediaPhoto.NotifyOfPropertyChange(() => mediaPhoto.Self); return; } StateService.CurrentDecryptedPhotoMessage = message; StateService.CurrentDecryptedMediaMessages = message.TTL.Value > 0? new List <TLDecryptedMessage>() : UngroupEnumerator(Items) .OfType <TLDecryptedMessage>() .Where(x => x.TTL.Value == 0 && (x.Media is TLDecryptedMessageMediaPhoto || x.IsVideo())) .ToList(); OpenImageViewer(); return; } var mediaGeo = message.Media as TLDecryptedMessageMediaGeoPoint; if (mediaGeo != null) { OpenLocation(message); return; } var mediaVideo = message.Media as TLDecryptedMessageMediaVideo; if (mediaVideo != null) { var fileLocation = mediaVideo.File as TLEncryptedFile; if (fileLocation == null) { return; } var fileName = String.Format("{0}_{1}_{2}.mp4", fileLocation.Id, fileLocation.DCId, fileLocation.AccessHash); using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (store.FileExists(fileName)) { var mediaVideo17 = mediaVideo as TLDecryptedMessageMediaVideo17; if (mediaVideo17 != null) { if (!message.Out.Value) { if (message.TTL != null && message.TTL.Value > 0 && message.TTL.Value <= 60.0) { if (mediaVideo17.TTLParams == null) { message.IsTTLStarted = true; message.DeleteDate = new TLLong(DateTime.Now.Ticks + Math.Max(mediaVideo17.Duration.Value + 1, message.TTL.Value) * TimeSpan.TicksPerSecond); mediaVideo17.TTLParams = new TTLParams { StartTime = DateTime.Now, IsStarted = true, Total = message.TTL.Value }; message.Unread = new TLBool(false); message.Status = MessageStatus.Read; AddToTTLQueue(message, mediaVideo17.TTLParams, result => { DeleteMessage(false, message); SplitGroupedMessages(new List <TLLong> { message.RandomId }); }); CacheService.SyncDecryptedMessage(message, Chat, r => { var chat = Chat as TLEncryptedChat; if (chat == null) { return; } var action = new TLDecryptedMessageActionReadMessages(); action.RandomIds = new TLVector <TLLong> { message.RandomId }; var decryptedTuple = GetDecryptedServiceMessageAndObject(action, chat, MTProtoService.CurrentUserId, CacheService); #if DEBUG Execute.BeginOnUIThread(() => Items.Insert(0, decryptedTuple.Item1)); #endif SendEncryptedService(chat, decryptedTuple.Item2, MTProtoService, CacheService, sentEncryptedMessage => { }); }); } } } } var launcher = new MediaPlayerLauncher(); launcher.Location = MediaLocationType.Data; launcher.Media = new Uri(fileName, UriKind.Relative); launcher.Show(); } else { mediaVideo.DownloadingProgress = 0.001; var fileManager = IoC.Get <IEncryptedFileManager>(); fileManager.DownloadFile(fileLocation, mediaVideo); } } return; } var mediaAudio = message.Media as TLDecryptedMessageMediaAudio; if (mediaAudio != null) { var fileLocation = mediaAudio.File as TLEncryptedFile; if (fileLocation == null) { return; } var fileName = String.Format("audio{0}_{1}.wav", fileLocation.Id, fileLocation.AccessHash); using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (!store.FileExists(fileName)) { mediaAudio.DownloadingProgress = 0.001; var fileManager = IoC.Get <IEncryptedFileManager>(); fileManager.DownloadFile(fileLocation, mediaAudio); } else { if (mediaAudio.IsCanceled) { mediaAudio.IsCanceled = false; mediaAudio.NotifyOfPropertyChange(() => mediaAudio.ThumbSelf); return; } var mediaAudio17 = mediaAudio as TLDecryptedMessageMediaAudio17; if (mediaAudio17 != null) { if (!message.Out.Value) { if (message.TTL != null && message.TTL.Value > 0 && message.TTL.Value <= 60.0) { if (mediaAudio17.TTLParams == null) { message.IsTTLStarted = true; message.DeleteDate = new TLLong(DateTime.Now.Ticks + Math.Max(mediaAudio17.Duration.Value + 1, message.TTL.Value) * TimeSpan.TicksPerSecond); mediaAudio17.TTLParams = new TTLParams { StartTime = DateTime.Now, IsStarted = true, Total = message.TTL.Value }; message.Unread = new TLBool(false); message.Status = MessageStatus.Read; CacheService.SyncDecryptedMessage(message, Chat, r => { var chat = Chat as TLEncryptedChat; if (chat == null) { return; } var action = new TLDecryptedMessageActionReadMessages(); action.RandomIds = new TLVector <TLLong> { message.RandomId }; var decryptedTuple = GetDecryptedServiceMessageAndObject(action, chat, MTProtoService.CurrentUserId, CacheService); #if DEBUG Execute.BeginOnUIThread(() => Items.Insert(0, decryptedTuple.Item1)); #endif SendEncryptedService(chat, decryptedTuple.Item2, MTProtoService, CacheService, sentEncryptedMessage => { }); }); } } } } } } return; } var mediaDocument = message.Media as TLDecryptedMessageMediaDocument; if (mediaDocument != null) { if (message.IsVoice()) { var fileLocation = mediaDocument.File as TLEncryptedFile; if (fileLocation == null) { return; } var fileName = String.Format("audio{0}_{1}.wav", fileLocation.Id, fileLocation.AccessHash); using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (!store.FileExists(fileName)) { mediaDocument.DownloadingProgress = 0.001; var fileManager = IoC.Get <IEncryptedFileManager>(); fileManager.DownloadFile(fileLocation, mediaDocument); } else { if (mediaDocument.IsCanceled) { mediaDocument.IsCanceled = false; mediaDocument.NotifyOfPropertyChange(() => mediaDocument.ThumbSelf); return; } var mediaDocument45 = mediaDocument as TLDecryptedMessageMediaDocument45; if (mediaDocument45 != null) { if (!message.Out.Value) { var message45 = message as TLDecryptedMessage45; if (message.TTL != null && message.TTL.Value > 0 && message.TTL.Value <= 60.0) { if (mediaDocument45.TTLParams == null) { message.IsTTLStarted = true; message.DeleteDate = new TLLong(DateTime.Now.Ticks + Math.Max(mediaDocument45.Duration.Value + 1, message.TTL.Value) * TimeSpan.TicksPerSecond); mediaDocument45.TTLParams = new TTLParams { StartTime = DateTime.Now, IsStarted = true, Total = message.TTL.Value }; message.Unread = new TLBool(false); message.Status = MessageStatus.Read; CacheService.SyncDecryptedMessage(message, Chat, r => { var chat = Chat as TLEncryptedChat; if (chat == null) { return; } var action = new TLDecryptedMessageActionReadMessages(); action.RandomIds = new TLVector <TLLong> { message.RandomId }; var decryptedTuple = GetDecryptedServiceMessageAndObject(action, chat, MTProtoService.CurrentUserId, CacheService); #if DEBUG Execute.BeginOnUIThread(() => Items.Insert(0, decryptedTuple.Item1)); #endif SendEncryptedService(chat, decryptedTuple.Item2, MTProtoService, CacheService, sentEncryptedMessage => { if (message45 != null) { message45.SetListened(); message45.Media.NotListened = false; message45.Media.NotifyOfPropertyChange(() => message45.Media.NotListened); CacheService.Commit(); } }); }); } } else { ReadMessageContents(message45); } } } } } return; } else if (message.IsVideo()) { var fileLocation = mediaDocument.File as TLEncryptedFile; if (fileLocation == null) { return; } var fileName = String.Format("{0}_{1}_{2}.mp4", fileLocation.Id, fileLocation.DCId, fileLocation.AccessHash); using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (store.FileExists(fileName)) { var mediaVideo17 = mediaDocument as TLDecryptedMessageMediaDocument45; if (mediaVideo17 != null) { if (!message.Out.Value) { if (message.TTL != null && message.TTL.Value > 0 && message.TTL.Value <= 60.0) { if (mediaVideo17.TTLParams == null) { message.IsTTLStarted = true; message.DeleteDate = new TLLong(DateTime.Now.Ticks + Math.Max(mediaVideo17.Duration.Value + 1, message.TTL.Value) * TimeSpan.TicksPerSecond); mediaVideo17.TTLParams = new TTLParams { StartTime = DateTime.Now, IsStarted = true, Total = message.TTL.Value }; message.Unread = new TLBool(false); message.Status = MessageStatus.Read; AddToTTLQueue(message, mediaVideo17.TTLParams, result => { DeleteMessage(false, message); SplitGroupedMessages(new List <TLLong> { message.RandomId }); }); CacheService.SyncDecryptedMessage(message, Chat, r => { var chat = Chat as TLEncryptedChat; if (chat == null) { return; } var action = new TLDecryptedMessageActionReadMessages(); action.RandomIds = new TLVector <TLLong> { message.RandomId }; var decryptedTuple = GetDecryptedServiceMessageAndObject(action, chat, MTProtoService.CurrentUserId, CacheService); #if DEBUG Execute.BeginOnUIThread(() => Items.Insert(0, decryptedTuple.Item1)); #endif SendEncryptedService(chat, decryptedTuple.Item2, MTProtoService, CacheService, sentEncryptedMessage => { }); }); } } } } var launcher = new MediaPlayerLauncher(); launcher.Location = MediaLocationType.Data; launcher.Media = new Uri(fileName, UriKind.Relative); launcher.Show(); } else { mediaDocument.DownloadingProgress = 0.001; var fileManager = IoC.Get <IEncryptedFileManager>(); fileManager.DownloadFile(fileLocation, mediaDocument); } } return; } else { var fileLocation = mediaDocument.File as TLEncryptedFile; if (fileLocation == null) { return; } var fileName = String.Format("{0}_{1}_{2}.{3}", fileLocation.Id, fileLocation.DCId, fileLocation.AccessHash, fileLocation.FileExt ?? mediaDocument.FileExt); using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (store.FileExists(fileName)) { #if WP8 StorageFile pdfFile = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName); Windows.System.Launcher.LaunchFileAsync(pdfFile); #endif } else { mediaDocument.DownloadingProgress = 0.001; var fileManager = IoC.Get <IEncryptedFileManager>(); fileManager.DownloadFile(fileLocation, mediaDocument); } } } return; } #if DEBUG MessageBox.Show("Tap on media"); #endif }
public void OpenCropedMessage(TLDecryptedMessage message) { StateService.DecryptedMediaMessage = message; NavigationService.UriFor <MessageViewerViewModel>().Navigate(); }
private static ImageSource ReturnOrEnqueueSticker(TLDecryptedMessageMediaExternalDocument document, TLDecryptedMessage owner) { if (document == null) { return(null); } var documentLocalFileName = document.GetFileName(); using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { if (!store.FileExists(documentLocalFileName)) { // 1. download full size IoC.Get <IDocumentFileManager>().DownloadFileAsync(document.FileName, document.DCId, document.ToInputFileLocation(), owner, document.Size, progress => { }); // 2. download preview var thumbCachedSize = document.Thumb as TLPhotoCachedSize; if (thumbCachedSize != null) { var fileName = "cached" + document.GetFileName(); var buffer = thumbCachedSize.Bytes.Data; if (buffer == null) { return(null); } return(DecodeWebPImage(fileName, buffer, () => { })); } var thumbPhotoSize = document.Thumb as TLPhotoSize; if (thumbPhotoSize != null) { var location = thumbPhotoSize.Location as TLFileLocation; if (location != null) { return(ReturnOrEnqueueStickerPreview(location, owner, thumbPhotoSize.Size)); } } } else { if (document.Size.Value > 0 && document.Size.Value < Telegram.Api.Constants.StickerMaxSize) { byte[] buffer; using (var file = store.OpenFile(documentLocalFileName, FileMode.Open)) { buffer = new byte[file.Length]; file.Read(buffer, 0, buffer.Length); } return(DecodeWebPImage(documentLocalFileName, buffer, () => { using (var localStore = IsolatedStorageFile.GetUserStoreForApplication()) { localStore.DeleteFile(documentLocalFileName); } })); } } } return(null); }