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