~ubuntu-branches/ubuntu/saucy/horde3/saucy

« back to all changes in this revision

Viewing changes to lib/XML/WBXML.php

  • Committer: Bazaar Package Importer
  • Author(s): Ola Lundqvist
  • Date: 2005-05-04 23:08:08 UTC
  • Revision ID: james.westby@ubuntu.com-20050504230808-p4hf3hk28o3v7wir
Tags: upstream-3.0.4
ImportĀ upstreamĀ versionĀ 3.0.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?php
 
2
 
 
3
/**
 
4
 * Constants are from Binary XML Content Format Specification Version
 
5
 * 1.3, 25 July 2001 found at http://www.wapforum.org
 
6
 */
 
7
 
 
8
/**
 
9
 * From 7.1 Global Tokens.
 
10
 */
 
11
 
 
12
define('XML_WBXML_GLOBAL_TOKEN_SWITCH_PAGE', 0);  // 0x00
 
13
define('XML_WBXML_GLOBAL_TOKEN_END', 1);          // 0x01
 
14
define('XML_WBXML_GLOBAL_TOKEN_ENTITY', 2);       // 0x02
 
15
define('XML_WBXML_GLOBAL_TOKEN_STR_I', 3);        // 0x03
 
16
define('XML_WBXML_GLOBAL_TOKEN_LITERAL', 4);      // 0x04
 
17
 
 
18
define('XML_WBXML_GLOBAL_TOKEN_EXT_I_0', 64);     // 0x40
 
19
define('XML_WBXML_GLOBAL_TOKEN_EXT_I_1', 65);     // 0x41
 
20
define('XML_WBXML_GLOBAL_TOKEN_EXT_I_2', 66);     // 0x42
 
21
define('XML_WBXML_GLOBAL_TOKEN_PI', 67);          // 0x43
 
22
define('XML_WBXML_GLOBAL_TOKEN_LITERAL_C', 68);   // 0x44
 
23
 
 
24
define('XML_WBXML_GLOBAL_TOKEN_EXT_T_0', 128);    // 0x80
 
25
define('XML_WBXML_GLOBAL_TOKEN_EXT_T_1', 129);    // 0x81
 
26
define('XML_WBXML_GLOBAL_TOKEN_EXT_T_2', 130);    // 0x82
 
27
define('XML_WBXML_GLOBAL_TOKEN_STR_T', 131);      // 0x83
 
28
define('XML_WBXML_GLOBAL_TOKEN_LITERAL_A', 132);  // 0x84
 
29
 
 
30
define('XML_WBXML_GLOBAL_TOKEN_EXT_0', 192);      // 0xC0
 
31
define('XML_WBXML_GLOBAL_TOKEN_EXT_1', 193);      // 0xC1
 
32
define('XML_WBXML_GLOBAL_TOKEN_EXT_2', 194);      // 0xC2
 
33
define('XML_WBXML_GLOBAL_TOKEN_OPAQUE', 195);     // 0xC3
 
34
define('XML_WBXML_GLOBAL_TOKEN_LITERAL_AC', 196); // 0xC4
 
35
 
 
36
/**
 
37
 * Not sure where defined.
 
38
 * ADD CHAPTER
 
39
 */
 
40
define('DPI_DTD_WML_1_0', '-//WAPFORUM//DTD WML 1.0//EN');
 
41
define('DPI_DTD_WTA_1_0', '-//WAPFORUM//DTD WTA 1.0//EN');
 
42
define('DPI_DTD_WML_1_1', '-//WAPFORUM//DTD WML 1.1//EN');
 
43
define('DPI_DTD_SI_1_1', '-//WAPFORUM//DTD SI 1.1//EN');
 
44
define('DPI_DTD_SL_1_0', '-//WAPFORUM//DTD SL 1.0//EN');
 
45
define('DPI_DTD_CO_1_0', '-//WAPFORUM//DTD CO 1.0//EN');
 
46
define('DPI_DTD_CHANNEL_1_1', '-//WAPFORUM//DTD CHANNEL 1.1//EN');
 
47
define('DPI_DTD_WML_1_2', '-//WAPFORUM//DTD WML 1.2//EN');
 
48
define('DPI_DTD_WML_1_3', '-//WAPFORUM//DTD WML 1.3//EN');
 
49
define('DPI_DTD_PROV_1_0', '-//WAPFORUM//DTD PROV 1.0//EN');
 
50
define('DPI_DTD_WTA_WML_1_2', '-//WAPFORUM//DTD WTA-WML 1.2//EN');
 
51
define('DPI_DTD_CHANNEL_1_2', '-//WAPFORUM//DTD CHANNEL 1.2//EN');
 
52
define('DPI_DTD_SYNCML_1_1', '-//SYNCML//DTD SyncML 1.1//EN');
 
53
define('DPI_DTD_DEVINF_1_1', '-//SYNCML//DTD DevInf 1.1//EN');
 
54
 
 
55
/**
 
56
 * Only default character encodings from J2SE are currently supported.
 
57
 */
 
58
define('CHARSET_US_ASCII', 'US-ASCII');
 
59
define('CHARSET_ISO_8859_1', 'ISO-8859-1');
 
60
define('CHARSET_UTF_8', 'UTF-8');
 
61
define('CHARSET_UTF_16BE', 'UTF-16BE');
 
62
define('CHARSET_UTF_16LE', 'UTF-16LE');
 
63
define('CHARSET_UTF_16', 'UTF-16');
 
64
 
 
65
/**
 
66
 * Copyright 2003-2005 Anthony Mills <amills@pyramid6.com>
 
67
 *
 
68
 * See the enclosed file COPYING for license information (LGPL).  If you
 
69
 * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
 
70
 *
 
71
 * $Horde: framework/XML_WBXML/WBXML.php,v 1.13.12.1 2005/01/03 12:19:22 jan Exp $
 
72
 *
 
73
 * @package XML_WBXML
 
74
 */
 
75
class XML_WBXML {
 
76
 
 
77
    /**
 
78
     * Decoding Multi-byte Integers from Section 5.1
 
79
     *
 
80
     * Use long because it is unsigned.
 
81
     */
 
82
    function MBUInt32ToInt($in, &$pos)
 
83
    {
 
84
        $val = 0;
 
85
 
 
86
        do {
 
87
            $b = ord($in[$pos++]);
 
88
            $val <<= 7; // Bitshift left 7 bits.
 
89
            $val += ($b & 127);
 
90
        } while (($b & 128) != 0);
 
91
 
 
92
        return $val;
 
93
    }
 
94
 
 
95
    /**
 
96
     * Encoding Multi-byte Integers from Section 5.1
 
97
     */
 
98
    function intToMBUInt32(&$out, $i)
 
99
    {
 
100
        if ($i > 268435455) {
 
101
            $bytes0 = 0 | XML_WBXML::getBits(0, $i);
 
102
            $bytes1 = 128 | XML_WBXML::getBits(1, $i);
 
103
            $bytes2 = 128 | XML_WBXML::getBits(2, $i);
 
104
            $bytes3 = 128 | XML_WBXML::getBits(3, $i);
 
105
            $bytes4 = 128 | XML_WBXML::getBits(4, $i);
 
106
 
 
107
            $out .= chr($bytes4);
 
108
            $out .= chr($bytes3);
 
109
            $out .= chr($bytes2);
 
110
            $out .= chr($bytes1);
 
111
            $out .= chr($bytes0);
 
112
        } elseif ($i > 2097151) {
 
113
            $bytes0 = 0 | XML_WBXML::getBits(0, $i);
 
114
            $bytes1 = 128 | XML_WBXML::getBits(1, $i);
 
115
            $bytes2 = 128 | XML_WBXML::getBits(2, $i);
 
116
            $bytes3 = 128 | XML_WBXML::getBits(3, $i);
 
117
 
 
118
            $out .= chr($bytes3);
 
119
            $out .= chr($bytes2);
 
120
            $out .= chr($bytes1);
 
121
            $out .= chr($bytes0);
 
122
        } elseif ($i > 16383) {
 
123
            $bytes0 = 0 | XML_WBXML::getBits(0, $i);
 
124
            $bytes1 = 128 | XML_WBXML::getBits(1, $i);
 
125
            $bytes2 = 128 | XML_WBXML::getBits(2, $i);
 
126
 
 
127
            $out .= chr($bytes2);
 
128
            $out .= chr($bytes1);
 
129
            $out .= chr($bytes0);
 
130
        } elseif ($i > 127) {
 
131
            $bytes0 = 0 | XML_WBXML::getBits(0, $i);
 
132
            $bytes1 = 128 | XML_WBXML::getBits(1, $i);
 
133
 
 
134
            $out .= chr($bytes1);
 
135
            $out .= chr($bytes0);
 
136
        } else {
 
137
            $bytes0 = 0 | XML_WBXML::getBits(0, $i);
 
138
 
 
139
            $out .= chr($bytes0);
 
140
        }
 
141
    }
 
142
 
 
143
    function getBits($num, $l)
 
144
    {
 
145
        switch ($num) {
 
146
        case 0:
 
147
            return $l & 127; // 0x7F
 
148
 
 
149
        case 1:
 
150
            return ($l >> 7) & 127; // 0x7F
 
151
 
 
152
        case 2:
 
153
            return ($l >> 14) & 127; // 0x7F
 
154
 
 
155
        case 3:
 
156
            return ($l >> 21) & 127; // 0x7F
 
157
 
 
158
        case 4:
 
159
            return ($l >> 28) & 127; // 0x7F
 
160
        }
 
161
 
 
162
        return 0;
 
163
    }
 
164
 
 
165
    function getDPIString($i)
 
166
    {
 
167
        /**
 
168
         * ADD CHAPTER
 
169
         * @var array $_DPIString
 
170
         */
 
171
        $DPIString = array(2 => DPI_DTD_WML_1_0,
 
172
                           3 => DPI_DTD_WTA_1_0,
 
173
                           4 => DPI_DTD_WML_1_1,
 
174
                           5 => DPI_DTD_SI_1_1,
 
175
                           6 => DPI_DTD_SL_1_0,
 
176
                           7 => DPI_DTD_CO_1_0,
 
177
                           8 => DPI_DTD_CHANNEL_1_1,
 
178
                           9 => DPI_DTD_WML_1_2,
 
179
                           10 => DPI_DTD_WML_1_3,
 
180
                           11 => DPI_DTD_PROV_1_0,
 
181
                           12 => DPI_DTD_WTA_WML_1_2,
 
182
                           13 => DPI_DTD_CHANNEL_1_2,
 
183
 
 
184
                           // Not all SyncML clients know this, so we
 
185
                           // should use the string table.
 
186
                           // 0xFD1 => DPI_DTD_SYNCML_1_1,
 
187
                           // 0xFD2 => DPI_DTD_DEVINF_1_1,
 
188
                           );
 
189
 
 
190
        return isset($DPIString[$i]) ? $DPIString[$i] : null;
 
191
    }
 
192
 
 
193
    function getDPIInt($dpi)
 
194
    {
 
195
        /**
 
196
         * ADD CHAPTER
 
197
         * @var array $_DPIInt
 
198
         */
 
199
        $DPIInt = array(DPI_DTD_WML_1_0 => 2,
 
200
                        DPI_DTD_WTA_1_0 => 3,
 
201
                        DPI_DTD_WML_1_1 => 4,
 
202
                        DPI_DTD_SI_1_1 => 5,
 
203
                        DPI_DTD_SL_1_0 => 6,
 
204
                        DPI_DTD_CO_1_0 => 7,
 
205
                        DPI_DTD_CHANNEL_1_1 => 8,
 
206
                        DPI_DTD_WML_1_2 => 9,
 
207
                        DPI_DTD_WML_1_3 => 10,
 
208
                        DPI_DTD_PROV_1_0 => 11,
 
209
                        DPI_DTD_WTA_WML_1_2 => 12,
 
210
                        DPI_DTD_CHANNEL_1_2 => 13,
 
211
 
 
212
                        // Not all SyncML clients know this, so we
 
213
                        // should use the string table.
 
214
                        // DPI_DTD_SYNCML_1_1 => 0xFD1,
 
215
                        // DPI_DTD_DEVINF_1_1 => 0xFD2,
 
216
                        );
 
217
 
 
218
        return isset($DPIInt[$dpi]) ? $DPIInt[$dpi] : 0;
 
219
    }
 
220
 
 
221
    /**
 
222
     * Returns the character encoding.
 
223
     * only default character encodings from J2SE are supported
 
224
     * from http://www.iana.org/assignments/character-sets
 
225
     * and http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html
 
226
     */
 
227
    function getCharsetString($cs)
 
228
    {
 
229
        /**
 
230
         * From http://www.iana.org/assignments/character-sets
 
231
         * @var array $_charsetString
 
232
         */
 
233
        $charsetString = array(3 => 'US-ASCII',
 
234
                               4 => 'ISO-8859-1',
 
235
                               106 => 'UTF-8',
 
236
                               1013 => 'UTF-16BE',
 
237
                               1014 => 'UTF-16LE',
 
238
                               1015 => 'UTF-16');
 
239
 
 
240
        return isset($charsetString[$cs]) ? $charsetString[$cs] : null;
 
241
    }
 
242
 
 
243
    /**
 
244
     * Returns the character encoding.
 
245
     *
 
246
     * Only default character encodings from J2SE are supported.
 
247
     *
 
248
     * From http://www.iana.org/assignments/character-sets and
 
249
     * http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html
 
250
     */
 
251
    function getCharsetInt($cs)
 
252
    {
 
253
        /**
 
254
         * From http://www.iana.org/assignments/character-sets
 
255
         * @var array $_charsetInt
 
256
         */
 
257
        $charsetInt = array('US-ASCII' => 3,
 
258
                            'ISO-8859-1' => 4,
 
259
                            'UTF-8' => 106,
 
260
                            'UTF-16BE' => 1013,
 
261
                            'UTF-16LE' => 1014,
 
262
                            'UTF-16' => 1015);
 
263
 
 
264
        return isset($charsetInt[$cs]) ? $charsetInt[$cs] : null;
 
265
    }
 
266
 
 
267
}
 
268
 
 
269
/**
 
270
 * @package XML_WBXML
 
271
 */
 
272
class XML_WBXML_HashTable {
 
273
 
 
274
    var $_h;
 
275
 
 
276
    function set($k, $v)
 
277
    {
 
278
        $this->_h[$k] = $v;
 
279
    }
 
280
 
 
281
    function get($k)
 
282
    {
 
283
        return isset($this->_h[$k]) ? $this->_h[$k] : null;
 
284
    }
 
285
 
 
286
}