205 lines · 7.0 KB · Java
RawDownload
/* * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package sun.net.www;import java.net.URL;import java.io.*;import java.util.StringTokenizer; class MimeLauncher extends Thread {    java.net.URLConnection uc;    MimeEntry m;    String genericTempFileTemplate;    InputStream is;    String execPath;     MimeLauncher (MimeEntry M, java.net.URLConnection uc,                  InputStream is, String tempFileTemplate, String threadName) throws ApplicationLaunchException {        super(threadName);        m = M;        this.uc = uc;        this.is = is;        genericTempFileTemplate = tempFileTemplate;         /* get the application to launch */        String launchString = m.getLaunchString();         /* get a valid path to launch application - sets           the execPath instance variable with the correct path.         */        if (!findExecutablePath(launchString)) {            /* strip off parameters i.e %s */            String appName;            int index = launchString.indexOf(' ');            if (index != -1) {                appName = launchString.substring(0, index);            }            else {                appName = launchString;            }            throw new ApplicationLaunchException(appName);        }    }     protected String getTempFileName(URL url, String template) {        String tempFilename = template;         // Replace all but last occurrance of "%s" with timestamp to insure        // uniqueness.  There's a subtle behavior here: if there is anything        // _after_ the last "%s" we need to append it so that unusual launch        // strings that have the datafile in the middle can still be used.        int wildcard = tempFilename.lastIndexOf("%s");        String prefix = tempFilename.substring(0, wildcard);         String suffix = "";        if (wildcard < tempFilename.length() - 2) {            suffix = tempFilename.substring(wildcard + 2);        }         long timestamp = System.currentTimeMillis()/1000;        int argIndex = 0;        while ((argIndex = prefix.indexOf("%s")) >= 0) {            prefix = prefix.substring(0, argIndex)                + timestamp                + prefix.substring(argIndex + 2);        }         // Add a file name and file-extension if known        String filename = url.getFile();         String extension = "";        int dot = filename.lastIndexOf('.');         // BugId 4084826:  Temp MIME file names not always valid.        // Fix:  don't allow slashes in the file name or extension.        if (dot >= 0 && dot > filename.lastIndexOf('/')) {            extension = filename.substring(dot);        }         filename = "HJ" + url.hashCode();         tempFilename = prefix + filename + timestamp + extension + suffix;         return tempFilename;    }     public void run() {        try {            String ofn = m.getTempFileTemplate();            if (ofn == null) {                ofn = genericTempFileTemplate;            }             ofn = getTempFileName(uc.getURL(), ofn);            try {                OutputStream os = new FileOutputStream(ofn);                byte buf[] = new byte[2048];                int i = 0;                try {                    while ((i = is.read(buf)) >= 0) {                        os.write(buf, 0, i);                    }                } catch(IOException e) {                  //System.err.println("Exception in write loop " + i);                  //e.printStackTrace();                } finally {                    os.close();                    is.close();                }            } catch(IOException e) {              //System.err.println("Exception in input or output stream");              //e.printStackTrace();            }             int inx = 0;            String c = execPath;            while ((inx = c.indexOf("%t")) >= 0) {                c = c.substring(0, inx) + uc.getContentType()                    + c.substring(inx + 2);            }             boolean substituted = false;            while ((inx = c.indexOf("%s")) >= 0) {                c = c.substring(0, inx) + ofn + c.substring(inx + 2);                substituted = true;            }            if (!substituted)                c = c + " <" + ofn;             // System.out.println("Execing " +c);             Runtime.getRuntime().exec(c);        } catch(IOException e) {        }    }     /* This method determines the path for the launcher application       and sets the execPath instance variable.  It uses the exec.path       property to obtain a list of paths that is in turn used to       location the application.  If a valid path is not found, it       returns false else true.  */    private boolean findExecutablePath(String str) {        if (str == null || str.length() == 0) {            return false;        }         String command;        int index = str.indexOf(' ');        if (index != -1) {            command = str.substring(0, index);        }        else {            command = str;        }         File f = new File(command);        if (f.isFile()) {            // Already executable as it is            execPath = str;            return true;        }         String execPathList;        execPathList = java.security.AccessController.doPrivileged(                new sun.security.action.GetPropertyAction("exec.path"));        if (execPathList == null) {            // exec.path property not set            return false;        }         StringTokenizer iter = new StringTokenizer(execPathList, "|");        while (iter.hasMoreElements()) {            String prefix = (String)iter.nextElement();            String fullCmd = prefix + File.separator + command;            f = new File(fullCmd);            if (f.isFile()) {                execPath = prefix + File.separator + str;                return true;            }        }         return false; // application not found in exec.path    }}