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 "dataloader.h"
19*9190c2a8SAndroid Build Coastguard Worker
20*9190c2a8SAndroid Build Coastguard Worker namespace android::dataloader {
21*9190c2a8SAndroid Build Coastguard Worker namespace details {
22*9190c2a8SAndroid Build Coastguard Worker
23*9190c2a8SAndroid Build Coastguard Worker struct DataLoaderImpl : public ::DataLoader {
DataLoaderImplDataLoaderImpl24*9190c2a8SAndroid Build Coastguard Worker DataLoaderImpl(DataLoaderPtr&& dataLoader) : mDataLoader(std::move(dataLoader)) {
25*9190c2a8SAndroid Build Coastguard Worker getFeatures = [](DataLoader* self) -> DataLoaderFeatures {
26*9190c2a8SAndroid Build Coastguard Worker return static_cast<DataLoaderImpl*>(self)->mDataLoader->getFeatures();
27*9190c2a8SAndroid Build Coastguard Worker };
28*9190c2a8SAndroid Build Coastguard Worker onStart = [](DataLoader* self) -> bool {
29*9190c2a8SAndroid Build Coastguard Worker return static_cast<DataLoaderImpl*>(self)->mDataLoader->onStart();
30*9190c2a8SAndroid Build Coastguard Worker };
31*9190c2a8SAndroid Build Coastguard Worker onStop = [](DataLoader* self) {
32*9190c2a8SAndroid Build Coastguard Worker return static_cast<DataLoaderImpl*>(self)->mDataLoader->onStop();
33*9190c2a8SAndroid Build Coastguard Worker };
34*9190c2a8SAndroid Build Coastguard Worker onDestroy = [](DataLoader* self) {
35*9190c2a8SAndroid Build Coastguard Worker auto me = static_cast<DataLoaderImpl*>(self);
36*9190c2a8SAndroid Build Coastguard Worker me->mDataLoader->onDestroy();
37*9190c2a8SAndroid Build Coastguard Worker delete me;
38*9190c2a8SAndroid Build Coastguard Worker };
39*9190c2a8SAndroid Build Coastguard Worker onPrepareImage = [](DataLoader* self, const ::DataLoaderInstallationFile addedFiles[],
40*9190c2a8SAndroid Build Coastguard Worker int addedFilesCount) -> bool {
41*9190c2a8SAndroid Build Coastguard Worker return static_cast<DataLoaderImpl*>(self)->mDataLoader->onPrepareImage(
42*9190c2a8SAndroid Build Coastguard Worker DataLoaderInstallationFiles(addedFiles, addedFilesCount));
43*9190c2a8SAndroid Build Coastguard Worker };
44*9190c2a8SAndroid Build Coastguard Worker onPendingReads = [](DataLoader* self, const IncFsReadInfo pendingReads[],
45*9190c2a8SAndroid Build Coastguard Worker int pendingReadsCount) {
46*9190c2a8SAndroid Build Coastguard Worker return static_cast<DataLoaderImpl*>(self)->mDataLoader->onPendingReads(
47*9190c2a8SAndroid Build Coastguard Worker PendingReads(pendingReads, pendingReadsCount));
48*9190c2a8SAndroid Build Coastguard Worker };
49*9190c2a8SAndroid Build Coastguard Worker onPageReads = [](DataLoader* self, const IncFsReadInfo pageReads[], int pageReadsCount) {
50*9190c2a8SAndroid Build Coastguard Worker return static_cast<DataLoaderImpl*>(self)->mDataLoader->onPageReads(
51*9190c2a8SAndroid Build Coastguard Worker PageReads(pageReads, pageReadsCount));
52*9190c2a8SAndroid Build Coastguard Worker };
53*9190c2a8SAndroid Build Coastguard Worker onPendingReadsWithUid = [](DataLoader* self, const IncFsReadInfoWithUid pendingReads[],
54*9190c2a8SAndroid Build Coastguard Worker int pendingReadsCount) {
55*9190c2a8SAndroid Build Coastguard Worker return static_cast<DataLoaderImpl*>(self)->mDataLoader->onPendingReadsWithUid(
56*9190c2a8SAndroid Build Coastguard Worker PendingReadsWithUid(pendingReads, pendingReadsCount));
57*9190c2a8SAndroid Build Coastguard Worker };
58*9190c2a8SAndroid Build Coastguard Worker onPageReadsWithUid = [](DataLoader* self, const IncFsReadInfoWithUid pageReads[],
59*9190c2a8SAndroid Build Coastguard Worker int pageReadsCount) {
60*9190c2a8SAndroid Build Coastguard Worker return static_cast<DataLoaderImpl*>(self)->mDataLoader->onPageReadsWithUid(
61*9190c2a8SAndroid Build Coastguard Worker PageReadsWithUid(pageReads, pageReadsCount));
62*9190c2a8SAndroid Build Coastguard Worker };
63*9190c2a8SAndroid Build Coastguard Worker }
64*9190c2a8SAndroid Build Coastguard Worker
65*9190c2a8SAndroid Build Coastguard Worker private:
66*9190c2a8SAndroid Build Coastguard Worker DataLoaderPtr mDataLoader;
67*9190c2a8SAndroid Build Coastguard Worker };
68*9190c2a8SAndroid Build Coastguard Worker
createParams(const::DataLoaderParams * params)69*9190c2a8SAndroid Build Coastguard Worker inline DataLoaderParams createParams(const ::DataLoaderParams* params) {
70*9190c2a8SAndroid Build Coastguard Worker const DataLoaderType type((DataLoaderType)params->type);
71*9190c2a8SAndroid Build Coastguard Worker std::string packageName(params->packageName);
72*9190c2a8SAndroid Build Coastguard Worker std::string className(params->className);
73*9190c2a8SAndroid Build Coastguard Worker std::string arguments(params->arguments);
74*9190c2a8SAndroid Build Coastguard Worker return DataLoaderParams(type, std::move(packageName), std::move(className),
75*9190c2a8SAndroid Build Coastguard Worker std::move(arguments));
76*9190c2a8SAndroid Build Coastguard Worker }
77*9190c2a8SAndroid Build Coastguard Worker
createInstallationFile(const::DataLoaderInstallationFile * file)78*9190c2a8SAndroid Build Coastguard Worker inline DataLoaderInstallationFile createInstallationFile(const ::DataLoaderInstallationFile* file) {
79*9190c2a8SAndroid Build Coastguard Worker const DataLoaderLocation location((DataLoaderLocation)file->location);
80*9190c2a8SAndroid Build Coastguard Worker std::string name(file->name);
81*9190c2a8SAndroid Build Coastguard Worker IncFsSize size(file->size);
82*9190c2a8SAndroid Build Coastguard Worker RawMetadata metadata(file->metadata.data, file->metadata.data + file->metadata.size);
83*9190c2a8SAndroid Build Coastguard Worker return DataLoaderInstallationFile(location, std::move(name), size, std::move(metadata));
84*9190c2a8SAndroid Build Coastguard Worker }
85*9190c2a8SAndroid Build Coastguard Worker
86*9190c2a8SAndroid Build Coastguard Worker struct DataLoaderFactoryImpl : public ::DataLoaderFactory {
DataLoaderFactoryImplDataLoaderFactoryImpl87*9190c2a8SAndroid Build Coastguard Worker DataLoaderFactoryImpl(DataLoader::Factory&& factory) : mFactory(factory) {
88*9190c2a8SAndroid Build Coastguard Worker onCreate = [](::DataLoaderFactory* self, const ::DataLoaderParams* ndkParams,
89*9190c2a8SAndroid Build Coastguard Worker ::DataLoaderFilesystemConnectorPtr fsConnector,
90*9190c2a8SAndroid Build Coastguard Worker ::DataLoaderStatusListenerPtr statusListener, ::DataLoaderServiceVmPtr vm,
91*9190c2a8SAndroid Build Coastguard Worker ::DataLoaderServiceConnectorPtr serviceConnector,
92*9190c2a8SAndroid Build Coastguard Worker ::DataLoaderServiceParamsPtr serviceParams) {
93*9190c2a8SAndroid Build Coastguard Worker auto me = static_cast<DataLoaderFactoryImpl*>(self);
94*9190c2a8SAndroid Build Coastguard Worker ::DataLoader* result = nullptr;
95*9190c2a8SAndroid Build Coastguard Worker auto params = createParams(ndkParams);
96*9190c2a8SAndroid Build Coastguard Worker auto dataLoader = me->mFactory(vm, params);
97*9190c2a8SAndroid Build Coastguard Worker if (!dataLoader ||
98*9190c2a8SAndroid Build Coastguard Worker !dataLoader->onCreate(params, static_cast<FilesystemConnector*>(fsConnector),
99*9190c2a8SAndroid Build Coastguard Worker static_cast<StatusListener*>(statusListener),
100*9190c2a8SAndroid Build Coastguard Worker serviceConnector, serviceParams)) {
101*9190c2a8SAndroid Build Coastguard Worker return result;
102*9190c2a8SAndroid Build Coastguard Worker }
103*9190c2a8SAndroid Build Coastguard Worker result = new DataLoaderImpl(std::move(dataLoader));
104*9190c2a8SAndroid Build Coastguard Worker return result;
105*9190c2a8SAndroid Build Coastguard Worker };
106*9190c2a8SAndroid Build Coastguard Worker }
107*9190c2a8SAndroid Build Coastguard Worker
108*9190c2a8SAndroid Build Coastguard Worker private:
109*9190c2a8SAndroid Build Coastguard Worker DataLoader::Factory mFactory;
110*9190c2a8SAndroid Build Coastguard Worker };
111*9190c2a8SAndroid Build Coastguard Worker
112*9190c2a8SAndroid Build Coastguard Worker } // namespace details
113*9190c2a8SAndroid Build Coastguard Worker
initialize(DataLoader::Factory && factory)114*9190c2a8SAndroid Build Coastguard Worker inline void DataLoader::initialize(DataLoader::Factory&& factory) {
115*9190c2a8SAndroid Build Coastguard Worker DataLoader_Initialize_WithFeatures(new details::DataLoaderFactoryImpl(std::move(factory)));
116*9190c2a8SAndroid Build Coastguard Worker }
117*9190c2a8SAndroid Build Coastguard Worker
DataLoaderParams(DataLoaderType type,std::string && packageName,std::string && className,std::string && arguments)118*9190c2a8SAndroid Build Coastguard Worker inline DataLoaderParams::DataLoaderParams(DataLoaderType type, std::string&& packageName,
119*9190c2a8SAndroid Build Coastguard Worker std::string&& className, std::string&& arguments)
120*9190c2a8SAndroid Build Coastguard Worker : mType(type),
121*9190c2a8SAndroid Build Coastguard Worker mPackageName(std::move(packageName)),
122*9190c2a8SAndroid Build Coastguard Worker mClassName(std::move(className)),
123*9190c2a8SAndroid Build Coastguard Worker mArguments(std::move(arguments)) {}
124*9190c2a8SAndroid Build Coastguard Worker
DataLoaderInstallationFile(DataLoaderLocation location,std::string && name,IncFsSize size,RawMetadata && metadata)125*9190c2a8SAndroid Build Coastguard Worker inline DataLoaderInstallationFile::DataLoaderInstallationFile(DataLoaderLocation location,
126*9190c2a8SAndroid Build Coastguard Worker std::string&& name, IncFsSize size,
127*9190c2a8SAndroid Build Coastguard Worker RawMetadata&& metadata)
128*9190c2a8SAndroid Build Coastguard Worker : mLocation(location), mName(std::move(name)), mSize(size), mMetadata(std::move(metadata)) {}
129*9190c2a8SAndroid Build Coastguard Worker
openForSpecialOps(FileId fid)130*9190c2a8SAndroid Build Coastguard Worker inline android::incfs::UniqueFd FilesystemConnector::openForSpecialOps(FileId fid) {
131*9190c2a8SAndroid Build Coastguard Worker return android::incfs::UniqueFd(DataLoader_FilesystemConnector_openForSpecialOps(this, fid));
132*9190c2a8SAndroid Build Coastguard Worker }
133*9190c2a8SAndroid Build Coastguard Worker
writeBlocks(DataBlocks blocks)134*9190c2a8SAndroid Build Coastguard Worker inline int FilesystemConnector::writeBlocks(DataBlocks blocks) {
135*9190c2a8SAndroid Build Coastguard Worker return DataLoader_FilesystemConnector_writeBlocks(this, blocks.data(), blocks.size());
136*9190c2a8SAndroid Build Coastguard Worker }
137*9190c2a8SAndroid Build Coastguard Worker
getRawMetadata(FileId fid)138*9190c2a8SAndroid Build Coastguard Worker inline RawMetadata FilesystemConnector::getRawMetadata(FileId fid) {
139*9190c2a8SAndroid Build Coastguard Worker RawMetadata metadata(INCFS_MAX_FILE_ATTR_SIZE);
140*9190c2a8SAndroid Build Coastguard Worker size_t size = metadata.size();
141*9190c2a8SAndroid Build Coastguard Worker if (DataLoader_FilesystemConnector_getRawMetadata(this, fid, metadata.data(), &size) < 0) {
142*9190c2a8SAndroid Build Coastguard Worker return {};
143*9190c2a8SAndroid Build Coastguard Worker }
144*9190c2a8SAndroid Build Coastguard Worker metadata.resize(size);
145*9190c2a8SAndroid Build Coastguard Worker return metadata;
146*9190c2a8SAndroid Build Coastguard Worker }
147*9190c2a8SAndroid Build Coastguard Worker
setParams(DataLoaderFilesystemParams params)148*9190c2a8SAndroid Build Coastguard Worker inline bool FilesystemConnector::setParams(DataLoaderFilesystemParams params) {
149*9190c2a8SAndroid Build Coastguard Worker return DataLoader_FilesystemConnector_setParams(this, params);
150*9190c2a8SAndroid Build Coastguard Worker }
151*9190c2a8SAndroid Build Coastguard Worker
reportStatus(DataLoaderStatus status)152*9190c2a8SAndroid Build Coastguard Worker inline bool StatusListener::reportStatus(DataLoaderStatus status) {
153*9190c2a8SAndroid Build Coastguard Worker return DataLoader_StatusListener_reportStatus(this, status);
154*9190c2a8SAndroid Build Coastguard Worker }
155*9190c2a8SAndroid Build Coastguard Worker
156*9190c2a8SAndroid Build Coastguard Worker } // namespace android::dataloader
157