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