/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/

import com.sun.star.comp.loader.FactoryHelper;
import com.sun.star.lang.*;
import com.sun.star.uno.*;
import com.sun.star.registry.XRegistryKey;
import java.io.*;
import java.net.*;
//import com.sun.star.lib.sandbox.*;


/** This component implements XTypeProvider for use with StarBasic.
 *  The XServiceInfo is implemented to have an interface in which we can put some
 *  code just for the sake of debugging.
 *
 *  To debug with JPDA (jdk 1.3), put these lines in the java.ini within the  [Java] section:
 *  -Xdebug
 *  -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y
 *
 *  When the Virtual Machine service is instantiated it will block until the debugger
 *  attaches to it on port 8000. You can chose a different port. You attach to the VM using
 *  jdb by
 *
 *  jdb -connect com.sun.jdi.SocketAttach:hostname=myhost,port=8000
 *
 *  myhost is the hostname where the VM is running.
*/
public class TestComponent implements XServiceInfo, XTypeProvider
{
    public static final String __serviceName="JavaTestComponent";

    // XTypeProvider
    public com.sun.star.uno.Type[] getTypes(  )
    {
        Type[] retValue= new Type[2];
        retValue[0]= new Type( XServiceInfo.class);
        retValue[1]= new Type( XTypeProvider.class);
        return retValue;
    }
    // XTypeProvider
    public byte[] getImplementationId(  )
    {
        return TestComponent.class.getName().getBytes();
    }


    // XServiceName
    public String getImplementationName(  )
    {
        String a= "the functions are for debugging";
        int abc= 34;
        String prop= System.getProperty("ftp.proxyHost");
        prop= System.getProperty("ftp.proxyPort");
        prop= System.getProperty("http.proxyHost");
        prop= System.getProperty("http.proxyPort");
        prop= System.getProperty("ftp.nonProxyHosts");
        prop= System.getProperty("http.nonProxyHosts");
        prop= System.getProperty("socksProxyHost");
        prop= System.getProperty("socksProxyPort");

		prop= System.getProperty("stardiv.security.disableSecurity");
		prop= System.getProperty("appletviewer.security.mode");

        // Test security settings
        File f= new File("c:/temp/javasecurity.txt");
        try {
            f.createNewFile();

               // local connection
        URL url= new URL("http://localhost:8080/index.html");
        InputStream is= url.openStream();
        // remote connection
        url= new URL("http://www.w3.org/index.html");
        is= url.openStream();
        }catch( MalformedURLException mue) {
        }catch( IOException e) {
            String s= e.getMessage();
            System.out.println(s);
        }/*catch( SandboxSecurityException sse) {
            String s= sse.getMessage();
            System.out.println("s");
        }
*/

        return __serviceName;
    }
    // XServiceName
    public boolean supportsService( /*IN*/String ServiceName )
    {

        return false;
    }

    //XServiceName
    public String[] getSupportedServiceNames(  )
    {
        String[] retValue= new String[0];
        return retValue;
    }

    public static XSingleServiceFactory __getServiceFactory(String implName,
    XMultiServiceFactory multiFactory,
    XRegistryKey regKey)
    {
        XSingleServiceFactory xSingleServiceFactory = null;

        if (implName.equals( TestComponent.class.getName()) )
            xSingleServiceFactory = FactoryHelper.getServiceFactory( TestComponent.class,
            TestComponent.__serviceName,
            multiFactory,
            regKey);

        return xSingleServiceFactory;
    }

  /**
   * Writes the service information into the given registry key.
   * This method is called by the <code>JavaLoader</code>
   * <p>
   * @return  returns true if the operation succeeded
   * @param   regKey       the registryKey
   * @see                  com.sun.star.comp.loader.JavaLoader
   */
    public static boolean __writeRegistryServiceInfo(XRegistryKey regKey)
    {
        return FactoryHelper.writeRegistryServiceInfo( TestComponent.class.getName(),
        TestComponent.__serviceName, regKey);
    }

}
