hpdf_objects.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /*
  2. * << Haru Free PDF Library >> -- hpdf_objects.c
  3. *
  4. * URL: http://libharu.org
  5. *
  6. * Copyright (c) 1999-2006 Takeshi Kanno <[email protected]>
  7. * Copyright (c) 2007-2009 Antony Dovgal <[email protected]>
  8. *
  9. * Permission to use, copy, modify, distribute and sell this software
  10. * and its documentation for any purpose is hereby granted without fee,
  11. * provided that the above copyright notice appear in all copies and
  12. * that both that copyright notice and this permission notice appear
  13. * in supporting documentation.
  14. * It is provided "as is" without express or implied warranty.
  15. *
  16. */
  17. #include "hpdf_conf.h"
  18. #include "hpdf_utils.h"
  19. #include "hpdf_objects.h"
  20. void
  21. HPDF_Obj_Free (HPDF_MMgr mmgr,
  22. void *obj)
  23. {
  24. HPDF_Obj_Header *header;
  25. HPDF_PTRACE((" HPDF_Obj_Free\n"));
  26. if (!obj)
  27. return;
  28. header = (HPDF_Obj_Header *)obj;
  29. if (!(header->obj_id & HPDF_OTYPE_INDIRECT))
  30. HPDF_Obj_ForceFree (mmgr, obj);
  31. }
  32. void
  33. HPDF_Obj_ForceFree (HPDF_MMgr mmgr,
  34. void *obj)
  35. {
  36. HPDF_Obj_Header *header;
  37. HPDF_PTRACE((" HPDF_Obj_ForceFree\n"));
  38. if (!obj)
  39. return;
  40. header = (HPDF_Obj_Header *)obj;
  41. HPDF_PTRACE((" HPDF_Obj_ForceFree obj=0x%08X obj_id=0x%08X "
  42. "obj_class=0x%08X\n",
  43. (HPDF_UINT)obj, (HPDF_UINT)(header->obj_id),
  44. (HPDF_UINT)(header->obj_class)));
  45. switch (header->obj_class & HPDF_OCLASS_ANY) {
  46. case HPDF_OCLASS_STRING:
  47. HPDF_String_Free (obj);
  48. break;
  49. case HPDF_OCLASS_BINARY:
  50. HPDF_Binary_Free (obj);
  51. break;
  52. case HPDF_OCLASS_ARRAY:
  53. HPDF_Array_Free (obj);
  54. break;
  55. case HPDF_OCLASS_DICT:
  56. HPDF_Dict_Free (obj);
  57. break;
  58. default:
  59. HPDF_FreeMem (mmgr, obj);
  60. }
  61. }
  62. HPDF_STATUS
  63. HPDF_Obj_Write (void *obj,
  64. HPDF_Stream stream,
  65. HPDF_Encrypt e)
  66. {
  67. HPDF_Obj_Header *header = (HPDF_Obj_Header *)obj;
  68. HPDF_PTRACE((" HPDF_Obj_Write\n"));
  69. if (header->obj_id & HPDF_OTYPE_HIDDEN) {
  70. HPDF_PTRACE(("#HPDF_Obj_Write obj=0x%08X skipped\n", (HPDF_UINT)obj));
  71. return HPDF_OK;
  72. }
  73. if (header->obj_class == HPDF_OCLASS_PROXY) {
  74. char buf[HPDF_SHORT_BUF_SIZ];
  75. char *pbuf = buf;
  76. char *eptr = buf + HPDF_SHORT_BUF_SIZ - 1;
  77. HPDF_Proxy p = obj;
  78. header = (HPDF_Obj_Header*)p->obj;
  79. pbuf = HPDF_IToA (pbuf, header->obj_id & 0x00FFFFFF, eptr);
  80. *pbuf++ = ' ';
  81. pbuf = HPDF_IToA (pbuf, header->gen_no, eptr);
  82. HPDF_StrCpy(pbuf, " R", eptr);
  83. return HPDF_Stream_WriteStr(stream, buf);
  84. }
  85. return HPDF_Obj_WriteValue(obj, stream, e);
  86. }
  87. HPDF_STATUS
  88. HPDF_Obj_WriteValue (void *obj,
  89. HPDF_Stream stream,
  90. HPDF_Encrypt e)
  91. {
  92. HPDF_Obj_Header *header;
  93. HPDF_STATUS ret;
  94. HPDF_PTRACE((" HPDF_Obj_WriteValue\n"));
  95. header = (HPDF_Obj_Header *)obj;
  96. HPDF_PTRACE((" HPDF_Obj_WriteValue obj=0x%08X obj_class=0x%04X\n",
  97. (HPDF_UINT)obj, (HPDF_UINT)header->obj_class));
  98. switch (header->obj_class & HPDF_OCLASS_ANY) {
  99. case HPDF_OCLASS_NAME:
  100. ret = HPDF_Name_Write (obj, stream);
  101. break;
  102. case HPDF_OCLASS_NUMBER:
  103. ret = HPDF_Number_Write (obj, stream);
  104. break;
  105. case HPDF_OCLASS_REAL:
  106. ret = HPDF_Real_Write (obj, stream);
  107. break;
  108. case HPDF_OCLASS_STRING:
  109. ret = HPDF_String_Write (obj, stream, e);
  110. break;
  111. case HPDF_OCLASS_BINARY:
  112. ret = HPDF_Binary_Write (obj, stream, e);
  113. break;
  114. case HPDF_OCLASS_ARRAY:
  115. ret = HPDF_Array_Write (obj, stream, e);
  116. break;
  117. case HPDF_OCLASS_DICT:
  118. ret = HPDF_Dict_Write (obj, stream, e);
  119. break;
  120. case HPDF_OCLASS_BOOLEAN:
  121. ret = HPDF_Boolean_Write (obj, stream);
  122. break;
  123. case HPDF_OCLASS_NULL:
  124. ret = HPDF_Stream_WriteStr (stream, "null");
  125. break;
  126. default:
  127. ret = HPDF_ERR_UNKNOWN_CLASS;
  128. }
  129. return ret;
  130. }
  131. HPDF_Proxy
  132. HPDF_Proxy_New (HPDF_MMgr mmgr,
  133. void *obj)
  134. {
  135. HPDF_Proxy p = HPDF_GetMem (mmgr, sizeof(HPDF_Proxy_Rec));
  136. HPDF_PTRACE((" HPDF_Proxy_New\n"));
  137. if (p) {
  138. HPDF_MemSet (&p->header, 0, sizeof(HPDF_Obj_Header));
  139. p->header.obj_class = HPDF_OCLASS_PROXY;
  140. p->obj = obj;
  141. }
  142. return p;
  143. }