1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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 "sal/config.h"
24 #include "boost/shared_ptr.hpp"
25 #include "com/sun/star/uno/Exception.hpp"
26 #include "comphelper/configuration.hxx"
27 #include "config_folders.h"
28 #include "officecfg/Setup.hxx"
30 #include "osl/file.hxx"
31 #include "rtl/ustring.hxx"
32 #include "sal/log.hxx"
33 #include "unotools/bootstrap.hxx"
35 #include "userinstall.hxx"
37 namespace desktop
{ namespace userinstall
{
41 #if !(defined ANDROID || defined IOS)
42 osl::FileBase::RC
copyRecursive(
43 OUString
const & srcUri
, OUString
const & dstUri
)
45 osl::DirectoryItem item
;
46 osl::FileBase::RC e
= osl::DirectoryItem::get(srcUri
, item
);
47 if (e
!= osl::FileBase::E_None
) {
50 osl::FileStatus
stat1(osl_FileStatus_Mask_Type
);
51 e
= item
.getFileStatus(stat1
);
52 if (e
!= osl::FileBase::E_None
) {
55 if (stat1
.getFileType() == osl::FileStatus::Directory
) {
56 e
= osl::Directory::create(dstUri
);
57 if (e
!= osl::FileBase::E_None
&& e
!= osl::FileBase::E_EXIST
) {
60 osl::Directory
dir(srcUri
);
62 if (e
!= osl::FileBase::E_None
) {
66 e
= dir
.getNextItem(item
);
67 if (e
== osl::FileBase::E_NOENT
) {
70 if (e
!= osl::FileBase::E_None
) {
73 osl::FileStatus
stat2(
74 osl_FileStatus_Mask_FileName
| osl_FileStatus_Mask_FileURL
);
75 e
= item
.getFileStatus(stat2
);
76 if (e
!= osl::FileBase::E_None
) {
79 assert(!dstUri
.endsWith("/"));
81 stat2
.getFileURL(), dstUri
+ "/" + stat2
.getFileName());
82 // assumes that all files under presets/ have names that can be
83 // copied unencoded into file URLs
84 if (e
!= osl::FileBase::E_None
) {
90 e
= osl::File::copy(srcUri
, dstUri
);
91 if (e
== osl::FileBase::E_EXIST
) {
92 // Assume an earlier attempt failed half-way through:
93 e
= osl::FileBase::E_None
;
100 Status
create(OUString
const & uri
) {
101 osl::FileBase::RC e
= osl::Directory::createPath(uri
);
102 if (e
!= osl::FileBase::E_None
&& e
!= osl::FileBase::E_EXIST
) {
105 #if !(defined ANDROID || defined IOS)
107 // Set safer permissions for the user directory by default:
108 osl::File::setAttributes(
110 (osl_File_Attribute_OwnWrite
| osl_File_Attribute_OwnRead
111 | osl_File_Attribute_OwnExe
));
113 // As of now osl_copyFile does not work on Android => don't do this:
115 if (utl::Bootstrap::locateBaseInstallation(baseUri
)
116 != utl::Bootstrap::PATH_EXISTS
)
120 switch (copyRecursive(
121 baseUri
+ "/" LIBO_SHARE_PRESETS_FOLDER
, uri
+ "/user"))
123 case osl::FileBase::E_None
:
125 case osl::FileBase::E_ACCES
:
126 return ERROR_CANT_WRITE
;
127 case osl::FileBase::E_NOSPC
:
128 return ERROR_NO_SPACE
;
133 boost::shared_ptr
<comphelper::ConfigurationChanges
> batch(
134 comphelper::ConfigurationChanges::create());
135 officecfg::Setup::Office::ooSetupInstCompleted::set(true, batch
);
142 return officecfg::Setup::Office::ooSetupInstCompleted::get();
143 } catch (css::uno::Exception
& e
) {
144 SAL_WARN("desktop.app", "ignoring Exception \"" << e
.Message
<< "\"");
153 switch (utl::Bootstrap::locateUserInstallation(uri
)) {
154 case utl::Bootstrap::PATH_EXISTS
:
159 case utl::Bootstrap::PATH_VALID
:
168 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */