// // ViewController.swift // dcav-uploader // // Created by Alexander Munch-hansen on 31/07/2017. // Copyright © 2017 Guava. All rights reserved. // import UIKit class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate, URLSessionDelegate, URLSessionTaskDelegate, URLSessionDataDelegate { @IBOutlet weak var labell: UILabel! @IBOutlet weak var imageView: UIImageView! var imagePickerController : UIImagePickerController! @IBOutlet weak var dcavTextField: UITextField! var responseString : String! @IBOutlet weak var uploadProgressBar: UIProgressView! @IBOutlet weak var savedPhotoImageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() UserDefaults.standard.synchronize() dcavTextField.delegate = self labell.text = UserDefaults.standard.string(forKey: "username_preference") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func onLibraryButton(_ sender: Any) { imagePickerController = UIImagePickerController() imagePickerController.delegate = self imagePickerController.sourceType = .photoLibrary present(imagePickerController, animated: true, completion: nil) } @IBAction func onPhotoButton(_ sender: Any) { imagePickerController = UIImagePickerController() imagePickerController.delegate = self imagePickerController.sourceType = .camera present(imagePickerController, animated: true, completion: nil) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { imagePickerController.dismiss(animated: true, completion: nil) imageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage } func setTextInField(path: String) { dcavTextField.text = path } @IBAction func onSaveButton(_ sender: Any) { UIImageWriteToSavedPhotosAlbum(imageView.image!, nil, nil, nil); UIView.animate(withDuration: 0.5, delay:0.0, options:UIViewAnimationOptions.transitionFlipFromTop, animations: { self.savedPhotoImageView.isHidden = false self.savedPhotoImageView.alpha = 1 }, completion: { finished in UIView.animate(withDuration: 0.5, delay:1, options:UIViewAnimationOptions.transitionCrossDissolve, animations: { self.savedPhotoImageView.alpha = 0 }, completion: { finished in self.savedPhotoImageView.isHidden = true }) }) } @IBAction func onUploadButton(_ sender: Any) { guard let username : String = UserDefaults.standard.string(forKey: "username_preference") else { print("USERNAME, MOTHERFUCKER!") // TODO create proper pop-up return } guard let passphrase : String = UserDefaults.standard.string(forKey: "passphrase_preference") else { // TODO create proper pop-up print("PASSPHRASE, MOTHERFUCKER!") return } let request = generateRequest(user: username, pass: passphrase) let session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: OperationQueue.main) let task = session.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { // check for fundamental networking error print("error=\(String(describing: error))") return } if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors print("statusCode should be 200, but is \(httpStatus.statusCode)") print("response = \(String(describing: response))") } self.responseString = String(data: data, encoding: .utf8)! print("responseString = \(String(describing: self.responseString))") DispatchQueue.main.async() { self.setTextInField(path: "https://dcav.pw/\(String(describing: self.labell.text![(self.labell.text!.startIndex)]))\(String(describing: self.responseString!))") } } task.resume() } func generateBoundaryString() -> String { return "Boundary-\(NSUUID().uuidString)" } func generateRequest(user: String, pass: String) -> URLRequest { let params : [String : String] = [ "user": user, "pass": pass ] let url = URL(string: UserDefaults.standard.string(forKey: "endpoint_preference")!) let boundary = generateBoundaryString() var request = URLRequest(url: url!) request.httpMethod = "POST" request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") let imageData: Data = UIImagePNGRepresentation(imageView.image!)! var body = Data() for (key, value) in params { body.append(Data("--\(boundary)\r\n".utf8)) body.append(Data("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".utf8)) body.append(Data("\(value)\r\n".utf8)) } let mimetype : String = "application/octet-stream" body.append(Data("--\(boundary)\r\n".utf8)) body.append(Data("Content-Disposition: form-data; name=\"imagedata\"; filename=\"lolfag.png\"\r\n".utf8)) body.append(Data("Content-Type: \(mimetype)\r\n\r\n".utf8)) body.append(imageData) body.append(Data("\r\n".utf8)) body.append(Data("--\(boundary)--\r\n".utf8)) request.httpBody = body return request } //MARK:Update progress bar func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) { uploadProgressBar.progress = Float(totalBytesSent) / Float(totalBytesExpectedToSend) print(String(describing: uploadProgressBar.progress)) } }