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