nss: upgrade to release 3.73
[LibreOffice.git] / connectivity / source / commontools / CommonTools.cxx
blob5c84bf6e6f1869f2d026d0ebda6c8e1e30a464f2
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <config_java.h>
22 #include <connectivity/CommonTools.hxx>
23 #include <connectivity/dbtools.hxx>
24 #include <com/sun/star/beans/XPropertySet.hpp>
25 #include <com/sun/star/java/JavaVirtualMachine.hpp>
26 #if HAVE_FEATURE_JAVA
27 #include <jvmaccess/virtualmachine.hxx>
28 #endif
29 #include <osl/diagnose.h>
30 #include <rtl/character.hxx>
31 #include <rtl/process.h>
32 #include <tools/diagnose_ex.h>
34 using namespace ::comphelper;
35 static sal_Unicode rtl_ascii_toUpperCase( sal_Unicode ch )
37 return ch >= 0x0061 && ch <= 0x007a ? ch + 0x20 : ch;
40 namespace connectivity
42 using namespace ::com::sun::star::uno;
43 using namespace ::com::sun::star::lang;
44 using namespace ::com::sun::star::beans;
45 using namespace ::com::sun::star::java;
46 using namespace dbtools;
48 const sal_Unicode CHAR_PLACE = '_';
49 const sal_Unicode CHAR_WILD = '%';
51 bool match(const sal_Unicode* pWild, const sal_Unicode* pStr, const sal_Unicode cEscape)
53 int pos=0;
54 int flag=0;
56 while ( *pWild || flag )
58 switch (*pWild)
60 case CHAR_PLACE:
61 if ( *pStr == 0 )
62 return false;
63 break;
64 default:
65 if (*pWild && (*pWild == cEscape) && ((*(pWild+1)== CHAR_PLACE) || (*(pWild+1) == CHAR_WILD)) )
66 pWild++;
67 if ( rtl_ascii_toUpperCase(*pWild) != rtl_ascii_toUpperCase(*pStr) )
68 if ( !pos )
69 return false;
70 else
71 pWild += pos;
72 else
73 break;
74 // WARNING/TODO: in certain circumstances it will run into
75 // the next 'case'!
76 [[fallthrough]];
77 case CHAR_WILD:
78 while ( *pWild == CHAR_WILD )
79 pWild++;
80 if ( *pWild == 0 )
81 return true;
82 flag = 1;
83 pos = 0;
84 if ( *pStr == 0 )
85 return ( *pWild == 0 );
86 while ( *pStr && *pStr != *pWild )
88 if ( *pWild == CHAR_PLACE ) {
89 pWild++;
90 while ( *pWild == CHAR_WILD )
91 pWild++;
93 pStr++;
94 if ( *pStr == 0 )
95 return ( *pWild == 0 );
97 break;
99 if ( *pWild != 0 )
100 pWild++;
101 if ( *pStr != 0 )
102 pStr++;
103 else
104 flag = 0;
105 if ( flag )
106 pos--;
108 return ( *pStr == 0 ) && ( *pWild == 0 );
111 #if HAVE_FEATURE_JAVA
112 ::rtl::Reference< jvmaccess::VirtualMachine > getJavaVM(const Reference<XComponentContext >& _rxContext)
114 ::rtl::Reference< jvmaccess::VirtualMachine > aRet;
115 OSL_ENSURE(_rxContext.is(),"No XMultiServiceFactory a.v.!");
116 if(!_rxContext.is())
117 return aRet;
121 Reference< XJavaVM > xVM = JavaVirtualMachine::create(_rxContext);
123 Sequence<sal_Int8> processID(16);
124 rtl_getGlobalProcessId( reinterpret_cast<sal_uInt8*>(processID.getArray()) );
125 processID.realloc(17);
126 processID[16] = 0;
128 Any uaJVM = xVM->getJavaVM( processID );
129 sal_Int64 nTemp;
130 if (!(uaJVM >>= nTemp)) {
131 throw Exception("cannot get result for getJavaVM", nullptr); // -5
133 aRet = reinterpret_cast<jvmaccess::VirtualMachine *>(
134 static_cast<sal_IntPtr>(nTemp));
136 catch (Exception&)
138 TOOLS_WARN_EXCEPTION("connectivity.commontools", "getJavaVM failed:");
141 return aRet;
144 bool existsJavaClassByName( const ::rtl::Reference< jvmaccess::VirtualMachine >& _pJVM,const OUString& _sClassName )
146 bool bRet = false;
147 if ( _pJVM.is() )
149 jvmaccess::VirtualMachine::AttachGuard aGuard(_pJVM);
150 JNIEnv* pEnv = aGuard.getEnvironment();
151 if( pEnv )
153 OString sClassName = OUStringToOString(_sClassName, RTL_TEXTENCODING_ASCII_US);
154 sClassName = sClassName.replace('.','/');
155 jobject out = pEnv->FindClass(sClassName.getStr());
156 bRet = out != nullptr;
157 pEnv->DeleteLocalRef( out );
160 return bRet;
162 #endif
165 namespace dbtools
168 static bool isCharOk(sal_Unicode c,const OUString& _rSpecials)
171 return ( ((c >= 97) && (c <= 122)) || ((c >= 65) && (c <= 90)) || ((c >= 48) && (c <= 57)) ||
172 c == '_' || _rSpecials.indexOf(c) != -1);
176 bool isValidSQLName(const OUString& rName,const OUString& _rSpecials)
178 // Test for correct naming (in SQL sense)
179 // This is important for table names for example
180 const sal_Unicode* pStr = rName.getStr();
181 if (*pStr > 127 || rtl::isAsciiDigit(*pStr))
182 return false;
184 for (; *pStr; ++pStr )
185 if(!isCharOk(*pStr,_rSpecials))
186 return false;
188 if ( !rName.isEmpty()
189 && ( (rName.toChar() == '_')
190 || ( (rName.toChar() >= '0')
191 && (rName.toChar() <= '9')
195 return false;
196 // the SQL-Standard requires the first character to be an alphabetic character, which
197 // isn't easy to decide in UniCode...
198 // So we just prohibit the characters which already lead to problems...
199 // 11.04.00 - 74902 - FS
201 return true;
204 // Creates a new name if necessary
205 OUString convertName2SQLName(const OUString& rName,const OUString& _rSpecials)
207 if(isValidSQLName(rName,_rSpecials))
208 return rName;
210 const sal_Unicode* pStr = rName.getStr();
211 // if not valid
212 if (*pStr >= 128 || rtl::isAsciiDigit(*pStr))
213 return OUString();
215 OUStringBuffer aNewName(rName);
216 sal_Int32 nLength = rName.getLength();
217 for (sal_Int32 i=0; i < nLength; ++i)
218 if(!isCharOk(aNewName[i],_rSpecials))
219 aNewName[i] = '_';
221 return aNewName.makeStringAndClear();
224 OUString quoteName(const OUString& _rQuote, const OUString& _rName)
226 OUString sName = _rName;
227 if( !_rQuote.isEmpty() && _rQuote.toChar() != ' ')
228 sName = _rQuote + _rName + _rQuote;
229 return sName;
235 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */