/**************************************************************
 * 
 * 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 complex.loadAllDocuments;

import com.sun.star.uno.UnoRuntime;
import com.sun.star.ucb.XSimpleFileAccess;
import com.sun.star.lang.XMultiServiceFactory;

/**
 * Simulates an input and output stream and
 * implements the interfaces XInputStream, XOutputStream.
 * So it can be used for testing loading/saving of documents
 * using streams instead of URLs.
 */
public class StreamSimulator implements com.sun.star.io.XInputStream    ,
                                        com.sun.star.io.XOutputStream   ,
                                        com.sun.star.io.XSeekable
{
    //_________________________________
    /**
     * @member  m_sFileName     name of the corrsponding file on disk
     * @member  m_xInStream     the internal input stream for reading
     * @member  m_xOutStream    the internal input stream for writing
     * @member  m_xSeek         points at runtime to m_xInStream or m_xOutStream and make it seekable
     *
     * @member  m_bInWasUsed    indicates, that the input stream interface was used
     * @member  m_bOutWasUsed   indicates, that the output stream interface was used
     */

    private String                          m_sFileName     ;
    private com.sun.star.io.XInputStream    m_xInStream     ;
    private com.sun.star.io.XOutputStream   m_xOutStream    ;
    private com.sun.star.io.XSeekable       m_xSeek         ;

    public  boolean                         m_bInWasUsed    ;
    public  boolean                         m_bOutWasUsed   ;

    /**
     * construct a new instance of this class
     * It set the name of the correspojnding file on disk, which
     * should be source or target for the following operations on
     * this object. And it regulate if it should function as
     * input or output stream.
     *
     * @param   sFileName
     *              name of the file on disk
     *              Will be used as source (if param bInput==true)
     *              or as target (if param bInput==false).
     *
     * @param   bInput
     *              it specify, which interface should work at this object.
     *              <TRUE/>  => we simulate an input stream
     *              <FALSE/> => we simulate an output stream
     *
     * @throw   com.sun.star.io.NotConnectedException
     *              in case the internal streams to the file on disk couldn't
     *              be established.
     *              They are neccessary. Otherwhise this simulator can't
     *              really work.
     */
    public StreamSimulator(XMultiServiceFactory xMSF,
                            String  sFileName, boolean bInput)
                            throws com.sun.star.io.NotConnectedException
    {
        m_sFileName     = sFileName ;
        m_bInWasUsed    = false     ;
        m_bOutWasUsed   = false     ;

        try
        {
            XSimpleFileAccess xHelper = (XSimpleFileAccess)
                UnoRuntime.queryInterface(XSimpleFileAccess.class,
                xMSF.createInstance("com.sun.star.ucb.SimpleFileAccess"));

            if (xHelper == null)
                throw new com.sun.star.io.NotConnectedException(
                        "ucb helper not available. Can't create streams.");

            if (bInput)
            {
                m_xInStream = xHelper.openFileRead(m_sFileName);
                m_xSeek = (com.sun.star.io.XSeekable)UnoRuntime.queryInterface(
                            com.sun.star.io.XSeekable.class,
                            m_xInStream);
            }
            else
            {
                m_xOutStream = xHelper.openFileWrite(m_sFileName);
                m_xSeek = (com.sun.star.io.XSeekable)UnoRuntime.queryInterface(
                            com.sun.star.io.XSeekable.class,
                            m_xOutStream);
            }
        }
        catch(com.sun.star.uno.Exception exUno)
        {
            throw new com.sun.star.io.NotConnectedException(
                                            "Could not open the file.");
        }
    }

    /**
     * following methods simulates the XInputStream.
     * The notice all actions inside the internal protocol
     * and try to map all neccessary functions to the internal
     * open in-stream.
     */
    public int readBytes(byte[][] lData, int nBytesToRead )
                                throws com.sun.star.io.NotConnectedException,
                                com.sun.star.io.BufferSizeExceededException,
                                com.sun.star.io.IOException
    {
        m_bInWasUsed = true;

        if (m_xInStream == null)
        {
            throw new com.sun.star.io.NotConnectedException("stream not open");
        }

        int nRead = 0;
        try
        {
            nRead = m_xInStream.readBytes(lData,nBytesToRead);
        }
        catch (com.sun.star.io.NotConnectedException       exConnect) {
        }
        catch (com.sun.star.io.BufferSizeExceededException exBuffer ) {
        }
        catch (com.sun.star.io.IOException                 exIO     ) {
        }
        catch (com.sun.star.uno.RuntimeException           exRuntime) {
        }
        catch (com.sun.star.uno.Exception                  exUno    ) {
        }


        return nRead;
    }

    public int readSomeBytes(byte[][] lData, int nMaxBytesToRead)
                            throws com.sun.star.io.NotConnectedException,
                            com.sun.star.io.BufferSizeExceededException ,
                            com.sun.star.io.IOException
    {
        m_bInWasUsed = true;

        if (m_xInStream == null)
        {
            throw new com.sun.star.io.NotConnectedException("stream not open");
        }

        int nRead = 0;
        try
        {
            nRead = m_xInStream.readSomeBytes(lData,nMaxBytesToRead);
        }
        catch (com.sun.star.io.NotConnectedException       exConnect) { 
        }
        catch (com.sun.star.io.BufferSizeExceededException exBuffer ) {   
        }
        catch (com.sun.star.io.IOException                 exIO     ) {    
        }
        catch (com.sun.star.uno.RuntimeException           exRuntime) { 
        }
        catch (com.sun.star.uno.Exception                  exUno    ) {  
        }

        return nRead;
    }

    //_________________________________

    public void skipBytes(int nBytesToSkip) 
                                throws com.sun.star.io.NotConnectedException,
                                com.sun.star.io.BufferSizeExceededException ,
                                com.sun.star.io.IOException
    {
        m_bInWasUsed = true;

        if (m_xInStream == null)
        {
            throw new com.sun.star.io.NotConnectedException("stream not open");
        }

        try
        {
            m_xInStream.skipBytes(nBytesToSkip);
        }
        catch (com.sun.star.io.NotConnectedException       exConnect) { 
        }
        catch (com.sun.star.io.BufferSizeExceededException exBuffer ) { 
        }
        catch (com.sun.star.io.IOException                 exIO     ) { 
        }
        catch (com.sun.star.uno.RuntimeException           exRuntime) { 
        }
        catch (com.sun.star.uno.Exception                  exUno    ) { 
        }

    }

    public int available() throws com.sun.star.io.NotConnectedException,
                                  com.sun.star.io.IOException
    {
        m_bInWasUsed = true;

        if (m_xInStream == null)
        {
            throw new com.sun.star.io.NotConnectedException("stream not open");
        }

        int nAvailable = 0;
        try
        {
            nAvailable = m_xInStream.available();
        }
        catch (com.sun.star.io.NotConnectedException exConnect) { 
        }
        catch (com.sun.star.io.IOException           exIO     ) { 
        }
        catch (com.sun.star.uno.RuntimeException     exRuntime) { 
        }
        catch (com.sun.star.uno.Exception            exUno    ) { 
        }

        return nAvailable;
    }

    //_________________________________

    public void closeInput() throws com.sun.star.io.NotConnectedException,
                                    com.sun.star.io.IOException
    {
        m_bInWasUsed = true;

        if (m_xInStream == null)
        {
            throw new com.sun.star.io.NotConnectedException("stream not open");
        }

        try
        {
            m_xInStream.closeInput();
        }
        catch (com.sun.star.io.NotConnectedException exConnect) { 
        }
        catch (com.sun.star.io.IOException           exIO     ) { 
        }
        catch (com.sun.star.uno.RuntimeException     exRuntime) { 
        }
        catch (com.sun.star.uno.Exception            exUno    ) { 
        }

    }

    /**
     * following methods simulates the XOutputStream.
     * The notice all actions inside the internal protocol
     * and try to map all neccessary functions to the internal
     * open out-stream.
     */
    public void writeBytes(byte[] lData) 
                                throws com.sun.star.io.NotConnectedException,
                                com.sun.star.io.BufferSizeExceededException ,
                                com.sun.star.io.IOException
    {
        m_bOutWasUsed = true;

        if (m_xOutStream == null)
        {
            throw new com.sun.star.io.NotConnectedException("stream not open");
        }

        try
        {
            m_xOutStream.writeBytes(lData);
        }
        catch (com.sun.star.io.NotConnectedException       exConnect) { 
        }
        catch (com.sun.star.io.BufferSizeExceededException exBuffer ) { 
        }
        catch (com.sun.star.io.IOException                 exIO     ) { 
        }
        catch (com.sun.star.uno.RuntimeException           exRuntime) { 
        }
        catch (com.sun.star.uno.Exception                  exUno    ) { 
        }

    }

    //_________________________________

    public void flush() throws com.sun.star.io.NotConnectedException        ,
                               com.sun.star.io.BufferSizeExceededException  ,
                               com.sun.star.io.IOException
    {
        m_bOutWasUsed = true;

        if (m_xOutStream == null)
        {
            throw new com.sun.star.io.NotConnectedException("stream not open");
        }

        try
        {
            m_xOutStream.flush();
        }
        catch (com.sun.star.io.NotConnectedException       exConnect) { 
        }
        catch (com.sun.star.io.BufferSizeExceededException exBuffer ) { 
        }
        catch (com.sun.star.io.IOException                 exIO     ) { 
        }
        catch (com.sun.star.uno.RuntimeException           exRuntime) { 
        }
        catch (com.sun.star.uno.Exception                  exUno    ) { 
        }
    }

    //_________________________________

    public void closeOutput() throws com.sun.star.io.NotConnectedException      ,
                                     com.sun.star.io.BufferSizeExceededException,
                                     com.sun.star.io.IOException
    {
        m_bOutWasUsed = true;

        if (m_xOutStream == null)
        {
            throw new com.sun.star.io.NotConnectedException("stream not open");
        }

        try
        {
            m_xOutStream.closeOutput();
        }
        catch (com.sun.star.io.NotConnectedException       exConnect) { 
        }
        catch (com.sun.star.io.BufferSizeExceededException exBuffer ) { 
        }
        catch (com.sun.star.io.IOException                 exIO     ) { 
        }
        catch (com.sun.star.uno.RuntimeException           exRuntime) { 
        }
        catch (com.sun.star.uno.Exception                  exUno    ) { 
        }

    }

    /**
     * following methods simulates the XSeekable.
     * The notice all actions inside the internal protocol
     * and try to map all neccessary functions to the internal
     * open stream.
     */
    public void seek(long nLocation ) 
                    throws com.sun.star.lang.IllegalArgumentException,
                    com.sun.star.io.IOException
    {
        if (m_xInStream != null)
            m_bInWasUsed = true;
        else
        if (m_xOutStream != null)
            m_bOutWasUsed = true;
//        else
            //m_aProtocol.log("\tno stream open!\n");

        if (m_xSeek == null)
        {
            throw new com.sun.star.io.IOException("stream not seekable");
        }

        try
        {
            m_xSeek.seek(nLocation);
        }
        catch (com.sun.star.lang.IllegalArgumentException exArg    ) {
        }
        catch (com.sun.star.io.IOException                exIO     ) {
        }
        catch (com.sun.star.uno.RuntimeException          exRuntime) {
        }
        catch (com.sun.star.uno.Exception                 exUno    ) {
        }

    }

    public long getPosition() throws com.sun.star.io.IOException
    {

        if (m_xInStream != null)
            m_bInWasUsed = true;
        else
        if (m_xOutStream != null)
            m_bOutWasUsed = true;
//        else
            //m_aProtocol.log("\tno stream open!\n");

        if (m_xSeek == null)
        {
            throw new com.sun.star.io.IOException("stream not seekable");
        }

        long nPos = 0;
        try
        {
            nPos = m_xSeek.getPosition();
        }
        catch (com.sun.star.io.IOException       exIO     ) {
        }
        catch (com.sun.star.uno.RuntimeException exRuntime) {
        }
        catch (com.sun.star.uno.Exception        exUno    ) {
        }

        return nPos;
    }

    //_________________________________

    public long getLength() throws com.sun.star.io.IOException
    {

        if (m_xInStream != null)
            m_bInWasUsed = true;
        else
        if (m_xOutStream != null)
            m_bOutWasUsed = true;
//        else
            //m_aProtocol.log("\tno stream open!\n");

        if (m_xSeek == null)
        {
            throw new com.sun.star.io.IOException("stream not seekable");
        }

        long nLen = 0;
        try
        {
            nLen = m_xSeek.getLength();
        }
        catch (com.sun.star.io.IOException       exIO     ) { 
        }
        catch (com.sun.star.uno.RuntimeException exRuntime) { 
        }
        catch (com.sun.star.uno.Exception        exUno    ) { 
        }

        return nLen;
    }
}
