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 17*9190c2a8SAndroid Build Coastguard Worker #ifndef ANDROID_INCREMENTAL_FILE_SYSTEM_DATA_LOADER_NDK_H 18*9190c2a8SAndroid Build Coastguard Worker #define ANDROID_INCREMENTAL_FILE_SYSTEM_DATA_LOADER_NDK_H 19*9190c2a8SAndroid Build Coastguard Worker 20*9190c2a8SAndroid Build Coastguard Worker #include <incfs_ndk.h> 21*9190c2a8SAndroid Build Coastguard Worker #include <jni.h> 22*9190c2a8SAndroid Build Coastguard Worker 23*9190c2a8SAndroid Build Coastguard Worker __BEGIN_DECLS 24*9190c2a8SAndroid Build Coastguard Worker 25*9190c2a8SAndroid Build Coastguard Worker #define DATALOADER_LIBRARY_NAME "libdataloader.so" 26*9190c2a8SAndroid Build Coastguard Worker 27*9190c2a8SAndroid Build Coastguard Worker typedef enum { 28*9190c2a8SAndroid Build Coastguard Worker DATA_LOADER_UNAVAILABLE = 7, 29*9190c2a8SAndroid Build Coastguard Worker DATA_LOADER_UNRECOVERABLE = 8, 30*9190c2a8SAndroid Build Coastguard Worker } DataLoaderStatus; 31*9190c2a8SAndroid Build Coastguard Worker 32*9190c2a8SAndroid Build Coastguard Worker typedef enum { 33*9190c2a8SAndroid Build Coastguard Worker DATA_LOADER_TYPE_NONE = 0, 34*9190c2a8SAndroid Build Coastguard Worker DATA_LOADER_TYPE_STREAMING = 1, 35*9190c2a8SAndroid Build Coastguard Worker DATA_LOADER_TYPE_INCREMENTAL = 2, 36*9190c2a8SAndroid Build Coastguard Worker } DataLoaderType; 37*9190c2a8SAndroid Build Coastguard Worker 38*9190c2a8SAndroid Build Coastguard Worker typedef enum { 39*9190c2a8SAndroid Build Coastguard Worker DATA_LOADER_LOCATION_DATA_APP = 0, 40*9190c2a8SAndroid Build Coastguard Worker DATA_LOADER_LOCATION_MEDIA_OBB = 1, 41*9190c2a8SAndroid Build Coastguard Worker DATA_LOADER_LOCATION_MEDIA_DATA = 2, 42*9190c2a8SAndroid Build Coastguard Worker } DataLoaderLocation; 43*9190c2a8SAndroid Build Coastguard Worker 44*9190c2a8SAndroid Build Coastguard Worker typedef enum { 45*9190c2a8SAndroid Build Coastguard Worker DATA_LOADER_FEATURE_NONE = 0, 46*9190c2a8SAndroid Build Coastguard Worker DATA_LOADER_FEATURE_UID = 1 << 0, 47*9190c2a8SAndroid Build Coastguard Worker } DataLoaderFeatures; 48*9190c2a8SAndroid Build Coastguard Worker 49*9190c2a8SAndroid Build Coastguard Worker struct DataLoaderParams { 50*9190c2a8SAndroid Build Coastguard Worker int type; 51*9190c2a8SAndroid Build Coastguard Worker const char* packageName; 52*9190c2a8SAndroid Build Coastguard Worker const char* className; 53*9190c2a8SAndroid Build Coastguard Worker const char* arguments; 54*9190c2a8SAndroid Build Coastguard Worker }; 55*9190c2a8SAndroid Build Coastguard Worker 56*9190c2a8SAndroid Build Coastguard Worker typedef struct { 57*9190c2a8SAndroid Build Coastguard Worker int location; 58*9190c2a8SAndroid Build Coastguard Worker const char* name; 59*9190c2a8SAndroid Build Coastguard Worker IncFsSize size; 60*9190c2a8SAndroid Build Coastguard Worker IncFsSpan metadata; 61*9190c2a8SAndroid Build Coastguard Worker } DataLoaderInstallationFile; 62*9190c2a8SAndroid Build Coastguard Worker 63*9190c2a8SAndroid Build Coastguard Worker typedef struct { 64*9190c2a8SAndroid Build Coastguard Worker bool readLogsEnabled; 65*9190c2a8SAndroid Build Coastguard Worker } DataLoaderFilesystemParams; 66*9190c2a8SAndroid Build Coastguard Worker 67*9190c2a8SAndroid Build Coastguard Worker #ifdef __cplusplus 68*9190c2a8SAndroid Build Coastguard Worker 69*9190c2a8SAndroid Build Coastguard Worker typedef class DataLoaderFilesystemConnector { 70*9190c2a8SAndroid Build Coastguard Worker } * DataLoaderFilesystemConnectorPtr; 71*9190c2a8SAndroid Build Coastguard Worker typedef class DataLoaderStatusListener { 72*9190c2a8SAndroid Build Coastguard Worker } * DataLoaderStatusListenerPtr; 73*9190c2a8SAndroid Build Coastguard Worker 74*9190c2a8SAndroid Build Coastguard Worker #else /* not __cplusplus */ 75*9190c2a8SAndroid Build Coastguard Worker 76*9190c2a8SAndroid Build Coastguard Worker typedef void* DataLoaderFilesystemConnectorPtr; 77*9190c2a8SAndroid Build Coastguard Worker typedef void* DataLoaderStatusListenerPtr; 78*9190c2a8SAndroid Build Coastguard Worker 79*9190c2a8SAndroid Build Coastguard Worker #endif /* not __cplusplus */ 80*9190c2a8SAndroid Build Coastguard Worker 81*9190c2a8SAndroid Build Coastguard Worker typedef JavaVM* DataLoaderServiceVmPtr; 82*9190c2a8SAndroid Build Coastguard Worker typedef jobject DataLoaderServiceConnectorPtr; 83*9190c2a8SAndroid Build Coastguard Worker typedef jobject DataLoaderServiceParamsPtr; 84*9190c2a8SAndroid Build Coastguard Worker 85*9190c2a8SAndroid Build Coastguard Worker struct DataLoader { 86*9190c2a8SAndroid Build Coastguard Worker // DataLoader v1. 87*9190c2a8SAndroid Build Coastguard Worker bool (*onStart)(struct DataLoader* self); 88*9190c2a8SAndroid Build Coastguard Worker void (*onStop)(struct DataLoader* self); 89*9190c2a8SAndroid Build Coastguard Worker void (*onDestroy)(struct DataLoader* self); 90*9190c2a8SAndroid Build Coastguard Worker 91*9190c2a8SAndroid Build Coastguard Worker bool (*onPrepareImage)(struct DataLoader* self, const DataLoaderInstallationFile addedFiles[], 92*9190c2a8SAndroid Build Coastguard Worker int addedFilesCount); 93*9190c2a8SAndroid Build Coastguard Worker 94*9190c2a8SAndroid Build Coastguard Worker void (*onPendingReads)(struct DataLoader* self, const IncFsReadInfo pendingReads[], 95*9190c2a8SAndroid Build Coastguard Worker int pendingReadsCount); 96*9190c2a8SAndroid Build Coastguard Worker void (*onPageReads)(struct DataLoader* self, const IncFsReadInfo pageReads[], 97*9190c2a8SAndroid Build Coastguard Worker int pageReadsCount); 98*9190c2a8SAndroid Build Coastguard Worker 99*9190c2a8SAndroid Build Coastguard Worker // DataLoader v2, with features. 100*9190c2a8SAndroid Build Coastguard Worker // Use DataLoader_Initialize_WithFeatures to set a factory for v2 DataLoader. 101*9190c2a8SAndroid Build Coastguard Worker DataLoaderFeatures (*getFeatures)(struct DataLoader* self); 102*9190c2a8SAndroid Build Coastguard Worker 103*9190c2a8SAndroid Build Coastguard Worker void (*onPendingReadsWithUid)(struct DataLoader* self, 104*9190c2a8SAndroid Build Coastguard Worker const IncFsReadInfoWithUid pendingReads[], int pendingReadsCount); 105*9190c2a8SAndroid Build Coastguard Worker void (*onPageReadsWithUid)(struct DataLoader* self, const IncFsReadInfoWithUid pageReads[], 106*9190c2a8SAndroid Build Coastguard Worker int pageReadsCount); 107*9190c2a8SAndroid Build Coastguard Worker }; 108*9190c2a8SAndroid Build Coastguard Worker 109*9190c2a8SAndroid Build Coastguard Worker struct DataLoaderFactory { 110*9190c2a8SAndroid Build Coastguard Worker struct DataLoader* (*onCreate)(struct DataLoaderFactory* self, const struct DataLoaderParams*, 111*9190c2a8SAndroid Build Coastguard Worker DataLoaderFilesystemConnectorPtr, DataLoaderStatusListenerPtr, 112*9190c2a8SAndroid Build Coastguard Worker DataLoaderServiceVmPtr, DataLoaderServiceConnectorPtr, 113*9190c2a8SAndroid Build Coastguard Worker DataLoaderServiceParamsPtr); 114*9190c2a8SAndroid Build Coastguard Worker }; 115*9190c2a8SAndroid Build Coastguard Worker void DataLoader_Initialize(struct DataLoaderFactory*); 116*9190c2a8SAndroid Build Coastguard Worker void DataLoader_Initialize_WithFeatures(struct DataLoaderFactory*); 117*9190c2a8SAndroid Build Coastguard Worker 118*9190c2a8SAndroid Build Coastguard Worker void DataLoader_FilesystemConnector_writeData(DataLoaderFilesystemConnectorPtr, jstring name, 119*9190c2a8SAndroid Build Coastguard Worker jlong offsetBytes, jlong lengthBytes, 120*9190c2a8SAndroid Build Coastguard Worker jobject incomingFd); 121*9190c2a8SAndroid Build Coastguard Worker 122*9190c2a8SAndroid Build Coastguard Worker // Returns a newly opened file descriptor and gives the ownership to the caller. 123*9190c2a8SAndroid Build Coastguard Worker int DataLoader_FilesystemConnector_openForSpecialOps(DataLoaderFilesystemConnectorPtr, 124*9190c2a8SAndroid Build Coastguard Worker IncFsFileId fid); 125*9190c2a8SAndroid Build Coastguard Worker 126*9190c2a8SAndroid Build Coastguard Worker int DataLoader_FilesystemConnector_writeBlocks(DataLoaderFilesystemConnectorPtr, 127*9190c2a8SAndroid Build Coastguard Worker const IncFsDataBlock blocks[], int blocksCount); 128*9190c2a8SAndroid Build Coastguard Worker // INCFS_MAX_FILE_ATTR_SIZE 129*9190c2a8SAndroid Build Coastguard Worker int DataLoader_FilesystemConnector_getRawMetadata(DataLoaderFilesystemConnectorPtr, IncFsFileId fid, 130*9190c2a8SAndroid Build Coastguard Worker char buffer[], size_t* bufferSize); 131*9190c2a8SAndroid Build Coastguard Worker 132*9190c2a8SAndroid Build Coastguard Worker bool DataLoader_FilesystemConnector_setParams(DataLoaderFilesystemConnectorPtr, 133*9190c2a8SAndroid Build Coastguard Worker DataLoaderFilesystemParams params); 134*9190c2a8SAndroid Build Coastguard Worker 135*9190c2a8SAndroid Build Coastguard Worker int DataLoader_StatusListener_reportStatus(DataLoaderStatusListenerPtr listener, 136*9190c2a8SAndroid Build Coastguard Worker DataLoaderStatus status); 137*9190c2a8SAndroid Build Coastguard Worker 138*9190c2a8SAndroid Build Coastguard Worker // DataLoaderService JNI 139*9190c2a8SAndroid Build Coastguard Worker bool DataLoaderService_OnCreate(JNIEnv* env, jobject service, jint storageId, jobject control, 140*9190c2a8SAndroid Build Coastguard Worker jobject params, jobject listener); 141*9190c2a8SAndroid Build Coastguard Worker bool DataLoaderService_OnStart(JNIEnv* env, jint storageId); 142*9190c2a8SAndroid Build Coastguard Worker bool DataLoaderService_OnStop(JNIEnv* env, jint storageId); 143*9190c2a8SAndroid Build Coastguard Worker bool DataLoaderService_OnDestroy(JNIEnv* env, jint storageId); 144*9190c2a8SAndroid Build Coastguard Worker 145*9190c2a8SAndroid Build Coastguard Worker bool DataLoaderService_OnPrepareImage(JNIEnv* env, jint storageId, jobjectArray addedFiles, 146*9190c2a8SAndroid Build Coastguard Worker jobjectArray removedFiles); 147*9190c2a8SAndroid Build Coastguard Worker 148*9190c2a8SAndroid Build Coastguard Worker __END_DECLS 149*9190c2a8SAndroid Build Coastguard Worker 150*9190c2a8SAndroid Build Coastguard Worker #endif // ANDROID_INCREMENTAL_FILE_SYSTEM_DATA_LOADER_NDK_H 151