1/*
2******************************************************************************
3*
4*   Copyright (C) 1999-2011, International Business Machines
5*   Corporation and others.  All Rights Reserved.
6*
7******************************************************************************/
8
9
10/*----------------------------------------------------------------------------------
11 *
12 *   UCommonData   An abstract interface for dealing with ICU Common Data Files.
13 *                 ICU Common Data Files are a grouping of a number of individual
14 *                 data items (resources, converters, tables, anything) into a
15 *                 single file or dll.  The combined format includes a table of
16 *                 contents for locating the individual items by name.
17 *
18 *                 Two formats for the table of contents are supported, which is
19 *                 why there is an abstract inteface involved.
20 *
21 *                 These functions are part of the ICU internal implementation, and
22 *                 are not inteded to be used directly by applications.
23 */
24
25#ifndef __UCMNDATA_H__
26#define __UCMNDATA_H__
27
28#include "unicode/udata.h"
29#include "umapfile.h"
30
31
32#define COMMON_DATA_NAME U_ICUDATA_NAME
33
34typedef struct  {
35    uint16_t    headerSize;
36    uint8_t     magic1;
37    uint8_t     magic2;
38} MappedData;
39
40
41typedef struct  {
42    MappedData  dataHeader;
43    UDataInfo   info;
44} DataHeader;
45
46typedef struct {
47    DataHeader hdr;
48    char padding[8];
49    uint32_t count, reserved;
50    /*
51    const struct {
52    const char *const name;
53    const void *const data;
54    } toc[1];
55    */
56   int   fakeNameAndData[4];       /* TODO:  Change this header type from */
57                                   /*        pointerTOC to OffsetTOC.     */
58} ICU_Data_Header;
59
60typedef struct {
61    uint32_t nameOffset;
62    uint32_t dataOffset;
63} UDataOffsetTOCEntry;
64
65typedef struct {
66    uint32_t count;
67    UDataOffsetTOCEntry entry[2];    /* Actual size of array is from count. */
68} UDataOffsetTOC;
69
70/**
71 * Get the header size from a const DataHeader *udh.
72 * Handles opposite-endian data.
73 *
74 * @internal
75 */
76U_CFUNC uint16_t
77udata_getHeaderSize(const DataHeader *udh);
78
79/**
80 * Get the UDataInfo.size from a const UDataInfo *info.
81 * Handles opposite-endian data.
82 *
83 * @internal
84 */
85U_CFUNC uint16_t
86udata_getInfoSize(const UDataInfo *info);
87
88U_CDECL_BEGIN
89/*
90 *  "Virtual" functions for data lookup.
91 *  To call one, given a UDataMemory *p, the code looks like this:
92 *     p->vFuncs.Lookup(p, tocEntryName, pErrorCode);
93 *          (I sure do wish this was written in C++, not C)
94 */
95
96typedef const DataHeader *
97(U_CALLCONV * LookupFn)(const UDataMemory *pData,
98                        const char *tocEntryName,
99                        int32_t *pLength,
100                        UErrorCode *pErrorCode);
101
102typedef uint32_t
103(U_CALLCONV * NumEntriesFn)(const UDataMemory *pData);
104
105U_CDECL_END
106
107typedef struct {
108    LookupFn      Lookup;
109    NumEntriesFn  NumEntries;
110} commonDataFuncs;
111
112
113/*
114 *  Functions to check whether a UDataMemory refers to memory containing
115 *     a recognizable header and table of contents a Common Data Format
116 *
117 *     If a valid header and TOC are found,
118 *         set the CommonDataFuncs function dispatch vector in the UDataMemory
119 *             to point to the right functions for the TOC type.
120 *     otherwise
121 *         set an errorcode.
122 */
123U_CFUNC void udata_checkCommonData(UDataMemory *pData, UErrorCode *pErrorCode);
124
125#endif
126