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]

Reply via email to