/*
* Copyright 2010, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef BCC_CACHEWRITER_H
#define BCC_CACHEWRITER_H
#include <bcc/bcc_cache.h>
#include "FileHandle.h"
#include <map>
#include <string>
#include <utility>
#include <vector>
namespace bcc {
class Script;
class CacheWriter {
private:
Script *mpOwner;
FileHandle *mObjFile;
FileHandle *mInfoFile;
std::vector<std::pair<char const *, size_t> > mStringPool;
std::map<std::string,
std::pair<uint32_t, unsigned char const *> > mDependencies;
OBCC_Header *mpHeaderSection;
OBCC_StringPool *mpStringPoolSection;
OBCC_DependencyTable *mpDependencyTableSection;
//OBCC_RelocationTable *mpRelocationTableSection;
OBCC_ExportVarList *mpExportVarListSection;
OBCC_ExportFuncList *mpExportFuncListSection;
OBCC_PragmaList *mpPragmaListSection;
OBCC_FuncTable *mpFuncTableSection;
OBCC_ObjectSlotList *mpObjectSlotSection;
public:
CacheWriter()
: mpHeaderSection(NULL), mpStringPoolSection(NULL),
mpDependencyTableSection(NULL), mpExportVarListSection(NULL),
mpExportFuncListSection(NULL), mpPragmaListSection(NULL),
mpFuncTableSection(NULL), mpObjectSlotSection(NULL) {
}
~CacheWriter();
bool writeCacheFile(FileHandle *objFile,
FileHandle *infoFile,
Script *S,
uint32_t libRS_threadable);
void addDependency(OBCC_ResourceType resType,
std::string const &resName,
unsigned char const *sha1) {
mDependencies.insert(std::make_pair(resName,
std::make_pair((uint32_t)resType, sha1)));
}
private:
bool prepareHeader(uint32_t libRS_threadable);
bool prepareStringPool();
bool prepareDependencyTable();
bool prepareRelocationTable();
bool prepareExportVarList();
bool prepareExportFuncList();
bool preparePragmaList();
bool prepareFuncTable();
bool prepareObjectSlotList();
bool writeAll();
bool calcSectionOffset();
bool calcContextChecksum();
size_t addString(char const *str, size_t size) {
mStringPool.push_back(std::make_pair(str, size));
return mStringPool.size() - 1;
}
};
} // namespace bcc
#endif // BCC_CACHEWRITER_H