| // | |
| // Copyright 2011 The Android Open Source Project | |
| // | |
| // Abstraction of calls to system to make directories and delete files and | |
| // wrapper to image processing. | |
| #ifndef CACHE_UPDATER_H | |
| #define CACHE_UPDATER_H | |
| #include <utils/String8.h> | |
| #include <sys/types.h> | |
| #include <sys/stat.h> | |
| #include <stdio.h> | |
| #include "Images.h" | |
| using namespace android; | |
| /** CacheUpdater | |
| * This is a pure virtual class that declares abstractions of functions useful | |
| * for managing a cache files. This manager is set up to be used in a | |
| * mirror cache where the source tree is duplicated and filled with processed | |
| * images. This class is abstracted to allow for dependency injection during | |
| * unit testing. | |
| * Usage: | |
| * To update/add a file to the cache, call processImage | |
| * To remove a file from the cache, call deleteFile | |
| */ | |
| class CacheUpdater { | |
| public: | |
| // Make sure all the directories along this path exist | |
| virtual void ensureDirectoriesExist(String8 path) = 0; | |
| // Delete a file | |
| virtual void deleteFile(String8 path) = 0; | |
| // Process an image from source out to dest | |
| virtual void processImage(String8 source, String8 dest) = 0; | |
| private: | |
| }; | |
| /** SystemCacheUpdater | |
| * This is an implementation of the above virtual cache updater specification. | |
| * This implementations hits the filesystem to manage a cache and calls out to | |
| * the PNG crunching in images.h to process images out to its cache components. | |
| */ | |
| class SystemCacheUpdater : public CacheUpdater { | |
| public: | |
| // Constructor to set bundle to pass to preProcessImage | |
| SystemCacheUpdater (Bundle* b) | |
| : bundle(b) { }; | |
| // Make sure all the directories along this path exist | |
| virtual void ensureDirectoriesExist(String8 path) | |
| { | |
| // Check to see if we're dealing with a fully qualified path | |
| String8 existsPath; | |
| String8 toCreate; | |
| String8 remains; | |
| struct stat s; | |
| // Check optomistically to see if all directories exist. | |
| // If something in the path doesn't exist, then walk the path backwards | |
| // and find the place to start creating directories forward. | |
| if (stat(path.string(),&s) == -1) { | |
| // Walk backwards to find place to start creating directories | |
| existsPath = path; | |
| do { | |
| // As we remove the end of existsPath add it to | |
| // the string of paths to create. | |
| toCreate = existsPath.getPathLeaf().appendPath(toCreate); | |
| existsPath = existsPath.getPathDir(); | |
| } while (stat(existsPath.string(),&s) == -1); | |
| // Walk forwards and build directories as we go | |
| do { | |
| // Advance to the next segment of the path | |
| existsPath.appendPath(toCreate.walkPath(&remains)); | |
| toCreate = remains; | |
| #ifdef HAVE_MS_C_RUNTIME | |
| _mkdir(existsPath.string()); | |
| #else | |
| mkdir(existsPath.string(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP); | |
| #endif | |
| } while (remains.length() > 0); | |
| } //if | |
| }; | |
| // Delete a file | |
| virtual void deleteFile(String8 path) | |
| { | |
| if (remove(path.string()) != 0) | |
| fprintf(stderr,"ERROR DELETING %s\n",path.string()); | |
| }; | |
| // Process an image from source out to dest | |
| virtual void processImage(String8 source, String8 dest) | |
| { | |
| // Make sure we're trying to write to a directory that is extant | |
| ensureDirectoriesExist(dest.getPathDir()); | |
| preProcessImageToCache(bundle, source, dest); | |
| }; | |
| private: | |
| Bundle* bundle; | |
| }; | |
| #endif // CACHE_UPDATER_H |