예제 #1
0
        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);
        }
예제 #2
0
        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;
        }
예제 #4
0
        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);
        }
예제 #6
0
        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);
                }));
            }
        }
예제 #7
0
        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);
        }
예제 #8
0
 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());
     }
 }
예제 #9
0
        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);
        }
예제 #10
0
        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));
        }
예제 #13
0
        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);
        }
예제 #14
0
 public StartGifPlayerEventArgs(TLDecryptedMessage decryptedMessage)
 {
     DecryptedMessage = decryptedMessage;
 }
예제 #15
0
 private void ToMessageTemplate(TLDecryptedMessage message)
 {
     DrawBubble(message);
 }
예제 #16
0
        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);
        }
예제 #17
0
        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
        }
예제 #18
0
 public async void OpenMedia(TLDecryptedMessage message)
예제 #19
0
 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));
        }
예제 #22
0
        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);
        }