package com.shaneisrael.st.stppus; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.xml.bind.DatatypeConverter; import com.google.gson.Gson; import com.shaneisrael.st.SnippingToolPlusPlus; import com.shaneisrael.st.data.Logger; import com.shaneisrael.st.data.OperatingSystem; import com.shaneisrael.st.notification.NotificationManager; import com.shaneisrael.st.notification.STNotificationType; import com.shaneisrael.st.prefs.Preferences; import com.shaneisrael.st.utilities.AnimatedTrayIcon; import com.shaneisrael.st.utilities.ClipboardUtilities; import com.shaneisrael.st.utilities.ImageUtilities; import com.shaneisrael.st.utilities.SoundNotifications; import com.shaneisrael.st.utilities.database.DBStats; public class StppUploader implements Runnable { private static final AnimatedTrayIcon animatedIcon = AnimatedTrayIcon.getDefaultIcon(); private static final Gson gson = new Gson(); private BufferedImage image; private final String URI = "http://stppl.us/api/1/upload/?"; private final String KEY = "f5d630e655b3806f24d81d0fe4715590"; private Thread self; public StppUploader(BufferedImage image) { this.image = image; float quality = Preferences.getInstance().getUploadQuality(); if(quality < 1f) this.image = ImageUtilities.compressImage(image, quality); } public void upload() { uploadAsync(); } private void uploadAsync() { self = new Thread(this); self.start(); } private void doBeforeUpload() { if (OperatingSystem.isWindows()) { new Thread(animatedIcon, "upload-animation").start(); } else { SnippingToolPlusPlus.trayIcon.setImage(new ImageIcon(this.getClass().getResource("/images/uploadMac.png")) .getImage()); } NotificationManager.getInstance().showNotification("uploading", STNotificationType.INFO); } private void doAfterUpload() { SoundNotifications.playDing(); if (OperatingSystem.isWindows()) { if (StppUploader.animatedIcon != null) { StppUploader.animatedIcon.stopAnimating(); } } else { SnippingToolPlusPlus.trayIcon .setImage(new ImageIcon(this.getClass().getResource("/images/trayIconMac.png")).getImage()); } NotificationManager.getInstance().showNotification("upload-done", STNotificationType.SUCCESS); image = null; } @Override public void run() { doBeforeUpload(); try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(image, "png", baos); byte[] bytes = baos.toByteArray(); String base64bytes = DatatypeConverter.printBase64Binary(bytes); String data = "key=" + KEY; data += "&source=" + URLEncoder.encode(base64bytes, "UTF-8");//Base64.encodeBase64String(baos.toByteArray()).toString(); data += "&format=txt"; URL url = new URL(URI); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); OutputStream out = conn.getOutputStream(); out.write(data.getBytes()); out.flush(); out.close(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String decodedString = reader.readLine(); reader.close(); ClipboardUtilities.setClipboard(decodedString); DBStats.addHistory(decodedString, ""); } catch (Exception e) { Logger.Log(e); e.printStackTrace(); } doAfterUpload(); } }