xref: /aosp_15_r20/frameworks/base/tools/aapt/CacheUpdater.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
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