private async Task <ITextEditor> RecoverTextEditorAsync(TextEditorSessionDataV1 editorSessionData) { StorageFile editingFile = null; if (editorSessionData.EditingFileFutureAccessToken != null) { editingFile = await FutureAccessListUtility.GetFileFromFutureAccessList(editorSessionData.EditingFileFutureAccessToken); } string lastSavedFile = editorSessionData.LastSavedBackupFilePath; string pendingFile = editorSessionData.PendingBackupFilePath; ITextEditor textEditor; if (editingFile == null && lastSavedFile == null && pendingFile == null) { textEditor = null; } else if (editingFile != null && lastSavedFile == null && pendingFile == null) // File without pending changes { var encoding = EncodingUtility.GetEncodingByName(editorSessionData.StateMetaData.LastSavedEncoding); textEditor = await _notepadsCore.CreateTextEditor(editorSessionData.Id, editingFile, encoding : encoding, ignoreFileSizeLimit : true); textEditor.ResetEditorState(editorSessionData.StateMetaData); } else // File with pending changes { string lastSavedText = string.Empty; string pendingText = null; if (lastSavedFile != null) { TextFile lastSavedTextFile = await FileSystemUtility.ReadFile(lastSavedFile, ignoreFileSizeLimit : true, EncodingUtility.GetEncodingByName(editorSessionData.StateMetaData.LastSavedEncoding)); lastSavedText = lastSavedTextFile.Content; } var textFile = new TextFile(lastSavedText, EncodingUtility.GetEncodingByName(editorSessionData.StateMetaData.LastSavedEncoding), LineEndingUtility.GetLineEndingByName(editorSessionData.StateMetaData.LastSavedLineEnding), editorSessionData.StateMetaData.DateModifiedFileTime); textEditor = _notepadsCore.CreateTextEditor( editorSessionData.Id, textFile, editingFile, editorSessionData.StateMetaData.FileNamePlaceholder, editorSessionData.StateMetaData.IsModified); if (pendingFile != null) { TextFile pendingTextFile = await FileSystemUtility.ReadFile(pendingFile, ignoreFileSizeLimit : true, EncodingUtility.GetEncodingByName(editorSessionData.StateMetaData.LastSavedEncoding)); pendingText = pendingTextFile.Content; } textEditor.ResetEditorState(editorSessionData.StateMetaData, pendingText); } return(textEditor); }
private async Task <TextEditorSessionDataV1> BuildTextEditorSessionData(ITextEditor textEditor) { TextEditorSessionDataV1 textEditorData = new TextEditorSessionDataV1 { Id = textEditor.Id, }; if (textEditor.EditingFile != null) { // Add the opened file to FutureAccessList so we can access it next launch var futureAccessToken = ToToken(textEditor.Id); await FutureAccessListUtility.TryAddOrReplaceTokenInFutureAccessList(futureAccessToken, textEditor.EditingFile); textEditorData.EditingFileFutureAccessToken = futureAccessToken; textEditorData.EditingFileName = textEditor.EditingFileName; textEditorData.EditingFilePath = textEditor.EditingFilePath; } if (textEditor.IsModified) { if (textEditor.EditingFile != null) { // Persist the last save known to the app, which might not be up-to-date (if the file was modified outside the app) var lastSavedBackupFile = await SessionUtility.CreateNewFileInBackupFolderAsync( ToToken(textEditor.Id) + "-LastSaved", CreationCollisionOption.ReplaceExisting, _backupFolderName); if (!await BackupTextAsync(textEditor.LastSavedSnapshot.Content, textEditor.LastSavedSnapshot.Encoding, textEditor.LastSavedSnapshot.LineEnding, lastSavedBackupFile)) { return(null); // Error: Failed to write backup text to file } textEditorData.LastSavedBackupFilePath = lastSavedBackupFile.Path; } if (textEditor.EditingFile == null || !string.Equals(textEditor.LastSavedSnapshot.Content, textEditor.GetText())) { // Persist pending changes relative to the last save var pendingBackupFile = await SessionUtility.CreateNewFileInBackupFolderAsync( ToToken(textEditor.Id) + "-Pending", CreationCollisionOption.ReplaceExisting, _backupFolderName); if (!await BackupTextAsync(textEditor.GetText(), textEditor.LastSavedSnapshot.Encoding, textEditor.LastSavedSnapshot.LineEnding, pendingBackupFile)) { return(null); // Error: Failed to write backup text to file } textEditorData.PendingBackupFilePath = pendingBackupFile.Path; } } textEditorData.StateMetaData = textEditor.GetTextEditorStateMetaData(); return(textEditorData); }