@@ -6,38 +6,41 @@ import Foundation
66import JavaScriptCore
77
88@objc ( FilesPlugin)
9- public class FilesPlugin : CAPPlugin , UIDocumentPickerDelegate , UINavigationControllerDelegate {
9+ public class FilesPlugin : CAPPlugin , UIDocumentPickerDelegate , UINavigationControllerDelegate {
1010 private var delegate : UIDocumentPickerDelegate ? = nil
11-
11+
1212 @objc func openFile( _ call: CAPPluginCall ) {
13- guard let viewController = self . bridge? . viewController else { return }
13+ guard let viewController = self . bridge? . viewController else {
14+ return
15+ }
1416 let types = [ UTType . data]
15-
17+
1618 DispatchQueue . main. async {
1719 let documentPickerController = UIDocumentPickerViewController (
1820 forOpeningContentTypes: types
1921 )
20-
22+
2123 self . delegate = OpenFileDelegate ( call) ;
2224 documentPickerController. delegate = self . delegate;
23-
25+
2426 viewController. present ( documentPickerController, animated: true , completion: nil )
2527 }
2628 }
27-
29+
2830 @objc func saveFile( _ call: CAPPluginCall ) {
29- guard let array = call. getArray ( " data " ) ? . map ( { value in
31+ guard let dataBytes = call. getArray ( " data " ) ? . map ( { value in
3032 ( value as! NSNumber ) . uint8Value
31- } ) else {
33+ } )
34+ else {
3235 call. reject ( " Couldn't convert data to UTF " )
3336 return
3437 }
35- let data = Data ( bytes: array , count: array . count)
38+ let data = Data ( bytes: dataBytes , count: dataBytes . count)
3639 guard let path = call. getString ( " path " ) else {
3740 showSaveFilePicker ( call, data) ;
3841 return ;
3942 }
40-
43+
4144 let url = URL ( string: path) !
4245 let error : NSErrorPointer = nil
4346 let coordinator = NSFileCoordinator ( filePresenter: nil )
@@ -50,22 +53,40 @@ public class FilesPlugin: CAPPlugin, UIDocumentPickerDelegate,UINavigationContro
5053 }
5154 }
5255 }
53-
56+
57+ private func getPathFromCall( _ call: CAPPluginCall ) -> URL ? {
58+ guard let encodedBookmarkData = call. getString ( " path " ) else {
59+ return nil
60+ }
61+ guard let bookmarkData = Data ( base64Encoded: encodedBookmarkData) else {
62+ return nil
63+ }
64+ do {
65+ var bookmarkDataIsStale = false
66+ let url = try URL ( resolvingBookmarkData: bookmarkData, bookmarkDataIsStale: & bookmarkDataIsStale)
67+ return url
68+ } catch {
69+ return nil
70+ }
71+ }
72+
5473 private func showSaveFilePicker( _ call: CAPPluginCall , _ data: Data ) {
55- guard let viewController = self . bridge? . viewController else { return }
74+ guard let viewController = self . bridge? . viewController else {
75+ return
76+ }
5677 let fileManager = FileManager . default
57-
78+
5879 do {
5980 let path = fileManager. temporaryDirectory. appendingPathComponent ( call. getString ( " defaultFileName " ) !)
6081 try data. write ( to: path)
61-
82+
6283 DispatchQueue . main. async {
6384 let documentPickerController = UIDocumentPickerViewController (
6485 forExporting: [ path] )
65-
86+
6687 self . delegate = SaveFileDelegate ( call) ;
6788 documentPickerController. delegate = self . delegate;
68-
89+
6990 viewController. present ( documentPickerController, animated: true , completion: nil )
7091 }
7192 } catch {
@@ -76,25 +97,27 @@ public class FilesPlugin: CAPPlugin, UIDocumentPickerDelegate,UINavigationContro
7697}
7798
7899private func FileMetadata( _ path: URL ) -> [ String : Any ] {
79- return [ " path " : path. absoluteString, " name " : path. lastPathComponent] ;
100+ [ " path " : path. absoluteString, " name " : path. lastPathComponent] ;
80101}
81102
82103private func PlatformFile( _ path: URL , _ data: [ UInt8 ] ) -> [ String : Any ] {
83- return FileMetadata ( path) . merging ( [ " data " : data] ) { ( current, _) in current }
104+ FileMetadata ( path) . merging ( [ " data " : data] ) { ( current, _) in
105+ current
106+ }
84107}
85108
86- private class OpenFileDelegate : NSObject , UIDocumentPickerDelegate {
109+ private class OpenFileDelegate : NSObject , UIDocumentPickerDelegate {
87110 private let call : CAPPluginCall ;
88-
111+
89112 init ( _ call: CAPPluginCall ) {
90113 self . call = call;
91114 }
92-
115+
93116 public func documentPicker( _ controller: UIDocumentPickerViewController , didPickDocumentsAt urls: [ URL ] ) {
94117 guard let filePath = urls. first else {
95118 return
96119 }
97- if ( filePath. startAccessingSecurityScopedResource ( ) ) {
120+ if ( filePath. startAccessingSecurityScopedResource ( ) ) {
98121 let error : NSErrorPointer = nil
99122 let coordinator = NSFileCoordinator ( filePresenter: nil )
100123 coordinator. coordinate ( readingItemAt: filePath, error: error) { url in
@@ -105,33 +128,38 @@ private class OpenFileDelegate : NSObject, UIDocumentPickerDelegate {
105128 call. reject ( " Unable to read the selected file " , nil , error) ;
106129 }
107130 }
108- if ( error != nil ) {
131+ if ( error != nil ) {
109132 call. reject ( " Unable to read the selected file " , nil , error? . pointee)
110133 }
111134 } else {
112135 call. reject ( " Unable to read the selected file " )
113136 }
114137 }
115-
138+
116139 public func documentPickerWasCancelled( _ controller: UIDocumentPickerViewController ) {
117140 self . call. resolve ( ) ;
118141 }
119142}
120143
121- private class SaveFileDelegate : NSObject , UIDocumentPickerDelegate {
144+ private class SaveFileDelegate : NSObject , UIDocumentPickerDelegate {
122145 private let call : CAPPluginCall ;
123-
146+
124147 init ( _ call: CAPPluginCall ) {
125148 self . call = call;
126149 }
127-
150+
128151 public func documentPicker( _ controller: UIDocumentPickerViewController , didPickDocumentsAt urls: [ URL ] ) {
129152 guard let filePath = urls. first else {
130153 return
131154 }
132- call. resolve ( [ " path " : filePath. absoluteString, " name " : filePath. lastPathComponent] ) ;
155+ if ( !filePath. startAccessingSecurityScopedResource ( ) ) {
156+ self . call. reject ( " Unable to save the file " )
157+ return
158+ }
159+
160+ call. resolve ( [ " name " : filePath. lastPathComponent] )
133161 }
134-
162+
135163 public func documentPickerWasCancelled( _ controller: UIDocumentPickerViewController ) {
136164 self . call. resolve ( ) ;
137165 }
0 commit comments