1
- using Newtonsoft . Json ;
1
+ using System ;
2
+ using Newtonsoft . Json ;
2
3
using System . IO ;
3
4
using System . Threading . Tasks ;
4
5
using Windows . Storage ;
7
8
using ClipboardCanvas . Exceptions ;
8
9
using ClipboardCanvas . Helpers . Filesystem ;
9
10
using ClipboardCanvas . Helpers . SafetyHelpers ;
10
- using System ;
11
+ using ClipboardCanvas . UnsafeNative ;
11
12
12
13
namespace ClipboardCanvas . ReferenceItems
13
14
{
@@ -30,12 +31,57 @@ private ReferenceFile(StorageFile innerFile, IStorageItem referencedItem)
30
31
this . ReferencedItem = referencedItem ;
31
32
}
32
33
33
- public async Task < SafeWrapperResult > UpdateReference ( string newPath )
34
+ /// <summary>
35
+ /// Updates the underlying file and fileData
36
+ /// </summary>
37
+ /// <param name="newPath"></param>
38
+ /// <returns></returns>
39
+ private async Task < SafeWrapperResult > UpdateReference ( string newPath , bool regenerateReferenceItem )
34
40
{
35
- _referenceFileData = new ReferenceFileData ( newPath ) ;
41
+ if ( ! StorageHelpers . Existsh ( newPath ) )
42
+ {
43
+ return new SafeWrapperResult ( OperationErrorCode . NotFound , new FileNotFoundException ( ) , "File does not exist." ) ;
44
+ }
45
+
46
+ long fileId = UnsafeNativeHelpers . GetFileId ( newPath ) ;
47
+ bool isRepairable = fileId != - 1 ;
48
+
49
+ _referenceFileData = new ReferenceFileData ( newPath , fileId , isRepairable ) ;
36
50
string serialized = JsonConvert . SerializeObject ( _referenceFileData , Formatting . Indented ) ;
37
51
38
- return await FilesystemOperations . WriteFileText ( _innerReferenceFile , serialized ) ;
52
+ SafeWrapperResult writeFileTextResult = await FilesystemOperations . WriteFileText ( _innerReferenceFile , serialized ) ;
53
+ if ( ! writeFileTextResult )
54
+ {
55
+ return writeFileTextResult ;
56
+ }
57
+
58
+ if ( regenerateReferenceItem )
59
+ {
60
+ SafeWrapper < IStorageItem > referencedItem = await StorageHelpers . ToStorageItemWithError < IStorageItem > ( newPath ) ;
61
+ this . ReferencedItem = referencedItem . Result ;
62
+
63
+ return referencedItem ;
64
+ }
65
+
66
+ return SafeWrapperResult . SUCCESS ;
67
+ }
68
+
69
+ public static async Task < ReferenceFile > CreateReferenceFileFromFile ( StorageFile emptyReferenceFile , IStorageItem referencedItem )
70
+ {
71
+ if ( ! FileHelpers . IsPathEqualExtension ( emptyReferenceFile . Path , Constants . FileSystem . REFERENCE_FILE_EXTENSION ) )
72
+ {
73
+ return new ReferenceFile ( emptyReferenceFile , null )
74
+ {
75
+ LastError = new SafeWrapperResult ( OperationErrorCode . InvalidArgument , new ArgumentException ( ) , "Empty file uses invalid Reference File extension." )
76
+ } ;
77
+ }
78
+
79
+ ReferenceFile referenceFile = new ReferenceFile ( emptyReferenceFile , referencedItem ) ;
80
+
81
+ SafeWrapperResult result = await referenceFile . UpdateReference ( referencedItem . Path , false ) ;
82
+ referenceFile . LastError = result ;
83
+
84
+ return referenceFile ;
39
85
}
40
86
41
87
private static async Task < SafeWrapper < ReferenceFileData > > ReadData ( StorageFile referenceFile )
@@ -50,26 +96,48 @@ private static async Task<SafeWrapper<ReferenceFileData>> ReadData(StorageFile r
50
96
return ( referenceFileData , SafeWrapperResult . SUCCESS ) ;
51
97
}
52
98
53
- public static async Task < ReferenceFile > GetReferenceFile ( StorageFile referenceFile )
99
+ public static async Task < ReferenceFile > GetReferenceFile ( StorageFile file )
54
100
{
55
101
// The file is not a Reference File
56
- if ( ! IsReferenceFile ( referenceFile ) )
102
+ if ( ! IsReferenceFile ( file ) )
57
103
{
58
104
return null ;
59
105
}
60
106
61
- // The file does not exist
62
- if ( ! StorageHelpers . Existsh ( referenceFile . Path ) )
107
+ // The referenceFile does not exist
108
+ if ( ! StorageHelpers . Existsh ( file . Path ) )
63
109
{
64
- return new ReferenceFile ( referenceFile , null )
110
+ return new ReferenceFile ( file , null )
65
111
{
66
112
LastError = new SafeWrapperResult ( OperationErrorCode . NotFound , new FileNotFoundException ( ) , "Couldn't resolve item associated with path." )
67
113
} ;
68
114
}
69
115
70
- SafeWrapper < ReferenceFileData > referenceFileData = await ReadData ( referenceFile ) ;
116
+ SafeWrapper < ReferenceFileData > referenceFileData = await ReadData ( file ) ;
117
+
118
+ ReferenceFile referenceFile = await GetFile ( file , referenceFileData ) ;
119
+ if ( referenceFile . LastError )
120
+ {
121
+ if ( ! referenceFileData . Result . isRepairable ) // Bad FileId but the path is correct
122
+ {
123
+ // Repair the FileId
124
+ await referenceFile . UpdateReference ( referenceFileData . Result . path , false ) ;
125
+ }
126
+ }
127
+ else
128
+ {
129
+ if ( referenceFile . LastError == OperationErrorCode . InvalidArgument || referenceFile . LastError == OperationErrorCode . NotFound )
130
+ {
131
+ if ( referenceFileData . Result ? . isRepairable ?? false )
132
+ {
133
+ // Repair it
134
+ SafeWrapperResult result = await RepairReferenceFile ( referenceFile , referenceFileData ) ;
135
+ referenceFile . LastError = result ;
136
+ }
137
+ }
138
+ }
71
139
72
- return await GetFile ( referenceFile , referenceFileData ) ;
140
+ return referenceFile ;
73
141
}
74
142
75
143
private static async Task < ReferenceFile > GetFile ( StorageFile referenceFile , SafeWrapper < ReferenceFileData > referenceFileData )
@@ -116,6 +184,21 @@ private static async Task<ReferenceFile> GetFile(StorageFile referenceFile, Safe
116
184
} ;
117
185
}
118
186
187
+ private static async Task < SafeWrapperResult > RepairReferenceFile ( ReferenceFile referenceFile , ReferenceFileData referenceFileData )
188
+ {
189
+ if ( referenceFileData . fileId == - 1 )
190
+ {
191
+ return referenceFile . LastError ;
192
+ }
193
+
194
+ // Get path from FileId...
195
+
196
+ // TODO: Implement that when it becomes possible
197
+
198
+ // for now, return the error
199
+ return referenceFile . LastError ;
200
+ }
201
+
119
202
public static bool IsReferenceFile ( StorageFile file )
120
203
{
121
204
return FileHelpers . IsPathEqualExtension ( file ? . Path , Constants . FileSystem . REFERENCE_FILE_EXTENSION ) ;
0 commit comments