18a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// 28a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// Copyright 2011 The Android Open Source Project 38a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// 48a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// Abstraction of calls to system to make directories and delete files and 58a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// wrapper to image processing. 68a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 78a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#ifndef CACHE_UPDATER_H 88a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#define CACHE_UPDATER_H 98a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 108a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <utils/String8.h> 118a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <sys/types.h> 128a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <sys/stat.h> 138a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <stdio.h> 148a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include "Images.h" 15e17788ceff5c676f3783e5aa25d57a613e9f59dbElliott Hughes#ifdef _WIN32 16c9d32390e59d99c76b79edd247a1127088ce81ecAndrew Hsieh#include <direct.h> 17c9d32390e59d99c76b79edd247a1127088ce81ecAndrew Hsieh#endif 188a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 198a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinusing namespace android; 208a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 218a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin/** CacheUpdater 228a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * This is a pure virtual class that declares abstractions of functions useful 238a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * for managing a cache files. This manager is set up to be used in a 248a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * mirror cache where the source tree is duplicated and filled with processed 258a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * images. This class is abstracted to allow for dependency injection during 268a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * unit testing. 278a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * Usage: 288a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * To update/add a file to the cache, call processImage 298a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * To remove a file from the cache, call deleteFile 308a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin */ 318a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinclass CacheUpdater { 328a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinpublic: 334bf58108d442b37ab4adf5ce3a4ecd63472ce254Adam Lesinski virtual ~CacheUpdater() {} 344bf58108d442b37ab4adf5ce3a4ecd63472ce254Adam Lesinski 358a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Make sure all the directories along this path exist 368a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual void ensureDirectoriesExist(String8 path) = 0; 378a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 388a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Delete a file 398a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual void deleteFile(String8 path) = 0; 408a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 418a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Process an image from source out to dest 428a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual void processImage(String8 source, String8 dest) = 0; 438a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinprivate: 448a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin}; 458a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 468a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin/** SystemCacheUpdater 478a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * This is an implementation of the above virtual cache updater specification. 488a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * This implementations hits the filesystem to manage a cache and calls out to 498a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * the PNG crunching in images.h to process images out to its cache components. 508a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin */ 518a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinclass SystemCacheUpdater : public CacheUpdater { 528a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinpublic: 538a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Constructor to set bundle to pass to preProcessImage 548a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin SystemCacheUpdater (Bundle* b) 558a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin : bundle(b) { }; 568a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 578a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Make sure all the directories along this path exist 588a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual void ensureDirectoriesExist(String8 path) 598a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin { 608a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Check to see if we're dealing with a fully qualified path 618a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin String8 existsPath; 628a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin String8 toCreate; 638a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin String8 remains; 648a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin struct stat s; 658a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 668a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Check optomistically to see if all directories exist. 678a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // If something in the path doesn't exist, then walk the path backwards 688a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // and find the place to start creating directories forward. 698a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin if (stat(path.string(),&s) == -1) { 708a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Walk backwards to find place to start creating directories 718a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin existsPath = path; 728a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin do { 738a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // As we remove the end of existsPath add it to 748a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // the string of paths to create. 758a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin toCreate = existsPath.getPathLeaf().appendPath(toCreate); 768a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin existsPath = existsPath.getPathDir(); 778a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin } while (stat(existsPath.string(),&s) == -1); 788a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 798a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Walk forwards and build directories as we go 808a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin do { 818a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Advance to the next segment of the path 828a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin existsPath.appendPath(toCreate.walkPath(&remains)); 838a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin toCreate = remains; 84e17788ceff5c676f3783e5aa25d57a613e9f59dbElliott Hughes#ifdef _WIN32 858a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin _mkdir(existsPath.string()); 868a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#else 878a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin mkdir(existsPath.string(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP); 888a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#endif 898a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin } while (remains.length() > 0); 908a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin } //if 918a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin }; 928a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 938a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Delete a file 948a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual void deleteFile(String8 path) 958a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin { 968a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin if (remove(path.string()) != 0) 978a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin fprintf(stderr,"ERROR DELETING %s\n",path.string()); 988a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin }; 998a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 1008a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Process an image from source out to dest 1018a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual void processImage(String8 source, String8 dest) 1028a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin { 1038a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Make sure we're trying to write to a directory that is extant 1048a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin ensureDirectoriesExist(dest.getPathDir()); 1058a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 1068a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin preProcessImageToCache(bundle, source, dest); 1078a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin }; 1088a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinprivate: 1098a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin Bundle* bundle; 1108a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin}; 1118a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 1122412f84064c26b643c722ce914a97c4ec7776c69Andreas Gampe#endif // CACHE_UPDATER_H 113