xref: /aosp_15_r20/system/incremental_delivery/libdataloader/include/dataloader.h (revision 9190c2a8bd3622b7aa9bd7bfe4b3aec77820f478)
1*9190c2a8SAndroid Build Coastguard Worker /*
2*9190c2a8SAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*9190c2a8SAndroid Build Coastguard Worker  *
4*9190c2a8SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*9190c2a8SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*9190c2a8SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*9190c2a8SAndroid Build Coastguard Worker  *
8*9190c2a8SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*9190c2a8SAndroid Build Coastguard Worker  *
10*9190c2a8SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*9190c2a8SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*9190c2a8SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*9190c2a8SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*9190c2a8SAndroid Build Coastguard Worker  * limitations under the License.
15*9190c2a8SAndroid Build Coastguard Worker  */
16*9190c2a8SAndroid Build Coastguard Worker #pragma once
17*9190c2a8SAndroid Build Coastguard Worker 
18*9190c2a8SAndroid Build Coastguard Worker #include <functional>
19*9190c2a8SAndroid Build Coastguard Worker #include <memory>
20*9190c2a8SAndroid Build Coastguard Worker #include <string>
21*9190c2a8SAndroid Build Coastguard Worker #include <vector>
22*9190c2a8SAndroid Build Coastguard Worker 
23*9190c2a8SAndroid Build Coastguard Worker #include "dataloader_ndk.h"
24*9190c2a8SAndroid Build Coastguard Worker #include "incfs.h"
25*9190c2a8SAndroid Build Coastguard Worker 
26*9190c2a8SAndroid Build Coastguard Worker namespace android::dataloader {
27*9190c2a8SAndroid Build Coastguard Worker 
28*9190c2a8SAndroid Build Coastguard Worker using DataLoaderStatus = ::DataLoaderStatus;
29*9190c2a8SAndroid Build Coastguard Worker template <class T>
30*9190c2a8SAndroid Build Coastguard Worker using Span = android::incfs::Span<T>;
31*9190c2a8SAndroid Build Coastguard Worker 
32*9190c2a8SAndroid Build Coastguard Worker struct DataLoader;
33*9190c2a8SAndroid Build Coastguard Worker struct DataLoaderParams;
34*9190c2a8SAndroid Build Coastguard Worker struct DataLoaderInstallationFile;
35*9190c2a8SAndroid Build Coastguard Worker struct FilesystemConnector;
36*9190c2a8SAndroid Build Coastguard Worker struct StatusListener;
37*9190c2a8SAndroid Build Coastguard Worker 
38*9190c2a8SAndroid Build Coastguard Worker using FileId = IncFsFileId;
39*9190c2a8SAndroid Build Coastguard Worker using Uid = IncFsUid;
40*9190c2a8SAndroid Build Coastguard Worker using ReadInfo = IncFsReadInfo;
41*9190c2a8SAndroid Build Coastguard Worker using ReadInfoWithUid = IncFsReadInfoWithUid;
42*9190c2a8SAndroid Build Coastguard Worker using DataBlock = IncFsDataBlock;
43*9190c2a8SAndroid Build Coastguard Worker 
44*9190c2a8SAndroid Build Coastguard Worker using FilesystemConnectorPtr = FilesystemConnector*;
45*9190c2a8SAndroid Build Coastguard Worker using StatusListenerPtr = StatusListener*;
46*9190c2a8SAndroid Build Coastguard Worker using ServiceConnectorPtr = DataLoaderServiceConnectorPtr;
47*9190c2a8SAndroid Build Coastguard Worker using ServiceParamsPtr = DataLoaderServiceParamsPtr;
48*9190c2a8SAndroid Build Coastguard Worker 
49*9190c2a8SAndroid Build Coastguard Worker using DataLoaderPtr = std::unique_ptr<DataLoader>;
50*9190c2a8SAndroid Build Coastguard Worker using DataLoaderInstallationFiles = Span<const ::DataLoaderInstallationFile>;
51*9190c2a8SAndroid Build Coastguard Worker using PendingReads = Span<const ReadInfo>;
52*9190c2a8SAndroid Build Coastguard Worker using PendingReadsWithUid = Span<const ReadInfoWithUid>;
53*9190c2a8SAndroid Build Coastguard Worker using PageReads = Span<const ReadInfo>;
54*9190c2a8SAndroid Build Coastguard Worker using PageReadsWithUid = Span<const ReadInfoWithUid>;
55*9190c2a8SAndroid Build Coastguard Worker using RawMetadata = std::vector<char>;
56*9190c2a8SAndroid Build Coastguard Worker using DataBlocks = Span<const DataBlock>;
57*9190c2a8SAndroid Build Coastguard Worker 
58*9190c2a8SAndroid Build Coastguard Worker constexpr int kBlockSize = INCFS_DATA_FILE_BLOCK_SIZE;
59*9190c2a8SAndroid Build Coastguard Worker 
60*9190c2a8SAndroid Build Coastguard Worker struct DataLoader {
61*9190c2a8SAndroid Build Coastguard Worker     using Factory = std::function<DataLoaderPtr(DataLoaderServiceVmPtr, const DataLoaderParams&)>;
62*9190c2a8SAndroid Build Coastguard Worker     static void initialize(Factory&& factory);
63*9190c2a8SAndroid Build Coastguard Worker 
~DataLoaderDataLoader64*9190c2a8SAndroid Build Coastguard Worker     virtual ~DataLoader() {}
65*9190c2a8SAndroid Build Coastguard Worker 
66*9190c2a8SAndroid Build Coastguard Worker     // Bitmask of supported features.
67*9190c2a8SAndroid Build Coastguard Worker     virtual DataLoaderFeatures getFeatures() const = 0;
68*9190c2a8SAndroid Build Coastguard Worker 
69*9190c2a8SAndroid Build Coastguard Worker     // Lifecycle.
70*9190c2a8SAndroid Build Coastguard Worker     virtual bool onCreate(const DataLoaderParams&, FilesystemConnectorPtr, StatusListenerPtr,
71*9190c2a8SAndroid Build Coastguard Worker                           ServiceConnectorPtr, ServiceParamsPtr) = 0;
72*9190c2a8SAndroid Build Coastguard Worker     virtual bool onStart() = 0;
73*9190c2a8SAndroid Build Coastguard Worker     virtual void onStop() = 0;
74*9190c2a8SAndroid Build Coastguard Worker     virtual void onDestroy() = 0;
75*9190c2a8SAndroid Build Coastguard Worker 
76*9190c2a8SAndroid Build Coastguard Worker     // FS callbacks.
77*9190c2a8SAndroid Build Coastguard Worker     virtual bool onPrepareImage(DataLoaderInstallationFiles addedFiles) = 0;
78*9190c2a8SAndroid Build Coastguard Worker 
79*9190c2a8SAndroid Build Coastguard Worker     // IFS callbacks.
80*9190c2a8SAndroid Build Coastguard Worker     virtual void onPendingReads(PendingReads pendingReads) = 0;
81*9190c2a8SAndroid Build Coastguard Worker     virtual void onPageReads(PageReads pageReads) = 0;
82*9190c2a8SAndroid Build Coastguard Worker 
83*9190c2a8SAndroid Build Coastguard Worker     virtual void onPendingReadsWithUid(PageReadsWithUid pendingReads) = 0;
84*9190c2a8SAndroid Build Coastguard Worker     virtual void onPageReadsWithUid(PendingReadsWithUid pageReads) = 0;
85*9190c2a8SAndroid Build Coastguard Worker };
86*9190c2a8SAndroid Build Coastguard Worker 
87*9190c2a8SAndroid Build Coastguard Worker struct DataLoaderParams {
typeDataLoaderParams88*9190c2a8SAndroid Build Coastguard Worker     DataLoaderType type() const { return mType; }
packageNameDataLoaderParams89*9190c2a8SAndroid Build Coastguard Worker     const std::string& packageName() const { return mPackageName; }
classNameDataLoaderParams90*9190c2a8SAndroid Build Coastguard Worker     const std::string& className() const { return mClassName; }
argumentsDataLoaderParams91*9190c2a8SAndroid Build Coastguard Worker     const std::string& arguments() const { return mArguments; }
92*9190c2a8SAndroid Build Coastguard Worker 
93*9190c2a8SAndroid Build Coastguard Worker     DataLoaderParams(DataLoaderType type, std::string&& packageName, std::string&& className,
94*9190c2a8SAndroid Build Coastguard Worker                      std::string&& arguments);
95*9190c2a8SAndroid Build Coastguard Worker 
96*9190c2a8SAndroid Build Coastguard Worker private:
97*9190c2a8SAndroid Build Coastguard Worker     DataLoaderType const mType;
98*9190c2a8SAndroid Build Coastguard Worker     std::string const mPackageName;
99*9190c2a8SAndroid Build Coastguard Worker     std::string const mClassName;
100*9190c2a8SAndroid Build Coastguard Worker     std::string const mArguments;
101*9190c2a8SAndroid Build Coastguard Worker };
102*9190c2a8SAndroid Build Coastguard Worker 
103*9190c2a8SAndroid Build Coastguard Worker struct DataLoaderInstallationFile {
locationDataLoaderInstallationFile104*9190c2a8SAndroid Build Coastguard Worker     DataLoaderLocation location() const { return mLocation; }
nameDataLoaderInstallationFile105*9190c2a8SAndroid Build Coastguard Worker     const std::string& name() const { return mName; }
sizeDataLoaderInstallationFile106*9190c2a8SAndroid Build Coastguard Worker     IncFsSize size() const { return mSize; }
metadataDataLoaderInstallationFile107*9190c2a8SAndroid Build Coastguard Worker     const RawMetadata& metadata() const { return mMetadata; }
108*9190c2a8SAndroid Build Coastguard Worker 
109*9190c2a8SAndroid Build Coastguard Worker     DataLoaderInstallationFile(DataLoaderLocation location, std::string&& name, IncFsSize size,
110*9190c2a8SAndroid Build Coastguard Worker                                RawMetadata&& metadata);
111*9190c2a8SAndroid Build Coastguard Worker 
112*9190c2a8SAndroid Build Coastguard Worker private:
113*9190c2a8SAndroid Build Coastguard Worker     DataLoaderLocation const mLocation;
114*9190c2a8SAndroid Build Coastguard Worker     std::string const mName;
115*9190c2a8SAndroid Build Coastguard Worker     IncFsSize const mSize;
116*9190c2a8SAndroid Build Coastguard Worker     RawMetadata const mMetadata;
117*9190c2a8SAndroid Build Coastguard Worker };
118*9190c2a8SAndroid Build Coastguard Worker 
119*9190c2a8SAndroid Build Coastguard Worker struct FilesystemConnector : public DataLoaderFilesystemConnector {
120*9190c2a8SAndroid Build Coastguard Worker     android::incfs::UniqueFd openForSpecialOps(FileId fid);
121*9190c2a8SAndroid Build Coastguard Worker     int writeBlocks(DataBlocks blocks);
122*9190c2a8SAndroid Build Coastguard Worker     RawMetadata getRawMetadata(FileId fid);
123*9190c2a8SAndroid Build Coastguard Worker     bool setParams(DataLoaderFilesystemParams);
124*9190c2a8SAndroid Build Coastguard Worker };
125*9190c2a8SAndroid Build Coastguard Worker 
126*9190c2a8SAndroid Build Coastguard Worker struct StatusListener : public DataLoaderStatusListener {
127*9190c2a8SAndroid Build Coastguard Worker     bool reportStatus(DataLoaderStatus status);
128*9190c2a8SAndroid Build Coastguard Worker };
129*9190c2a8SAndroid Build Coastguard Worker 
130*9190c2a8SAndroid Build Coastguard Worker } // namespace android::dataloader
131*9190c2a8SAndroid Build Coastguard Worker 
132*9190c2a8SAndroid Build Coastguard Worker #include "dataloader_inline.h"
133