1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_connectivity.hxx"
26*b1cdbd2cSJim Jagielski #if defined(HAVE_CONFIG_H) && HAVE_CONFIG_H
27*b1cdbd2cSJim Jagielski #include <config.h>
28*b1cdbd2cSJim Jagielski #endif
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include "uno/mapping.hxx"
31*b1cdbd2cSJim Jagielski #include "uno/environment.hxx"
32*b1cdbd2cSJim Jagielski #include "cppuhelper/bootstrap.hxx"
33*b1cdbd2cSJim Jagielski #include "cppuhelper/compbase1.hxx"
34*b1cdbd2cSJim Jagielski #include "cppuhelper/component_context.hxx"
35*b1cdbd2cSJim Jagielski #include "accesslog.hxx"
36*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XTransactedObject.hpp>
37*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XStream.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XDocumentSubStorageSupplier.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XStorage.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/ElementModes.hpp>
43*b1cdbd2cSJim Jagielski #include <comphelper/stl_types.hxx>
44*b1cdbd2cSJim Jagielski #include <comphelper/types.hxx>
45*b1cdbd2cSJim Jagielski #include "hsqldb/HStorageAccess.hxx"
46*b1cdbd2cSJim Jagielski #include "hsqldb/HStorageMap.hxx"
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski #include "jvmaccess/virtualmachine.hxx"
49*b1cdbd2cSJim Jagielski #include "com/sun/star/lang/XSingleComponentFactory.hpp"
50*b1cdbd2cSJim Jagielski #include "diagnose_ex.h"
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
53*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
54*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::document;
55*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::embed;
56*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::io;
57*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
58*b1cdbd2cSJim Jagielski using namespace ::connectivity::hsqldb;
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski #define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
61*b1cdbd2cSJim Jagielski /*****************************************************************************/
62*b1cdbd2cSJim Jagielski /* exception macros */
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski #define ThrowException(env, type, msg) { \
65*b1cdbd2cSJim Jagielski 	env->ThrowNew(env->FindClass(type), msg); }
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
68*b1cdbd2cSJim Jagielski /*
69*b1cdbd2cSJim Jagielski  * Class:     com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream
70*b1cdbd2cSJim Jagielski  * Method:    openStream
71*b1cdbd2cSJim Jagielski  * Signature: (Ljava/lang/String;Ljava/lang/String;I)V
72*b1cdbd2cSJim Jagielski  */
Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_openStream(JNIEnv * env,jobject,jstring name,jstring key,jint mode)73*b1cdbd2cSJim Jagielski extern "C" SAL_DLLPUBLIC_EXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_openStream
74*b1cdbd2cSJim Jagielski   (JNIEnv * env, jobject /*obj_this*/, jstring name, jstring key, jint mode)
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski #ifdef HSQLDB_DBG
77*b1cdbd2cSJim Jagielski     {
78*b1cdbd2cSJim Jagielski         OperationLogFile( env, name, "output" ).logOperation( "openStream" );
79*b1cdbd2cSJim Jagielski         LogFile( env, name, "output" ).create();
80*b1cdbd2cSJim Jagielski     }
81*b1cdbd2cSJim Jagielski #endif
82*b1cdbd2cSJim Jagielski 	StorageContainer::registerStream(env,name,key,mode);
83*b1cdbd2cSJim Jagielski }
84*b1cdbd2cSJim Jagielski /*
85*b1cdbd2cSJim Jagielski  * Class:     com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream
86*b1cdbd2cSJim Jagielski  * Method:    write
87*b1cdbd2cSJim Jagielski  * Signature: (Ljava/lang/String;Ljava/lang/String;[BII)V
88*b1cdbd2cSJim Jagielski  */
Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_write__Ljava_lang_String_2Ljava_lang_String_2_3BII(JNIEnv * env,jobject obj_this,jstring key,jstring name,jbyteArray buffer,jint off,jint len)89*b1cdbd2cSJim Jagielski extern "C" SAL_DLLPUBLIC_EXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_write__Ljava_lang_String_2Ljava_lang_String_2_3BII
90*b1cdbd2cSJim Jagielski   (JNIEnv * env, jobject obj_this, jstring key, jstring name, jbyteArray buffer, jint off, jint len)
91*b1cdbd2cSJim Jagielski {
92*b1cdbd2cSJim Jagielski #ifdef HSQLDB_DBG
93*b1cdbd2cSJim Jagielski     OperationLogFile( env, name, "output" ).logOperation( "write( byte[], int, int )" );
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski     DataLogFile aDataLog( env, name, "output" );
96*b1cdbd2cSJim Jagielski     write_to_storage_stream_from_buffer( env, obj_this, name, key, buffer, off, len, &aDataLog );
97*b1cdbd2cSJim Jagielski #else
98*b1cdbd2cSJim Jagielski     write_to_storage_stream_from_buffer( env, obj_this, name, key, buffer, off, len );
99*b1cdbd2cSJim Jagielski #endif
100*b1cdbd2cSJim Jagielski }
101*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
102*b1cdbd2cSJim Jagielski /*
103*b1cdbd2cSJim Jagielski  * Class:     com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream
104*b1cdbd2cSJim Jagielski  * Method:    write
105*b1cdbd2cSJim Jagielski  * Signature: (Ljava/lang/String;Ljava/lang/String;[B)V
106*b1cdbd2cSJim Jagielski  */
Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_write__Ljava_lang_String_2Ljava_lang_String_2_3B(JNIEnv * env,jobject obj_this,jstring key,jstring name,jbyteArray buffer)107*b1cdbd2cSJim Jagielski extern "C" SAL_DLLPUBLIC_EXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_write__Ljava_lang_String_2Ljava_lang_String_2_3B
108*b1cdbd2cSJim Jagielski   (JNIEnv * env, jobject obj_this, jstring key, jstring name, jbyteArray buffer)
109*b1cdbd2cSJim Jagielski {
110*b1cdbd2cSJim Jagielski #ifdef HSQLDB_DBG
111*b1cdbd2cSJim Jagielski     OperationLogFile( env, name, "output" ).logOperation( "write( byte[] )" );
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski     DataLogFile aDataLog( env, name, "output" );
114*b1cdbd2cSJim Jagielski     write_to_storage_stream_from_buffer( env, obj_this, name, key, buffer, 0, env->GetArrayLength( buffer ), &aDataLog );
115*b1cdbd2cSJim Jagielski #else
116*b1cdbd2cSJim Jagielski     write_to_storage_stream_from_buffer( env, obj_this, name, key, buffer, 0, env->GetArrayLength( buffer ) );
117*b1cdbd2cSJim Jagielski #endif
118*b1cdbd2cSJim Jagielski }
119*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
120*b1cdbd2cSJim Jagielski /*
121*b1cdbd2cSJim Jagielski  * Class:     com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream
122*b1cdbd2cSJim Jagielski  * Method:    close
123*b1cdbd2cSJim Jagielski  * Signature: (Ljava/lang/String;Ljava/lang/String;)V
124*b1cdbd2cSJim Jagielski  */
Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_close(JNIEnv * env,jobject,jstring key,jstring name)125*b1cdbd2cSJim Jagielski extern "C" SAL_DLLPUBLIC_EXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_close
126*b1cdbd2cSJim Jagielski   (JNIEnv * env, jobject /*obj_this*/, jstring key, jstring name)
127*b1cdbd2cSJim Jagielski {
128*b1cdbd2cSJim Jagielski #ifdef HSQLDB_DBG
129*b1cdbd2cSJim Jagielski     OperationLogFile aOpLog( env, name, "output" );
130*b1cdbd2cSJim Jagielski     aOpLog.logOperation( "close" );
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski     LogFile aDataLog( env, name, "output" );
133*b1cdbd2cSJim Jagielski #endif
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski     ::boost::shared_ptr<StreamHelper> pHelper = StorageContainer::getRegisteredStream(env,name,key);
136*b1cdbd2cSJim Jagielski     Reference< XOutputStream> xFlush = pHelper.get() ? pHelper->getOutputStream() : Reference< XOutputStream>();
137*b1cdbd2cSJim Jagielski     if ( xFlush.is() )
138*b1cdbd2cSJim Jagielski         try
139*b1cdbd2cSJim Jagielski         {
140*b1cdbd2cSJim Jagielski             xFlush->flush();
141*b1cdbd2cSJim Jagielski         }
142*b1cdbd2cSJim Jagielski         catch(Exception&)
143*b1cdbd2cSJim Jagielski         {}
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski #ifdef HSQLDB_DBG
146*b1cdbd2cSJim Jagielski     aDataLog.close();
147*b1cdbd2cSJim Jagielski     aOpLog.close();
148*b1cdbd2cSJim Jagielski #endif
149*b1cdbd2cSJim Jagielski 	StorageContainer::revokeStream(env,name,key);
150*b1cdbd2cSJim Jagielski }
151*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
152*b1cdbd2cSJim Jagielski /*
153*b1cdbd2cSJim Jagielski  * Class:     com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream
154*b1cdbd2cSJim Jagielski  * Method:    write
155*b1cdbd2cSJim Jagielski  * Signature: (Ljava/lang/String;Ljava/lang/String;I)V
156*b1cdbd2cSJim Jagielski  */
Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_write__Ljava_lang_String_2Ljava_lang_String_2I(JNIEnv * env,jobject obj_this,jstring key,jstring name,jint b)157*b1cdbd2cSJim Jagielski extern "C" SAL_DLLPUBLIC_EXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_write__Ljava_lang_String_2Ljava_lang_String_2I
158*b1cdbd2cSJim Jagielski   (JNIEnv * env, jobject obj_this, jstring key, jstring name,jint b)
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski #ifdef HSQLDB_DBG
161*b1cdbd2cSJim Jagielski     OperationLogFile( env, name, "output" ).logOperation( "write( int )" );
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski     DataLogFile aDataLog( env, name, "output" );
164*b1cdbd2cSJim Jagielski     write_to_storage_stream( env, obj_this, name, key, b, &aDataLog );
165*b1cdbd2cSJim Jagielski #else
166*b1cdbd2cSJim Jagielski     write_to_storage_stream( env, obj_this, name, key, b );
167*b1cdbd2cSJim Jagielski #endif
168*b1cdbd2cSJim Jagielski }
169*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
170*b1cdbd2cSJim Jagielski /*
171*b1cdbd2cSJim Jagielski  * Class:     com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream
172*b1cdbd2cSJim Jagielski  * Method:    flush
173*b1cdbd2cSJim Jagielski  * Signature: (Ljava/lang/String;Ljava/lang/String;)V
174*b1cdbd2cSJim Jagielski  */
Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_flush(JNIEnv * env,jobject,jstring key,jstring name)175*b1cdbd2cSJim Jagielski extern "C" SAL_DLLPUBLIC_EXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_flush
176*b1cdbd2cSJim Jagielski   (JNIEnv * env, jobject /*obj_this*/, jstring key, jstring name)
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski     OSL_UNUSED( env );
179*b1cdbd2cSJim Jagielski     OSL_UNUSED( key );
180*b1cdbd2cSJim Jagielski     OSL_UNUSED( name );
181*b1cdbd2cSJim Jagielski #ifdef HSQLDB_DBG
182*b1cdbd2cSJim Jagielski     OperationLogFile( env, name, "output" ).logOperation( "flush" );
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski     ::rtl::OUString sKey = StorageContainer::jstring2ustring(env,key);
185*b1cdbd2cSJim Jagielski     ::rtl::OUString sName = StorageContainer::jstring2ustring(env,name);
186*b1cdbd2cSJim Jagielski #endif
187*b1cdbd2cSJim Jagielski }
188*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
189*b1cdbd2cSJim Jagielski /*
190*b1cdbd2cSJim Jagielski  * Class:     com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream
191*b1cdbd2cSJim Jagielski  * Method:    sync
192*b1cdbd2cSJim Jagielski  * Signature: (Ljava/lang/String;Ljava/lang/String;)V
193*b1cdbd2cSJim Jagielski  */
Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_sync(JNIEnv * env,jobject,jstring key,jstring name)194*b1cdbd2cSJim Jagielski extern "C" SAL_DLLPUBLIC_EXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_StorageNativeOutputStream_sync
195*b1cdbd2cSJim Jagielski   (JNIEnv * env, jobject /*obj_this*/, jstring key, jstring name)
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski #ifdef HSQLDB_DBG
198*b1cdbd2cSJim Jagielski     OperationLogFile( env, name, "output" ).logOperation( "sync" );
199*b1cdbd2cSJim Jagielski #endif
200*b1cdbd2cSJim Jagielski     ::boost::shared_ptr< StreamHelper > pStream = StorageContainer::getRegisteredStream( env, name, key );
201*b1cdbd2cSJim Jagielski     Reference< XOutputStream > xFlush = pStream.get() ? pStream->getOutputStream() : Reference< XOutputStream>();
202*b1cdbd2cSJim Jagielski     OSL_ENSURE( xFlush.is(), "StorageNativeOutputStream::sync: could not retrieve an output stream!" );
203*b1cdbd2cSJim Jagielski     if ( xFlush.is() )
204*b1cdbd2cSJim Jagielski     {
205*b1cdbd2cSJim Jagielski         try
206*b1cdbd2cSJim Jagielski         {
207*b1cdbd2cSJim Jagielski             xFlush->flush();
208*b1cdbd2cSJim Jagielski         }
209*b1cdbd2cSJim Jagielski         catch(Exception&)
210*b1cdbd2cSJim Jagielski         {
211*b1cdbd2cSJim Jagielski             OSL_ENSURE( false, "StorageNativeOutputStream::sync: could not flush output stream!" );
212*b1cdbd2cSJim Jagielski         }
213*b1cdbd2cSJim Jagielski     }
214*b1cdbd2cSJim Jagielski }
215*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
216