You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
6.8 KiB
157 lines
6.8 KiB
/*
|
|
* Copyright (C) 2019 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
#pragma once
|
|
|
|
#include "dataloader.h"
|
|
|
|
namespace android::dataloader {
|
|
namespace details {
|
|
|
|
struct DataLoaderImpl : public ::DataLoader {
|
|
DataLoaderImpl(DataLoaderPtr&& dataLoader) : mDataLoader(std::move(dataLoader)) {
|
|
getFeatures = [](DataLoader* self) -> DataLoaderFeatures {
|
|
return static_cast<DataLoaderImpl*>(self)->mDataLoader->getFeatures();
|
|
};
|
|
onStart = [](DataLoader* self) -> bool {
|
|
return static_cast<DataLoaderImpl*>(self)->mDataLoader->onStart();
|
|
};
|
|
onStop = [](DataLoader* self) {
|
|
return static_cast<DataLoaderImpl*>(self)->mDataLoader->onStop();
|
|
};
|
|
onDestroy = [](DataLoader* self) {
|
|
auto me = static_cast<DataLoaderImpl*>(self);
|
|
me->mDataLoader->onDestroy();
|
|
delete me;
|
|
};
|
|
onPrepareImage = [](DataLoader* self, const ::DataLoaderInstallationFile addedFiles[],
|
|
int addedFilesCount) -> bool {
|
|
return static_cast<DataLoaderImpl*>(self)->mDataLoader->onPrepareImage(
|
|
DataLoaderInstallationFiles(addedFiles, addedFilesCount));
|
|
};
|
|
onPendingReads = [](DataLoader* self, const IncFsReadInfo pendingReads[],
|
|
int pendingReadsCount) {
|
|
return static_cast<DataLoaderImpl*>(self)->mDataLoader->onPendingReads(
|
|
PendingReads(pendingReads, pendingReadsCount));
|
|
};
|
|
onPageReads = [](DataLoader* self, const IncFsReadInfo pageReads[], int pageReadsCount) {
|
|
return static_cast<DataLoaderImpl*>(self)->mDataLoader->onPageReads(
|
|
PageReads(pageReads, pageReadsCount));
|
|
};
|
|
onPendingReadsWithUid = [](DataLoader* self, const IncFsReadInfoWithUid pendingReads[],
|
|
int pendingReadsCount) {
|
|
return static_cast<DataLoaderImpl*>(self)->mDataLoader->onPendingReadsWithUid(
|
|
PendingReadsWithUid(pendingReads, pendingReadsCount));
|
|
};
|
|
onPageReadsWithUid = [](DataLoader* self, const IncFsReadInfoWithUid pageReads[],
|
|
int pageReadsCount) {
|
|
return static_cast<DataLoaderImpl*>(self)->mDataLoader->onPageReadsWithUid(
|
|
PageReadsWithUid(pageReads, pageReadsCount));
|
|
};
|
|
}
|
|
|
|
private:
|
|
DataLoaderPtr mDataLoader;
|
|
};
|
|
|
|
inline DataLoaderParams createParams(const ::DataLoaderParams* params) {
|
|
const DataLoaderType type((DataLoaderType)params->type);
|
|
std::string packageName(params->packageName);
|
|
std::string className(params->className);
|
|
std::string arguments(params->arguments);
|
|
return DataLoaderParams(type, std::move(packageName), std::move(className),
|
|
std::move(arguments));
|
|
}
|
|
|
|
inline DataLoaderInstallationFile createInstallationFile(const ::DataLoaderInstallationFile* file) {
|
|
const DataLoaderLocation location((DataLoaderLocation)file->location);
|
|
std::string name(file->name);
|
|
IncFsSize size(file->size);
|
|
RawMetadata metadata(file->metadata.data, file->metadata.data + file->metadata.size);
|
|
return DataLoaderInstallationFile(location, std::move(name), size, std::move(metadata));
|
|
}
|
|
|
|
struct DataLoaderFactoryImpl : public ::DataLoaderFactory {
|
|
DataLoaderFactoryImpl(DataLoader::Factory&& factory) : mFactory(factory) {
|
|
onCreate = [](::DataLoaderFactory* self, const ::DataLoaderParams* ndkParams,
|
|
::DataLoaderFilesystemConnectorPtr fsConnector,
|
|
::DataLoaderStatusListenerPtr statusListener, ::DataLoaderServiceVmPtr vm,
|
|
::DataLoaderServiceConnectorPtr serviceConnector,
|
|
::DataLoaderServiceParamsPtr serviceParams) {
|
|
auto me = static_cast<DataLoaderFactoryImpl*>(self);
|
|
::DataLoader* result = nullptr;
|
|
auto params = createParams(ndkParams);
|
|
auto dataLoader = me->mFactory(vm, params);
|
|
if (!dataLoader ||
|
|
!dataLoader->onCreate(params, static_cast<FilesystemConnector*>(fsConnector),
|
|
static_cast<StatusListener*>(statusListener),
|
|
serviceConnector, serviceParams)) {
|
|
return result;
|
|
}
|
|
result = new DataLoaderImpl(std::move(dataLoader));
|
|
return result;
|
|
};
|
|
}
|
|
|
|
private:
|
|
DataLoader::Factory mFactory;
|
|
};
|
|
|
|
} // namespace details
|
|
|
|
inline void DataLoader::initialize(DataLoader::Factory&& factory) {
|
|
DataLoader_Initialize_WithFeatures(new details::DataLoaderFactoryImpl(std::move(factory)));
|
|
}
|
|
|
|
inline DataLoaderParams::DataLoaderParams(DataLoaderType type, std::string&& packageName,
|
|
std::string&& className, std::string&& arguments)
|
|
: mType(type),
|
|
mPackageName(std::move(packageName)),
|
|
mClassName(std::move(className)),
|
|
mArguments(std::move(arguments)) {}
|
|
|
|
inline DataLoaderInstallationFile::DataLoaderInstallationFile(DataLoaderLocation location,
|
|
std::string&& name, IncFsSize size,
|
|
RawMetadata&& metadata)
|
|
: mLocation(location), mName(std::move(name)), mSize(size), mMetadata(std::move(metadata)) {}
|
|
|
|
inline android::incfs::UniqueFd FilesystemConnector::openForSpecialOps(FileId fid) {
|
|
return android::incfs::UniqueFd(DataLoader_FilesystemConnector_openForSpecialOps(this, fid));
|
|
}
|
|
|
|
inline int FilesystemConnector::writeBlocks(DataBlocks blocks) {
|
|
return DataLoader_FilesystemConnector_writeBlocks(this, blocks.data(), blocks.size());
|
|
}
|
|
|
|
inline RawMetadata FilesystemConnector::getRawMetadata(FileId fid) {
|
|
RawMetadata metadata(INCFS_MAX_FILE_ATTR_SIZE);
|
|
size_t size = metadata.size();
|
|
if (DataLoader_FilesystemConnector_getRawMetadata(this, fid, metadata.data(), &size) < 0) {
|
|
return {};
|
|
}
|
|
metadata.resize(size);
|
|
return metadata;
|
|
}
|
|
|
|
inline bool FilesystemConnector::setParams(DataLoaderFilesystemParams params) {
|
|
return DataLoader_FilesystemConnector_setParams(this, params);
|
|
}
|
|
|
|
inline bool StatusListener::reportStatus(DataLoaderStatus status) {
|
|
return DataLoader_StatusListener_reportStatus(this, status);
|
|
}
|
|
|
|
} // namespace android::dataloader
|