diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2005-02-11 15:34:28 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2005-02-11 15:34:28 +0000 |
commit | a5fe7e285d5865c7ea674246db654bb278218c03 (patch) | |
tree | 60ba6ec35926ef50f79da99c68433e0892fe44a4 /scripting | |
parent | 023363bbbdfad98f7c1c36be518b74320e2cd21f (diff) |
INTEGRATION: CWS pyunofixes1 (1.1.2); FILE ADDED
2005/01/05 15:58:35 toconnor 1.1.2.7: #i37468# ensure directory exists before getting contents
Issue number:
Submitted by:
Reviewed by:
2004/12/22 11:48:45 toconnor 1.1.2.6: #i37468# use | as separator in language part of script URI
Issue number:
Submitted by:
Reviewed by:
2004/12/21 13:07:06 toconnor 1.1.2.5: #i37468# add support for Python scripts in UNO packages
Issue number:
Submitted by:
Reviewed by:
2004/12/19 20:50:31 jbu 1.1.2.4: #i25309# removed obsolete user suffix
2004/12/19 19:19:46 jbu 1.1.2.3: #i25309# inifilenaming now works also on windows
2004/12/05 08:57:49 jbu 1.1.2.2: #i25309# removed file existence check to e.g. allow to add function names to uris
2004/11/26 13:31:58 toconnor 1.1.2.1: #i37415# add helper for storage and script URIs
Issue number:
Submitted by:
Reviewed by:
Diffstat (limited to 'scripting')
-rw-r--r-- | scripting/source/provider/URIHelper.cxx | 354 |
1 files changed, 354 insertions, 0 deletions
diff --git a/scripting/source/provider/URIHelper.cxx b/scripting/source/provider/URIHelper.cxx new file mode 100644 index 000000000000..940614419017 --- /dev/null +++ b/scripting/source/provider/URIHelper.cxx @@ -0,0 +1,354 @@ +/************************************************************************* + * + * $RCSfile: URIHelper.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: hr $ $Date: 2005-02-11 16:34:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include <com/sun/star/uri/XVndSunStarScriptUrl.hpp> +#include <rtl/ustrbuf.hxx> +#include "URIHelper.hxx" + +#define PRTSTR(x) ::rtl::OUStringToOString(x, RTL_TEXTENCODING_ASCII_US).pData->buffer + +namespace func_provider +{ + +using ::rtl::OUString; +namespace uno = ::com::sun::star::uno; +namespace ucb = ::com::sun::star::ucb; +namespace lang = ::com::sun::star::lang; +namespace uri = ::com::sun::star::uri; +namespace script = ::com::sun::star::script; + +static const char SHARE[] = "share"; +static const char SHARE_URI[] = + "vnd.sun.star.expand:${$SYSBINDIR/" SAL_CONFIGFILE( "bootstrap") "::BaseInstallation}"; + +static const char SHARE_UNO_PACKAGES[] = "share:uno_packages"; +static const char SHARE_UNO_PACKAGES_DIR[] = + "/share/uno_packages/cache"; + +static const char USER[] = "user"; +static const char USER_URI[] = + "vnd.sun.star.expand:${$SYSBINDIR/" SAL_CONFIGFILE( "bootstrap") ":::UserInstallation}"; + +static const char USER_UNO_PACKAGES[] = "user:uno_packages"; +static const char USER_UNO_PACKAGES_DIR[] = + "/user/uno_packages/cache"; + +static const char DOCUMENT[] = "document"; +static const char TDOC_SCHEME[] = "vnd.sun.star.tdoc"; + +ScriptingFrameworkURIHelper::ScriptingFrameworkURIHelper( + const uno::Reference< uno::XComponentContext >& xContext) + throw( uno::RuntimeException ) +{ + try + { + m_xSimpleFileAccess = uno::Reference< ucb::XSimpleFileAccess >( + xContext->getServiceManager()->createInstanceWithContext( + OUString::createFromAscii( + "com.sun.star.ucb.SimpleFileAccess"), + xContext), uno::UNO_QUERY_THROW); + } + catch (uno::Exception&) + { + OSL_ENSURE(false, + "Scripting Framework error initialising XSimpleFileAccess"); + } + + try + { + m_xUriReferenceFactory = uno::Reference< uri::XUriReferenceFactory >( + xContext->getServiceManager()->createInstanceWithContext( + OUString::createFromAscii( + "com.sun.star.uri.UriReferenceFactory"), + xContext ), uno::UNO_QUERY_THROW ); + } + catch (uno::Exception&) + { + OSL_ENSURE(false, + "Scripting Framework error initialising XUriReferenceFactory"); + } +} + +ScriptingFrameworkURIHelper::~ScriptingFrameworkURIHelper() +{ + // currently does nothing +} + +void SAL_CALL +ScriptingFrameworkURIHelper::initialize( + const uno::Sequence < uno::Any >& args ) +throw ( uno::Exception, uno::RuntimeException ) +{ + if ( args.getLength() != 2 || + args[0].getValueType() != ::getCppuType((const OUString*)NULL) || + args[1].getValueType() != ::getCppuType((const OUString*)NULL) ) + { + throw uno::RuntimeException( OUString::createFromAscii( + "ScriptingFrameworkURIHelper got invalid argument list" ), + uno::Reference< uno::XInterface >() ); + } + + if ( (args[0] >>= m_sLanguage) == sal_False || + (args[1] >>= m_sLocation) == sal_False ) + { + throw uno::RuntimeException( OUString::createFromAscii( + "ScriptingFrameworkURIHelper error parsing args" ), + uno::Reference< uno::XInterface >() ); + } + + SCRIPTS_PART = OUString::createFromAscii( "/Scripts/" ); + SCRIPTS_PART = SCRIPTS_PART.concat( m_sLanguage.toAsciiLowerCase() ); + + if ( !initBaseURI() ) + { + throw uno::RuntimeException( OUString::createFromAscii( + "ScriptingFrameworkURIHelper cannot find script directory"), + uno::Reference< uno::XInterface >() ); + } +} + +bool +ScriptingFrameworkURIHelper::initBaseURI() +{ + OUString uri, test; + bool bAppendScriptsPart = false; + + if ( m_sLocation.equalsAscii(USER)) + { + test = OUString::createFromAscii(USER); + uri = OUString::createFromAscii(USER_URI); + bAppendScriptsPart = true; + } + else if ( m_sLocation.equalsAscii(USER_UNO_PACKAGES)) + { + test = OUString::createFromAscii("uno_packages"); + uri = OUString::createFromAscii(USER_URI); + uri = uri.concat(OUString::createFromAscii(USER_UNO_PACKAGES_DIR)); + } + else if (m_sLocation.equalsAscii(SHARE)) + { + test = OUString::createFromAscii(SHARE); + uri = OUString::createFromAscii(SHARE_URI); + bAppendScriptsPart = true; + } + else if (m_sLocation.equalsAscii(SHARE_UNO_PACKAGES)) + { + test = OUString::createFromAscii("uno_packages"); + uri = OUString::createFromAscii(SHARE_URI); + uri = uri.concat(OUString::createFromAscii(SHARE_UNO_PACKAGES_DIR)); + } + else if (m_sLocation.indexOf(OUString::createFromAscii(TDOC_SCHEME)) == 0) + { + m_sBaseURI = m_sLocation.concat( SCRIPTS_PART ); + m_sLocation = OUString::createFromAscii( DOCUMENT ); + return true; + } + else + { + return false; + } + + if ( !m_xSimpleFileAccess->exists( uri ) || + !m_xSimpleFileAccess->isFolder( uri ) ) + { + return false; + } + + uno::Sequence< OUString > children = + m_xSimpleFileAccess->getFolderContents( uri, true ); + + for ( sal_Int32 i = 0; i < children.getLength(); i++ ) + { + OUString child = children[i]; + sal_Int32 idx = child.lastIndexOf(test); + + // OSL_TRACE("Trying: %s", PRTSTR(child)); + // OSL_TRACE("idx=%d, testlen=%d, children=%d", + // idx, test.getLength(), child.getLength()); + + if ( idx != -1 && (idx + test.getLength()) == child.getLength() ) + { + // OSL_TRACE("FOUND PATH: %s", PRTSTR(child)); + if ( bAppendScriptsPart ) + { + m_sBaseURI = child.concat( SCRIPTS_PART ); + } + else + { + m_sBaseURI = child; + } + return true; + } + } + return false; +} + +OUString +ScriptingFrameworkURIHelper::getLanguagePart(const OUString& rStorageURI) +{ + OUString result; + + sal_Int32 idx = rStorageURI.indexOf(m_sBaseURI); + sal_Int32 len = m_sBaseURI.getLength() + 1; + + if ( idx != -1 ) + { + result = rStorageURI.copy(idx + len); + result = result.replace('/', '|'); + } + return result; +} + +OUString +ScriptingFrameworkURIHelper::getLanguagePath(const OUString& rLanguagePart) +{ + OUString result; + result = rLanguagePart.replace('|', '/'); + return result; +} + +OUString SAL_CALL +ScriptingFrameworkURIHelper::getScriptURI(const OUString& rStorageURI) + throw( lang::IllegalArgumentException, uno::RuntimeException ) +{ + ::rtl::OUStringBuffer buf(120); + + buf.appendAscii("vnd.sun.star.script:"); + buf.append(getLanguagePart(rStorageURI)); + buf.appendAscii("?language="); + buf.append(m_sLanguage); + buf.appendAscii("&location="); + buf.append(m_sLocation); + + return buf.makeStringAndClear(); +} + +OUString SAL_CALL +ScriptingFrameworkURIHelper::getStorageURI(const OUString& rScriptURI) + throw( lang::IllegalArgumentException, uno::RuntimeException ) +{ + OUString sLanguagePart; + try + { + uno::Reference < uri::XVndSunStarScriptUrl > xURI( + m_xUriReferenceFactory->parse( rScriptURI ), uno::UNO_QUERY_THROW ); + sLanguagePart = xURI->getName(); + } + catch ( uno::Exception& ) + { + throw lang::IllegalArgumentException( + OUString::createFromAscii( "Script URI not valid" ), + uno::Reference< uno::XInterface >(), 1 ); + } + + ::rtl::OUStringBuffer buf(120); + buf.append(m_sBaseURI); + buf.append(OUString::createFromAscii("/")); + buf.append(getLanguagePath(sLanguagePart)); + + OUString result = buf.makeStringAndClear(); + + return result; +} + +OUString SAL_CALL +ScriptingFrameworkURIHelper::getRootStorageURI() + throw( uno::RuntimeException ) +{ + return m_sBaseURI; +} + +OUString SAL_CALL +ScriptingFrameworkURIHelper::getImplementationName() + throw( uno::RuntimeException ) +{ + return OUString::createFromAscii( + "com.sun.star.script.provider.ScriptURIHelper" ); +} + +sal_Bool SAL_CALL +ScriptingFrameworkURIHelper::supportsService( const OUString& serviceName ) + throw( uno::RuntimeException ) +{ + OUString m_sServiceName = OUString::createFromAscii( + "com.sun.star.script.provider.ScriptURIHelper" ); + + if ( serviceName.equals( m_sServiceName ) ) + { + return sal_True; + } + return sal_False; +} + +uno::Sequence< ::rtl::OUString > SAL_CALL +ScriptingFrameworkURIHelper::getSupportedServiceNames() + throw( uno::RuntimeException ) +{ + ::rtl::OUString serviceNameList[] = { + ::rtl::OUString::createFromAscii( + "com.sun.star.script.provider.ScriptURIHelper" ) }; + + uno::Sequence< ::rtl::OUString > serviceNames = uno::Sequence < + ::rtl::OUString > ( serviceNameList, 1 ); + + return serviceNames; +} +} |