123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- //
- // Download.swift
- // Runner
- //
- // Created by Yayan Dwi on 24/04/20.
- // Copyright © 2020 The Chromium Authors. All rights reserved.
- //
- import Foundation
- import Alamofire
- public class Download {
-
- public init() {}
-
- var delegate : DownloadDelegate?
-
- public func getDelegate() -> DownloadDelegate? {
- return delegate
- }
-
- private var downloadBufferQueue = DispatchQueue(label: "DOWNLOAD_BUFFER", attributes: .concurrent)
-
- var DOWNLOAD_BUFFER = [Data?]()
- var DOWNLOAD_SESSION = [Session]()
- var DOWNLOAD_URL = Utils.getURLBase() + "filepalio/image/"
-
- public func start(forKey: String, delegate: DownloadDelegate){
- self.delegate = delegate
- let download = Nexilis.getDownload(forKey: forKey)
- if download == nil {
- Nexilis.addDownload(forKey: forKey, download: self)
- }
- _ = Nexilis.write(message: CoreMessage_TMessageBank.getImageDownload(p_image_id: forKey))
- }
-
- var onDownloadProgress: ((String, Double) -> ())?
-
- public func start(forKey: String, completion: @escaping (String, Double)->()) {
- self.onDownloadProgress = completion
- let download = Nexilis.getDownload(forKey: forKey)
- if download == nil {
- Nexilis.addDownload(forKey: forKey, download: self)
- }
- _ = Nexilis.write(message: CoreMessage_TMessageBank.getImageDownload(p_image_id: forKey))
- }
-
- public func startHTTP(forKey: String, completion: @escaping (String, Double)->()) {
- _ = startHTTP(filename: forKey, baseURL: DOWNLOAD_URL, completion: completion)
- }
-
- public func startHTTP(filename: String, baseURL: String, completion: @escaping (String, Double)->()) {
- let download = Nexilis.getDownload(forKey: filename)
- if download == nil {
- Nexilis.addDownload(forKey: filename, download: self)
- var sep = ""
- if baseURL.last != "/" {
- sep = "/"
- }
- let fullURL = "\(baseURL)\(sep)\(filename)"
- //print("FULL URL: \(fullURL)")
- let BOUNDARY = "esuploader-" + "\(Date().currentTimeMillis())"
- let MIME_TYPE = "multipart/form-data; boundary=" + BOUNDARY
- let headers: HTTPHeaders = [
- "Content-Type": MIME_TYPE,
- "Host": Utils.getURLBase().components(separatedBy: "/")[2],
- "Accept-Encoding": "gzip, deflate, br",
- "Connection": "Keep-Alive",
- "Accept": "*/*",
- "User-Agent": Utils.getUserAgent(),
- "Cookie": Utils.getCookiesMobile()
- ]
- //print("HEADER: \(headers)")
- do {
- let downloadRequest = AF.download(fullURL, headers: headers)
- .downloadProgress(queue: downloadBufferQueue) { progress in
- let frac = progress.fractionCompleted*100
- if frac != 100.0 {
- completion(filename,frac)
- }
- }
- .responseData { result in
- if let response = result.response, response.statusCode == 200, let successResponse = result.value {
- //print("Response success")
- do {
- let documentDir = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
- let url = documentDir.appendingPathComponent(filename)
- //print("write file \(url.path)")
- try successResponse.write(to: url)
- Nexilis.removeDownload(forKey: filename)
- completion(filename,100)
- }
- catch {}
- }
- else {
- let statusCode = result.response?.statusCode
- //print("Response fail: \(statusCode)")
- completion(filename,0)
- }
- }
- }
- catch {}
- }
-
- }
-
- func put(part: Int, buffer: Data){
- downloadBufferQueue.async (flags: .barrier){
- self.DOWNLOAD_BUFFER.insert(buffer, at: part)
- }
- }
-
- func size() -> Int {
- var size = 0
- downloadBufferQueue.sync {
- for b in DOWNLOAD_BUFFER {
- size += b?.count ?? 0
- }
- }
- return size
- }
-
- func remove() -> Data {
- var result = Data()
- downloadBufferQueue.sync {
- for i in DOWNLOAD_BUFFER {
- if let b = i {
- result.append(contentsOf: b)
- }
- }
- }
- return result
- }
- }
|