1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
48393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius*   Copyright (C) 2005-2013, International Business Machines
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   file name:  package.h
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   encoding:   US-ASCII
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   tab size:   8 (not used)
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   indentation:4
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   created on: 2005aug25
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   created by: Markus W. Scherer
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Read, modify, and write ICU .dat data package files.
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef __PACKAGE_H__
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define __PACKAGE_H__
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h>
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// .dat package file representation ---------------------------------------- ***
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define STRING_STORE_SIZE 100000
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define MAX_PKG_NAME_LENGTH 32
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef void CheckDependency(void *context, const char *itemName, const char *targetName);
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct Item {
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *name;
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t *data;
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t length;
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool isDataOwned;
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char type;
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass U_TOOLUTIL_API Package {
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Constructor.
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Prepare this object for a new, empty package.
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Package();
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Destructor. */
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ~Package();
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
548393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    /**
558393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius     * Uses the prefix of the first entry of the package in readPackage(),
568393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius     * rather than the package basename.
578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius     */
588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    void setAutoPrefix() { doAutoPrefix=TRUE; }
598393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    /**
608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius     * Same as setAutoPrefix(), plus the prefix must end with the platform type letter.
618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius     */
628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    void setAutoPrefixWithType() {
638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        doAutoPrefix=TRUE;
648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        prefixEndsWithType=TRUE;
658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    void setPrefix(const char *p);
678393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Read an existing .dat package file.
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * The header and item name strings are swapped into this object,
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * but the items are left unswapped.
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void readPackage(const char *filename);
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Write a .dat package file with the items in this object.
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Swap all pieces to the desired output platform properties.
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * The package becomes unusable:
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * The item names are swapped and sorted in the outCharset rather than the local one.
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Also, the items themselves are swapped in-place
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void writePackage(const char *filename, char outType, const char *comment);
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Return the input data type letter (l, b, or e).
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char getInType();
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // find the item in items[], return the non-negative index if found, else the binary-not of the insertion point
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t findItem(const char *name, int32_t length=-1) const;
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Set internal state for following calls to findNextItem() which will return
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * indexes for items whose names match the pattern.
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void findItems(const char *pattern);
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t findNextItem();
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Set the match mode for findItems() & findNextItem().
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @param mode 0=default
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     *             MATCH_NOSLASH * does not match a '/'
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void setMatchMode(uint32_t mode);
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    enum {
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        MATCH_NOSLASH=1
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void addItem(const char *name);
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void addItem(const char *name, uint8_t *data, int32_t length, UBool isDataOwned, char type);
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void addFile(const char *filesPath, const char *name);
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void addItems(const Package &listPkg);
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    void removeItem(int32_t itemIndex);
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void removeItems(const char *pattern);
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void removeItems(const Package &listPkg);
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* The extractItem() functions accept outputType=0 to mean "don't swap the item". */
11885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    void extractItem(const char *filesPath, int32_t itemIndex, char outType);
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void extractItems(const char *filesPath, const char *pattern, char outType);
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void extractItems(const char *filesPath, const Package &listPkg, char outType);
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* This variant extracts an item to a specific filename. */
12385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    void extractItem(const char *filesPath, const char *outName, int32_t itemIndex, char outType);
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t getItemCount() const;
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const Item *getItem(int32_t idx) const;
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Check dependencies and return TRUE if all dependencies are fulfilled.
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool checkDependencies();
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
13427f654740f2a26ad62a5c155af9199af9e69b889claireho     * Enumerate all the dependencies and give the results to context and call CheckDependency callback
13527f654740f2a26ad62a5c155af9199af9e69b889claireho     * @param context user context (will be passed to check function)
13627f654740f2a26ad62a5c155af9199af9e69b889claireho     * @param check will be called with context and any missing items
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void enumDependencies(void *context, CheckDependency check);
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate:
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void enumDependencies(Item *pItem, void *context, CheckDependency check);
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
14327f654740f2a26ad62a5c155af9199af9e69b889claireho    /**
14427f654740f2a26ad62a5c155af9199af9e69b889claireho     * Default CheckDependency function used by checkDependencies()
14527f654740f2a26ad62a5c155af9199af9e69b889claireho     */
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static void checkDependency(void *context, const char *itemName, const char *targetName);
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Allocate a string in inStrings or outStrings.
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * The length does not include the terminating NUL.
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *allocString(UBool in, int32_t length);
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void sortItems();
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // data fields
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char inPkgName[MAX_PKG_NAME_LENGTH];
1588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    char pkgPrefix[MAX_PKG_NAME_LENGTH];
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t *inData;
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t header[1024];
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t inLength, headerLength;
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t inCharset;
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool inIsBigEndian;
1658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    UBool doAutoPrefix;
1668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    UBool prefixEndsWithType;
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t itemCount;
16927f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t itemMax;
17027f654740f2a26ad62a5c155af9199af9e69b889claireho    Item   *items;
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t inStringTop, outStringTop;
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char inStrings[STRING_STORE_SIZE], outStrings[STRING_STORE_SIZE];
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // match mode for findItems(pattern) and findNextItem()
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t matchMode;
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // state for findItems(pattern) and findNextItem()
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *findPrefix, *findSuffix;
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t findPrefixLength, findSuffixLength;
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t findNextIndex;
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // state for checkDependencies()
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool isMissingItems;
18527f654740f2a26ad62a5c155af9199af9e69b889claireho
18627f654740f2a26ad62a5c155af9199af9e69b889claireho    /**
18727f654740f2a26ad62a5c155af9199af9e69b889claireho     * Grow itemMax to new value
18827f654740f2a26ad62a5c155af9199af9e69b889claireho     */
18927f654740f2a26ad62a5c155af9199af9e69b889claireho    void setItemCapacity(int32_t max);
19027f654740f2a26ad62a5c155af9199af9e69b889claireho
19127f654740f2a26ad62a5c155af9199af9e69b889claireho    /**
19227f654740f2a26ad62a5c155af9199af9e69b889claireho     * Grow itemMax to at least itemCount+1
19327f654740f2a26ad62a5c155af9199af9e69b889claireho     */
19427f654740f2a26ad62a5c155af9199af9e69b889claireho    void ensureItemCapacity();
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
20027f654740f2a26ad62a5c155af9199af9e69b889claireho
20127f654740f2a26ad62a5c155af9199af9e69b889claireho
202