You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.6 KiB
113 lines
3.6 KiB
//
|
|
// 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"
|
|
#ifdef _WIN32
|
|
#include <direct.h>
|
|
#endif
|
|
|
|
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:
|
|
virtual ~CacheUpdater() {}
|
|
|
|
// 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
|
|
explicit 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 _WIN32
|
|
_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
|