1*d57664e9SAndroid Build Coastguard Worker // 2*d57664e9SAndroid Build Coastguard Worker // Copyright 2011 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker // 4*d57664e9SAndroid Build Coastguard Worker // Abstraction of calls to system to make directories and delete files and 5*d57664e9SAndroid Build Coastguard Worker // wrapper to image processing. 6*d57664e9SAndroid Build Coastguard Worker 7*d57664e9SAndroid Build Coastguard Worker #ifndef CACHE_UPDATER_H 8*d57664e9SAndroid Build Coastguard Worker #define CACHE_UPDATER_H 9*d57664e9SAndroid Build Coastguard Worker 10*d57664e9SAndroid Build Coastguard Worker #include <androidfw/PathUtils.h> 11*d57664e9SAndroid Build Coastguard Worker #include <utils/String8.h> 12*d57664e9SAndroid Build Coastguard Worker #include <sys/types.h> 13*d57664e9SAndroid Build Coastguard Worker #include <sys/stat.h> 14*d57664e9SAndroid Build Coastguard Worker #include <stdio.h> 15*d57664e9SAndroid Build Coastguard Worker #include "Images.h" 16*d57664e9SAndroid Build Coastguard Worker #ifdef _WIN32 17*d57664e9SAndroid Build Coastguard Worker #include <direct.h> 18*d57664e9SAndroid Build Coastguard Worker #endif 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include "Utils.h" 21*d57664e9SAndroid Build Coastguard Worker 22*d57664e9SAndroid Build Coastguard Worker using namespace android; 23*d57664e9SAndroid Build Coastguard Worker 24*d57664e9SAndroid Build Coastguard Worker /** CacheUpdater 25*d57664e9SAndroid Build Coastguard Worker * This is a pure virtual class that declares abstractions of functions useful 26*d57664e9SAndroid Build Coastguard Worker * for managing a cache files. This manager is set up to be used in a 27*d57664e9SAndroid Build Coastguard Worker * mirror cache where the source tree is duplicated and filled with processed 28*d57664e9SAndroid Build Coastguard Worker * images. This class is abstracted to allow for dependency injection during 29*d57664e9SAndroid Build Coastguard Worker * unit testing. 30*d57664e9SAndroid Build Coastguard Worker * Usage: 31*d57664e9SAndroid Build Coastguard Worker * To update/add a file to the cache, call processImage 32*d57664e9SAndroid Build Coastguard Worker * To remove a file from the cache, call deleteFile 33*d57664e9SAndroid Build Coastguard Worker */ 34*d57664e9SAndroid Build Coastguard Worker class CacheUpdater { 35*d57664e9SAndroid Build Coastguard Worker public: ~CacheUpdater()36*d57664e9SAndroid Build Coastguard Worker virtual ~CacheUpdater() {} 37*d57664e9SAndroid Build Coastguard Worker 38*d57664e9SAndroid Build Coastguard Worker // Make sure all the directories along this path exist 39*d57664e9SAndroid Build Coastguard Worker virtual void ensureDirectoriesExist(String8 path) = 0; 40*d57664e9SAndroid Build Coastguard Worker 41*d57664e9SAndroid Build Coastguard Worker // Delete a file 42*d57664e9SAndroid Build Coastguard Worker virtual void deleteFile(String8 path) = 0; 43*d57664e9SAndroid Build Coastguard Worker 44*d57664e9SAndroid Build Coastguard Worker // Process an image from source out to dest 45*d57664e9SAndroid Build Coastguard Worker virtual void processImage(String8 source, String8 dest) = 0; 46*d57664e9SAndroid Build Coastguard Worker private: 47*d57664e9SAndroid Build Coastguard Worker }; 48*d57664e9SAndroid Build Coastguard Worker 49*d57664e9SAndroid Build Coastguard Worker /** SystemCacheUpdater 50*d57664e9SAndroid Build Coastguard Worker * This is an implementation of the above virtual cache updater specification. 51*d57664e9SAndroid Build Coastguard Worker * This implementations hits the filesystem to manage a cache and calls out to 52*d57664e9SAndroid Build Coastguard Worker * the PNG crunching in images.h to process images out to its cache components. 53*d57664e9SAndroid Build Coastguard Worker */ 54*d57664e9SAndroid Build Coastguard Worker class SystemCacheUpdater : public CacheUpdater { 55*d57664e9SAndroid Build Coastguard Worker public: 56*d57664e9SAndroid Build Coastguard Worker // Constructor to set bundle to pass to preProcessImage SystemCacheUpdater(Bundle * b)57*d57664e9SAndroid Build Coastguard Worker explicit SystemCacheUpdater (Bundle* b) 58*d57664e9SAndroid Build Coastguard Worker : bundle(b) { }; 59*d57664e9SAndroid Build Coastguard Worker 60*d57664e9SAndroid Build Coastguard Worker // Make sure all the directories along this path exist ensureDirectoriesExist(String8 path)61*d57664e9SAndroid Build Coastguard Worker virtual void ensureDirectoriesExist(String8 path) 62*d57664e9SAndroid Build Coastguard Worker { 63*d57664e9SAndroid Build Coastguard Worker // Check to see if we're dealing with a fully qualified path 64*d57664e9SAndroid Build Coastguard Worker String8 existsPath; 65*d57664e9SAndroid Build Coastguard Worker String8 toCreate; 66*d57664e9SAndroid Build Coastguard Worker String8 remains; 67*d57664e9SAndroid Build Coastguard Worker struct stat s; 68*d57664e9SAndroid Build Coastguard Worker 69*d57664e9SAndroid Build Coastguard Worker // Check optomistically to see if all directories exist. 70*d57664e9SAndroid Build Coastguard Worker // If something in the path doesn't exist, then walk the path backwards 71*d57664e9SAndroid Build Coastguard Worker // and find the place to start creating directories forward. 72*d57664e9SAndroid Build Coastguard Worker if (stat(path.c_str(),&s) == -1) { 73*d57664e9SAndroid Build Coastguard Worker // Walk backwards to find place to start creating directories 74*d57664e9SAndroid Build Coastguard Worker existsPath = path; 75*d57664e9SAndroid Build Coastguard Worker do { 76*d57664e9SAndroid Build Coastguard Worker // As we remove the end of existsPath add it to 77*d57664e9SAndroid Build Coastguard Worker // the string of paths to create. 78*d57664e9SAndroid Build Coastguard Worker toCreate = appendPathCopy(getPathLeaf(existsPath), toCreate); 79*d57664e9SAndroid Build Coastguard Worker existsPath = getPathDir(existsPath); 80*d57664e9SAndroid Build Coastguard Worker } while (stat(existsPath.c_str(),&s) == -1); 81*d57664e9SAndroid Build Coastguard Worker 82*d57664e9SAndroid Build Coastguard Worker // Walk forwards and build directories as we go 83*d57664e9SAndroid Build Coastguard Worker do { 84*d57664e9SAndroid Build Coastguard Worker // Advance to the next segment of the path 85*d57664e9SAndroid Build Coastguard Worker appendPath(existsPath, walkPath(toCreate, &remains)); 86*d57664e9SAndroid Build Coastguard Worker toCreate = remains; 87*d57664e9SAndroid Build Coastguard Worker #ifdef _WIN32 88*d57664e9SAndroid Build Coastguard Worker _mkdir(existsPath.c_str()); 89*d57664e9SAndroid Build Coastguard Worker #else 90*d57664e9SAndroid Build Coastguard Worker mkdir(existsPath.c_str(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP); 91*d57664e9SAndroid Build Coastguard Worker #endif 92*d57664e9SAndroid Build Coastguard Worker } while (remains.length() > 0); 93*d57664e9SAndroid Build Coastguard Worker } //if 94*d57664e9SAndroid Build Coastguard Worker }; 95*d57664e9SAndroid Build Coastguard Worker 96*d57664e9SAndroid Build Coastguard Worker // Delete a file deleteFile(String8 path)97*d57664e9SAndroid Build Coastguard Worker virtual void deleteFile(String8 path) 98*d57664e9SAndroid Build Coastguard Worker { 99*d57664e9SAndroid Build Coastguard Worker if (remove(path.c_str()) != 0) 100*d57664e9SAndroid Build Coastguard Worker fprintf(stderr,"ERROR DELETING %s\n",path.c_str()); 101*d57664e9SAndroid Build Coastguard Worker }; 102*d57664e9SAndroid Build Coastguard Worker 103*d57664e9SAndroid Build Coastguard Worker // Process an image from source out to dest processImage(String8 source,String8 dest)104*d57664e9SAndroid Build Coastguard Worker virtual void processImage(String8 source, String8 dest) 105*d57664e9SAndroid Build Coastguard Worker { 106*d57664e9SAndroid Build Coastguard Worker // Make sure we're trying to write to a directory that is extant 107*d57664e9SAndroid Build Coastguard Worker ensureDirectoriesExist(getPathDir(dest)); 108*d57664e9SAndroid Build Coastguard Worker 109*d57664e9SAndroid Build Coastguard Worker preProcessImageToCache(bundle, source, dest); 110*d57664e9SAndroid Build Coastguard Worker }; 111*d57664e9SAndroid Build Coastguard Worker private: 112*d57664e9SAndroid Build Coastguard Worker Bundle* bundle; 113*d57664e9SAndroid Build Coastguard Worker }; 114*d57664e9SAndroid Build Coastguard Worker 115*d57664e9SAndroid Build Coastguard Worker #endif // CACHE_UPDATER_H 116