HPDF_InsertPage (HPDF_Doc pdf, HPDF_Page target) { HPDF_Page page; HPDF_STATUS ret; HPDF_PTRACE ((" HPDF_InsertPage\n")); if (!HPDF_HasDoc (pdf)) return NULL; if (!HPDF_Page_Validate (target)) { HPDF_RaiseError (&pdf->error, HPDF_INVALID_PAGE, 0); return NULL; } /* check whether the page belong to the pdf */ if (pdf->mmgr != target->mmgr) { HPDF_RaiseError (&pdf->error, HPDF_INVALID_PAGE, 0); return NULL; } page = HPDF_Page_New (pdf->mmgr, pdf->xref); if (!page) { HPDF_CheckError (&pdf->error); return NULL; } if ((ret = HPDF_Page_InsertBefore (page, target)) != HPDF_OK) { HPDF_RaiseError (&pdf->error, ret, 0); return NULL; } if ((ret = HPDF_List_Insert (pdf->page_list, target, page)) != HPDF_OK) { HPDF_RaiseError (&pdf->error, ret, 0); return NULL; } if (pdf->compression_mode & HPDF_COMP_TEXT) HPDF_Page_SetFilter (page, HPDF_STREAM_FILTER_FLATE_DECODE); return page; }
HPDF_STATUS HPDF_Array_Insert (HPDF_Array array, void *target, void *obj) { HPDF_Obj_Header *header; HPDF_STATUS ret; HPDF_UINT i; HPDF_PTRACE((" HPDF_Array_Insert\n")); if (!obj) { if (HPDF_Error_GetCode (array->error) == HPDF_OK) return HPDF_SetError (array->error, HPDF_INVALID_OBJECT, 0); else return HPDF_INVALID_OBJECT; } header = (HPDF_Obj_Header *)obj; if (header->obj_id & HPDF_OTYPE_DIRECT) { HPDF_PTRACE((" HPDF_Array_Add this object cannot owned by array " "obj=0x%08X\n", (HPDF_UINT)array)); return HPDF_SetError (array->error, HPDF_INVALID_OBJECT, 0); } if (array->list->count >= HPDF_LIMIT_MAX_ARRAY) { HPDF_PTRACE((" HPDF_Array_Add exceed limitatin of array count(%d)\n", HPDF_LIMIT_MAX_ARRAY)); HPDF_Obj_Free (array->mmgr, obj); return HPDF_SetError (array->error, HPDF_ARRAY_COUNT_ERR, 0); } if (header->obj_id & HPDF_OTYPE_INDIRECT) { HPDF_Proxy proxy = HPDF_Proxy_New (array->mmgr, obj); if (!proxy) { HPDF_Obj_Free (array->mmgr, obj); return HPDF_Error_GetCode (array->error); } proxy->header.obj_id |= HPDF_OTYPE_DIRECT; obj = proxy; } else header->obj_id |= HPDF_OTYPE_DIRECT; /* get the target-object from object-list * consider that the pointer contained in list may be proxy-object. */ for (i = 0; i < array->list->count; i++) { void *ptr = HPDF_List_ItemAt (array->list, i); void *obj_ptr; header = (HPDF_Obj_Header *)obj; if (header->obj_class == HPDF_OCLASS_PROXY) obj_ptr = ((HPDF_Proxy)ptr)->obj; else obj_ptr = ptr; if (obj_ptr == target) { ret = HPDF_List_Insert (array->list, ptr, obj); if (ret != HPDF_OK) HPDF_Obj_Free (array->mmgr, obj); return ret; } } HPDF_Obj_Free (array->mmgr, obj); return HPDF_ITEM_NOT_FOUND; }