Changeset 843


Ignore:
Timestamp:
02/05/14 15:30:07 (10 years ago)
Author:
jts21
Message:

Implement uploading images to FrameServer so other people can see them

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/expeditee/gui/FrameUtils.java

    r784 r843  
    18311831//                      continue;
    18321832//              }
    1833                 out.getParentFile().mkdirs();
     1833                copyFile(file, out, true);
     1834        }
     1835    }
     1836   
     1837    /**
     1838     * @param src
     1839     * @param dst
     1840     * @throws IOException
     1841     */
     1842    public static void copyFile(File src, File dst, boolean overWrite) throws IOException {
     1843        if(!overWrite && dst.exists())
     1844                return;
     1845        dst.getParentFile().mkdirs();
    18341846                FileOutputStream fOut = null;
    18351847                FileInputStream fIn = null;
    18361848                try {
    18371849                        // System.out.println(out.getPath());
    1838                         fOut = new FileOutputStream(out);
    1839                         fIn = new FileInputStream(file);
     1850                        fOut = new FileOutputStream(dst);
     1851                        fIn = new FileInputStream(src);
    18401852                        byte[] bBuffer = new byte[1024];
    18411853                        int nLen;
     
    18541866                        }
    18551867                }
    1856                
    1857         }
    18581868    }
    18591869
  • trunk/src/org/expeditee/items/Picture.java

    r793 r843  
    2626
    2727import org.expeditee.gui.FrameGraphics;
     28import org.expeditee.gui.FrameIO;
    2829import org.expeditee.gui.FrameMouseActions;
     30import org.expeditee.gui.FrameUtils;
    2931import org.expeditee.stats.Logger;
    3032
     
    740742                return _fileName;
    741743        }
     744       
     745        public String getPath() {
     746                return _path;
     747        }
     748       
     749        /**
     750         * Copies the image to the default images folder and updates the reference to it in Expeditee
     751         * Used for correcting image references for FrameShare
     752         */
     753        public void moveToImagesFolder() {
     754                File f = new File(getPath());
     755                // if the file is not in the default images folder, copy it there
     756                if(! f.getParentFile().equals(new File(FrameIO.IMAGES_PATH))) {
     757                        try {
     758                                File f2 = new File(FrameIO.IMAGES_PATH + f.getName());
     759                FrameUtils.copyFile(f, f2, false);
     760                f = f2;
     761            } catch (IOException e) {
     762                e.printStackTrace();
     763                f = null;
     764            }
     765                }
     766                _path = f.getPath();
     767                _fileName = f.getName();
     768                updateSource();
     769        }
    742770
    743771        protected String getTagText() {
  • trunk/src/org/expeditee/network/FrameShare.java

    r838 r843  
    33import java.io.BufferedReader;
    44import java.io.File;
    5 import java.io.FileOutputStream;
    65import java.io.IOException;
    76import java.io.InputStream;
     7import java.io.OutputStream;
    88import java.io.StringReader;
    99import java.io.StringWriter;
     
    1717import java.util.HashMap;
    1818import java.util.LinkedList;
     19import java.util.List;
    1920import java.util.Map;
    2021
     
    2728import org.expeditee.io.FrameReader;
    2829import org.expeditee.io.FrameWriter;
     30import org.expeditee.items.Item;
     31import org.expeditee.items.Picture;
    2932import org.expeditee.items.Text;
    3033import org.expeditee.settings.network.NetworkSettings;
     
    6164
    6265        private FrameShare(int port) {
    63                 this();
     66        this();
    6467                _port = port;
    6568
     
    253256       
    254257        /**
    255          * Sends an image to the server,
    256          * So that other users can view the image on the server frames
    257          *
    258          * @param imageName
    259          * @param peerName
     258         * Send a list of images that may need to be uploaded
     259         * Then wait for a response (in form of a list of shorts denoting which files to keep)
     260         * Then send each file in sequence
     261         * @author jts21
     262         *
    260263         */
    261         public void sendImage(String imageName, String peerName) {
     264        private class ImageSender extends Thread {
    262265               
     266                private List<File> imageFiles;
     267                private Peer peer;
     268               
     269                public ImageSender(List<File> imageFiles, Peer peer) {
     270                        super("ImageSender");
     271                        this.imageFiles = imageFiles;
     272                        this.peer = peer;
     273                }
     274               
     275                @Override
     276                public void run() {
     277                        System.out.println("Sending images to server");
     278                        try(Socket socket = new Socket(peer.getAddress(), peer.getPort() + ImageSaver.OFFSET)) {
     279                                socket.setSoTimeout(NetworkSettings.FrameShareTimeout.get() * 2);
     280                                OutputStream os = socket.getOutputStream();
     281                                // send the list of filenames to the server
     282                                int numFiles = imageFiles.size();
     283                                if(numFiles > 255) {
     284                                        throw new Exception("Too many images on the frame");
     285                                }
     286                os.write((byte) (numFiles & 0xFF));
     287                // send the list of different files
     288                                for(File f : imageFiles) {
     289                                        byte[] fileName = f.getName().getBytes();
     290                        int fileNameLen = fileName.length;
     291                        if(fileNameLen > 255) {
     292                                        throw new Exception("Filename too long");
     293                                }
     294                        os.write((byte) ((fileNameLen) & 0xFF));
     295                        os.write(fileName);
     296                                }
     297                                // the server sends indices of files it wants, send their data
     298                                InputStream is = socket.getInputStream();
     299                                int i = -1;
     300                                while((i = is.read()) != -1 && i < imageFiles.size()) {
     301                                        File f = imageFiles.get(i);
     302                                        System.out.println("... sending " + f.getName());
     303                                        ImageServer.sendImage(f, socket);
     304                                }
     305                        } catch(Exception e) {
     306                                e.printStackTrace();
     307                        }
     308                }
    263309        }
    264310       
     
    266312                try(Socket socket = new Socket(peer.getAddress(), peer.getPort() + ImageServer.OFFSET)) {
    267313                socket.setSoTimeout(NetworkSettings.FrameShareTimeout.get() * 2);
    268                 byte[] fileName = imageName.getBytes();
     314                byte[] fileName = imageName.getBytes(ImageServer.CHARSET);
    269315                int fileNameLen = fileName.length;
    270                 byte[] data = new byte[2 + fileNameLen];
    271                 data[0] = (byte) ((fileNameLen >> 8) & 0xFF);
    272                 data[1] = (byte) ((fileNameLen) & 0xFF);
    273                 System.arraycopy(fileName, 0, data, 2, fileNameLen);
    274                 socket.getOutputStream().write(data);
    275                 socket.getOutputStream().flush();
     316                OutputStream os = socket.getOutputStream();
     317                os.write((byte) ((fileNameLen) & 0xFF));
     318                os.write(fileName);
     319                os.flush();
    276320                socket.shutdownOutput();
    277                 InputStream is = socket.getInputStream();
    278             // file length is the first 4 bytes
    279             int fileLen = (is.read() << 24) | (is.read() << 16) | (is.read() << 8) | is.read();
    280             // if the above reads failed, fileLen will be -1
    281             if(fileLen <= 0) {
    282                 return false;
    283             }
    284             System.out.println("Receiving " + new String(fileName, ImageServer.CHARSET) + " (" + fileLen + " bytes)");
    285             File f = new File(FrameIO.IMAGES_PATH + imageName);
    286             f.getParentFile().mkdirs();
    287             FileOutputStream out = new FileOutputStream(f);
    288             // file is the remaining bytes of the stream
    289             byte[] buf = null;
    290             if(fileLen > 1024) {
    291                 buf = new byte[1024];
    292                 while(fileLen > 1024) {
    293                         is.read(buf);
    294                         out.write(buf);
    295                         fileLen -= 1024;
    296                 }
    297             }
    298             buf = new byte[fileLen];
    299             is.read(buf);
    300                 out.write(buf);
    301                 out.flush();
    302             out.close();
     321                boolean ret = ImageSaver.recvImage(new File(FrameIO.IMAGES_PATH + imageName), socket);
    303322                socket.close();
    304                 return true;
     323                return ret;
    305324                } catch(Exception e) {
    306325                        e.printStackTrace();
     
    371390
    372391                Peer peer = _peers.get(toSave.getPath().toLowerCase());
     392               
     393                List<File> imageFiles = new LinkedList<File>();
     394                for(Item i : toSave.getItems()) {
     395                        if(i instanceof Picture) {
     396                                ((Picture) i).moveToImagesFolder();
     397                                File f = new File(((Picture) i).getPath());
     398                                if(f != null && f.isFile() && !imageFiles.contains(f)) {
     399                                        imageFiles.add(f);
     400                                }
     401                        }
     402                }
     403                new ImageSender(imageFiles, peer).start();
     404               
    373405                String fileContents = "";
    374406                // Now read the frame from the file contents
     
    488520            if (args.length != 1) {
    489521
    490                 // Work out the 'program name' (i.e. this class), but done in a general
    491                 //   way in case class name is changed at a later date
    492                 StackTraceElement[] stack = Thread.currentThread ().getStackTrace ();
    493                 StackTraceElement main = stack[stack.length - 1];
    494                 String mainClass = main.getClassName ();
    495 
    496                 System.err.println("Usage: java " + mainClass + " port-number");
    497                 System.exit(1);
     522                // Work out the 'program name' (i.e. this class), but done in a general
     523                //   way in case class name is changed at a later date
     524                StackTraceElement[] stack = Thread.currentThread ().getStackTrace ();
     525                StackTraceElement main = stack[stack.length - 1];
     526                String mainClass = main.getClassName ();
     527   
     528                System.err.println("Usage: java " + mainClass + " port-number");
     529                System.exit(1);
    498530            }
    499531           
     532            MessageBay.suppressMessages(true);
     533           
    500534            String port_str = args[0];
    501535
    502536            try {
    503                 int port = Integer.parseInt(port_str);
    504 
    505                 init(port);
     537                int port = Integer.parseInt(port_str);
     538   
     539                init(port);
    506540            }
    507541            catch (Exception e) {
  • trunk/src/org/expeditee/network/ImageSaver.java

    r838 r843  
    55import java.io.IOException;
    66import java.io.InputStream;
     7import java.io.OutputStream;
    78import java.net.ServerSocket;
    89import java.net.Socket;
     10import java.util.ArrayList;
     11import java.util.List;
    912
    1013import org.expeditee.gui.FrameIO;
    1114
    1215public class ImageSaver extends DefaultServer {
     16       
     17        public static boolean recvImage(File file, Socket socket) throws IOException {
     18                InputStream is = socket.getInputStream();
     19        // file length is the first 4 bytes
     20        int fileLen = (is.read() << 24) | (is.read() << 16) | (is.read() << 8) | is.read();
     21        // if the above reads failed, fileLen will be -1
     22        if(fileLen <= 0) {
     23                return false;
     24        }
     25        System.out.println("Receiving " + file.getName() + " (" + fileLen + " bytes)");
     26        file.getParentFile().mkdirs();
     27        FileOutputStream out = new FileOutputStream(file);
     28        // file is the remaining bytes of the stream
     29        byte[] buf = null;
     30        if(fileLen > 1024) {
     31                buf = new byte[1024];
     32                while(fileLen > 1024) {
     33                        is.read(buf);
     34                        out.write(buf);
     35                        fileLen -= 1024;
     36                }
     37        }
     38        buf = new byte[fileLen];
     39        is.read(buf);
     40                out.write(buf);
     41                out.flush();
     42        out.close();
     43        return true;
     44        }
    1345       
    1446        /**
     
    2052        private static class ImageReceiver extends Thread {
    2153               
    22                 private Socket client;
     54                private Socket socket;
    2355               
    2456                public ImageReceiver(Socket client) {
    2557                        super("ImageReceiver");
    26                         this.client = client;
     58                        this.socket = client;
    2759                }
    2860               
     
    3062                public void run() {
    3163                        try {
    32                                 this.client.shutdownOutput();
    33                                 InputStream is = this.client.getInputStream();
    34                                 // file name length is the first 2 bytes
    35                     int fileNameLen = (is.read() << 8) | is.read();
    36                     // file length is the next 4 bytes
    37                     int fileLen = (is.read() << 24) | (is.read() << 16) | (is.read() << 8) | is.read();
    38                     // file name is the remaining bytes of the header, encoded in UTF-8
    39                     byte[] fileName = new byte[fileNameLen];
    40                     is.read(fileName);
    41                     File f = new File(FrameIO.IMAGES_PATH + new String(fileName, ImageServer.CHARSET));
    42                     f.mkdirs();
    43                     // file is the remaining bytes of the stream
    44                     byte[] fileData = new byte[fileLen];
    45                     is.read(fileData);
    46                     // write the file
    47                     FileOutputStream out = new FileOutputStream(f);
    48                     out.write(fileData);
    49                     out.close();
    50                     this.client.close();
     64                                InputStream is = this.socket.getInputStream();
     65                                OutputStream os = this.socket.getOutputStream();
     66                                // number of files is the first byte
     67                                int numFiles = is.read();
     68                                if(numFiles == -1)
     69                                        return;
     70                                // read the filenames
     71                                File[] files = new File[numFiles];
     72                                List<Integer> wantFiles = new ArrayList<Integer>();
     73                                for(int i = 0; i < numFiles; i++) {
     74                                        int fileNameLen = is.read();
     75                                        byte[] fileName = new byte[fileNameLen];
     76                                        is.read(fileName);
     77                                        files[i] = new File(FrameIO.IMAGES_PATH + new String(fileName, ImageServer.CHARSET));
     78                                        // pick out which files we want
     79                                        if(!files[i].exists()) {
     80                                                wantFiles.add(i);
     81                                                os.write(i);
     82                                        }
     83                                }
     84                                // get the files
     85                                for(Integer i : wantFiles) {
     86                                        recvImage(files[i], socket);
     87                                }
     88                    this.socket.close();
    5189            } catch (IOException e) {
    5290                    e.printStackTrace();
  • trunk/src/org/expeditee/network/ImageServer.java

    r838 r843  
    11package org.expeditee.network;
    22
    3 import java.io.BufferedOutputStream;
    43import java.io.File;
    54import java.io.FileInputStream;
    65import java.io.IOException;
    76import java.io.InputStream;
     7import java.io.OutputStream;
    88import java.net.ServerSocket;
    99import java.net.Socket;
     
    1313
    1414public class ImageServer extends DefaultServer {
     15       
     16        public static void sendImage(File file, Socket socket) throws IOException {
     17                OutputStream os = socket.getOutputStream();
     18        // send the file over the socket
     19        int fileLen = (int) file.length();
     20        System.out.println("Sending " + file.getName() + " (" + fileLen + " bytes)");
     21        byte[] fileLenBytes = new byte[4];
     22        fileLenBytes[0] = (byte) ((fileLen >> 24) & 0xFF);
     23        fileLenBytes[1] = (byte) ((fileLen >> 16) & 0xFF);
     24        fileLenBytes[2] = (byte) ((fileLen >> 8) & 0xFF);
     25        fileLenBytes[3] = (byte) ((fileLen) & 0xFF);
     26        os.write(fileLenBytes);
     27        FileInputStream in = new FileInputStream(file);
     28        byte[] buf = null;
     29        if(in.available() > 1024) {
     30                buf = new byte[1024];
     31                while(in.available() > 1024) {
     32                        in.read(buf);
     33                        os.write(buf);
     34                }
     35        }
     36        buf = new byte[in.available()];
     37        in.read(buf);
     38                os.write(buf);
     39                os.flush();
     40                in.close();
     41        }
    1542       
    1643        /**
     
    2249        private static class ImageSender extends Thread {
    2350               
    24                 private Socket client;
     51                private Socket socket;
    2552               
    2653                public ImageSender(Socket client) {
    2754                        super("ImageSender");
    28                         this.client = client;
     55                        this.socket = client;
    2956                }
    3057               
     
    3259                public void run() {
    3360                        try {
    34                                 BufferedOutputStream os = new BufferedOutputStream(this.client.getOutputStream());
    35                                 InputStream is = this.client.getInputStream();
    36                                 // file name length is the first 2 bytes
    37                     int fileNameLen = (is.read() << 8) | is.read();
     61                                InputStream is = this.socket.getInputStream();
     62                                // file name length is the first byte
     63                    int fileNameLen = is.read();
     64                    if(fileNameLen <= 0)
     65                        return;
    3866                    // file name is the remaining bytes of the stream, encoded in UTF-8
    3967                    byte[] fileName = new byte[fileNameLen];
    4068                    is.read(fileName);
    41                     this.client.shutdownInput();
    42                     File f = new File(FrameIO.IMAGES_PATH + new String(fileName, ImageServer.CHARSET));
    43                     if(f.exists()) {
    44                         // send the file over the socket
    45                         int fileLen = (int) f.length();
    46                         System.out.println("Sending " + new String(fileName, ImageServer.CHARSET) + " (" + fileLen + " bytes)");
    47                         byte[] fileLenBytes = new byte[4];
    48                         fileLenBytes[0] = (byte) ((fileLen >> 24) & 0xFF);
    49                         fileLenBytes[1] = (byte) ((fileLen >> 16) & 0xFF);
    50                         fileLenBytes[2] = (byte) ((fileLen >> 8) & 0xFF);
    51                         fileLenBytes[3] = (byte) ((fileLen) & 0xFF);
    52                         os.write(fileLenBytes);
    53                         FileInputStream in = new FileInputStream(f);
    54                         byte[] buf = null;
    55                         if(in.available() > 1024) {
    56                                 buf = new byte[1024];
    57                                 while(in.available() > 1024) {
    58                                         in.read(buf);
    59                                         os.write(buf);
    60                                 }
    61                         }
    62                         buf = new byte[in.available()];
    63                         in.read(buf);
    64                                 os.write(buf);
    65                                 os.flush();
    66                                 in.close();
    67                     }
    68                 this.client.close();
     69                    this.socket.shutdownInput();
     70                    sendImage(new File(FrameIO.IMAGES_PATH + new String(fileName, ImageServer.CHARSET)), socket);
     71                this.socket.close();
    6972            } catch (IOException e) {
    7073                    e.printStackTrace();
Note: See TracChangeset for help on using the changeset viewer.