GPU-Calc: remove Alloc_Host_Ptr for clmem of NAN vector
[LibreOffice.git] / desktop / source / app / userinstall.cxx
blob7780064b8fce1c172265ab6ea1dc458f8764523b
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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"
22 #include <cassert>
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"
29 #include "osl/file.h"
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 {
39 namespace {
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) {
48 return e;
50 osl::FileStatus stat1(osl_FileStatus_Mask_Type);
51 e = item.getFileStatus(stat1);
52 if (e != osl::FileBase::E_None) {
53 return e;
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) {
58 return e;
60 osl::Directory dir(srcUri);
61 e = dir.open();
62 if (e != osl::FileBase::E_None) {
63 return e;
65 for (;;) {
66 e = dir.getNextItem(item);
67 if (e == osl::FileBase::E_NOENT) {
68 break;
70 if (e != osl::FileBase::E_None) {
71 return e;
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) {
77 return e;
79 assert(!dstUri.endsWith("/"));
80 e = copyRecursive(
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) {
85 return e;
88 e = dir.close();
89 } else {
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;
96 return e;
98 #endif
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) {
103 return ERROR_OTHER;
105 #if !(defined ANDROID || defined IOS)
106 #if defined UNIX
107 // Set safer permissions for the user directory by default:
108 osl::File::setAttributes(
109 uri,
110 (osl_File_Attribute_OwnWrite | osl_File_Attribute_OwnRead
111 | osl_File_Attribute_OwnExe));
112 #endif
113 // As of now osl_copyFile does not work on Android => don't do this:
114 OUString baseUri;
115 if (utl::Bootstrap::locateBaseInstallation(baseUri)
116 != utl::Bootstrap::PATH_EXISTS)
118 return ERROR_OTHER;
120 switch (copyRecursive(
121 baseUri + "/" LIBO_SHARE_PRESETS_FOLDER, uri + "/user"))
123 case osl::FileBase::E_None:
124 break;
125 case osl::FileBase::E_ACCES:
126 return ERROR_CANT_WRITE;
127 case osl::FileBase::E_NOSPC:
128 return ERROR_NO_SPACE;
129 default:
130 return ERROR_OTHER;
132 #endif
133 boost::shared_ptr<comphelper::ConfigurationChanges> batch(
134 comphelper::ConfigurationChanges::create());
135 officecfg::Setup::Office::ooSetupInstCompleted::set(true, batch);
136 batch->commit();
137 return CREATED;
140 bool isCreated() {
141 try {
142 return officecfg::Setup::Office::ooSetupInstCompleted::get();
143 } catch (css::uno::Exception & e) {
144 SAL_WARN("desktop.app", "ignoring Exception \"" << e.Message << "\"");
145 return false;
151 Status finalize() {
152 OUString uri;
153 switch (utl::Bootstrap::locateUserInstallation(uri)) {
154 case utl::Bootstrap::PATH_EXISTS:
155 if (isCreated()) {
156 return EXISTED;
158 // fall through
159 case utl::Bootstrap::PATH_VALID:
160 return create(uri);
161 default:
162 return ERROR_OTHER;
168 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */