1
0

AbstractEncoderChannel.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. /*
  2. * Copyright (C) 2007-2012 Siemens AG
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU Lesser General Public License as published
  6. * by the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU Lesser General Public License for more details.
  13. * GNU Lesser General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Lesser General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /*******************************************************************
  19. *
  20. * @author Daniel.Peintner.EXT@siemens.com
  21. * @version 0.7
  22. * @contact Joerg.Heuer@siemens.com
  23. *
  24. * <p>Code generated by EXIdizer.com</p>
  25. ********************************************************************/
  26. #include "EncoderChannel.h"
  27. #include "CoderChannel.h"
  28. #include "BitOutputStream.h"
  29. #include "EXIOptions.h"
  30. #include "EXITypes.h"
  31. #include "ErrorCodes.h"
  32. #include "MethodsBag.h"
  33. #include "EXICoder.h"
  34. #ifndef ABSTRACT_ENCODER_CHANNEL_C
  35. #define ABSTRACT_ENCODER_CHANNEL_C
  36. int encodeUnsignedInteger(bitstream_t* stream, exi_integer_t* iv) {
  37. int errn = 0;
  38. switch (iv->type) {
  39. /* Unsigned Integer */
  40. case EXI_UNSIGNED_INTEGER_8:
  41. errn = encodeUnsignedInteger32(stream, iv->val.uint8);
  42. break;
  43. case EXI_UNSIGNED_INTEGER_16:
  44. errn = encodeUnsignedInteger32(stream, iv->val.uint16);
  45. break;
  46. case EXI_UNSIGNED_INTEGER_32:
  47. errn = encodeUnsignedInteger32(stream, iv->val.uint32);
  48. break;
  49. case EXI_UNSIGNED_INTEGER_64:
  50. errn = encodeUnsignedInteger64(stream, iv->val.uint64);
  51. break;
  52. /* (Signed) Integer */
  53. case EXI_INTEGER_8:
  54. if (iv->val.int8 < 0) {
  55. return EXI_NEGATIVE_UNSIGNED_INTEGER_VALUE;
  56. }
  57. errn = encodeUnsignedInteger32(stream, iv->val.int8);
  58. break;
  59. case EXI_INTEGER_16:
  60. if (iv->val.int16 < 0) {
  61. return EXI_NEGATIVE_UNSIGNED_INTEGER_VALUE;
  62. }
  63. errn = encodeUnsignedInteger32(stream, iv->val.int16);
  64. break;
  65. case EXI_INTEGER_32:
  66. if (iv->val.int32 < 0) {
  67. return EXI_NEGATIVE_UNSIGNED_INTEGER_VALUE;
  68. }
  69. errn = encodeUnsignedInteger32(stream, iv->val.int32);
  70. break;
  71. case EXI_INTEGER_64:
  72. if (iv->val.int64 < 0) {
  73. return EXI_NEGATIVE_UNSIGNED_INTEGER_VALUE;
  74. }
  75. errn = encodeUnsignedInteger64(stream, iv->val.int64);
  76. break;
  77. default:
  78. errn = EXI_UNSUPPORTED_INTEGER_VALUE_TYPE;
  79. break;
  80. }
  81. return errn;
  82. }
  83. /**
  84. * Encode an arbitrary precision non negative integer using a sequence of
  85. * octets. The most significant bit of the last octet is set to zero to
  86. * indicate sequence termination. Only seven bits per octet are used to
  87. * store the integer's value.
  88. */
  89. int encodeUnsignedInteger32(bitstream_t* stream, uint32_t n) {
  90. int errn = 0;
  91. if (n < 128) {
  92. /* write byte as is */
  93. errn = encode(stream, (uint8_t) n);
  94. } else {
  95. uint8_t n7BitBlocks = numberOf7BitBlocksToRepresent(n);
  96. switch (n7BitBlocks) {
  97. case 5:
  98. errn = encode(stream, (uint8_t) (128 | n));
  99. n = n >> 7;
  100. if (errn < 0) {
  101. break;
  102. }
  103. /* no break */
  104. case 4:
  105. errn = encode(stream, (uint8_t) (128 | n));
  106. n = n >> 7;
  107. if (errn < 0) {
  108. break;
  109. }
  110. /* no break */
  111. case 3:
  112. errn = encode(stream, (uint8_t) (128 | n));
  113. n = n >> 7;
  114. if (errn < 0) {
  115. break;
  116. }
  117. /* no break */
  118. case 2:
  119. errn = encode(stream, (uint8_t) (128 | n));
  120. n = n >> 7;
  121. if (errn < 0) {
  122. break;
  123. }
  124. /* no break */
  125. case 1:
  126. /* 0 .. 7 (last byte) */
  127. errn = encode(stream, (uint8_t) (0 | n));
  128. /* no break */
  129. }
  130. }
  131. return errn;
  132. }
  133. /**
  134. * Encode an arbitrary precision non negative integer using a sequence of
  135. * octets. The most significant bit of the last octet is set to zero to
  136. * indicate sequence termination. Only seven bits per octet are used to
  137. * store the integer's value.
  138. */
  139. int encodeUnsignedInteger64(bitstream_t* stream, uint64_t n) {
  140. int errn = 0;
  141. uint8_t lastEncode = (uint8_t) n;
  142. n >>= 7;
  143. while (n != 0) {
  144. errn = encode(stream, lastEncode | 128);
  145. if (errn < 0) {
  146. return errn;
  147. }
  148. lastEncode = (uint8_t) n;
  149. n >>= 7;
  150. }
  151. return encode(stream, lastEncode);
  152. }
  153. int encodeInteger(bitstream_t* stream, exi_integer_t* iv) {
  154. int errn = 0;
  155. switch (iv->type) {
  156. /* Unsigned Integer */
  157. case EXI_UNSIGNED_INTEGER_8:
  158. errn = encodeInteger32(stream, iv->val.uint8);
  159. break;
  160. case EXI_UNSIGNED_INTEGER_16:
  161. errn = encodeInteger32(stream, iv->val.uint16);
  162. break;
  163. case EXI_UNSIGNED_INTEGER_32:
  164. errn = encodeInteger64(stream, iv->val.uint32);
  165. break;
  166. case EXI_UNSIGNED_INTEGER_64:
  167. errn = encodeInteger64(stream, iv->val.uint64);
  168. break;
  169. /* (Signed) Integer */
  170. case EXI_INTEGER_8:
  171. errn = encodeInteger32(stream, iv->val.int8);
  172. break;
  173. case EXI_INTEGER_16:
  174. errn = encodeInteger32(stream, iv->val.int16);
  175. break;
  176. case EXI_INTEGER_32:
  177. errn = encodeInteger32(stream, iv->val.int32);
  178. break;
  179. case EXI_INTEGER_64:
  180. errn = encodeInteger64(stream, iv->val.int64);
  181. break;
  182. default:
  183. errn = EXI_UNSUPPORTED_INTEGER_VALUE_TYPE;
  184. break;
  185. }
  186. return errn;
  187. }
  188. /**
  189. * Encode an arbitrary precision integer using a sign bit followed by a
  190. * sequence of octets. The most significant bit of the last octet is set to
  191. * zero to indicate sequence termination. Only seven bits per octet are used
  192. * to store the integer's value.
  193. */
  194. int encodeInteger32(bitstream_t* stream, int32_t n) {
  195. int errn;
  196. /* signalize sign */
  197. if (n < 0) {
  198. errn = encodeBoolean(stream, 1);
  199. /* For negative values, the Unsigned Integer holds the
  200. * magnitude of the value minus 1 */
  201. n = (-n) - 1;
  202. } else {
  203. errn = encodeBoolean(stream, 0);
  204. }
  205. if (errn < 0) {
  206. return errn;
  207. }
  208. return encodeUnsignedInteger32(stream, n);
  209. }
  210. /**
  211. * Encode an arbitrary precision integer using a sign bit followed by a
  212. * sequence of octets. The most significant bit of the last octet is set to
  213. * zero to indicate sequence termination. Only seven bits per octet are used
  214. * to store the integer's value.
  215. */
  216. int encodeInteger64(bitstream_t* stream, int64_t n) {
  217. int errn;
  218. /* signalize sign */
  219. if (n < 0) {
  220. errn = encodeBoolean(stream, 1);
  221. /* For negative values, the Unsigned Integer holds the
  222. * magnitude of the value minus 1 */
  223. n = (-n) - 1;
  224. } else {
  225. errn = encodeBoolean(stream, 0);
  226. }
  227. if (errn < 0) {
  228. return errn;
  229. }
  230. return encodeUnsignedInteger64(stream, n);
  231. }
  232. /**
  233. * The Float datatype representation is two consecutive Integers.
  234. * The first Integer represents the mantissa of the floating point
  235. * number and the second Integer represents the base-10 exponent
  236. * of the floating point number.
  237. */
  238. int encodeFloat(bitstream_t* stream, exi_float_me_t* f) {
  239. int errn = encodeInteger64(stream, f->mantissa);
  240. if (errn >= 0) {
  241. errn = encodeInteger32(stream, f->exponent);
  242. }
  243. return errn;
  244. }
  245. /**
  246. * Encode a decimal represented as a Boolean sign followed by two Unsigned
  247. * Integers. A sign value of zero (0) is used to represent positive Decimal
  248. * values and a sign value of one (1) is used to represent negative Decimal
  249. * values The first Integer represents the integral portion of the Decimal
  250. * value. The second positive integer represents the fractional portion of
  251. * the decimal with the digits in reverse order to preserve leading zeros.
  252. */
  253. int encodeDecimal(bitstream_t* stream, exi_decimal_t* d) {
  254. /* sign, integral, reverse fractional */
  255. int errn = encodeBoolean(stream, d->negative);
  256. if (errn < 0) {
  257. return errn;
  258. }
  259. errn = encodeUnsignedInteger(stream, &d->integral);
  260. if (errn < 0) {
  261. return errn;
  262. }
  263. errn = encodeUnsignedInteger(stream, &d->reverseFraction);
  264. return errn;
  265. }
  266. /**
  267. * Encode a length prefixed sequence of characters.
  268. */
  269. /*int encodeASCII(bitstream_t* stream, const char* ascii) {
  270. int errn;
  271. uint32_t slen = (uint32_t) strlen(ascii);
  272. errn = encodeUnsignedInteger32(stream, slen);
  273. if (errn >= 0) {
  274. errn = encodeASCIICharacters(stream, ascii, slen);
  275. }
  276. return errn;
  277. }*/
  278. int encodeString(bitstream_t* stream, exi_string_ucs_t* string) {
  279. int errn = encodeUnsignedInteger32(stream, string->len);
  280. if (errn >= 0) {
  281. errn = encodeUCSCharacters(stream, string->codepoints, string->len);
  282. }
  283. return errn;
  284. }
  285. static int _writeStringValueLocalHit(bitstream_t* stream, exi_state_t* state,
  286. uint16_t qnameID, uint32_t localID) {
  287. int errn;
  288. uint16_t codingLength;
  289. if(!(state->stringTable.sizeLocalStrings > qnameID)) {
  290. return EXI_ERROR_OUT_OF_BOUNDS;
  291. }
  292. errn = exiGetCodingLength(state->stringTable.numberOfLocalStrings[qnameID],
  293. &codingLength);
  294. if (errn) {
  295. return errn;
  296. }
  297. errn = encodeNBitUnsignedInteger(stream, codingLength, localID);
  298. return errn;
  299. }
  300. static int _writeStringValueGlobalHit(bitstream_t* stream, exi_state_t* state,
  301. uint32_t globalID) {
  302. int errn;
  303. uint16_t codingLength;
  304. errn = exiGetCodingLength(state->stringTable.numberOfGlobalStrings, &codingLength);
  305. if (errn) {
  306. return errn;
  307. }
  308. errn = encodeNBitUnsignedInteger(stream, codingLength, globalID);
  309. return errn;
  310. }
  311. int encodeStringValue(bitstream_t* stream, exi_state_t* state, uint16_t qnameID,
  312. exi_string_value_t* string) {
  313. int errn;
  314. switch (string->type) {
  315. case EXI_STRING_VALUE_LOCAL_HIT:
  316. errn = encodeUnsignedInteger32(stream, 0);
  317. if (errn) {
  318. return errn;
  319. }
  320. errn = _writeStringValueLocalHit(stream, state, qnameID,
  321. string->localID);
  322. break;
  323. case EXI_STRING_VALUE_GLOBAL_HIT:
  324. errn = encodeUnsignedInteger32(stream, 1);
  325. if (errn) {
  326. return errn;
  327. }
  328. errn = _writeStringValueGlobalHit(stream, state, string->globalID);
  329. break;
  330. case EXI_STRING_VALUE_MISS:
  331. /* encode string as string table miss */
  332. errn = encodeUnsignedInteger32(stream, string->miss.len + 2);
  333. if (errn >= 0) {
  334. errn = encodeUCSCharacters(stream, string->miss.codepoints,
  335. string->miss.len);
  336. }
  337. #if EXI_VALUE_PARTITION_CAPACITY != 0
  338. #if EXI_VALUE_MAX_LENGTH != 0
  339. /* If length L is greater than zero the string S is added */
  340. if (string->miss.len > 0) {
  341. /* After encoding the string value, it is added to both the
  342. * associated "local" value string table partition and the global
  343. * value string table partition */
  344. #if EXI_VALUE_MAX_LENGTH < 0
  345. errn = exi__IncrementStringValueCount(state, qnameID);
  346. # else /* EXI_VALUE_MAX_LENGTH < 0 */
  347. if (string->miss.len <= EXI_VALUE_MAX_LENGTH) {
  348. errn = exi__IncrementStringValueCount(state,
  349. qnameID);
  350. }
  351. #endif /* EXI_VALUE_MAX_LENGTH < 0 */
  352. }
  353. #endif /* EXI_VALUE_MAX_LENGTH != 0 */
  354. #endif /* EXI_VALUE_PARTITION_CAPACITY != 0 */
  355. break;
  356. default:
  357. errn = EXI_UNSUPPORTED_STRING_VALUE_TYPE;
  358. break;
  359. }
  360. return errn;
  361. }
  362. int encodeRCSStringValue(bitstream_t* stream, exi_state_t* state,
  363. uint16_t qnameID, exi_rcs_t* rcs, exi_string_value_t* string) {
  364. unsigned int i;
  365. int errn;
  366. uint32_t k;
  367. switch (string->type) {
  368. case EXI_STRING_VALUE_LOCAL_HIT:
  369. errn = encodeUnsignedInteger32(stream, 0);
  370. if (errn) {
  371. return errn;
  372. }
  373. errn = _writeStringValueLocalHit(stream, state, qnameID,
  374. string->localID);
  375. break;
  376. case EXI_STRING_VALUE_GLOBAL_HIT:
  377. errn = encodeUnsignedInteger32(stream, 1);
  378. if (errn) {
  379. return errn;
  380. }
  381. errn = _writeStringValueGlobalHit(stream, state, string->globalID);
  382. break;
  383. case EXI_STRING_VALUE_MISS:
  384. /* encode string as string table miss */
  385. errn = encodeUnsignedInteger32(stream, string->miss.len + 2);
  386. if (errn) {
  387. return errn;
  388. }
  389. for (i = 0; i < string->miss.len; i++) {
  390. for (k = 0; k < rcs->size; k++) {
  391. if (rcs->codepoints[k] == string->miss.codepoints[i]) {
  392. errn = encodeNBitUnsignedInteger(stream, rcs->codingLength,
  393. k);
  394. if (errn) {
  395. return errn;
  396. }
  397. break; /* break inner for loop */
  398. }
  399. }
  400. }
  401. #if EXI_VALUE_PARTITION_CAPACITY != 0
  402. #if EXI_VALUE_MAX_LENGTH != 0
  403. /* If length L is greater than zero the string S is added */
  404. if (string->miss.len > 0) {
  405. /* After encoding the string value, it is added to both the
  406. * associated "local" value string table partition and the global
  407. * value string table partition */
  408. #if EXI_VALUE_MAX_LENGTH < 0
  409. errn = exi__IncrementStringValueCount(state, qnameID);
  410. #else /* EXI_VALUE_MAX_LENGTH < 0 */
  411. if (string->miss.len <= EXI_VALUE_MAX_LENGTH) {
  412. errn = exi__IncrementStringValueCount(state,
  413. qnameID);
  414. }
  415. #endif /* EXI_VALUE_MAX_LENGTH < 0 */
  416. }
  417. #endif /* EXI_VALUE_MAX_LENGTH != 0 */
  418. #endif /* EXI_VALUE_PARTITION_CAPACITY != 0 */
  419. break;
  420. default:
  421. errn = EXI_UNSUPPORTED_STRING_VALUE_TYPE;
  422. break;
  423. }
  424. return errn;
  425. }
  426. /**
  427. * Encode a sequence of characters according to a given length.
  428. * Each character is represented by its UCS [ISO/IEC 10646]
  429. * code point encoded as an Unsigned Integer
  430. */
  431. int encodeUCSCharacters(bitstream_t* stream, uint32_t* chars, uint16_t len) {
  432. unsigned int i;
  433. int errn = 0;
  434. for (i = 0; i < len && errn >= 0; i++) {
  435. errn = encodeUnsignedInteger32(stream, chars[i]);
  436. }
  437. return errn;
  438. }
  439. /*int encodeASCIICharacters(bitstream_t* stream, const char* chars, uint16_t len) {
  440. unsigned int i;
  441. int errn = 0;
  442. for (i = 0; i < len && errn >= 0; i++) {
  443. errn = encode(stream, chars[i]);
  444. }
  445. return errn;
  446. }*/
  447. /**
  448. * Encode a binary value as a length-prefixed sequence of octets.
  449. */
  450. int encodeBinary(bitstream_t* stream, exi_bytes_t* bytes) {
  451. unsigned int i;
  452. int errn = encodeUnsignedInteger32(stream, bytes->len);
  453. for (i = 0; i < bytes->len && errn >= 0; i++) {
  454. errn = encode(stream, bytes->data[i]);
  455. }
  456. return errn;
  457. }
  458. /**
  459. * Encode a datetime representation which is a sequence of values
  460. * representing the individual components of the Date-Time
  461. */
  462. int encodeDateTime(bitstream_t* stream, exi_datetime_t* datetime) {
  463. int errn = 0;
  464. switch (datetime->type) {
  465. case EXI_DATETIME_GYEAR: /* Year, [Time-Zone] */
  466. errn = encodeInteger32(stream, datetime->year - DATETIME_YEAR_OFFSET);
  467. break;
  468. case EXI_DATETIME_GYEARMONTH: /* Year, MonthDay, [TimeZone] */
  469. case EXI_DATETIME_DATE: /* Year, MonthDay, [TimeZone] */
  470. errn = encodeInteger32(stream, datetime->year - DATETIME_YEAR_OFFSET);
  471. if (errn < 0) {
  472. return errn;
  473. }
  474. errn = encodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY,
  475. datetime->monthDay);
  476. break;
  477. case EXI_DATETIME_DATETIME: /* Year, MonthDay, Time, [FractionalSecs], [TimeZone] */
  478. errn = encodeInteger32(stream, datetime->year - DATETIME_YEAR_OFFSET);
  479. if (errn < 0) {
  480. return errn;
  481. }
  482. errn = encodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY,
  483. datetime->monthDay);
  484. if (errn < 0) {
  485. return errn;
  486. }
  487. /* no break */
  488. case EXI_DATETIME_TIME: /* Time, [FractionalSecs], [TimeZone] */
  489. errn = encodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_TIME,
  490. datetime->time);
  491. if (errn < 0) {
  492. return errn;
  493. }
  494. if (datetime->presenceFractionalSecs) {
  495. encodeBoolean(stream, 1);
  496. if (errn < 0) {
  497. return errn;
  498. }
  499. encodeUnsignedInteger32(stream, datetime->fractionalSecs);
  500. } else {
  501. encodeBoolean(stream, 0);
  502. }
  503. break;
  504. case EXI_DATETIME_GMONTH: /* MonthDay, [TimeZone] */
  505. case EXI_DATETIME_GMONTHDAY: /* MonthDay, [TimeZone] */
  506. case EXI_DATETIME_GDAY: /* MonthDay, [TimeZone] */
  507. errn = encodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY,
  508. datetime->monthDay);
  509. break;
  510. default:
  511. return EXI_UNSUPPORTED_DATETIME_TYPE;
  512. }
  513. if (errn < 0) {
  514. return errn;
  515. }
  516. /* [TimeZone] */
  517. if (datetime->presenceTimezone) {
  518. errn = encodeBoolean(stream, 1);
  519. if (errn < 0) {
  520. return errn;
  521. }
  522. encodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_TIMEZONE,
  523. datetime->timezone + DATETIME_TIMEZONE_OFFSET_IN_MINUTES);
  524. } else {
  525. encodeBoolean(stream, 0);
  526. }
  527. return errn;
  528. }
  529. #endif