12722ceddSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
32722ceddSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
42722ceddSAndrew Rist * or more contributor license agreements. See the NOTICE file
52722ceddSAndrew Rist * distributed with this work for additional information
62722ceddSAndrew Rist * regarding copyright ownership. The ASF licenses this file
72722ceddSAndrew Rist * to you under the Apache License, Version 2.0 (the
82722ceddSAndrew Rist * "License"); you may not use this file except in compliance
92722ceddSAndrew Rist * with the License. You may obtain a copy of the License at
102722ceddSAndrew Rist *
112722ceddSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
122722ceddSAndrew Rist *
132722ceddSAndrew Rist * Unless required by applicable law or agreed to in writing,
142722ceddSAndrew Rist * software distributed under the License is distributed on an
152722ceddSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
162722ceddSAndrew Rist * KIND, either express or implied. See the License for the
172722ceddSAndrew Rist * specific language governing permissions and limitations
182722ceddSAndrew Rist * under the License.
192722ceddSAndrew Rist *
202722ceddSAndrew Rist *************************************************************/
212722ceddSAndrew Rist
222722ceddSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_desktop.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include "deployment.hrc"
28cdf0e10cSrcweir #include "unopkg_shared.h"
29cdf0e10cSrcweir #include "dp_identifier.hxx"
30cdf0e10cSrcweir #include "../../deployment/gui/dp_gui.hrc"
31cdf0e10cSrcweir #include "../../app/lockfile.hxx"
32cdf0e10cSrcweir #include "vcl/svapp.hxx"
33cdf0e10cSrcweir #include "vcl/msgbox.hxx"
34cdf0e10cSrcweir #include "rtl/bootstrap.hxx"
35cdf0e10cSrcweir #include "rtl/strbuf.hxx"
36cdf0e10cSrcweir #include "rtl/ustrbuf.hxx"
37cdf0e10cSrcweir #include "osl/process.h"
38cdf0e10cSrcweir #include "osl/file.hxx"
39cdf0e10cSrcweir #include "osl/thread.hxx"
40cdf0e10cSrcweir #include "tools/getprocessworkingdir.hxx"
41cdf0e10cSrcweir #include "ucbhelper/contentbroker.hxx"
42cdf0e10cSrcweir #include "ucbhelper/configurationkeys.hxx"
43cdf0e10cSrcweir #include "unotools/processfactory.hxx"
44cdf0e10cSrcweir #include "unotools/configmgr.hxx"
45cdf0e10cSrcweir #include "com/sun/star/lang/XMultiServiceFactory.hpp"
46cdf0e10cSrcweir #include "cppuhelper/bootstrap.hxx"
47cdf0e10cSrcweir #include "comphelper/sequence.hxx"
48cdf0e10cSrcweir #include <stdio.h>
49cdf0e10cSrcweir
50cdf0e10cSrcweir using ::rtl::OUString;
51cdf0e10cSrcweir using ::rtl::OString;
52cdf0e10cSrcweir using namespace ::com::sun::star;
53cdf0e10cSrcweir using namespace ::com::sun::star::uno;
54cdf0e10cSrcweir using namespace ::com::sun::star::ucb;
55cdf0e10cSrcweir
56cdf0e10cSrcweir namespace unopkg {
57cdf0e10cSrcweir
58cdf0e10cSrcweir bool getLockFilePath(OUString & out);
59cdf0e10cSrcweir
toString(OptionInfo const * info)60cdf0e10cSrcweir ::rtl::OUString toString( OptionInfo const * info )
61cdf0e10cSrcweir {
62cdf0e10cSrcweir OSL_ASSERT( info != 0 );
63cdf0e10cSrcweir ::rtl::OUStringBuffer buf;
64cdf0e10cSrcweir buf.appendAscii("--");
65cdf0e10cSrcweir buf.appendAscii(info->m_name);
66cdf0e10cSrcweir if (info->m_short_option != '\0')
67cdf0e10cSrcweir {
68cdf0e10cSrcweir buf.appendAscii(" (short -" );
69cdf0e10cSrcweir buf.append(info->m_short_option );
70cdf0e10cSrcweir buf.appendAscii(")");
71cdf0e10cSrcweir }
72cdf0e10cSrcweir if (info->m_has_argument)
73cdf0e10cSrcweir buf.appendAscii(" <argument>" );
74cdf0e10cSrcweir return buf.makeStringAndClear();
75cdf0e10cSrcweir }
76cdf0e10cSrcweir
77cdf0e10cSrcweir //==============================================================================
getOptionInfo(OptionInfo const * list,OUString const & opt,sal_Unicode copt)78cdf0e10cSrcweir OptionInfo const * getOptionInfo(
79cdf0e10cSrcweir OptionInfo const * list,
80cdf0e10cSrcweir OUString const & opt, sal_Unicode copt )
81cdf0e10cSrcweir {
82cdf0e10cSrcweir for ( ; list->m_name != 0; ++list )
83cdf0e10cSrcweir {
84cdf0e10cSrcweir OptionInfo const & option_info = *list;
85cdf0e10cSrcweir if (opt.getLength() > 0)
86cdf0e10cSrcweir {
87cdf0e10cSrcweir if (opt.equalsAsciiL(
88cdf0e10cSrcweir option_info.m_name, option_info.m_name_length ) &&
89cdf0e10cSrcweir (copt == '\0' || copt == option_info.m_short_option))
90cdf0e10cSrcweir {
91cdf0e10cSrcweir return &option_info;
92cdf0e10cSrcweir }
93cdf0e10cSrcweir }
94cdf0e10cSrcweir else
95cdf0e10cSrcweir {
96cdf0e10cSrcweir OSL_ASSERT( copt != '\0' );
97cdf0e10cSrcweir if (copt == option_info.m_short_option)
98cdf0e10cSrcweir {
99cdf0e10cSrcweir return &option_info;
100cdf0e10cSrcweir }
101cdf0e10cSrcweir }
102cdf0e10cSrcweir }
103cdf0e10cSrcweir OSL_ENSURE( 0, ::rtl::OUStringToOString(
104cdf0e10cSrcweir opt, osl_getThreadTextEncoding() ).getStr() );
105cdf0e10cSrcweir return 0;
106cdf0e10cSrcweir }
107cdf0e10cSrcweir
108cdf0e10cSrcweir //==============================================================================
isOption(OptionInfo const * option_info,sal_uInt32 * pIndex)109cdf0e10cSrcweir bool isOption( OptionInfo const * option_info, sal_uInt32 * pIndex )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir OSL_ASSERT( option_info != 0 );
112cdf0e10cSrcweir if (osl_getCommandArgCount() <= *pIndex)
113cdf0e10cSrcweir return false;
114cdf0e10cSrcweir
115cdf0e10cSrcweir OUString arg;
116cdf0e10cSrcweir osl_getCommandArg( *pIndex, &arg.pData );
117cdf0e10cSrcweir sal_Int32 len = arg.getLength();
118cdf0e10cSrcweir
119cdf0e10cSrcweir if (len < 2 || arg[ 0 ] != '-')
120cdf0e10cSrcweir return false;
121cdf0e10cSrcweir
122cdf0e10cSrcweir if (len == 2 && arg[ 1 ] == option_info->m_short_option)
123cdf0e10cSrcweir {
124cdf0e10cSrcweir ++(*pIndex);
125cdf0e10cSrcweir dp_misc::TRACE(OUSTR(__FILE__": identified option \'")
126cdf0e10cSrcweir + OUSTR("\'") + OUString( option_info->m_short_option ) + OUSTR("\n"));
127cdf0e10cSrcweir return true;
128cdf0e10cSrcweir }
129cdf0e10cSrcweir if (arg[ 1 ] == '-' && rtl_ustr_ascii_compare(
130cdf0e10cSrcweir arg.pData->buffer + 2, option_info->m_name ) == 0)
131cdf0e10cSrcweir {
132cdf0e10cSrcweir ++(*pIndex);
133cdf0e10cSrcweir dp_misc::TRACE(OUSTR( __FILE__": identified option \'")
134cdf0e10cSrcweir + OUString::createFromAscii(option_info->m_name) + OUSTR("\'\n"));
135cdf0e10cSrcweir return true;
136cdf0e10cSrcweir }
137cdf0e10cSrcweir return false;
138cdf0e10cSrcweir }
139cdf0e10cSrcweir //==============================================================================
140cdf0e10cSrcweir
isBootstrapVariable(sal_uInt32 * pIndex)141cdf0e10cSrcweir bool isBootstrapVariable(sal_uInt32 * pIndex)
142cdf0e10cSrcweir {
143cdf0e10cSrcweir OSL_ASSERT(osl_getCommandArgCount() >= *pIndex);
144cdf0e10cSrcweir
145cdf0e10cSrcweir OUString arg;
146cdf0e10cSrcweir osl_getCommandArg(*pIndex, &arg.pData);
147cdf0e10cSrcweir if (arg.matchAsciiL("-env:", 5))
148cdf0e10cSrcweir {
149cdf0e10cSrcweir ++(*pIndex);
150cdf0e10cSrcweir return true;
151cdf0e10cSrcweir }
152cdf0e10cSrcweir return false;
153cdf0e10cSrcweir }
154cdf0e10cSrcweir
155cdf0e10cSrcweir //==============================================================================
readArgument(OUString * pValue,OptionInfo const * option_info,sal_uInt32 * pIndex)156cdf0e10cSrcweir bool readArgument(
157cdf0e10cSrcweir OUString * pValue, OptionInfo const * option_info, sal_uInt32 * pIndex )
158cdf0e10cSrcweir {
159cdf0e10cSrcweir if (isOption( option_info, pIndex ))
160cdf0e10cSrcweir {
161cdf0e10cSrcweir if (*pIndex < osl_getCommandArgCount())
162cdf0e10cSrcweir {
163cdf0e10cSrcweir OSL_ASSERT( pValue != 0 );
164cdf0e10cSrcweir osl_getCommandArg( *pIndex, &pValue->pData );
165cdf0e10cSrcweir dp_misc::TRACE(OUSTR( __FILE__": argument value: ")
166cdf0e10cSrcweir + *pValue + OUSTR("\n"));
167cdf0e10cSrcweir ++(*pIndex);
168cdf0e10cSrcweir return true;
169cdf0e10cSrcweir }
170cdf0e10cSrcweir --(*pIndex);
171cdf0e10cSrcweir }
172cdf0e10cSrcweir return false;
173cdf0e10cSrcweir }
174cdf0e10cSrcweir
175cdf0e10cSrcweir //##############################################################################
176cdf0e10cSrcweir
177cdf0e10cSrcweir namespace {
178cdf0e10cSrcweir struct ExecutableDir : public rtl::StaticWithInit<
179cdf0e10cSrcweir const OUString, ExecutableDir> {
operator ()unopkg::__anon5ff1f5c90111::ExecutableDir180cdf0e10cSrcweir const OUString operator () () {
181cdf0e10cSrcweir OUString path;
182cdf0e10cSrcweir if (osl_getExecutableFile( &path.pData ) != osl_Process_E_None) {
183cdf0e10cSrcweir throw RuntimeException(
184cdf0e10cSrcweir OUSTR("cannot locate executable directory!"),0 );
185cdf0e10cSrcweir }
186cdf0e10cSrcweir return path.copy( 0, path.lastIndexOf( '/' ) );
187cdf0e10cSrcweir }
188cdf0e10cSrcweir };
189cdf0e10cSrcweir struct ProcessWorkingDir : public rtl::StaticWithInit<
190cdf0e10cSrcweir const OUString, ProcessWorkingDir> {
operator ()unopkg::__anon5ff1f5c90111::ProcessWorkingDir191cdf0e10cSrcweir const OUString operator () () {
192cdf0e10cSrcweir OUString workingDir;
193cdf0e10cSrcweir tools::getProcessWorkingDir(&workingDir);
194cdf0e10cSrcweir return workingDir;
195cdf0e10cSrcweir }
196cdf0e10cSrcweir };
197cdf0e10cSrcweir } // anon namespace
198cdf0e10cSrcweir
199cdf0e10cSrcweir //==============================================================================
getExecutableDir()200cdf0e10cSrcweir OUString const & getExecutableDir()
201cdf0e10cSrcweir {
202cdf0e10cSrcweir return ExecutableDir::get();
203cdf0e10cSrcweir }
204cdf0e10cSrcweir
205cdf0e10cSrcweir //==============================================================================
getProcessWorkingDir()206cdf0e10cSrcweir OUString const & getProcessWorkingDir()
207cdf0e10cSrcweir {
208cdf0e10cSrcweir return ProcessWorkingDir::get();
209cdf0e10cSrcweir }
210cdf0e10cSrcweir
211cdf0e10cSrcweir //==============================================================================
makeAbsoluteFileUrl(OUString const & sys_path,OUString const & base_url,bool throw_exc)212cdf0e10cSrcweir OUString makeAbsoluteFileUrl(
213cdf0e10cSrcweir OUString const & sys_path, OUString const & base_url, bool throw_exc )
214cdf0e10cSrcweir {
215cdf0e10cSrcweir // system path to file url
216cdf0e10cSrcweir OUString file_url;
217cdf0e10cSrcweir oslFileError rc = osl_getFileURLFromSystemPath( sys_path.pData, &file_url.pData );
218cdf0e10cSrcweir if ( rc != osl_File_E_None) {
219cdf0e10cSrcweir OUString tempPath;
220cdf0e10cSrcweir if ( osl_getSystemPathFromFileURL( sys_path.pData, &tempPath.pData) == osl_File_E_None )
221cdf0e10cSrcweir {
222cdf0e10cSrcweir file_url = sys_path;
223cdf0e10cSrcweir }
224cdf0e10cSrcweir else if (throw_exc)
225cdf0e10cSrcweir {
226cdf0e10cSrcweir throw RuntimeException(
227cdf0e10cSrcweir OUSTR("cannot get file url from system path: ") +
228cdf0e10cSrcweir sys_path, Reference< XInterface >() );
229cdf0e10cSrcweir }
230cdf0e10cSrcweir }
231cdf0e10cSrcweir
232cdf0e10cSrcweir OUString abs;
233cdf0e10cSrcweir if (osl_getAbsoluteFileURL(
234cdf0e10cSrcweir base_url.pData, file_url.pData, &abs.pData ) != osl_File_E_None)
235cdf0e10cSrcweir {
236cdf0e10cSrcweir if (throw_exc) {
237cdf0e10cSrcweir ::rtl::OUStringBuffer buf;
238cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(
239cdf0e10cSrcweir "making absolute file url failed: \"") );
240cdf0e10cSrcweir buf.append( base_url );
241cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(
242cdf0e10cSrcweir "\" (base-url) and \"") );
243cdf0e10cSrcweir buf.append( file_url );
244cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\" (file-url)!") );
245cdf0e10cSrcweir throw RuntimeException(
246cdf0e10cSrcweir buf.makeStringAndClear(), Reference< XInterface >() );
247cdf0e10cSrcweir }
248cdf0e10cSrcweir return OUString();
249cdf0e10cSrcweir }
250cdf0e10cSrcweir return abs[ abs.getLength() -1 ] == '/'
251cdf0e10cSrcweir ? abs.copy( 0, abs.getLength() -1 ) : abs;
252cdf0e10cSrcweir }
253cdf0e10cSrcweir
254cdf0e10cSrcweir //##############################################################################
255cdf0e10cSrcweir
256cdf0e10cSrcweir namespace {
257cdf0e10cSrcweir
258cdf0e10cSrcweir //------------------------------------------------------------------------------
printf_space(sal_Int32 space)259cdf0e10cSrcweir inline void printf_space( sal_Int32 space )
260cdf0e10cSrcweir {
261cdf0e10cSrcweir while (space--)
262cdf0e10cSrcweir dp_misc::writeConsole(" ");
263cdf0e10cSrcweir }
264cdf0e10cSrcweir
265cdf0e10cSrcweir //------------------------------------------------------------------------------
printf_line(OUString const & name,OUString const & value,sal_Int32 level)266cdf0e10cSrcweir void printf_line(
267cdf0e10cSrcweir OUString const & name, OUString const & value, sal_Int32 level )
268cdf0e10cSrcweir {
269cdf0e10cSrcweir printf_space( level );
270cdf0e10cSrcweir dp_misc::writeConsole(name + OUSTR(": ") + value + OUSTR("\n"));
271cdf0e10cSrcweir }
272cdf0e10cSrcweir
273cdf0e10cSrcweir //------------------------------------------------------------------------------
printf_package(Reference<deployment::XPackage> const & xPackage,Reference<XCommandEnvironment> const & xCmdEnv,sal_Int32 level)274cdf0e10cSrcweir void printf_package(
275cdf0e10cSrcweir Reference<deployment::XPackage> const & xPackage,
276cdf0e10cSrcweir Reference<XCommandEnvironment> const & xCmdEnv, sal_Int32 level )
277cdf0e10cSrcweir {
278cdf0e10cSrcweir beans::Optional< OUString > id(
279cdf0e10cSrcweir level == 0
280cdf0e10cSrcweir ? beans::Optional< OUString >(
281cdf0e10cSrcweir true, dp_misc::getIdentifier( xPackage ) )
282cdf0e10cSrcweir : xPackage->getIdentifier() );
283cdf0e10cSrcweir if (id.IsPresent)
284cdf0e10cSrcweir printf_line( OUSTR("Identifier"), id.Value, level );
285cdf0e10cSrcweir OUString version(xPackage->getVersion());
286cdf0e10cSrcweir if (version.getLength() != 0)
287cdf0e10cSrcweir printf_line( OUSTR("Version"), version, level + 1 );
288cdf0e10cSrcweir printf_line( OUSTR("URL"), xPackage->getURL(), level + 1 );
289cdf0e10cSrcweir
290cdf0e10cSrcweir beans::Optional< beans::Ambiguous<sal_Bool> > option(
291cdf0e10cSrcweir xPackage->isRegistered( Reference<task::XAbortChannel>(), xCmdEnv ) );
292cdf0e10cSrcweir OUString value;
293cdf0e10cSrcweir if (option.IsPresent) {
294cdf0e10cSrcweir beans::Ambiguous<sal_Bool> const & reg = option.Value;
295cdf0e10cSrcweir if (reg.IsAmbiguous)
296cdf0e10cSrcweir value = OUSTR("unknown");
297cdf0e10cSrcweir else
298cdf0e10cSrcweir value = reg.Value ? OUSTR("yes") : OUSTR("no");
299cdf0e10cSrcweir }
300cdf0e10cSrcweir else
301cdf0e10cSrcweir value = OUSTR("n/a");
302cdf0e10cSrcweir printf_line( OUSTR("is registered"), value, level + 1 );
303cdf0e10cSrcweir
304cdf0e10cSrcweir const Reference<deployment::XPackageTypeInfo> xPackageType(
305cdf0e10cSrcweir xPackage->getPackageType() );
306cdf0e10cSrcweir OSL_ASSERT( xPackageType.is() );
307cdf0e10cSrcweir if (xPackageType.is()) {
308cdf0e10cSrcweir printf_line( OUSTR("Media-Type"),
309cdf0e10cSrcweir xPackageType->getMediaType(), level + 1 );
310cdf0e10cSrcweir }
311cdf0e10cSrcweir printf_line( OUSTR("Description"), xPackage->getDescription(), level + 1 );
312cdf0e10cSrcweir if (xPackage->isBundle()) {
313cdf0e10cSrcweir Sequence< Reference<deployment::XPackage> > seq(
314cdf0e10cSrcweir xPackage->getBundle( Reference<task::XAbortChannel>(), xCmdEnv ) );
315cdf0e10cSrcweir printf_space( level + 1 );
316cdf0e10cSrcweir dp_misc::writeConsole("bundled Packages: {\n");
317cdf0e10cSrcweir ::std::vector<Reference<deployment::XPackage> >vec_bundle;
318cdf0e10cSrcweir ::comphelper::sequenceToContainer(vec_bundle, seq);
319cdf0e10cSrcweir printf_packages( vec_bundle, ::std::vector<bool>(vec_bundle.size()),
320cdf0e10cSrcweir xCmdEnv, level + 2 );
321cdf0e10cSrcweir printf_space( level + 1 );
322cdf0e10cSrcweir dp_misc::writeConsole("}\n");
323cdf0e10cSrcweir }
324cdf0e10cSrcweir }
325cdf0e10cSrcweir
326cdf0e10cSrcweir } // anon namespace
327cdf0e10cSrcweir
printf_unaccepted_licenses(Reference<deployment::XPackage> const & ext)328cdf0e10cSrcweir void printf_unaccepted_licenses(
329cdf0e10cSrcweir Reference<deployment::XPackage> const & ext)
330cdf0e10cSrcweir {
331cdf0e10cSrcweir OUString id(
332cdf0e10cSrcweir dp_misc::getIdentifier(ext) );
333cdf0e10cSrcweir printf_line( OUSTR("Identifier"), id, 0 );
334cdf0e10cSrcweir printf_space(1);
335cdf0e10cSrcweir dp_misc::writeConsole(OUSTR("License not accepted\n\n"));
336cdf0e10cSrcweir }
337cdf0e10cSrcweir
338cdf0e10cSrcweir //==============================================================================
printf_packages(::std::vector<Reference<deployment::XPackage>> const & allExtensions,::std::vector<bool> const & vecUnaccepted,Reference<XCommandEnvironment> const & xCmdEnv,sal_Int32 level)339cdf0e10cSrcweir void printf_packages(
340cdf0e10cSrcweir ::std::vector< Reference<deployment::XPackage> > const & allExtensions,
341cdf0e10cSrcweir ::std::vector<bool> const & vecUnaccepted,
342cdf0e10cSrcweir Reference<XCommandEnvironment> const & xCmdEnv, sal_Int32 level )
343cdf0e10cSrcweir {
344cdf0e10cSrcweir OSL_ASSERT(allExtensions.size() == vecUnaccepted.size());
345cdf0e10cSrcweir
346cdf0e10cSrcweir if (allExtensions.size() == 0)
347cdf0e10cSrcweir {
348cdf0e10cSrcweir printf_space( level );
349cdf0e10cSrcweir dp_misc::writeConsole("<none>\n");
350cdf0e10cSrcweir }
351cdf0e10cSrcweir else
352cdf0e10cSrcweir {
353cdf0e10cSrcweir typedef ::std::vector< Reference<deployment::XPackage> >::const_iterator I_EXT;
354cdf0e10cSrcweir int index = 0;
355cdf0e10cSrcweir for (I_EXT i = allExtensions.begin(); i != allExtensions.end(); i++, index++)
356cdf0e10cSrcweir {
357cdf0e10cSrcweir if (vecUnaccepted[index])
358cdf0e10cSrcweir printf_unaccepted_licenses(*i);
359cdf0e10cSrcweir else
360cdf0e10cSrcweir printf_package( *i, xCmdEnv, level );
361cdf0e10cSrcweir dp_misc::writeConsole(OUSTR("\n"));
362cdf0e10cSrcweir }
363cdf0e10cSrcweir }
364cdf0e10cSrcweir }
365cdf0e10cSrcweir
366cdf0e10cSrcweir
367cdf0e10cSrcweir //##############################################################################
368cdf0e10cSrcweir
369cdf0e10cSrcweir namespace {
370cdf0e10cSrcweir
371cdf0e10cSrcweir //------------------------------------------------------------------------------
bootstrapStandAlone(DisposeGuard & disposeGuard,bool)372cdf0e10cSrcweir Reference<XComponentContext> bootstrapStandAlone(
373cdf0e10cSrcweir DisposeGuard & disposeGuard, bool /*verbose */)
374cdf0e10cSrcweir {
375cdf0e10cSrcweir Reference<XComponentContext> xContext =
376cdf0e10cSrcweir ::cppu::defaultBootstrap_InitialComponentContext();
377cdf0e10cSrcweir
378cdf0e10cSrcweir // assure disposing of local component context:
379cdf0e10cSrcweir disposeGuard.reset(
380cdf0e10cSrcweir Reference<lang::XComponent>( xContext, UNO_QUERY ) );
381cdf0e10cSrcweir
382cdf0e10cSrcweir Reference<lang::XMultiServiceFactory> xServiceManager(
383cdf0e10cSrcweir xContext->getServiceManager(), UNO_QUERY_THROW );
384cdf0e10cSrcweir // set global process service factory used by unotools config helpers
385cdf0e10cSrcweir ::utl::setProcessServiceFactory( xServiceManager );
386cdf0e10cSrcweir
387cdf0e10cSrcweir // initialize the ucbhelper ucb,
388cdf0e10cSrcweir // because the package implementation uses it
389cdf0e10cSrcweir Sequence<Any> ucb_args( 2 );
390cdf0e10cSrcweir ucb_args[ 0 ] <<= OUSTR(UCB_CONFIGURATION_KEY1_LOCAL);
391cdf0e10cSrcweir ucb_args[ 1 ] <<= OUSTR(UCB_CONFIGURATION_KEY2_OFFICE);
392cdf0e10cSrcweir if (! ::ucbhelper::ContentBroker::initialize( xServiceManager, ucb_args ))
393cdf0e10cSrcweir throw RuntimeException( OUSTR("cannot initialize UCB!"), 0 );
394cdf0e10cSrcweir
395cdf0e10cSrcweir disposeGuard.setDeinitUCB();
396cdf0e10cSrcweir return xContext;
397cdf0e10cSrcweir }
398cdf0e10cSrcweir
399cdf0e10cSrcweir //------------------------------------------------------------------------------
connectToOffice(Reference<XComponentContext> const & xLocalComponentContext,bool verbose)400cdf0e10cSrcweir Reference<XComponentContext> connectToOffice(
401cdf0e10cSrcweir Reference<XComponentContext> const & xLocalComponentContext,
402cdf0e10cSrcweir bool verbose )
403cdf0e10cSrcweir {
404cdf0e10cSrcweir Sequence<OUString> args( 3 );
405cdf0e10cSrcweir args[ 0 ] = OUSTR("-nologo");
406cdf0e10cSrcweir args[ 1 ] = OUSTR("-nodefault");
407cdf0e10cSrcweir
408cdf0e10cSrcweir OUString pipeId( ::dp_misc::generateRandomPipeId() );
409cdf0e10cSrcweir ::rtl::OUStringBuffer buf;
410cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("-accept=pipe,name=") );
411cdf0e10cSrcweir buf.append( pipeId );
412cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(";urp;") );
413cdf0e10cSrcweir args[ 2 ] = buf.makeStringAndClear();
414cdf0e10cSrcweir OUString appURL( getExecutableDir() + OUSTR("/soffice") );
415cdf0e10cSrcweir
416cdf0e10cSrcweir if (verbose)
417cdf0e10cSrcweir {
418cdf0e10cSrcweir dp_misc::writeConsole(
419cdf0e10cSrcweir OUSTR("Raising process: ") +
420cdf0e10cSrcweir appURL +
421cdf0e10cSrcweir OUSTR("\nArguments: -nologo -nodefault ") +
422cdf0e10cSrcweir args[2] +
423cdf0e10cSrcweir OUSTR("\n"));
424cdf0e10cSrcweir }
425cdf0e10cSrcweir
426cdf0e10cSrcweir ::dp_misc::raiseProcess( appURL, args );
427cdf0e10cSrcweir
428cdf0e10cSrcweir if (verbose)
429cdf0e10cSrcweir dp_misc::writeConsole("Ok. Connecting...");
430cdf0e10cSrcweir
431cdf0e10cSrcweir OSL_ASSERT( buf.getLength() == 0 );
432cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("uno:pipe,name=") );
433cdf0e10cSrcweir buf.append( pipeId );
434cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(
435cdf0e10cSrcweir ";urp;StarOffice.ComponentContext") );
436cdf0e10cSrcweir Reference<XComponentContext> xRet(
437cdf0e10cSrcweir ::dp_misc::resolveUnoURL(
438cdf0e10cSrcweir buf.makeStringAndClear(), xLocalComponentContext ),
439cdf0e10cSrcweir UNO_QUERY_THROW );
440cdf0e10cSrcweir if (verbose)
441cdf0e10cSrcweir dp_misc::writeConsole("Ok.\n");
442cdf0e10cSrcweir
443cdf0e10cSrcweir return xRet;
444cdf0e10cSrcweir }
445cdf0e10cSrcweir
446cdf0e10cSrcweir } // anon namespace
447cdf0e10cSrcweir
448cdf0e10cSrcweir /** returns the path to the lock file used by unopkg.
449cdf0e10cSrcweir @return the path. An empty string signifies an error.
450cdf0e10cSrcweir */
getLockFilePath()451cdf0e10cSrcweir OUString getLockFilePath()
452cdf0e10cSrcweir {
453cdf0e10cSrcweir OUString ret;
454*910823aeSJürgen Schmidt OUString sBootstrap(RTL_CONSTASCII_USTRINGPARAM("${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}"));
455cdf0e10cSrcweir rtl::Bootstrap::expandMacros(sBootstrap);
456cdf0e10cSrcweir OUString sAbs;
457cdf0e10cSrcweir if (::osl::File::E_None == ::osl::File::getAbsoluteFileURL(
458cdf0e10cSrcweir sBootstrap, OUSTR(".lock"), sAbs))
459cdf0e10cSrcweir {
460cdf0e10cSrcweir if (::osl::File::E_None ==
461cdf0e10cSrcweir ::osl::File::getSystemPathFromFileURL(sAbs, sBootstrap))
462cdf0e10cSrcweir {
463cdf0e10cSrcweir ret = sBootstrap;
464cdf0e10cSrcweir }
465cdf0e10cSrcweir }
466cdf0e10cSrcweir
467cdf0e10cSrcweir return ret;
468cdf0e10cSrcweir }
469cdf0e10cSrcweir //==============================================================================
getUNO(DisposeGuard & disposeGuard,bool verbose,bool shared,bool bGui,Reference<XComponentContext> & out_localContext)470cdf0e10cSrcweir Reference<XComponentContext> getUNO(
471cdf0e10cSrcweir DisposeGuard & disposeGuard, bool verbose, bool shared, bool bGui,
472cdf0e10cSrcweir Reference<XComponentContext> & out_localContext)
473cdf0e10cSrcweir {
474cdf0e10cSrcweir // do not create any user data (for the root user) in --shared mode:
475cdf0e10cSrcweir if (shared) {
476cdf0e10cSrcweir rtl::Bootstrap::set(
477cdf0e10cSrcweir rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CFG_CacheUrl")),
478cdf0e10cSrcweir rtl::OUString());
479cdf0e10cSrcweir }
480cdf0e10cSrcweir
481cdf0e10cSrcweir // hold lock during process runtime:
482cdf0e10cSrcweir static ::desktop::Lockfile s_lockfile( false /* no IPC server */ );
483cdf0e10cSrcweir Reference<XComponentContext> xComponentContext(
484cdf0e10cSrcweir bootstrapStandAlone( disposeGuard, verbose ) );
485cdf0e10cSrcweir out_localContext = xComponentContext;
486cdf0e10cSrcweir if (::dp_misc::office_is_running()) {
487cdf0e10cSrcweir xComponentContext.set(
488cdf0e10cSrcweir connectToOffice( xComponentContext, verbose ) );
489cdf0e10cSrcweir }
490cdf0e10cSrcweir else
491cdf0e10cSrcweir {
492cdf0e10cSrcweir if (! s_lockfile.check( 0 ))
493cdf0e10cSrcweir {
494cdf0e10cSrcweir String sMsg(ResId(RID_STR_CONCURRENTINSTANCE, *DeploymentResMgr::get()));
495cdf0e10cSrcweir //Create this string before we call DeInitVCL, because this will kill
496cdf0e10cSrcweir //the ResMgr
497cdf0e10cSrcweir String sError(ResId(RID_STR_UNOPKG_ERROR, *DeploymentResMgr::get()));
498cdf0e10cSrcweir
499cdf0e10cSrcweir sMsg = sMsg + OUSTR("\n") + getLockFilePath();
500cdf0e10cSrcweir
501cdf0e10cSrcweir if (bGui)
502cdf0e10cSrcweir {
503cdf0e10cSrcweir //We show a message box or print to the console that there
504cdf0e10cSrcweir //is another instance already running
505cdf0e10cSrcweir if ( ! InitVCL( Reference<lang::XMultiServiceFactory>(
506cdf0e10cSrcweir xComponentContext->getServiceManager(),
507cdf0e10cSrcweir UNO_QUERY_THROW ) ))
508cdf0e10cSrcweir throw RuntimeException( OUSTR("Cannot initialize VCL!"),
509cdf0e10cSrcweir NULL );
510cdf0e10cSrcweir {
511cdf0e10cSrcweir WarningBox warn(NULL, WB_OK | WB_DEF_OK, sMsg);
512cdf0e10cSrcweir warn.SetText(::utl::ConfigManager::GetDirectConfigProperty(
513cdf0e10cSrcweir ::utl::ConfigManager::PRODUCTNAME).get<OUString>());
514cdf0e10cSrcweir warn.SetIcon(0);
515cdf0e10cSrcweir warn.Execute();
516cdf0e10cSrcweir }
517cdf0e10cSrcweir DeInitVCL();
518cdf0e10cSrcweir }
519cdf0e10cSrcweir
520cdf0e10cSrcweir throw LockFileException(
521cdf0e10cSrcweir OUSTR("\n") + sError + sMsg + OUSTR("\n"));
522cdf0e10cSrcweir }
523cdf0e10cSrcweir }
524cdf0e10cSrcweir
525cdf0e10cSrcweir return xComponentContext;
526cdf0e10cSrcweir }
527cdf0e10cSrcweir
528cdf0e10cSrcweir //Determines if a folder does not contains a folder.
529cdf0e10cSrcweir //Return false may also mean that the status could not be determined
530cdf0e10cSrcweir //because some error occurred.
hasNoFolder(OUString const & folderUrl)531cdf0e10cSrcweir bool hasNoFolder(OUString const & folderUrl)
532cdf0e10cSrcweir {
533cdf0e10cSrcweir bool ret = false;
534cdf0e10cSrcweir OUString url = folderUrl;
535cdf0e10cSrcweir ::rtl::Bootstrap::expandMacros(url);
536cdf0e10cSrcweir ::osl::Directory dir(url);
537cdf0e10cSrcweir osl::File::RC rc = dir.open();
538cdf0e10cSrcweir if (rc == osl::File::E_None)
539cdf0e10cSrcweir {
540cdf0e10cSrcweir bool bFolderExist = false;
541cdf0e10cSrcweir osl::DirectoryItem i;
542cdf0e10cSrcweir osl::File::RC rcNext = osl::File::E_None;
543cdf0e10cSrcweir while ( (rcNext = dir.getNextItem(i)) == osl::File::E_None)
544cdf0e10cSrcweir {
545cdf0e10cSrcweir osl::FileStatus stat(FileStatusMask_Type);
546cdf0e10cSrcweir if (i.getFileStatus(stat) == osl::File::E_None)
547cdf0e10cSrcweir {
548cdf0e10cSrcweir if (stat.getFileType() == osl::FileStatus::Directory)
549cdf0e10cSrcweir {
550cdf0e10cSrcweir bFolderExist = true;
551cdf0e10cSrcweir break;
552cdf0e10cSrcweir }
553cdf0e10cSrcweir }
554cdf0e10cSrcweir else
555cdf0e10cSrcweir {
556cdf0e10cSrcweir dp_misc::writeConsole(
557cdf0e10cSrcweir OUSTR("unopkg: Error while investigating ") + url + OUSTR("\n"));
558cdf0e10cSrcweir break;
559cdf0e10cSrcweir }
560cdf0e10cSrcweir i = osl::DirectoryItem();
561cdf0e10cSrcweir }
562cdf0e10cSrcweir
563cdf0e10cSrcweir if (rcNext == osl::File::E_NOENT ||
564cdf0e10cSrcweir rcNext == osl::File::E_None)
565cdf0e10cSrcweir {
566cdf0e10cSrcweir if (!bFolderExist)
567cdf0e10cSrcweir ret = true;
568cdf0e10cSrcweir }
569cdf0e10cSrcweir else
570cdf0e10cSrcweir {
571cdf0e10cSrcweir dp_misc::writeConsole(
572cdf0e10cSrcweir OUSTR("unopkg: Error while investigating ") + url + OUSTR("\n"));
573cdf0e10cSrcweir }
574cdf0e10cSrcweir
575cdf0e10cSrcweir dir.close();
576cdf0e10cSrcweir }
577cdf0e10cSrcweir else
578cdf0e10cSrcweir {
579cdf0e10cSrcweir dp_misc::writeConsole(
580cdf0e10cSrcweir OUSTR("unopkg: Error while investigating ") + url + OUSTR("\n"));
581cdf0e10cSrcweir }
582cdf0e10cSrcweir return ret;
583cdf0e10cSrcweir }
584cdf0e10cSrcweir
removeFolder(OUString const & folderUrl)585cdf0e10cSrcweir void removeFolder(OUString const & folderUrl)
586cdf0e10cSrcweir {
587cdf0e10cSrcweir OUString url = folderUrl;
588cdf0e10cSrcweir ::rtl::Bootstrap::expandMacros(url);
589cdf0e10cSrcweir ::osl::Directory dir(url);
590cdf0e10cSrcweir ::osl::File::RC rc = dir.open();
591cdf0e10cSrcweir if (rc == osl::File::E_None)
592cdf0e10cSrcweir {
593cdf0e10cSrcweir ::osl::DirectoryItem i;
594cdf0e10cSrcweir ::osl::File::RC rcNext = ::osl::File::E_None;
595cdf0e10cSrcweir while ( (rcNext = dir.getNextItem(i)) == ::osl::File::E_None)
596cdf0e10cSrcweir {
597cdf0e10cSrcweir ::osl::FileStatus stat(FileStatusMask_Type | FileStatusMask_FileURL);
598cdf0e10cSrcweir if (i.getFileStatus(stat) == ::osl::File::E_None)
599cdf0e10cSrcweir {
600cdf0e10cSrcweir ::osl::FileStatus::Type t = stat.getFileType();
601cdf0e10cSrcweir if (t == ::osl::FileStatus::Directory)
602cdf0e10cSrcweir {
603cdf0e10cSrcweir //remove folder
604cdf0e10cSrcweir removeFolder(stat.getFileURL());
605cdf0e10cSrcweir }
606cdf0e10cSrcweir else if (t == ::osl::FileStatus::Regular)
607cdf0e10cSrcweir {
608cdf0e10cSrcweir //remove file
609cdf0e10cSrcweir ::osl::File::remove(stat.getFileURL());
610cdf0e10cSrcweir }
611cdf0e10cSrcweir else
612cdf0e10cSrcweir {
613cdf0e10cSrcweir OSL_ASSERT(0);
614cdf0e10cSrcweir }
615cdf0e10cSrcweir }
616cdf0e10cSrcweir else
617cdf0e10cSrcweir {
618cdf0e10cSrcweir dp_misc::writeConsole(
619cdf0e10cSrcweir OUSTR("unopkg: Error while investigating ") + url + OUSTR("\n"));
620cdf0e10cSrcweir break;
621cdf0e10cSrcweir }
622cdf0e10cSrcweir i = ::osl::DirectoryItem();
623cdf0e10cSrcweir }
624cdf0e10cSrcweir dir.close();
625cdf0e10cSrcweir ::osl::Directory::remove(url);
626cdf0e10cSrcweir }
627cdf0e10cSrcweir else if (rc != osl::File::E_NOENT)
628cdf0e10cSrcweir {
629cdf0e10cSrcweir dp_misc::writeConsole(
630cdf0e10cSrcweir OUSTR("unopkg: Error while removing ") + url + OUSTR("\n"));
631cdf0e10cSrcweir }
632cdf0e10cSrcweir }
633cdf0e10cSrcweir
634cdf0e10cSrcweir }
635