| File: | ucbhelper/source/provider/registerucb.cxx |
| Location: | line 90, column 29 |
| Description: | Called C++ object pointer is null |
| 1 | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | |||
| 2 | /* | |||
| 3 | * This file is part of the LibreOffice project. | |||
| 4 | * | |||
| 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/. | |||
| 8 | * | |||
| 9 | * This file incorporates work covered by the following license notice: | |||
| 10 | * | |||
| 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 . | |||
| 18 | */ | |||
| 19 | ||||
| 20 | #include <ucbhelper/registerucb.hxx> | |||
| 21 | #include <com/sun/star/beans/XPropertySet.hpp> | |||
| 22 | #include <com/sun/star/lang/XMultiServiceFactory.hpp> | |||
| 23 | #include <com/sun/star/ucb/XContentProviderManager.hpp> | |||
| 24 | #include <com/sun/star/ucb/XParameterizedContentProvider.hpp> | |||
| 25 | #include <com/sun/star/ucb/ContentProviderProxyFactory.hpp> | |||
| 26 | #include <com/sun/star/ucb/XContentProviderFactory.hpp> | |||
| 27 | #include <com/sun/star/uno/XComponentContext.hpp> | |||
| 28 | #include <com/sun/star/uno/RuntimeException.hpp> | |||
| 29 | ||||
| 30 | #include "osl/diagnose.h" | |||
| 31 | ||||
| 32 | using namespace com::sun::star; | |||
| 33 | ||||
| 34 | namespace ucbhelper { | |||
| 35 | ||||
| 36 | //============================================================================ | |||
| 37 | // | |||
| 38 | // registerAtUcb | |||
| 39 | // | |||
| 40 | //============================================================================ | |||
| 41 | ||||
| 42 | bool | |||
| 43 | registerAtUcb( | |||
| 44 | uno::Reference< ucb::XContentProviderManager > const & rManager, | |||
| 45 | uno::Reference< lang::XMultiServiceFactory > const & rServiceFactory, | |||
| 46 | rtl::OUString const & rName, | |||
| 47 | rtl::OUString const & rArguments, | |||
| 48 | rtl::OUString const & rTemplate, | |||
| 49 | ContentProviderRegistrationInfo * pInfo) | |||
| 50 | throw (uno::RuntimeException) | |||
| 51 | { | |||
| 52 | OSL_ENSURE(rServiceFactory.is(),do { if (true && (!(rServiceFactory.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/provider/registerucb.cxx" ":" "53" ": "), "%s", "ucb::registerAtUcb(): No service factory" ); } } while (false) | |||
| 53 | "ucb::registerAtUcb(): No service factory")do { if (true && (!(rServiceFactory.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/provider/registerucb.cxx" ":" "53" ": "), "%s", "ucb::registerAtUcb(): No service factory" ); } } while (false); | |||
| 54 | ||||
| 55 | bool bNoProxy | |||
| 56 | = rArguments.compareToAscii(RTL_CONSTASCII_STRINGPARAM("{noproxy}")(&("{noproxy}")[0]), ((sal_Int32)(sizeof ("{noproxy}") / sizeof (("{noproxy}")[0]))-1)) | |||
| 57 | == 0; | |||
| 58 | rtl::OUString | |||
| 59 | aProviderArguments(bNoProxy ? | |||
| ||||
| 60 | rArguments. | |||
| 61 | copy(RTL_CONSTASCII_LENGTH("{noproxy}")((sal_Int32)((sizeof ("{noproxy}") / sizeof (("{noproxy}")[0] ))-1))) : | |||
| 62 | rArguments); | |||
| 63 | ||||
| 64 | // First, try to instantiate proxy for provider: | |||
| 65 | uno::Reference< ucb::XContentProvider > xProvider; | |||
| 66 | if (!bNoProxy) | |||
| 67 | { | |||
| 68 | uno::Reference< ucb::XContentProviderFactory > xProxyFactory; | |||
| 69 | try | |||
| 70 | { | |||
| 71 | uno::Reference< beans::XPropertySet > xFactoryProperties( rServiceFactory, uno::UNO_QUERY_THROW ); | |||
| 72 | uno::Reference< uno::XComponentContext > xContext = uno::Reference< uno::XComponentContext >( | |||
| 73 | xFactoryProperties->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" )(&("DefaultContext")[0]), ((sal_Int32)((sizeof ("DefaultContext" ) / sizeof (("DefaultContext")[0]))-1)), (((rtl_TextEncoding) 11)) ) ), | |||
| 74 | uno::UNO_QUERY ); | |||
| 75 | xProxyFactory | |||
| 76 | = uno::Reference< ucb::XContentProviderFactory >( | |||
| 77 | ucb::ContentProviderProxyFactory::create( xContext ) ); | |||
| 78 | } | |||
| 79 | catch (uno::Exception const &) {} | |||
| 80 | OSL_ENSURE(xProxyFactory.is(), "No ContentProviderProxyFactory")do { if (true && (!(xProxyFactory.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/provider/registerucb.cxx" ":" "80" ": "), "%s", "No ContentProviderProxyFactory"); } } while (false); | |||
| 81 | if (xProxyFactory.is()) | |||
| 82 | xProvider = xProxyFactory->createContentProvider(rName); | |||
| 83 | } | |||
| 84 | ||||
| 85 | // Then, try to instantiate provider directly: | |||
| 86 | if (!xProvider.is()) | |||
| 87 | try | |||
| 88 | { | |||
| 89 | xProvider = uno::Reference< ucb::XContentProvider >( | |||
| 90 | rServiceFactory->createInstance(rName), | |||
| ||||
| 91 | uno::UNO_QUERY); | |||
| 92 | } | |||
| 93 | catch (uno::RuntimeException const &) { throw; } | |||
| 94 | catch (uno::Exception const &) {} | |||
| 95 | ||||
| 96 | uno::Reference< ucb::XContentProvider > | |||
| 97 | xOriginalProvider(xProvider); | |||
| 98 | uno::Reference< ucb::XParameterizedContentProvider > | |||
| 99 | xParameterized(xProvider, uno::UNO_QUERY); | |||
| 100 | if (xParameterized.is()) | |||
| 101 | { | |||
| 102 | uno::Reference< ucb::XContentProvider > xInstance; | |||
| 103 | try | |||
| 104 | { | |||
| 105 | xInstance = xParameterized->registerInstance(rTemplate, | |||
| 106 | aProviderArguments, | |||
| 107 | true); | |||
| 108 | //@@@ if this call replaces an old instance, the commit-or- | |||
| 109 | // rollback code below will not work | |||
| 110 | } | |||
| 111 | catch (lang::IllegalArgumentException const &) {} | |||
| 112 | ||||
| 113 | if (xInstance.is()) | |||
| 114 | xProvider = xInstance; | |||
| 115 | } | |||
| 116 | ||||
| 117 | bool bSuccess = false; | |||
| 118 | if (rManager.is() && xProvider.is()) | |||
| 119 | try | |||
| 120 | { | |||
| 121 | rManager->registerContentProvider(xProvider, rTemplate, true); | |||
| 122 | bSuccess = true; | |||
| 123 | } | |||
| 124 | catch (ucb::DuplicateProviderException const &) | |||
| 125 | { | |||
| 126 | if (xParameterized.is()) | |||
| 127 | try | |||
| 128 | { | |||
| 129 | xParameterized->deregisterInstance(rTemplate, | |||
| 130 | aProviderArguments); | |||
| 131 | } | |||
| 132 | catch (lang::IllegalArgumentException const &) {} | |||
| 133 | } | |||
| 134 | catch (...) | |||
| 135 | { | |||
| 136 | if (xParameterized.is()) | |||
| 137 | try | |||
| 138 | { | |||
| 139 | xParameterized->deregisterInstance(rTemplate, | |||
| 140 | aProviderArguments); | |||
| 141 | } | |||
| 142 | catch (lang::IllegalArgumentException const &) {} | |||
| 143 | catch (uno::RuntimeException const &) {} | |||
| 144 | throw; | |||
| 145 | } | |||
| 146 | ||||
| 147 | if (bSuccess && pInfo) | |||
| 148 | { | |||
| 149 | pInfo->m_xProvider = xOriginalProvider; | |||
| 150 | pInfo->m_aArguments = aProviderArguments; | |||
| 151 | pInfo->m_aTemplate = rTemplate; | |||
| 152 | } | |||
| 153 | return bSuccess; | |||
| 154 | } | |||
| 155 | ||||
| 156 | } | |||
| 157 | ||||
| 158 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |