NITFPRIV(NITF_BOOL) SegmentWriter_write(NITF_DATA * data, nitf_IOInterface* io, nitf_Error * error) { size_t size, bytesLeft; size_t readSize = READ_SIZE; size_t bytesToRead = READ_SIZE; char* buf = NULL; SegmentWriterImpl *impl = (SegmentWriterImpl *) data; size = (*impl->segmentSource->iface->getSize)(impl->segmentSource->data, error); bytesLeft = size; buf = (char*) NITF_MALLOC(readSize); if (!buf) { nitf_Error_init(error, NITF_STRERROR(NITF_ERRNO), NITF_CTXT, NITF_ERR_MEMORY); goto CATCH_ERROR; } while (bytesLeft > 0) { if (bytesLeft < readSize) bytesToRead = (size_t)bytesLeft; else bytesToRead = readSize; /* read the bytes */ if (!(*(impl->segmentSource->iface->read)) (impl->segmentSource->data, buf, bytesToRead, error)) { goto CATCH_ERROR; } /* write them */ if (!nitf_IOInterface_write(io, buf, (int)bytesToRead, error)) goto CATCH_ERROR; bytesLeft -= bytesToRead; } NITF_FREE(buf); return NITF_SUCCESS; CATCH_ERROR: if (buf) NITF_FREE(buf); return NITF_FAILURE; }
NITFAPI(NITF_BOOL) nitf_TREUtils_basicWrite(nitf_IOInterface* io, nitf_TRE* tre, struct _nitf_Record* record, nitf_Error* error) { nitf_Uint32 length; char* data = NULL; NITF_BOOL ok = NITF_FAILURE; data = nitf_TREUtils_getRawData(tre, &length, error); if (data) { ok = nitf_IOInterface_write(io, data, length, error); NITF_FREE(data); } return ok; }
NITFPRIV(NITF_BOOL) defaultWrite(nitf_IOInterface* io, struct _nitf_TRE* tre, struct _nitf_Record* record, nitf_Error* error) { nitf_Field* field; nitf_Pair* pair = nitf_HashTable_find( ((nitf_TREPrivateData*)tre->priv)->hash, NITF_TRE_RAW); if (pair == NULL) { nitf_Error_init(error, "No raw_data in default!", NITF_CTXT, NITF_ERR_INVALID_OBJECT); return NITF_FAILURE; } field = (nitf_Field*)pair->data; if (!nitf_IOInterface_write(io, field->raw, field->length, error)) return NITF_FAILURE; return NITF_SUCCESS; }