19b5730f6SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 39b5730f6SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 49b5730f6SAndrew Rist * or more contributor license agreements. See the NOTICE file 59b5730f6SAndrew Rist * distributed with this work for additional information 69b5730f6SAndrew Rist * regarding copyright ownership. The ASF licenses this file 79b5730f6SAndrew Rist * to you under the Apache License, Version 2.0 (the 89b5730f6SAndrew Rist * "License"); you may not use this file except in compliance 99b5730f6SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 119b5730f6SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 139b5730f6SAndrew Rist * Unless required by applicable law or agreed to in writing, 149b5730f6SAndrew Rist * software distributed under the License is distributed on an 159b5730f6SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 169b5730f6SAndrew Rist * KIND, either express or implied. See the License for the 179b5730f6SAndrew Rist * specific language governing permissions and limitations 189b5730f6SAndrew Rist * under the License. 19cdf0e10cSrcweir * 209b5730f6SAndrew Rist *************************************************************/ 219b5730f6SAndrew Rist 229b5730f6SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_connectivity.hxx" 26cdf0e10cSrcweir #include "java/sql/Blob.hxx" 27cdf0e10cSrcweir #include "java/tools.hxx" 28cdf0e10cSrcweir #include "java/io/InputStream.hxx" 29cdf0e10cSrcweir #ifndef _INC_MEMORY 30cdf0e10cSrcweir //#include <memory.h> 31cdf0e10cSrcweir #endif 32cdf0e10cSrcweir #include <connectivity/dbexception.hxx> 33cdf0e10cSrcweir 34cdf0e10cSrcweir #include <string.h> 35cdf0e10cSrcweir 36cdf0e10cSrcweir using namespace connectivity; 37cdf0e10cSrcweir //************************************************************** 38cdf0e10cSrcweir //************ Class: java.sql.Blob 39cdf0e10cSrcweir //************************************************************** 40cdf0e10cSrcweir 41cdf0e10cSrcweir jclass java_sql_Blob::theClass = 0; 42cdf0e10cSrcweir java_sql_Blob::java_sql_Blob( JNIEnv * pEnv, jobject myObj ) 43cdf0e10cSrcweir : java_lang_Object( pEnv, myObj ) 44cdf0e10cSrcweir { 45cdf0e10cSrcweir SDBThreadAttach::addRef(); 46cdf0e10cSrcweir } 47cdf0e10cSrcweir java_sql_Blob::~java_sql_Blob() 48cdf0e10cSrcweir { 49cdf0e10cSrcweir SDBThreadAttach::releaseRef(); 50cdf0e10cSrcweir } 51cdf0e10cSrcweir 52cdf0e10cSrcweir jclass java_sql_Blob::getMyClass() const 53cdf0e10cSrcweir { 54cdf0e10cSrcweir // die Klasse muss nur einmal geholt werden, daher statisch 55cdf0e10cSrcweir if( !theClass ) 56cdf0e10cSrcweir theClass = findMyClass("java/sql/Blob"); 57cdf0e10cSrcweir return theClass; 58cdf0e10cSrcweir } 59cdf0e10cSrcweir 60cdf0e10cSrcweir sal_Int64 SAL_CALL java_sql_Blob::length( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) 61cdf0e10cSrcweir { 62cdf0e10cSrcweir jlong out(0); 63*a3cdc23eSJohn Bampton SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Environment been deleted!"); 64cdf0e10cSrcweir 65cdf0e10cSrcweir { 66cdf0e10cSrcweir // temporaere Variable initialisieren 67cdf0e10cSrcweir static const char * cSignature = "()J"; 68cdf0e10cSrcweir static const char * cMethodName = "length"; 69cdf0e10cSrcweir // Java-Call absetzen 70cdf0e10cSrcweir static jmethodID mID(NULL); 71cdf0e10cSrcweir obtainMethodId(t.pEnv, cMethodName,cSignature, mID); 72cdf0e10cSrcweir out = t.pEnv->CallLongMethod( object, mID ); 73cdf0e10cSrcweir ThrowSQLException(t.pEnv,*this); 74cdf0e10cSrcweir } //t.pEnv 75cdf0e10cSrcweir return (sal_Int64)out; 76cdf0e10cSrcweir } 77cdf0e10cSrcweir ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL java_sql_Blob::getBytes( sal_Int64 pos, sal_Int32 count ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) 78cdf0e10cSrcweir { 79cdf0e10cSrcweir 80*a3cdc23eSJohn Bampton SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Environment been deleted!"); 81cdf0e10cSrcweir ::com::sun::star::uno::Sequence< sal_Int8 > aSeq; 82cdf0e10cSrcweir { 83cdf0e10cSrcweir // temporaere Variable initialisieren 84cdf0e10cSrcweir static const char * cSignature = "(JI)[B"; 85cdf0e10cSrcweir static const char * cMethodName = "getBytes"; 86cdf0e10cSrcweir // Java-Call absetzen 87cdf0e10cSrcweir static jmethodID mID(NULL); 88cdf0e10cSrcweir obtainMethodId(t.pEnv, cMethodName,cSignature, mID); 89cdf0e10cSrcweir jbyteArray out = (jbyteArray)t.pEnv->CallObjectMethod( object, mID,pos,count); 90cdf0e10cSrcweir ThrowSQLException(t.pEnv,*this); 91cdf0e10cSrcweir if(out) 92cdf0e10cSrcweir { 93cdf0e10cSrcweir jboolean p = sal_False; 94cdf0e10cSrcweir aSeq.realloc(t.pEnv->GetArrayLength(out)); 95cdf0e10cSrcweir memcpy(aSeq.getArray(),t.pEnv->GetByteArrayElements(out,&p),aSeq.getLength()); 96cdf0e10cSrcweir t.pEnv->DeleteLocalRef(out); 97cdf0e10cSrcweir } 98cdf0e10cSrcweir } //t.pEnv 99cdf0e10cSrcweir // ACHTUNG: der Aufrufer wird Eigentuemer des zurueckgelieferten Zeigers !!! 100cdf0e10cSrcweir return aSeq; 101cdf0e10cSrcweir } 102cdf0e10cSrcweir 103cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL java_sql_Blob::getBinaryStream( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) 104cdf0e10cSrcweir { 105*a3cdc23eSJohn Bampton SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Environment been deleted!"); 106cdf0e10cSrcweir static jmethodID mID(NULL); 107cdf0e10cSrcweir jobject out = callObjectMethod(t.pEnv,"getBinaryStream","()Ljava/io/InputStream;", mID); 108cdf0e10cSrcweir // ACHTUNG: der Aufrufer wird Eigentuemer des zurueckgelieferten Zeigers !!! 109cdf0e10cSrcweir return out==0 ? 0 : new java_io_InputStream( t.pEnv, out ); 110cdf0e10cSrcweir } 111cdf0e10cSrcweir 112cdf0e10cSrcweir sal_Int64 SAL_CALL java_sql_Blob::position( const ::com::sun::star::uno::Sequence< sal_Int8 >& pattern, sal_Int64 start ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) 113cdf0e10cSrcweir { 114cdf0e10cSrcweir jlong out(0); 115*a3cdc23eSJohn Bampton SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Environment been deleted!"); 116cdf0e10cSrcweir 117cdf0e10cSrcweir { 118cdf0e10cSrcweir // temporaere Variable initialisieren 119cdf0e10cSrcweir static const char * cSignature = "([BI)J"; 120cdf0e10cSrcweir static const char * cMethodName = "position"; 121cdf0e10cSrcweir // Java-Call absetzen 122cdf0e10cSrcweir static jmethodID mID(NULL); 123cdf0e10cSrcweir obtainMethodId(t.pEnv, cMethodName,cSignature, mID); 124cdf0e10cSrcweir // Parameter konvertieren 125cdf0e10cSrcweir jbyteArray pByteArray = t.pEnv->NewByteArray(pattern.getLength()); 126cdf0e10cSrcweir t.pEnv->SetByteArrayRegion(pByteArray,0,pattern.getLength(),(jbyte*)pattern.getConstArray()); 127cdf0e10cSrcweir out = t.pEnv->CallLongMethod( object, mID, pByteArray,start ); 128cdf0e10cSrcweir t.pEnv->DeleteLocalRef(pByteArray); 129cdf0e10cSrcweir ThrowSQLException(t.pEnv,*this); 130cdf0e10cSrcweir } //t.pEnv 131cdf0e10cSrcweir return (sal_Int64)out; 132cdf0e10cSrcweir } 133cdf0e10cSrcweir 134cdf0e10cSrcweir sal_Int64 SAL_CALL java_sql_Blob::positionOfBlob( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XBlob >& /*pattern*/, sal_Int64 /*start*/ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) 135cdf0e10cSrcweir { 136cdf0e10cSrcweir ::dbtools::throwFeatureNotImplementedException( "XBlob::positionOfBlob", *this ); 137cdf0e10cSrcweir // this was put here in CWS warnings01. The previous implementation was defective, as it did ignore 138cdf0e10cSrcweir // the pattern parameter. Since the effort for proper implementation is rather high - we would need 139cdf0e10cSrcweir // to translated patter into a byte[] -, we defer this functionality for the moment (hey, it was 140cdf0e10cSrcweir // unusable, anyway) 141cdf0e10cSrcweir // 2005-11-15 / #i57457# / frank.schoenheit@sun.com 142cdf0e10cSrcweir return 0; 143cdf0e10cSrcweir } 144