| /* |
| ******************************************************************************* |
| * |
| * Copyright (C) 2005-2014, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| * |
| ******************************************************************************* |
| * file name: package.h |
| * encoding: US-ASCII |
| * tab size: 8 (not used) |
| * indentation:4 |
| * |
| * created on: 2005aug25 |
| * created by: Markus W. Scherer |
| * |
| * Read, modify, and write ICU .dat data package files. |
| */ |
| |
| #ifndef __PACKAGE_H__ |
| #define __PACKAGE_H__ |
| |
| #include "unicode/utypes.h" |
| |
| #include <stdio.h> |
| |
| // .dat package file representation ---------------------------------------- *** |
| |
| #define STRING_STORE_SIZE 100000 |
| #define MAX_PKG_NAME_LENGTH 64 |
| |
| typedef void CheckDependency(void *context, const char *itemName, const char *targetName); |
| |
| U_NAMESPACE_BEGIN |
| |
| struct Item { |
| char *name; |
| uint8_t *data; |
| int32_t length; |
| UBool isDataOwned; |
| char type; |
| }; |
| |
| class U_TOOLUTIL_API Package { |
| public: |
| /* |
| * Constructor. |
| * Prepare this object for a new, empty package. |
| */ |
| Package(); |
| |
| /* Destructor. */ |
| ~Package(); |
| |
| /** |
| * Uses the prefix of the first entry of the package in readPackage(), |
| * rather than the package basename. |
| */ |
| void setAutoPrefix() { doAutoPrefix=TRUE; } |
| /** |
| * Same as setAutoPrefix(), plus the prefix must end with the platform type letter. |
| */ |
| void setAutoPrefixWithType() { |
| doAutoPrefix=TRUE; |
| prefixEndsWithType=TRUE; |
| } |
| void setPrefix(const char *p); |
| |
| /* |
| * Read an existing .dat package file. |
| * The header and item name strings are swapped into this object, |
| * but the items are left unswapped. |
| */ |
| void readPackage(const char *filename); |
| /* |
| * Write a .dat package file with the items in this object. |
| * Swap all pieces to the desired output platform properties. |
| * The package becomes unusable: |
| * The item names are swapped and sorted in the outCharset rather than the local one. |
| * Also, the items themselves are swapped in-place |
| */ |
| void writePackage(const char *filename, char outType, const char *comment); |
| |
| /* |
| * Return the input data type letter (l, b, or e). |
| */ |
| char getInType(); |
| |
| // find the item in items[], return the non-negative index if found, else the binary-not of the insertion point |
| int32_t findItem(const char *name, int32_t length=-1) const; |
| |
| /* |
| * Set internal state for following calls to findNextItem() which will return |
| * indexes for items whose names match the pattern. |
| */ |
| void findItems(const char *pattern); |
| int32_t findNextItem(); |
| /* |
| * Set the match mode for findItems() & findNextItem(). |
| * @param mode 0=default |
| * MATCH_NOSLASH * does not match a '/' |
| */ |
| void setMatchMode(uint32_t mode); |
| |
| enum { |
| MATCH_NOSLASH=1 |
| }; |
| |
| void addItem(const char *name); |
| void addItem(const char *name, uint8_t *data, int32_t length, UBool isDataOwned, char type); |
| void addFile(const char *filesPath, const char *name); |
| void addItems(const Package &listPkg); |
| |
| void removeItem(int32_t itemIndex); |
| void removeItems(const char *pattern); |
| void removeItems(const Package &listPkg); |
| |
| /* The extractItem() functions accept outputType=0 to mean "don't swap the item". */ |
| void extractItem(const char *filesPath, int32_t itemIndex, char outType); |
| void extractItems(const char *filesPath, const char *pattern, char outType); |
| void extractItems(const char *filesPath, const Package &listPkg, char outType); |
| |
| /* This variant extracts an item to a specific filename. */ |
| void extractItem(const char *filesPath, const char *outName, int32_t itemIndex, char outType); |
| |
| int32_t getItemCount() const; |
| const Item *getItem(int32_t idx) const; |
| |
| /* |
| * Check dependencies and return TRUE if all dependencies are fulfilled. |
| */ |
| UBool checkDependencies(); |
| |
| /* |
| * Enumerate all the dependencies and give the results to context and call CheckDependency callback |
| * @param context user context (will be passed to check function) |
| * @param check will be called with context and any missing items |
| */ |
| void enumDependencies(void *context, CheckDependency check); |
| |
| private: |
| void enumDependencies(Item *pItem, void *context, CheckDependency check); |
| |
| /** |
| * Default CheckDependency function used by checkDependencies() |
| */ |
| static void checkDependency(void *context, const char *itemName, const char *targetName); |
| |
| /* |
| * Allocate a string in inStrings or outStrings. |
| * The length does not include the terminating NUL. |
| */ |
| char *allocString(UBool in, int32_t length); |
| |
| void sortItems(); |
| |
| // data fields |
| char inPkgName[MAX_PKG_NAME_LENGTH]; |
| char pkgPrefix[MAX_PKG_NAME_LENGTH]; |
| |
| uint8_t *inData; |
| uint8_t header[1024]; |
| int32_t inLength, headerLength; |
| uint8_t inCharset; |
| UBool inIsBigEndian; |
| UBool doAutoPrefix; |
| UBool prefixEndsWithType; |
| |
| int32_t itemCount; |
| int32_t itemMax; |
| Item *items; |
| |
| int32_t inStringTop, outStringTop; |
| char inStrings[STRING_STORE_SIZE], outStrings[STRING_STORE_SIZE]; |
| |
| // match mode for findItems(pattern) and findNextItem() |
| uint32_t matchMode; |
| |
| // state for findItems(pattern) and findNextItem() |
| const char *findPrefix, *findSuffix; |
| int32_t findPrefixLength, findSuffixLength; |
| int32_t findNextIndex; |
| |
| // state for checkDependencies() |
| UBool isMissingItems; |
| |
| /** |
| * Grow itemMax to new value |
| */ |
| void setItemCapacity(int32_t max); |
| |
| /** |
| * Grow itemMax to at least itemCount+1 |
| */ |
| void ensureItemCapacity(); |
| }; |
| |
| U_NAMESPACE_END |
| |
| #endif |
| |
| |