Tag: cws_src680_hsqldb2 User: oj Date: 05/01/25 00:42:54 Modified: /dba/connectivity/source/drivers/hsqldb/ HStorageAccess.cxx, HStorageMap.cxx, StorageNativeInputStream.cxx, StorageNativeOutputStream.cxx, StorageNativeOutputStream.h
Log: #i39922# correct stream handling File Changes: Directory: /dba/connectivity/source/drivers/hsqldb/ =================================================== File [changed]: HStorageAccess.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/drivers/hsqldb/HStorageAccess.cxx?r1=1.2.20.1&r2=1.2.20.2 Delta lines: +114 -58 ---------------------- --- HStorageAccess.cxx 19 Jan 2005 07:03:27 -0000 1.2.20.1 +++ HStorageAccess.cxx 25 Jan 2005 08:42:51 -0000 1.2.20.2 @@ -75,6 +75,7 @@ #include "hsqldb/HStorageMap.hxx" #include "hsqldb/StorageNativeInputStream.h" + using namespace ::com::sun::star::container; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::embed; @@ -145,11 +146,24 @@ (JNIEnv * env, jobject obj_this,jstring name, jstring key) { ::boost::shared_ptr<StreamHelper> pHelper = StorageContainer::getRegisteredStream(env,name,key); - OSL_ENSURE(pHelper.get(),"No stream helper!"); - if ( pHelper.get() ) + Reference< XInputStream> xIn = pHelper.get() ? pHelper->getInputStream() : Reference< XInputStream>(); + OSL_ENSURE(xIn.is(),"Input stream is NULL!"); + if ( xIn.is() ) + { + sal_Bool bRead = sal_False; + Reference< XSeekable> xSeek = pHelper->getSeek(); + if ( xSeek.is() ) + { + sal_Int64 nStreamLen = xSeek->getLength(); + sal_Int64 nPos = xSeek->getPosition(); + bRead = (nPos + 1) <= nStreamLen; + } + else + bRead = xIn->available() > 0; + if ( bRead ) { Sequence< ::sal_Int8 > aData(1); - sal_Int32 nBytesRead = pHelper->getInputStream()->readBytes(aData,1); + sal_Int32 nBytesRead = xIn->readBytes(aData,1); if (nBytesRead <= 0) { return (-1); } else { @@ -157,9 +171,14 @@ if (tmpInt < 0 ){ tmpInt = 256 +tmpInt; } +#if OSL_DEBUG_LEVEL > 0 + ::rtl::OUString sOrgName = StorageContainer::jstring2ustring(env,name); + fputc(tmpInt,getStreams()[sOrgName]); +#endif return(tmpInt); } } + } return -1; } // ----------------------------------------------------------------------------- @@ -167,9 +186,9 @@ /* * Class: com_sun_star_sdbcx_comp_hsqldb_NativeStorageAccess * Method: read - * Signature: (Ljava/lang/String;Ljava/lang/String;[BII)V + * Signature: (Ljava/lang/String;Ljava/lang/String;[BII)I */ -JNIEXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_NativeStorageAccess_read__Ljava_lang_String_2Ljava_lang_String_2_3BII +JNIEXPORT jint JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_NativeStorageAccess_read__Ljava_lang_String_2Ljava_lang_String_2_3BII (JNIEnv * env, jobject obj_this,jstring name, jstring key, jbyteArray buffer, jint off, jint len) { ::boost::shared_ptr<StreamHelper> pHelper = StorageContainer::getRegisteredStream(env,name,key); @@ -177,34 +196,52 @@ OSL_ENSURE(xIn.is(),"Input stream is NULL!"); if ( xIn.is() ) { - sal_Int32 nBytesRead = 0; - jsize nLen = env->GetArrayLength(buffer); - Sequence< ::sal_Int8 > aData(nLen); - - sal_Int32 av = xIn->available(); - if ( av != 0 && nLen > av) - nBytesRead = xIn->readBytes(aData, av); + if ( nLen < len ) + { + ThrowException( env, + "java/io/IOException", + "Stream is not valid"); + return -1; + } + sal_Int32 nBytesRead = -1; + Reference< XSeekable> xSeek = pHelper->getSeek(); + if ( xSeek.is() ) + { + sal_Int64 nStreamLen = xSeek->getLength(); + sal_Int64 nPos = xSeek->getPosition(); + nBytesRead = ((nPos + len) <= nStreamLen) ? len : (nStreamLen - nPos); + } else - nBytesRead = xIn->readBytes(aData,nLen); + { + sal_Int32 av = xIn->available(); + nBytesRead = len <= av ? len : av; + } - // Casting bytesRead to an int is okay, since the user can - // only pass in an integer length to read, so the bytesRead - // must <= len. - // - if (nBytesRead <= 0) { - return ; - } else if (nBytesRead < len) { + if ( nBytesRead > 0 ) + { + Sequence< ::sal_Int8 > aData(nBytesRead); + nBytesRead = xIn->readBytes(aData, nBytesRead); + + if (nBytesRead <= 0) + return -1; + OSL_ENSURE(nLen >= (off + nBytesRead),"Buffer is too small!"); + OSL_ENSURE(aData.getLength() >= nBytesRead,"Buffer is too small!"); env->SetByteArrayRegion(buffer,off,nBytesRead,&aData[0]); - } else { - env->SetByteArrayRegion(buffer,off,len,&aData[0]); + +#if OSL_DEBUG_LEVEL > 0 + ::rtl::OUString sOrgName = StorageContainer::jstring2ustring(env,name); + fwrite(&aData[0],sizeof(sal_Int8),nBytesRead,getStreams()[sOrgName]); +#endif } - return ; + else + return -1; + return nBytesRead; } ThrowException( env, "java/io/IOException", "Stream is not valid"); - return; + return -1; } // ----------------------------------------------------------------------------- @@ -221,6 +258,18 @@ OSL_ENSURE(xIn.is(),"Input stream is NULL!"); if ( xIn.is() ) { + sal_Bool bRead = sal_False; + Reference< XSeekable> xSeek = pHelper->getSeek(); + if ( xSeek.is() ) + { + sal_Int64 nStreamLen = xSeek->getLength(); + sal_Int64 nPos = xSeek->getPosition(); + bRead = (nPos + 4) <= nStreamLen; + } + else + bRead = xIn->available() >= 4; + if ( bRead ) + { Sequence< ::sal_Int8 > aData(4); sal_Int32 nBytesRead = xIn->readBytes(aData, 4); @@ -247,8 +296,14 @@ return -1; } jint nRet = ((ch[0] << 24) + (ch[1] << 16) + (ch[2] << 8) + (ch[3] << 0)); +#if OSL_DEBUG_LEVEL > 0 + ::rtl::OUString sOrgName = StorageContainer::jstring2ustring(env,name); + fputc(nRet,getStreams()[sOrgName]); +#endif return nRet; } + return -1; + } ThrowException( env, "java/io/IOException", "No InputStream"); @@ -299,6 +354,7 @@ } xSeek->seek(position); + OSL_ENSURE(xSeek->getPosition() == position,"Wrong position after seeking the stream"); } } // ----------------------------------------------------------------------------- File [changed]: HStorageMap.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/drivers/hsqldb/HStorageMap.cxx?r1=1.2.20.1&r2=1.2.20.2 Delta lines: +21 -1 -------------------- --- HStorageMap.cxx 19 Jan 2005 07:03:28 -0000 1.2.20.1 +++ HStorageMap.cxx 25 Jan 2005 08:42:51 -0000 1.2.20.2 @@ -284,6 +284,13 @@ // ----------------------------------------------------------------------------- TStreamMap::mapped_type StorageContainer::registerStream(JNIEnv * env,jstring name, jstring key,sal_Int32 _nMode) { +#if OSL_DEBUG_LEVEL > 0 + { + ::rtl::OUString sOrgName = StorageContainer::jstring2ustring(env,name); + ::rtl::OString sName = ::rtl::OUStringToOString(sOrgName,RTL_TEXTENCODING_ASCII_US); + getStreams()[sOrgName] = fopen( sName.getStr(), "a+" ); + } +#endif TStreamMap::mapped_type pHelper; TStorages& rMap = lcl_getStorageMap(); ::rtl::OUString sKey = jstring2ustring(env,key); @@ -337,6 +344,13 @@ // ----------------------------------------------------------------------------- void StorageContainer::revokeStream( JNIEnv * env,jstring name, jstring key) { +#if OSL_DEBUG_LEVEL > 0 + { + ::rtl::OUString sOrgName = StorageContainer::jstring2ustring(env,name); + fclose( getStreams()[sOrgName] ); + getStreams().erase(sOrgName); + } +#endif TStorages& rMap = lcl_getStorageMap(); TStorages::iterator aFind = rMap.find(jstring2ustring(env,key)); OSL_ENSURE(aFind != rMap.end(),"Storage could not be found in list!"); @@ -367,4 +381,10 @@ } // namespace connectivity //........................................................................ - +#if OSL_DEBUG_LEVEL > 0 +TStreamMap& getStreams() +{ + static TStreamMap streams; + return streams; +} +#endif File [changed]: StorageNativeInputStream.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/drivers/hsqldb/StorageNativeInputStream.cxx?r1=1.2&r2=1.2.20.1 Delta lines: +18 -41 --------------------- --- StorageNativeInputStream.cxx 9 Nov 2004 12:09:23 -0000 1.2 +++ StorageNativeInputStream.cxx 25 Jan 2005 08:42:51 -0000 1.2.20.1 @@ -141,39 +141,7 @@ JNIEXPORT jint JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeInputStream_read__Ljava_lang_String_2Ljava_lang_String_2_3BII (JNIEnv * env, jobject obj_this,jstring key, jstring name, jbyteArray buffer, jint off, jint len) { - ::boost::shared_ptr<StreamHelper> pHelper = StorageContainer::getRegisteredStream(env,name,key); - Reference< XInputStream> xIn = pHelper.get() ? pHelper->getInputStream() : Reference< XInputStream>(); - OSL_ENSURE(xIn.is(),"Input stream is NULL!"); - if ( xIn.is() ) - { - sal_Int32 nBytesRead = 0; - - jsize nLen = env->GetArrayLength(buffer); - Sequence< ::sal_Int8 > aData(nLen); - - sal_Int32 av = xIn->available(); - if ( av != 0 && nLen > av) - nBytesRead = xIn->readBytes(aData, av); - else - nBytesRead = xIn->readBytes(aData,nLen); - - // Casting bytesRead to an int is okay, since the user can - // only pass in an integer length to read, so the bytesRead - // must <= len. - // - if (nBytesRead <= 0) { - return -1; - } else if (nBytesRead < len) { - env->SetByteArrayRegion(buffer,off,nBytesRead,&aData[0]); - } else { - env->SetByteArrayRegion(buffer,off,len,&aData[0]); - } - return nBytesRead; - } - ThrowException( env, - "java/io/IOException", - "Stream is not valid"); - return -1; + return Java_com_sun_star_sdbcx_comp_hsqldb_NativeStorageAccess_read__Ljava_lang_String_2Ljava_lang_String_2_3BII(env,obj_this,name,key,buffer,off,len); } // ----------------------------------------------------------------------------- @@ -306,10 +274,13 @@ Sequence< ::sal_Int8 > aData(nLen); sal_Int32 av = xIn->available(); - if ( av != 0 && nLen > av) + if ( av > 0 ) + { + if (nLen > av) nBytesRead = xIn->readBytes(aData, av); else nBytesRead = xIn->readBytes(aData,nLen); + } // Casting bytesRead to an int is okay, since the user can // only pass in an integer length to read, so the bytesRead @@ -318,7 +289,13 @@ if (nBytesRead <= 0) { return -1; } - env->SetByteArrayRegion(buffer,0,nLen,&aData[0]); + OSL_ENSURE(nLen >= nBytesRead,"Buffer is too small!"); + OSL_ENSURE(aData.getLength() >= nBytesRead,"Buffer is too small!"); + env->SetByteArrayRegion(buffer,0,nBytesRead,&aData[0]); +#if OSL_DEBUG_LEVEL > 0 + ::rtl::OUString sOrgName = StorageContainer::jstring2ustring(env,name); + fwrite(&aData[0],sizeof(sal_Int8),nBytesRead,getStreams()[sOrgName]); +#endif } return nBytesRead; } File [changed]: StorageNativeOutputStream.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/drivers/hsqldb/StorageNativeOutputStream.cxx?r1=1.2&r2=1.2.20.1 Delta lines: +36 -3 -------------------- --- StorageNativeOutputStream.cxx 9 Nov 2004 12:09:35 -0000 1.2 +++ StorageNativeOutputStream.cxx 25 Jan 2005 08:42:52 -0000 1.2.20.1 @@ -69,6 +69,9 @@ #include "cppuhelper/compbase1.hxx" #include "cppuhelper/component_context.hxx" +#ifndef _COM_SUN_STAR_EMBED_XTRANSACTEDOBJECT_HPP_ +#include <com/sun/star/embed/XTransactedObject.hpp> +#endif #ifndef _COMPHELPER_PROCESSFACTORY_HXX_ #include <comphelper/processfactory.hxx> #endif @@ -278,5 +281,35 @@ JNIEXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_flush (JNIEnv * env, jobject obj_this,jobject storage, jstring key, jstring name) { +} +// ----------------------------------------------------------------------------- +/* + * Class: com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream + * Method: sync + * Signature: (Lcom/sun/star/embed/XStorage;Ljava/lang/String;Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_sync + (JNIEnv * env, jobject obj_this,jobject storage, jstring key, jstring name) +{ + TStorages::mapped_type aStoragePair = StorageContainer::getRegisteredStorage(StorageContainer::jstring2ustring(env,key)); + Reference<XTransactedObject> xTrans(aStoragePair.first.first,UNO_QUERY); + if ( xTrans.is() ) + { + try + { + xTrans->commit(); + } + catch(Exception& e) + { + OSL_ENSURE(0,"Exception catched! : writeBytes(aData);"); + if (JNI_FALSE != env->ExceptionCheck()) + env->ExceptionClear(); + ::rtl::OString cstr( ::rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_JAVA_UTF8 ) ); + OSL_TRACE( __FILE__": forwarding Exception: %s", cstr.getStr() ); + ThrowException( env, + "java/io/IOException", + cstr.getStr()); + } + } } // ----------------------------------------------------------------------------- File [changed]: StorageNativeOutputStream.h Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/drivers/hsqldb/StorageNativeOutputStream.h?r1=1.2&r2=1.2.20.1 Delta lines: +8 -0 ------------------- --- StorageNativeOutputStream.h 9 Nov 2004 12:09:47 -0000 1.2 +++ StorageNativeOutputStream.h 25 Jan 2005 08:42:52 -0000 1.2.20.1 @@ -55,6 +55,14 @@ JNIEXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_flush (JNIEnv *, jobject, jobject, jstring, jstring); +/* + * Class: com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream + * Method: sync + * Signature: (Lcom/sun/star/embed/XStorage;Ljava/lang/String;Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_sync + (JNIEnv *, jobject, jobject, jstring, jstring); + #ifdef __cplusplus } #endif --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
