22// Use of this source code is governed by a BSD-style license that can be
33// found in the LICENSE file.
44
5- import Foundation
65import FirebaseStorage
6+ import Foundation
77
88#if canImport(firebase_core)
9- import firebase_core
9+ import firebase_core
1010#else
11- import firebase_core_shared
11+ import firebase_core_shared
1212#endif
1313
1414#if os(iOS)
15- import Flutter
15+ import Flutter
1616#elseif os(macOS)
17- import FlutterMacOS
17+ import FlutterMacOS
1818#endif
1919
2020extension FlutterError : Error { }
@@ -48,62 +48,82 @@ final class FLTFirebaseStoragePluginSwift: NSObject, FlutterPlugin, FirebaseStor
4848 return Storage . storage ( app: firApp, url: base)
4949 }
5050
51- private func ref( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference ) -> StorageReference {
52- return storage ( app: app) . reference ( withPath: reference. fullPath)
51+ private func ref( app: PigeonStorageFirebaseApp ,
52+ reference: PigeonStorageReference ) -> StorageReference {
53+ storage ( app: app) . reference ( withPath: reference. fullPath)
5354 }
5455
5556 private func toPigeon( _ ref: StorageReference ) -> PigeonStorageReference {
56- return PigeonStorageReference ( bucket: ref. bucket, fullPath: ref. fullPath, name: ref. name)
57+ PigeonStorageReference ( bucket: ref. bucket, fullPath: ref. fullPath, name: ref. name)
5758 }
5859
59- func getReferencebyPath( app: PigeonStorageFirebaseApp , path: String , bucket: String ? , completion: @escaping ( Result < PigeonStorageReference , Error > ) -> Void ) {
60+ func getReferencebyPath( app: PigeonStorageFirebaseApp , path: String , bucket: String ? ,
61+ completion: @escaping ( Result < PigeonStorageReference , Error > ) -> Void ) {
6062 let r = storage ( app: app) . reference ( withPath: path)
61- completion ( . success( PigeonStorageReference ( bucket: r. bucket, fullPath: r. fullPath, name: r. name) ) )
63+ completion ( . success( PigeonStorageReference (
64+ bucket: r. bucket,
65+ fullPath: r. fullPath,
66+ name: r. name
67+ ) ) )
6268 }
6369
64- func setMaxOperationRetryTime( app: PigeonStorageFirebaseApp , time: Int64 , completion: @escaping ( Result < Void , Error > ) -> Void ) {
70+ func setMaxOperationRetryTime( app: PigeonStorageFirebaseApp , time: Int64 ,
71+ completion: @escaping ( Result < Void , Error > ) -> Void ) {
6572 storage ( app: app) . maxOperationRetryTime = TimeInterval ( Double ( time) / 1000.0 )
6673 completion ( . success( ( ) ) )
6774 }
6875
69- func setMaxUploadRetryTime( app: PigeonStorageFirebaseApp , time: Int64 , completion: @escaping ( Result < Void , Error > ) -> Void ) {
76+ func setMaxUploadRetryTime( app: PigeonStorageFirebaseApp , time: Int64 ,
77+ completion: @escaping ( Result < Void , Error > ) -> Void ) {
7078 storage ( app: app) . maxUploadRetryTime = TimeInterval ( Double ( time) / 1000.0 )
7179 completion ( . success( ( ) ) )
7280 }
7381
74- func setMaxDownloadRetryTime( app: PigeonStorageFirebaseApp , time: Int64 , completion: @escaping ( Result < Void , Error > ) -> Void ) {
82+ func setMaxDownloadRetryTime( app: PigeonStorageFirebaseApp , time: Int64 ,
83+ completion: @escaping ( Result < Void , Error > ) -> Void ) {
7584 storage ( app: app) . maxDownloadRetryTime = TimeInterval ( Double ( time) / 1000.0 )
7685 completion ( . success( ( ) ) )
7786 }
7887
79- func useStorageEmulator( app: PigeonStorageFirebaseApp , host: String , port: Int64 , completion: @escaping ( Result < Void , Error > ) -> Void ) {
88+ func useStorageEmulator( app: PigeonStorageFirebaseApp , host: String , port: Int64 ,
89+ completion: @escaping ( Result < Void , Error > ) -> Void ) {
8090 let key = app. bucket
8191 let s = storage ( app: app)
8292 s. useEmulator ( withHost: host, port: Int ( port) )
8393 completion ( . success( ( ) ) )
8494 }
8595
86- func referenceDelete( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference , completion: @escaping ( Result < Void , Error > ) -> Void ) {
96+ func referenceDelete( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference ,
97+ completion: @escaping ( Result < Void , Error > ) -> Void ) {
8798 ref ( app: app, reference: reference) . delete { error in
88- if let e = error { completion ( . failure( self . toFlutterError ( e) ) ) } else { completion ( . success( ( ) ) ) }
99+ if let e = error { completion ( . failure( self . toFlutterError ( e) ) ) }
100+ else { completion ( . success( ( ) ) ) }
89101 }
90102 }
91103
92- func referenceGetDownloadURL( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference , completion: @escaping ( Result < String , Error > ) -> Void ) {
104+ func referenceGetDownloadURL( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference ,
105+ completion: @escaping ( Result < String , Error > ) -> Void ) {
93106 ref ( app: app, reference: reference) . downloadURL { url, error in
94- if let e = error { completion ( . failure( self . toFlutterError ( e) ) ) } else { completion ( . success( url!. absoluteString. replacingOccurrences ( of: " :443 " , with: " " ) ) ) }
107+ if let e = error { completion ( . failure( self . toFlutterError ( e) ) ) }
108+ else { completion ( . success( url!. absoluteString. replacingOccurrences (
109+ of: " :443 " ,
110+ with: " "
111+ ) ) ) }
95112 }
96113 }
97114
98- func referenceGetMetaData( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference , completion: @escaping ( Result < PigeonFullMetaData , Error > ) -> Void ) {
115+ func referenceGetMetaData( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference ,
116+ completion: @escaping ( Result < PigeonFullMetaData , Error > ) -> Void ) {
99117 ref ( app: app, reference: reference) . getMetadata { md, error in
100118 if let e = error { completion ( . failure( self . toFlutterError ( e) ) ) } else {
101119 completion ( . success( PigeonFullMetaData ( metadata: self . metaToDict ( md) ) ) )
102120 }
103121 }
104122 }
105123
106- func referenceList( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference , options: PigeonListOptions , completion: @escaping ( Result < PigeonListResult , Error > ) -> Void ) {
124+ func referenceList( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference ,
125+ options: PigeonListOptions ,
126+ completion: @escaping ( Result < PigeonListResult , Error > ) -> Void ) {
107127 let r = ref ( app: app, reference: reference)
108128 let block : ( StorageListResult ? , Error ? ) -> Void = { list, error in
109129 if let e = error { completion ( . failure( self . toFlutterError ( e) ) ) } else {
@@ -117,62 +137,103 @@ final class FLTFirebaseStoragePluginSwift: NSObject, FlutterPlugin, FirebaseStor
117137 }
118138 }
119139
120- func referenceListAll( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference , completion: @escaping ( Result < PigeonListResult , Error > ) -> Void ) {
140+ func referenceListAll( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference ,
141+ completion: @escaping ( Result < PigeonListResult , Error > ) -> Void ) {
121142 ref ( app: app, reference: reference) . listAll { list, error in
122- if let e = error { completion ( . failure( self . toFlutterError ( e) ) ) } else { completion ( . success( self . listToPigeon ( list!) ) ) }
143+ if let e = error { completion ( . failure( self . toFlutterError ( e) ) ) }
144+ else { completion ( . success( self . listToPigeon ( list!) ) ) }
123145 }
124146 }
125147
126- func referenceGetData( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference , maxSize: Int64 , completion: @escaping ( Result < FlutterStandardTypedData ? , Error > ) -> Void ) {
148+ func referenceGetData( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference ,
149+ maxSize: Int64 ,
150+ completion: @escaping ( Result < FlutterStandardTypedData ? , Error > ) -> Void ) {
127151 ref ( app: app, reference: reference) . getData ( maxSize: maxSize) { data, error in
128152 if let e = error {
129153 completion ( . failure( self . toFlutterError ( e) ) )
130- } else if let data = data {
154+ } else if let data {
131155 completion ( . success( FlutterStandardTypedData ( bytes: data) ) )
132156 } else {
133157 completion ( . success( nil ) )
134158 }
135159 }
136160 }
137161
138- func referencePutData( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference , data: FlutterStandardTypedData , settableMetaData: PigeonSettableMetadata , handle: Int64 , completion: @escaping ( Result < String , Error > ) -> Void ) {
162+ func referencePutData( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference ,
163+ data: FlutterStandardTypedData , settableMetaData: PigeonSettableMetadata ,
164+ handle: Int64 , completion: @escaping ( Result < String , Error > ) -> Void ) {
139165 let r = ref ( app: app, reference: reference)
140166 let task = r. putData ( data. data, metadata: toMeta ( settableMetaData) )
141- completion ( . success( registerTask ( task: task, appName: r. storage. app. name, handle: handle, path: r. fullPath) ) )
167+ completion ( . success( registerTask (
168+ task: task,
169+ appName: r. storage. app. name,
170+ handle: handle,
171+ path: r. fullPath
172+ ) ) )
142173 }
143174
144- func referencePutString( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference , data: String , format: Int64 , settableMetaData: PigeonSettableMetadata , handle: Int64 , completion: @escaping ( Result < String , Error > ) -> Void ) {
175+ func referencePutString( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference ,
176+ data: String , format: Int64 , settableMetaData: PigeonSettableMetadata ,
177+ handle: Int64 , completion: @escaping ( Result < String , Error > ) -> Void ) {
145178 let r = ref ( app: app, reference: reference)
146179 let d : Data
147180 if format == 1 { d = Data ( base64Encoded: data) ?? Data ( ) }
148- else if format == 2 { d = Data ( base64Encoded: data. replacingOccurrences ( of: " - " , with: " + " ) . replacingOccurrences ( of: " _ " , with: " / " ) . padding ( toLength: ( ( data. count+ 3 ) / 4 ) * 4 , withPad: " = " , startingAt: 0 ) ) ?? Data ( ) }
149- else { d = Data ( ) }
181+ else if format ==
182+ 2 {
183+ d = Data ( base64Encoded: data. replacingOccurrences ( of: " - " , with: " + " )
184+ . replacingOccurrences ( of: " _ " , with: " / " )
185+ . padding ( toLength: ( ( data. count + 3 ) / 4 ) * 4 , withPad: " = " , startingAt: 0 ) ) ?? Data ( )
186+ } else { d = Data ( ) }
150187 let task = r. putData ( d, metadata: toMeta ( settableMetaData) )
151- completion ( . success( registerTask ( task: task, appName: r. storage. app. name, handle: handle, path: r. fullPath) ) )
188+ completion ( . success( registerTask (
189+ task: task,
190+ appName: r. storage. app. name,
191+ handle: handle,
192+ path: r. fullPath
193+ ) ) )
152194 }
153195
154- func referencePutFile( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference , filePath: String , settableMetaData: PigeonSettableMetadata ? , handle: Int64 , completion: @escaping ( Result < String , Error > ) -> Void ) {
196+ func referencePutFile( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference ,
197+ filePath: String , settableMetaData: PigeonSettableMetadata ? , handle: Int64 ,
198+ completion: @escaping ( Result < String , Error > ) -> Void ) {
155199 let r = ref ( app: app, reference: reference)
156200 let url = URL ( fileURLWithPath: filePath)
157201 let task : StorageUploadTask
158- if let md = settableMetaData { task = r. putFile ( from: url, metadata: toMeta ( md) ) } else { task = r. putFile ( from: url) }
159- completion ( . success( registerTask ( task: task, appName: r. storage. app. name, handle: handle, path: r. fullPath) ) )
160- }
161-
162- func referenceDownloadFile( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference , filePath: String , handle: Int64 , completion: @escaping ( Result < String , Error > ) -> Void ) {
202+ if let md = settableMetaData { task = r. putFile ( from: url, metadata: toMeta ( md) ) }
203+ else { task = r. putFile ( from: url) }
204+ completion ( . success( registerTask (
205+ task: task,
206+ appName: r. storage. app. name,
207+ handle: handle,
208+ path: r. fullPath
209+ ) ) )
210+ }
211+
212+ func referenceDownloadFile( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference ,
213+ filePath: String , handle: Int64 ,
214+ completion: @escaping ( Result < String , Error > ) -> Void ) {
163215 let r = ref ( app: app, reference: reference)
164216 let url = URL ( fileURLWithPath: filePath)
165217 let task = r. write ( toFile: url)
166- completion ( . success( registerTask ( task: task, appName: r. storage. app. name, handle: handle, path: r. fullPath) ) )
218+ completion ( . success( registerTask (
219+ task: task,
220+ appName: r. storage. app. name,
221+ handle: handle,
222+ path: r. fullPath
223+ ) ) )
167224 }
168225
169- func referenceUpdateMetadata( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference , metadata: PigeonSettableMetadata , completion: @escaping ( Result < PigeonFullMetaData , Error > ) -> Void ) {
226+ func referenceUpdateMetadata( app: PigeonStorageFirebaseApp , reference: PigeonStorageReference ,
227+ metadata: PigeonSettableMetadata ,
228+ completion: @escaping ( Result < PigeonFullMetaData , Error > ) -> Void ) {
170229 ref ( app: app, reference: reference) . updateMetadata ( toMeta ( metadata) ) { md, error in
171- if let e = error { completion ( . failure( self . toFlutterError ( e) ) ) } else { completion ( . success( PigeonFullMetaData ( metadata: self . metaToDict ( md) ) ) ) }
230+ if let e = error { completion ( . failure( self . toFlutterError ( e) ) ) }
231+ else { completion ( . success( PigeonFullMetaData ( metadata: self . metaToDict ( md) ) ) ) }
172232 }
173233 }
174234
175- func taskPause( app: PigeonStorageFirebaseApp , handle: Int64 , completion: @escaping ( Result < [ String : Any ] , Error > ) -> Void ) {
235+ func taskPause( app: PigeonStorageFirebaseApp , handle: Int64 ,
236+ completion: @escaping ( Result < [ String : Any ] , Error > ) -> Void ) {
176237 if let task = handleToTask [ handle] as? StorageUploadTask {
177238 task. pause ( )
178239 completion ( . success( [ " status " : true , " snapshot " : currentSnapshot ( handle: handle) ] ) )
@@ -184,7 +245,8 @@ final class FLTFirebaseStoragePluginSwift: NSObject, FlutterPlugin, FirebaseStor
184245 }
185246 }
186247
187- func taskResume( app: PigeonStorageFirebaseApp , handle: Int64 , completion: @escaping ( Result < [ String : Any ] , Error > ) -> Void ) {
248+ func taskResume( app: PigeonStorageFirebaseApp , handle: Int64 ,
249+ completion: @escaping ( Result < [ String : Any ] , Error > ) -> Void ) {
188250 if let task = handleToTask [ handle] as? StorageUploadTask {
189251 task. resume ( )
190252 completion ( . success( [ " status " : true , " snapshot " : currentSnapshot ( handle: handle) ] ) )
@@ -196,7 +258,8 @@ final class FLTFirebaseStoragePluginSwift: NSObject, FlutterPlugin, FirebaseStor
196258 }
197259 }
198260
199- func taskCancel( app: PigeonStorageFirebaseApp , handle: Int64 , completion: @escaping ( Result < [ String : Any ] , Error > ) -> Void ) {
261+ func taskCancel( app: PigeonStorageFirebaseApp , handle: Int64 ,
262+ completion: @escaping ( Result < [ String : Any ] , Error > ) -> Void ) {
200263 if let task = handleToTask [ handle] as? StorageUploadTask {
201264 task. cancel ( )
202265 completion ( . success( [ " status " : true , " snapshot " : currentSnapshot ( handle: handle) ] ) )
@@ -248,20 +311,26 @@ final class FLTFirebaseStoragePluginSwift: NSObject, FlutterPlugin, FirebaseStor
248311 return PigeonListResult ( items: itemsOpt, pageToken: list. pageToken, prefixs: prefixesOpt)
249312 }
250313
251- private func registerTask( task: StorageObservableTask , appName: String , handle: Int64 , path: String ) -> String {
314+ private func registerTask( task: StorageObservableTask , appName: String , handle: Int64 ,
315+ path: String ) -> String {
252316 let uuid = UUID ( ) . uuidString
253317 let channelName = " plugins.flutter.io/firebase_storage/taskEvent/ \( uuid) "
254318 let channel = FlutterEventChannel ( name: channelName, binaryMessenger: messenger!)
255319 let storageInstance = Storage . storage ( app: FLTFirebasePlugin . firebaseAppNamed ( appName) !)
256- channel. setStreamHandler ( TaskStateChannelStreamHandler ( task: task, storage: storageInstance, identifier: channelName, plugin: nil ) )
320+ channel. setStreamHandler ( TaskStateChannelStreamHandler (
321+ task: task,
322+ storage: storageInstance,
323+ identifier: channelName,
324+ plugin: nil
325+ ) )
257326 eventChannels [ channelName] = channel
258327 handleToTask [ handle] = task as AnyObject
259328 handleToPath [ handle] = path
260329 return uuid
261330 }
262331
263332 private func currentSnapshot( handle: Int64 ) -> [ String : Any ] {
264- return [
333+ [
265334 " path " : handleToPath [ handle] ?? " " ,
266335 " bytesTransferred " : 0 ,
267336 " totalBytes " : 0 ,
@@ -289,7 +358,7 @@ final class FLTFirebaseStoragePluginSwift: NSObject, FlutterPlugin, FirebaseStor
289358 case . downloadSizeExceeded: return " download-size-exceeded "
290359 @unknown default : return " unknown "
291360 }
292- } else if error. domain == NSURLErrorDomain && error. code == NSURLErrorCancelled {
361+ } else if error. domain == NSURLErrorDomain, error. code == NSURLErrorCancelled {
293362 return " canceled "
294363 }
295364 return " unknown "
@@ -303,5 +372,3 @@ final class FLTFirebaseStoragePluginSwift: NSObject, FlutterPlugin, FirebaseStor
303372 }
304373 }
305374}
306-
307-
0 commit comments