Ejemplo n.º 1
0
        public ViewModel(Window parentWindow, FileEntityAggregator fileEntityAggregator)
        {
            _parentWindow = parentWindow;
            _fileEntityAggregator = fileEntityAggregator;
            _saveSelectedVersionCommand = new SaveSelectedVersionCommandImplementation(this);
            _cancelCommand = new CancelCommandImplementation(this);
            _diffStampsList = new List<DiffStampAdapter>();

            ResolveDiffstampsDescriptorsGet();
        }
 public GetSpecificFileVersionWindow(FileEntityAggregator fileEntityAggregator)
 {
     InitializeComponent();
     _viewModel = new ViewModel(this, fileEntityAggregator);
 }
 public async Task<FileEntityAggregator> TryFormSourceFileEntityAggregator(File fileDescriptor)
 {
     FileEntityAggregator result = default(FileEntityAggregator);
     if (fileDescriptor == default(File))
     {
         //Descriptor empty
     }
     else
     {
         FileTrackingInfo fileTrackingInfo =
             await TryGetFileTrackingInfo(fileDescriptor.Parents.First().Id);
         if (fileTrackingInfo == default(FileTrackingInfo))
         {
             //Failed to get tracking data
         }
         else
         {
             result = new FileEntityAggregator(
                 fileTrackingInfo.UserPCLocation,
                 fileDescriptor.Id,
                 fileDescriptor.Parents.First().Id,
                 fileDescriptor.DownloadUrl,
                 fileDescriptor.MimeType);
             result = await UpdateFileEntityAggregator(result);
         }
     }
     return result;
 }
        public async Task<FileEntityAggregator> UpdateFileEntityAggregator(FileEntityAggregator source)
        {
            DriveService driveService = await TryGetAuthorizer();
            FilesResource.ListRequest filesListRequest = driveService.Files.List();
            filesListRequest.Q = String.Format("'{0}' in parents and trashed=false", source.GoogleDriveParentId);
            FileList filelist = await filesListRequest.ExecuteAsync();
            Int64 bytesTaken = filelist.Items.Sum((File file) => Convert.ToInt64(file.FileSize));
            IEnumerable<File> fileListDiffStamps = filelist.Items.Where(
                fileRecord => fileRecord.FileExtension == BsdiffStampExtension);

            DateTime latestDiffStampDate =
                fileListDiffStamps.Count() > 0 ?
                fileListDiffStamps.Max(item => DateTime.Parse(item.CreatedDate)) :
                default(DateTime);
            source.DiffStampsAmount = fileListDiffStamps.Count();
            source.CloudMemory = FormatBytes(bytesTaken);
            source.LatestDiffStampTakenDateTime = latestDiffStampDate;
            return source;
        }
        public async Task<FileTrackingInfo> TryGetFileTrackingInfo(String fileRecordDirectoryId)
        {
            File fileTrackingInfoDescriptor = await TryGetFileTrackingInfoDescriptor(fileRecordDirectoryId);
            FileEntityAggregator fileTrackingInfoWrapper = new FileEntityAggregator(
                String.Empty,
                fileTrackingInfoDescriptor.Id,
                fileRecordDirectoryId,
                fileTrackingInfoDescriptor.DownloadUrl,
                FileLocationInfoExtension);
            IO.MemoryStream memoryStream = await TryDownloadFileToStream(fileTrackingInfoWrapper);

            if (memoryStream == default(IO.MemoryStream))
            {
                //Fail
                return default(FileTrackingInfo);
            }
            else
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(FileTrackingInfo));
                memoryStream.Position = 0;
                FileTrackingInfo fileTrackingInfo = xmlSerializer.Deserialize(memoryStream) as FileTrackingInfo;
                memoryStream.Dispose();
                return fileTrackingInfo;
            }
        }
 //Refactoring ++OK
 public async Task<List<DiffStampAdapter>> TryDownloadAllDiffstampsForFile(FileEntityAggregator targetFile)
 {
     DriveService driveService = await TryGetAuthorizer();
     //Get all files from folder
     FilesResource.ListRequest filesListRequest = driveService.Files.List();
     filesListRequest.Q = String.Format("'{0}' in parents and trashed=false", targetFile.GoogleDriveParentId);
     FileList filelist = await filesListRequest.ExecuteAsync();
     //Get diff stamps descriptors
     IEnumerable<File> foundDiffStamps =
         from items in filelist.Items
         where items.FileExtension == BsdiffStampExtension
         orderby DateTime.Parse(items.CreatedDate, CultureInfo.InvariantCulture) ascending
         select items;
     //Download diff stamps
     MediaDownloader mediaDownloader = new MediaDownloader(driveService);
     List<DiffStampAdapter> resultDiffStampAdapters = new List<DiffStampAdapter>();
     foreach (File diffStampDescriptor in foundDiffStamps)
     {
         using (IO.MemoryStream memoryStream = new IO.MemoryStream())
         {
             mediaDownloader.Download(diffStampDescriptor.DownloadUrl, memoryStream);
             BinaryFormatter binaryFormatter = new BinaryFormatter();
             memoryStream.Position = 0;
             DiffStampAdapter diffStampAdapter =
                 binaryFormatter.Deserialize(memoryStream) as DiffStampAdapter;
             resultDiffStampAdapters.Add(diffStampAdapter);
         }
     }
     return resultDiffStampAdapters;
 }
        //Refactoring OK++
        public async Task<DiffStampAdapter> TryMakeDiffStamp(
            FileEntityAggregator targetFile,
            String diffStampDescription)
        {
            //Download source file
            IO.MemoryStream fileMemoryStream = await TryDownloadFileToStream(targetFile);

            if (fileMemoryStream == default(IO.MemoryStream))
            {
                //Failed to download
                return default(DiffStampAdapter);
            }
            else
            {
                //Download present diff stamps
                List<DiffStampAdapter> diffStamps = await TryDownloadAllDiffstampsForFile(targetFile); //OK

                //Apply all of them (memory hungry section)
                Byte[] latestData = fileMemoryStream.ToArray();

                fileMemoryStream.Dispose(); //As there is a temp stream to apply patches
                foreach (DiffStampAdapter diffStamp in diffStamps)
                {
                    using (IO.MemoryStream outputStream = new IO.MemoryStream())
                    {
                        using (IO.MemoryStream currentPatchedMemoryStream = new IO.MemoryStream(latestData))
                        {
                            //Apply a patch
                            BinaryPatchUtility.Apply(
                                currentPatchedMemoryStream,
                                diffStamp.OpenMemoryStreamForPatching,
                                outputStream);
                            //Prepare applied data for next iteration patching
                            outputStream.Position = 0;
                            latestData = outputStream.ToArray();
                        }
                    }
                }
                //When all patches are applied, make new one with the difference between last on cloud and on PC
                IO.FileStream fileStream = default(IO.FileStream);
                IO.MemoryStream latestPatchMemoryStream = new IO.MemoryStream();
                DiffStampAdapter resultPatch = default(DiffStampAdapter);
                try
                {
                    //Read a file to byte array
                    fileStream = new IO.FileStream(targetFile.LocalFilePath, IO.FileMode.Open);
                    Byte[] lastFromUserPC = new Byte[fileStream.Length];
                    fileStream.Read(lastFromUserPC, 0, Convert.ToInt32(fileStream.Length));
                    //Get bytes from latest patched from cloud
                    BinaryPatchUtility.Create(latestData, lastFromUserPC, latestPatchMemoryStream);
                    //Create new binary patch instance
                    resultPatch = new DiffStampAdapter(
                        latestPatchMemoryStream.ToArray(),
                        diffStampDescription,
                        DateTime.Now);
                }
                catch (Exception)
                {
                    //Patching failed
                }
                finally
                {
                    fileStream.Dispose();
                    latestPatchMemoryStream.Dispose();
                }
                return resultPatch;
            }
        }
        public async Task<Byte[]> TryGetFilePatchedUntilDateTime(
            FileEntityAggregator targetFile,
            DateTime dateTimeUntil)
        {
            //Download source file
            IO.MemoryStream fileMemoryStream = await TryDownloadFileToStream(targetFile);

            if (fileMemoryStream == default(IO.MemoryStream))
            {
                //Failed to download
                return default(Byte[]);
            }
            else
            {
                //Download present diff stamps
                List<DiffStampAdapter> diffStamps = await TryDownloadAllDiffstampsForFileUntilDateTime(
                    targetFile, dateTimeUntil); //OK
                //Apply all of them (memory hungry section)
                Byte[] latestData = fileMemoryStream.ToArray();

                fileMemoryStream.Dispose(); //As there is a temp stream to apply patches
                foreach (DiffStampAdapter diffStamp in diffStamps)
                {
                    using (IO.MemoryStream outputStream = new IO.MemoryStream())
                    {
                        using (IO.MemoryStream currentPatchedMemoryStream = new IO.MemoryStream(latestData))
                        {
                            //Apply a patch
                            BinaryPatchUtility.Apply(
                                currentPatchedMemoryStream,
                                diffStamp.OpenMemoryStreamForPatching,
                                outputStream);
                            //Prepare applied data for next iteration patching
                            outputStream.Position = 0;
                            latestData = outputStream.ToArray();
                        }
                    }
                }
                return latestData;
            }
        }
 public async Task<String> TryRemoveRecordFromGoogleDrive(FileEntityAggregator targetFile)
 {
     DriveService driveService = await TryGetAuthorizer();
     FilesResource.DeleteRequest deleteRequest = new FilesResource.DeleteRequest(
         driveService,
         targetFile.GoogleDriveParentId);
     return await deleteRequest.ExecuteAsync();
 }
        //Refactoring OK++
        public async Task<FileEntityAggregator> TryMakeAndUploadDiffStamp(
            FileEntityAggregator targetFile,
            String diffStampDescription)
        {
            DiffStampAdapter diffStampAdapter =
                await CloudFileTrackingAggregatorSingleton.Instance.TryMakeDiffStamp(
                targetFile, diffStampDescription);

            if (diffStampAdapter == default(DiffStampAdapter))
            {
                //Fail
                return default(FileEntityAggregator);
            }
            else
            {
                return await TryUploadDiffStampForFileAsync(targetFile, diffStampAdapter);
            }
        }
 //Refactoring OK++
 public async Task<FileEntityAggregator> TryUploadDiffStampForFileAsync(
     FileEntityAggregator targetFile,
     DiffStampAdapter diffStamp)
 {
     DriveService driveService = await TryGetAuthorizer();
     //Instantiate file entity
     File fileToUpload = new File
     {
         Title = String.Format("{0}.{1}", diffStamp.Description, BsdiffStampExtension),
         Parents = new ParentReference[] { new ParentReference { Id = targetFile.GoogleDriveParentId } }
     };
     //Instantiate request
     IUploadProgress uploadProgress = default(IUploadProgress);
     FileEntityAggregator result = default(FileEntityAggregator);
     using (IO.MemoryStream uploadFileStream = new IO.MemoryStream())
     {
         BinaryFormatter binaryFormatter = new BinaryFormatter();
         binaryFormatter.Serialize(uploadFileStream, diffStamp);
         uploadFileStream.Position = 0;
         var insertUploadRequest = driveService.Files.Insert(
             fileToUpload, uploadFileStream, BsdiffStampMIMEType);
         insertUploadRequest.ChunkSize = FilesResource.InsertMediaUpload.MinimumChunkSize * 2;
         //Start uploading task
         uploadProgress = await insertUploadRequest.UploadAsync();
         //Return data according to upload completion state
         if (uploadProgress.Status == UploadStatus.Completed)
         {
             result = new FileEntityAggregator
             {
                 LocalFilePath = String.Empty,
                 GoogleDriveId = insertUploadRequest.ResponseBody.Id,
                 GoogleDrivePath = insertUploadRequest.ResponseBody.DownloadUrl,
                 GoogleDriveParentId = targetFile.GoogleDriveParentId,
                 MIMEType = BsdiffStampMIMEType
             };
         }
         else
         {
             result = default(FileEntityAggregator);
         }
     }
     return result;
 }
 public async Task<IO.MemoryStream> TryDownloadFileToStream(FileEntityAggregator targetFile)
 {
     DriveService driveService = await TryGetAuthorizer();
     MediaDownloader mediaDownloader = new MediaDownloader(driveService);
     IO.MemoryStream memoryStream = new IO.MemoryStream();
     try
     {
         mediaDownloader.Download(targetFile.GoogleDrivePath, memoryStream);
         return memoryStream;
     }
     catch (Exception)
     {
         memoryStream.Dispose();
         return default(IO.MemoryStream);
     }
 }