blob: 84bf1ffaf45cca81356ec3b92fc4070cc1885cfe [file] [log] [blame]
Songchun Fan3c82a302019-11-29 14:23:45 -08001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
Alex Buynytskyy1d892162020-04-03 23:00:19 -070019#include "IncrementalServiceValidation.h"
20
Songchun Fan3c82a302019-11-29 14:23:45 -080021#include <android-base/strings.h>
22#include <android-base/unique_fd.h>
23#include <android/content/pm/DataLoaderParamsParcel.h>
24#include <android/content/pm/FileSystemControlParcel.h>
Songchun Fan68645c42020-02-27 15:57:35 -080025#include <android/content/pm/IDataLoader.h>
26#include <android/content/pm/IDataLoaderManager.h>
Songchun Fan3c82a302019-11-29 14:23:45 -080027#include <android/content/pm/IDataLoaderStatusListener.h>
28#include <android/os/IVold.h>
Alex Buynytskyy96e350b2020-04-02 20:03:47 -070029#include <binder/AppOpsManager.h>
Songchun Fan3c82a302019-11-29 14:23:45 -080030#include <binder/IServiceManager.h>
31#include <incfs.h>
32
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080033#include <memory>
Songchun Fan3c82a302019-11-29 14:23:45 -080034#include <string>
35#include <string_view>
36
37using namespace android::incfs;
38using namespace android::content::pm;
39
40namespace android::os::incremental {
41
42// --- Wrapper interfaces ---
43
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080044using MountId = int32_t;
45
Songchun Fan3c82a302019-11-29 14:23:45 -080046class VoldServiceWrapper {
47public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080048 virtual ~VoldServiceWrapper() = default;
49 virtual binder::Status mountIncFs(const std::string& backingPath, const std::string& targetDir,
Songchun Fan3c82a302019-11-29 14:23:45 -080050 int32_t flags,
51 IncrementalFileSystemControlParcel* _aidl_return) const = 0;
52 virtual binder::Status unmountIncFs(const std::string& dir) const = 0;
53 virtual binder::Status bindMount(const std::string& sourceDir,
54 const std::string& targetDir) const = 0;
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -070055 virtual binder::Status setIncFsMountOptions(const ::android::os::incremental::IncrementalFileSystemControlParcel& control, bool enableReadLogs) const = 0;
Songchun Fan3c82a302019-11-29 14:23:45 -080056};
57
Songchun Fan68645c42020-02-27 15:57:35 -080058class DataLoaderManagerWrapper {
Songchun Fan3c82a302019-11-29 14:23:45 -080059public:
Songchun Fan68645c42020-02-27 15:57:35 -080060 virtual ~DataLoaderManagerWrapper() = default;
61 virtual binder::Status initializeDataLoader(MountId mountId,
62 const DataLoaderParamsParcel& params,
63 const FileSystemControlParcel& control,
64 const sp<IDataLoaderStatusListener>& listener,
65 bool* _aidl_return) const = 0;
66 virtual binder::Status getDataLoader(MountId mountId, sp<IDataLoader>* _aidl_return) const = 0;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080067 virtual binder::Status destroyDataLoader(MountId mountId) const = 0;
Songchun Fan3c82a302019-11-29 14:23:45 -080068};
69
70class IncFsWrapper {
71public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080072 virtual ~IncFsWrapper() = default;
Songchun Fan20d6ef22020-03-03 09:47:15 -080073 virtual Control createControl(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs) const = 0;
74 virtual ErrorCode makeFile(const Control& control, std::string_view path, int mode, FileId id,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080075 NewFileParams params) const = 0;
Songchun Fan20d6ef22020-03-03 09:47:15 -080076 virtual ErrorCode makeDir(const Control& control, std::string_view path, int mode) const = 0;
77 virtual RawMetadata getMetadata(const Control& control, FileId fileid) const = 0;
78 virtual RawMetadata getMetadata(const Control& control, std::string_view path) const = 0;
79 virtual FileId getFileId(const Control& control, std::string_view path) const = 0;
80 virtual ErrorCode link(const Control& control, std::string_view from,
81 std::string_view to) const = 0;
82 virtual ErrorCode unlink(const Control& control, std::string_view path) const = 0;
Yurii Zubrytskyie82cdd72020-04-01 12:19:26 -070083 virtual base::unique_fd openForSpecialOps(const Control& control, FileId id) const = 0;
Songchun Fan9b753082020-02-26 13:08:06 -080084 virtual ErrorCode writeBlocks(Span<const DataBlock> blocks) const = 0;
Songchun Fan3c82a302019-11-29 14:23:45 -080085};
86
Alex Buynytskyy96e350b2020-04-02 20:03:47 -070087class AppOpsManagerWrapper {
88public:
89 virtual ~AppOpsManagerWrapper() = default;
Alex Buynytskyy1d892162020-04-03 23:00:19 -070090 virtual binder::Status checkPermission(const char* permission, const char* operation,
91 const char* package) const = 0;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -070092 virtual void startWatchingMode(int32_t op, const String16& packageName, const sp<IAppOpsCallback>& callback) = 0;
Alex Buynytskyy1d892162020-04-03 23:00:19 -070093 virtual void stopWatchingMode(const sp<IAppOpsCallback>& callback) = 0;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -070094};
95
Songchun Fan3c82a302019-11-29 14:23:45 -080096class ServiceManagerWrapper {
97public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080098 virtual ~ServiceManagerWrapper() = default;
99 virtual std::unique_ptr<VoldServiceWrapper> getVoldService() = 0;
Songchun Fan68645c42020-02-27 15:57:35 -0800100 virtual std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() = 0;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800101 virtual std::unique_ptr<IncFsWrapper> getIncFs() = 0;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700102 virtual std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() = 0;
Songchun Fan3c82a302019-11-29 14:23:45 -0800103};
104
105// --- Real stuff ---
106
107class RealVoldService : public VoldServiceWrapper {
108public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800109 RealVoldService(const sp<os::IVold> vold) : mInterface(std::move(vold)) {}
Songchun Fan3c82a302019-11-29 14:23:45 -0800110 ~RealVoldService() = default;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800111 binder::Status mountIncFs(const std::string& backingPath, const std::string& targetDir,
Songchun Fan3c82a302019-11-29 14:23:45 -0800112 int32_t flags,
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700113 IncrementalFileSystemControlParcel* _aidl_return) const final {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800114 return mInterface->mountIncFs(backingPath, targetDir, flags, _aidl_return);
Songchun Fan3c82a302019-11-29 14:23:45 -0800115 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700116 binder::Status unmountIncFs(const std::string& dir) const final {
Songchun Fan3c82a302019-11-29 14:23:45 -0800117 return mInterface->unmountIncFs(dir);
118 }
119 binder::Status bindMount(const std::string& sourceDir,
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700120 const std::string& targetDir) const final {
Songchun Fan3c82a302019-11-29 14:23:45 -0800121 return mInterface->bindMount(sourceDir, targetDir);
122 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700123 binder::Status setIncFsMountOptions(
124 const ::android::os::incremental::IncrementalFileSystemControlParcel& control,
125 bool enableReadLogs) const final {
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -0700126 return mInterface->setIncFsMountOptions(control, enableReadLogs);
127 }
Songchun Fan3c82a302019-11-29 14:23:45 -0800128
129private:
130 sp<os::IVold> mInterface;
131};
132
Songchun Fan68645c42020-02-27 15:57:35 -0800133class RealDataLoaderManager : public DataLoaderManagerWrapper {
Songchun Fan3c82a302019-11-29 14:23:45 -0800134public:
Songchun Fan68645c42020-02-27 15:57:35 -0800135 RealDataLoaderManager(const sp<content::pm::IDataLoaderManager> manager)
Songchun Fan3c82a302019-11-29 14:23:45 -0800136 : mInterface(manager) {}
Songchun Fan68645c42020-02-27 15:57:35 -0800137 ~RealDataLoaderManager() = default;
138 binder::Status initializeDataLoader(MountId mountId, const DataLoaderParamsParcel& params,
139 const FileSystemControlParcel& control,
140 const sp<IDataLoaderStatusListener>& listener,
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700141 bool* _aidl_return) const final {
Songchun Fan68645c42020-02-27 15:57:35 -0800142 return mInterface->initializeDataLoader(mountId, params, control, listener, _aidl_return);
Songchun Fan3c82a302019-11-29 14:23:45 -0800143 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700144 binder::Status getDataLoader(MountId mountId, sp<IDataLoader>* _aidl_return) const final {
Songchun Fan68645c42020-02-27 15:57:35 -0800145 return mInterface->getDataLoader(mountId, _aidl_return);
Songchun Fan3c82a302019-11-29 14:23:45 -0800146 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700147 binder::Status destroyDataLoader(MountId mountId) const final {
Songchun Fan3c82a302019-11-29 14:23:45 -0800148 return mInterface->destroyDataLoader(mountId);
149 }
Songchun Fan3c82a302019-11-29 14:23:45 -0800150
151private:
Songchun Fan68645c42020-02-27 15:57:35 -0800152 sp<content::pm::IDataLoaderManager> mInterface;
Songchun Fan3c82a302019-11-29 14:23:45 -0800153};
154
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700155class RealAppOpsManager : public AppOpsManagerWrapper {
156public:
157 ~RealAppOpsManager() = default;
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700158 binder::Status checkPermission(const char* permission, const char* operation,
159 const char* package) const final {
160 return android::incremental::CheckPermissionForDataDelivery(permission, operation, package);
161 }
162 void startWatchingMode(int32_t op, const String16& packageName,
163 const sp<IAppOpsCallback>& callback) final {
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700164 mAppOpsManager.startWatchingMode(op, packageName, callback);
165 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700166 void stopWatchingMode(const sp<IAppOpsCallback>& callback) final {
167 mAppOpsManager.stopWatchingMode(callback);
168 }
169
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700170private:
171 android::AppOpsManager mAppOpsManager;
172};
173
Songchun Fan3c82a302019-11-29 14:23:45 -0800174class RealServiceManager : public ServiceManagerWrapper {
175public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800176 RealServiceManager(sp<IServiceManager> serviceManager);
Songchun Fan3c82a302019-11-29 14:23:45 -0800177 ~RealServiceManager() = default;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700178 std::unique_ptr<VoldServiceWrapper> getVoldService() final;
179 std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final;
180 std::unique_ptr<IncFsWrapper> getIncFs() final;
181 std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final;
Songchun Fan3c82a302019-11-29 14:23:45 -0800182
183private:
184 template <class INTERFACE>
185 sp<INTERFACE> getRealService(std::string_view serviceName) const;
186 sp<android::IServiceManager> mServiceManager;
187};
188
189class RealIncFs : public IncFsWrapper {
190public:
191 RealIncFs() = default;
192 ~RealIncFs() = default;
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700193 Control createControl(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs) const final {
Songchun Fan20d6ef22020-03-03 09:47:15 -0800194 return incfs::createControl(cmd, pendingReads, logs);
195 }
196 ErrorCode makeFile(const Control& control, std::string_view path, int mode, FileId id,
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700197 NewFileParams params) const final {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800198 return incfs::makeFile(control, path, mode, id, params);
Songchun Fan3c82a302019-11-29 14:23:45 -0800199 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700200 ErrorCode makeDir(const Control& control, std::string_view path, int mode) const final {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800201 return incfs::makeDir(control, path, mode);
Songchun Fan3c82a302019-11-29 14:23:45 -0800202 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700203 RawMetadata getMetadata(const Control& control, FileId fileid) const final {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800204 return incfs::getMetadata(control, fileid);
Songchun Fan3c82a302019-11-29 14:23:45 -0800205 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700206 RawMetadata getMetadata(const Control& control, std::string_view path) const final {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800207 return incfs::getMetadata(control, path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800208 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700209 FileId getFileId(const Control& control, std::string_view path) const final {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800210 return incfs::getFileId(control, path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800211 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700212 ErrorCode link(const Control& control, std::string_view from, std::string_view to) const final {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800213 return incfs::link(control, from, to);
214 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700215 ErrorCode unlink(const Control& control, std::string_view path) const final {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800216 return incfs::unlink(control, path);
217 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700218 base::unique_fd openForSpecialOps(const Control& control, FileId id) const final {
Yurii Zubrytskyie82cdd72020-04-01 12:19:26 -0700219 return base::unique_fd{incfs::openForSpecialOps(control, id).release()};
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800220 }
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700221 ErrorCode writeBlocks(Span<const DataBlock> blocks) const final {
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800222 return incfs::writeBlocks(blocks);
Songchun Fan3c82a302019-11-29 14:23:45 -0800223 }
224};
225
226} // namespace android::os::incremental