/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/

package org.openoffice.examples.embedding;

import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.lib.uno.helper.Factory;
import com.sun.star.lang.XSingleComponentFactory;
import com.sun.star.registry.XRegistryKey;
import com.sun.star.lib.uno.helper.WeakBase;
import com.sun.star.uno.Exception;
import com.sun.star.lang.IllegalArgumentException;

import com.sun.star.embed.*;

import org.openoffice.examples.embedding.OwnEmbeddedObject;

public final class OwnEmbeddedObjectFactory extends WeakBase
   implements com.sun.star.lang.XServiceInfo,
              com.sun.star.embed.XEmbedObjectFactory
{
    private final XComponentContext m_xContext;
    private static final String m_implementationName = OwnEmbeddedObjectFactory.class.getName();
    private static final String[] m_serviceNames = {
        "org.openoffice.examples.embedding.Factory69474366FD6F480683748EDD1B6E771D" };
    private static final byte[] m_classID = { 0x69, 0x47, 0x43, 0x66, (byte)0xFD, 0x6F, 0x48, 0x06, (byte)0x83, 0x74, (byte)0x8E, (byte)0xDD, 0x1B, 0x6E, 0x77, 0x1D };


    public OwnEmbeddedObjectFactory( XComponentContext context )
    {
        m_xContext = context;
    };

    public static XSingleComponentFactory __getComponentFactory( String sImplementationName ) {
        XSingleComponentFactory xFactory = null;

        if ( sImplementationName.equals( m_implementationName ) )
            xFactory = Factory.createComponentFactory(OwnEmbeddedObjectFactory.class, m_serviceNames);
        return xFactory;
    }

    // This method not longer necessary since OOo 3.4 where the component registration
    // was changed to passive component registration. For more details see
    // http://wiki.services.openoffice.org/wiki/Passive_Component_Registration

//     public static boolean __writeRegistryServiceInfo( XRegistryKey xRegistryKey ) {
//         return Factory.writeRegistryServiceInfo(m_implementationName,
//                                                 m_serviceNames,
//                                                 xRegistryKey);
//     }

    // com.sun.star.lang.XServiceInfo:
    public String getImplementationName() {
         return m_implementationName;
    }

    public boolean supportsService( String sService ) {
        int len = m_serviceNames.length;

        for( int i=0; i < len; i++) {
            if (sService.equals(m_serviceNames[i]))
                return true;
        }
        return false;
    }

    public String[] getSupportedServiceNames() {
        return m_serviceNames;
    }

    // com.sun.star.embed.XEmbedObjectFactory:
    public Object createInstanceUserInit(byte[] aClassID, String sClassName, com.sun.star.embed.XStorage xStorage, String sEntName, int nEntryConnectionMode, com.sun.star.beans.PropertyValue[] aArgs, com.sun.star.beans.PropertyValue[] aObjectArgs) throws com.sun.star.lang.IllegalArgumentException, com.sun.star.io.IOException, com.sun.star.uno.Exception
    {
        if ( xStorage == null || sEntName == null || sEntName.length() == 0 )
            throw new com.sun.star.lang.IllegalArgumentException();
    
        if ( nEntryConnectionMode == com.sun.star.embed.EntryInitModes.DEFAULT_INIT )
        {
            if ( aClassID != null && aClassID.length != 0 )
            {
                if ( aClassID.length != m_classID.length )
                    throw new com.sun.star.lang.IllegalArgumentException();

                for ( int i = 0; i < aClassID.length; i++ )
                    if ( aClassID[i] != m_classID[i] )
                        throw new com.sun.star.lang.IllegalArgumentException();
            }
            else if ( !xStorage.hasByName( sEntName ) )
                throw new com.sun.star.lang.IllegalArgumentException();
        }
        else if ( nEntryConnectionMode == com.sun.star.embed.EntryInitModes.TRUNCATE_INIT )
        {
            if ( aClassID.length != m_classID.length )
                throw new com.sun.star.lang.IllegalArgumentException();

            for ( int i = 0; i < m_classID.length; i++ )
                if ( aClassID[i] != m_classID[i] )
                    throw new com.sun.star.lang.IllegalArgumentException();
        }

        OwnEmbeddedObject aObject = new OwnEmbeddedObject( m_xContext, m_classID );
        aObject.setPersistentEntry( xStorage, sEntName, nEntryConnectionMode, aArgs, aObjectArgs );

        return aObject;
    }

}
