/* GnomeDesktopPeer.java -- Offers a GNOME Desktop peer for DesktopPeer
 Copyright (C) 2006, 2007 Free Software Foundation, Inc.

 This file is part of GNU Classpath.

 GNU Classpath is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.

 GNU Classpath 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 for more details.

 You should have received a copy of the GNU General Public License
 along with GNU Classpath; see the file COPYING.  If not, write to the
 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 02110-1301 USA.

 Linking this library statically or dynamically with other modules is
 making a combined work based on this library.  Thus, the terms and
 conditions of the GNU General Public License cover the whole
 combination.

 As a special exception, the copyright holders of this library give you
 permission to link this library with independent modules to produce an
 executable, regardless of the license terms of these independent
 modules, and to copy and distribute the resulting executable under
 terms of your choice, provided that you also meet, for each linked
 independent module, the terms and conditions of the license of that
 module.  An independent module is a module which is not derived from
 or based on this library.  If you modify this library, you may extend
 this exception to your version of the library, but you are not
 obligated to do so.  If you do not wish to do so, delete this
 exception statement from your version. */

package gnu.java.awt.peer;

import gnu.java.lang.CPStringBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;

/**
 * @author Mario Torre <neugens@limasoftware.net>
 */
public class GnomeDesktopPeer
    extends ClasspathDesktopPeer
{
  /**
   * Query string to use if a GNOME desktop is detected to get the name of the
   * default browser. This requires gconftool-2 (part of GNOME).
   */
  private static final String BROWSER_QUERY_GNOME =
    "gconftool-2 -g /desktop/gnome/url-handlers/http/command";

  protected String getCommand(String action)
  {
    // check if a command already exists
    String command = super.getCommand(action);
    
    if (command == null)
      {
        try
          {
            if (action == _BROWSE)
              { 
                command = execQuery(BROWSER_QUERY_GNOME);
              }
            else if (action == _PRINT)
              {
                command = null;
              }
            else
              {
                command = "gnome-open";
              }
          }
        catch (Exception e)
          {
            command = null;
          }
      }
    
    return command;
  }
  
  public void browse(URI url) throws IOException
  {
    checkPermissions();
    
    String browser = getCommand(_BROWSE);
    
    if (browser == null)
      throw new UnsupportedOperationException();
    
    browser = browser + " " + url.toString();
    
    Runtime.getRuntime().exec(browser);
  }

  protected boolean supportCommand(String check)
  {
    if (check == _PRINT)
      { 
        return super.supportCommand(check);
      }
    
    return true;
  }

  public void mail() throws IOException
  {
    checkPermissions();
    
    String mail = getCommand(_MAIL);
    
    if (mail == null)
      throw new UnsupportedOperationException();
    
    Runtime.getRuntime().exec(mail + " mailto:");
  }
  
  protected String execQuery(String command) throws IOException
  {
    InputStream in = null;
    CPStringBuilder output = new CPStringBuilder();

    try
      {
        Process process = Runtime.getRuntime().exec(command);

        // Get the input stream and read from it
        in = process.getInputStream();
        int c;
        while ((c = in.read()) != - 1)
          {
            output.append((char) c);
          }
      }
    finally
      {
        if (in != null)
          in.close();
      }

    // remove %s from the string, leave only the command line
    int index = output.indexOf("%s");
    output.delete(index, index + 1);
    
    return output.toString().trim();
  }
}
