/**************************************************************
*
* 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 helper;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.ucb.XSimpleFileAccess;
/**
* It 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_aProtocol the external set protocol object for logging messages
* @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 ComplexTestEnvironment //m_aProtocol ;
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.
* => we simulate an input stream
* => we simulate an output stream
*
* @throw com.sun.star.io.NotConnectedException
* in case the internal streams to the file on disk couldn't established.
* They are neccessary. Otherwhise this simulator can't realy work.
*/
public StreamSimulator( String sFileName , boolean bInput ,
lib.TestParameters param ) throws com.sun.star.io.NotConnectedException
{
////m_aProtocol = new ComplexTestEnvironment();
m_sFileName = sFileName ;
m_bInWasUsed = false ;
m_bOutWasUsed = false ;
try
{
XSimpleFileAccess xHelper = (XSimpleFileAccess)
UnoRuntime.queryInterface(XSimpleFileAccess.class,
((XMultiServiceFactory)param.getMSF()).createInstance("com.sun.star.ucb.SimpleFileAccess"));
/* com.sun.star.ucb.XSimpleFileAccess xHelper = (com.sun.star.ucb.XSimpleFileAccess)OfficeConnect.createRemoteInstance(
com.sun.star.ucb.XSimpleFileAccess.class,
"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)
{
////m_aProtocol.log("\tstream not open. throw NotConnectedException\n\n\tfailed\n}\n");
throw new com.sun.star.io.NotConnectedException("Could not open the file.");
}
}
/* public void finalize()
{
////m_aProtocol.log("finalize was called. Please check if it was right or not.\n");
} */
//_________________________________
/**
* 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( /*OUT*/ byte[][] lData ,
/*IN*/ int nBytesToRead ) throws com.sun.star.io.NotConnectedException ,
com.sun.star.io.BufferSizeExceededException,
com.sun.star.io.IOException
{
//m_aProtocol.log("readBytes(lData["+lData.length+"]["+lData[0]+"],"+nBytesToRead+")\n{\n");
m_bInWasUsed = true;
if (m_xInStream == null)
{
//m_aProtocol.log("\tstream not open. throw NotConnectedException\n\n\tfailed\n}\n");
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) { //m_aProtocol.log("\tgot NotConnectedException\n\tfailed\n}\n" ); throw exConnect;
}
catch (com.sun.star.io.BufferSizeExceededException exBuffer ) { //m_aProtocol.log("\tgot BufferSizeExceededException\n\tfailed\n}\n"); throw exBuffer;
}
catch (com.sun.star.io.IOException exIO ) { //m_aProtocol.log("\tgot IOException\n\tfailed\n}\n" ); throw exIO;
}
catch (com.sun.star.uno.RuntimeException exRuntime) { //m_aProtocol.log("\tgot RuntimeException\n\tfailed\n}\n" ); throw exRuntime;
}
catch (com.sun.star.uno.Exception exUno ) { //m_aProtocol.log("\tgot Exception\n\tfailed\n}\n" );
}
//m_aProtocol.log("\treads "+nRead+" bytes\n\tOK\n}\n");
//if (nRead != nBytesToRead)
//m_aProtocol.log("there are some missing bytes for reading!\n");
return nRead;
}
//_________________________________
public int readSomeBytes( /*OUT*/ byte[][] lData ,
/*IN*/ int nMaxBytesToRead ) throws com.sun.star.io.NotConnectedException ,
com.sun.star.io.BufferSizeExceededException ,
com.sun.star.io.IOException
{
//m_aProtocol.log("readSomeBytes(lData["+lData.length+"]["+lData[0]+"],"+nMaxBytesToRead+")\n{\n");
m_bInWasUsed = true;
if (m_xInStream == null)
{
//m_aProtocol.log("\tstream not open. throw NotConnectedException\n\tfailed\n}\n");
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) { //m_aProtocol.log("\tgot NotConnectedException\n\tfailed\n}\n" ); throw exConnect;
}
catch (com.sun.star.io.BufferSizeExceededException exBuffer ) { //m_aProtocol.log("\tgot BufferSizeExceededException\n\tfailed\n}\n"); throw exBuffer;
}
catch (com.sun.star.io.IOException exIO ) { //m_aProtocol.log("\tgot IOException\n\tfailed\n}\n" ); throw exIO;
}
catch (com.sun.star.uno.RuntimeException exRuntime) { //m_aProtocol.log("\tgot RuntimeException\n\tfailed\n}\n" ); throw exRuntime;
}
catch (com.sun.star.uno.Exception exUno ) { //m_aProtocol.log("\tgot Exception\n\tfailed\n}\n" );
}
//m_aProtocol.log("\treads "+nRead+" bytes\n\tOK\n}\n");
//if (nRead != nMaxBytesToRead)
//m_aProtocol.log("there are some missing bytes for reading!");
return nRead;
}
//_________________________________
public void skipBytes( /*IN*/ int nBytesToSkip ) throws com.sun.star.io.NotConnectedException ,
com.sun.star.io.BufferSizeExceededException ,
com.sun.star.io.IOException
{
//m_aProtocol.log("skipBytes("+nBytesToSkip+")\n{\n");
m_bInWasUsed = true;
if (m_xInStream == null)
{
//m_aProtocol.log("\tstream not open. throw NotConnectedException\n\tfailed\n}\n");
throw new com.sun.star.io.NotConnectedException("stream not open");
}
try
{
m_xInStream.skipBytes(nBytesToSkip);
}
catch (com.sun.star.io.NotConnectedException exConnect) { //m_aProtocol.log("\tgot NotConnectedException\n\tfailed\n}\n" ); throw exConnect;
}
catch (com.sun.star.io.BufferSizeExceededException exBuffer ) { //m_aProtocol.log("\tgot BufferSizeExceededException\n\tfailed\n}\n"); throw exBuffer;
}
catch (com.sun.star.io.IOException exIO ) { //m_aProtocol.log("\tgot IOException\n\tfailed\n}\n" ); throw exIO;
}
catch (com.sun.star.uno.RuntimeException exRuntime) { //m_aProtocol.log("\tgot RuntimeException\n\tfailed\n}\n" ); throw exRuntime;
}
catch (com.sun.star.uno.Exception exUno ) { //m_aProtocol.log("\tgot Exception\n\tfailed\n}\n" );
}
//m_aProtocol.log("\tOK\n}\n");
}
//_________________________________
public int available() throws com.sun.star.io.NotConnectedException,
com.sun.star.io.IOException
{
//m_aProtocol.log("available()\n{\n");
m_bInWasUsed = true;
if (m_xInStream == null)
{
//m_aProtocol.log("\tstream not open. throw NotConnectedException\n\tfailed\n}\n");
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) { //m_aProtocol.log("\tgot NotConnectedException\n\tfailed\n}\n"); throw exConnect;
}
catch (com.sun.star.io.IOException exIO ) { //m_aProtocol.log("\tgot IOException\n\tfailed\n}\n" ); throw exIO;
}
catch (com.sun.star.uno.RuntimeException exRuntime) { //m_aProtocol.log("\tgot RuntimeException\n\tfailed\n}\n" ); throw exRuntime;
}
catch (com.sun.star.uno.Exception exUno ) { //m_aProtocol.log("\tgot Exception\n\tfailed\n}\n" );
}
//m_aProtocol.log("\treturns "+nAvailable+" bytes\n\tOK\n}\n");
return nAvailable;
}
//_________________________________
public void closeInput() throws com.sun.star.io.NotConnectedException,
com.sun.star.io.IOException
{
//m_aProtocol.log("closeInput()\n{\n");
m_bInWasUsed = true;
if (m_xInStream == null)
{
//m_aProtocol.log("\tstream not open. throw NotConnectedException\n\tfailed\n}\n");
throw new com.sun.star.io.NotConnectedException("stream not open");
}
try
{
m_xInStream.closeInput();
}
catch (com.sun.star.io.NotConnectedException exConnect) { //m_aProtocol.log("\tgot NotConnectedException\n\tfailed\n}\n"); throw exConnect;
}
catch (com.sun.star.io.IOException exIO ) { //m_aProtocol.log("\tgot IOException\n\tfailed\n}\n" ); throw exIO;
}
catch (com.sun.star.uno.RuntimeException exRuntime) { //m_aProtocol.log("\tgot RuntimeException\n\tfailed\n}\n" ); throw exRuntime;
}
catch (com.sun.star.uno.Exception exUno ) { //m_aProtocol.log("\tgot Exception\n\tfailed\n}\n" );
}
//m_aProtocol.log("\tOK\n}\n");
}
//_________________________________
/**
* 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( /*IN*/byte[] lData ) throws com.sun.star.io.NotConnectedException ,
com.sun.star.io.BufferSizeExceededException ,
com.sun.star.io.IOException
{
//m_aProtocol.log("writeBytes(lData["+lData.length+"])\n{\n");
m_bOutWasUsed = true;
if (m_xOutStream == null)
{
//m_aProtocol.log("\tstream not open. throw NotConnectedException\n\tfailed\n}\n");
throw new com.sun.star.io.NotConnectedException("stream not open");
}
try
{
m_xOutStream.writeBytes(lData);
}
catch (com.sun.star.io.NotConnectedException exConnect) { //m_aProtocol.log("\tgot NotConnectedException\n\tfailed\n}\n" ); throw exConnect;
}
catch (com.sun.star.io.BufferSizeExceededException exBuffer ) { //m_aProtocol.log("\tgot BufferSizeExceededException\n\tfailed\n}\n"); throw exBuffer;
}
catch (com.sun.star.io.IOException exIO ) { //m_aProtocol.log("\tgot IOException\n\tfailed\n}\n" ); throw exIO;
}
catch (com.sun.star.uno.RuntimeException exRuntime) { //m_aProtocol.log("\tgot RuntimeException\n\tfailed\n}\n" ); throw exRuntime;
}
catch (com.sun.star.uno.Exception exUno ) { //m_aProtocol.log("\tgot Exception\n\tfailed\n}\n" );
}
//m_aProtocol.log("\tOK\n}\n");
}
//_________________________________
public void flush() throws com.sun.star.io.NotConnectedException ,
com.sun.star.io.BufferSizeExceededException ,
com.sun.star.io.IOException
{
//m_aProtocol.log("flush()\n{\n");
m_bOutWasUsed = true;
if (m_xOutStream == null)
{
//m_aProtocol.log("\tstream not open. throw NotConnectedException\n\tfailed\n}\n");
throw new com.sun.star.io.NotConnectedException("stream not open");
}
try
{
m_xOutStream.flush();
}
catch (com.sun.star.io.NotConnectedException exConnect) { //m_aProtocol.log("\tgot NotConnectedException\n\tfailed\n}\n" ); throw exConnect;
}
catch (com.sun.star.io.BufferSizeExceededException exBuffer ) { //m_aProtocol.log("\tgot BufferSizeExceededException\n\tfailed\n}\n"); throw exBuffer;
}
catch (com.sun.star.io.IOException exIO ) { //m_aProtocol.log("\tgot IOException\n\tfailed\n}\n" ); throw exIO;
}
catch (com.sun.star.uno.RuntimeException exRuntime) { //m_aProtocol.log("\tgot RuntimeException\n\tfailed\n}\n" ); throw exRuntime;
}
catch (com.sun.star.uno.Exception exUno ) { //m_aProtocol.log("\tgot Exception\n\tfailed\n}\n" );
}
//m_aProtocol.log("\tOK\n}\n");
}
//_________________________________
public void closeOutput() throws com.sun.star.io.NotConnectedException ,
com.sun.star.io.BufferSizeExceededException,
com.sun.star.io.IOException
{
//m_aProtocol.log("closeOutput()\n{\n");
m_bOutWasUsed = true;
if (m_xOutStream == null)
{
//m_aProtocol.log("\tstream not open. throw NotConnectedException\n\tfailed\n}\n");
throw new com.sun.star.io.NotConnectedException("stream not open");
}
try
{
m_xOutStream.closeOutput();
}
catch (com.sun.star.io.NotConnectedException exConnect) { //m_aProtocol.log("\tgot NotConnectedException\n\tfailed\n}\n" ); throw exConnect;
}
catch (com.sun.star.io.BufferSizeExceededException exBuffer ) { //m_aProtocol.log("\tgot BufferSizeExceededException\n\tfailed\n}\n"); throw exBuffer;
}
catch (com.sun.star.io.IOException exIO ) { //m_aProtocol.log("\tgot IOException\n\tfailed\n}\n" ); throw exIO;
}
catch (com.sun.star.uno.RuntimeException exRuntime) { //m_aProtocol.log("\tgot RuntimeException\n\tfailed\n}\n" ); throw exRuntime;
}
catch (com.sun.star.uno.Exception exUno ) { //m_aProtocol.log("\tgot Exception\n\tfailed\n}\n" );
}
//m_aProtocol.log("\tOK\n}\n");
}
//_________________________________
/**
* 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( /*IN*/long nLocation ) throws com.sun.star.lang.IllegalArgumentException,
com.sun.star.io.IOException
{
//m_aProtocol.log("seek("+nLocation+")\n{\n");
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)
{
//m_aProtocol.log("\tstream not seekable. throw IOException\n\tfailed\n}\n");
throw new com.sun.star.io.IOException("stream not seekable");
}
try
{
m_xSeek.seek(nLocation);
}
catch (com.sun.star.lang.IllegalArgumentException exArg ) { //m_aProtocol.log("\tgot IllegalArgumentException\n\tfailed\n}\n" ); throw exArg;
}
catch (com.sun.star.io.IOException exIO ) { //m_aProtocol.log("\tgot IOException\n\tfailed\n}\n" ); throw exIO;
}
catch (com.sun.star.uno.RuntimeException exRuntime) { //m_aProtocol.log("\tgot RuntimeException\n\tfailed\n}\n" ); throw exRuntime;
}
catch (com.sun.star.uno.Exception exUno ) { //m_aProtocol.log("\tgot Exception\n\tfailed\n}\n" );
}
//m_aProtocol.log("\tOK\n}\n");
}
//_________________________________
public long getPosition() throws com.sun.star.io.IOException
{
//m_aProtocol.log("getPosition()\n{\n");
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)
{
//m_aProtocol.log("\tstream not seekable. throw IOException\n\tfailed\n}\n");
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 ) { //m_aProtocol.log("\tgot IOException\n\tfailed\n}\n" ); throw exIO;
}
catch (com.sun.star.uno.RuntimeException exRuntime) { //m_aProtocol.log("\tgot RuntimeException\n\tfailed\n}\n"); throw exRuntime;
}
catch (com.sun.star.uno.Exception exUno ) { //m_aProtocol.log("\tgot Exception\n\tfailed\n}\n" );
}
//m_aProtocol.log("\treturns pos="+nPos+"\n\tOK\n}\n");
return nPos;
}
//_________________________________
public long getLength() throws com.sun.star.io.IOException
{
//m_aProtocol.log("getLength()\n{\n");
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)
{
//m_aProtocol.log("\tstream not seekable. throw IOException\n\tfailed\n}\n");
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 ) { //m_aProtocol.log("\tgot IOException\n\tfailed\n}\n" ); throw exIO;
}
catch (com.sun.star.uno.RuntimeException exRuntime) { //m_aProtocol.log("\tgot RuntimeException\n\tfailed\n}\n"); throw exRuntime;
}
catch (com.sun.star.uno.Exception exUno ) { //m_aProtocol.log("\tgot Exception\n\tfailed\n}\n" );
}
//m_aProtocol.log("\treturns len="+nLen+"\n\tOK\n}\n");
return nLen;
}
}