/**************************************************************
 * 
 * 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);
    }

}
