Read CICM XML metadata block.

This commit is contained in:
2019-03-18 22:06:10 +00:00
parent 2ca8443fdf
commit d5311f9fe3
3 changed files with 58 additions and 19 deletions

View File

@@ -46,22 +46,24 @@ typedef struct dicformatContext
struct dataLinkedList *mediaTagsHead; struct dataLinkedList *mediaTagsHead;
struct dataLinkedList *mediaTagsTail; struct dataLinkedList *mediaTagsTail;
unsigned char *sectorPrefix; unsigned char *sectorPrefix;
unsigned char *sectorPrefixCorrected; unsigned char *sectorPrefixCorrected;
unsigned char *sectorSuffix; unsigned char *sectorSuffix;
unsigned char *sectorSuffixCorrected; unsigned char *sectorSuffixCorrected;
unsigned char *sectorSubchannel; unsigned char *sectorSubchannel;
unsigned char *mode2Subheaders; unsigned char *mode2Subheaders;
unsigned char shift; unsigned char shift;
bool inMemoryDdt; bool inMemoryDdt;
uint64_t *userDataDdt; uint64_t *userDataDdt;
size_t mappedMemoryDdtSize; size_t mappedMemoryDdtSize;
uint32_t *sectorPrefixDdt; uint32_t *sectorPrefixDdt;
uint32_t *sectorSuffixDdt; uint32_t *sectorSuffixDdt;
GeometryBlockHeader geometryBlock; GeometryBlockHeader geometryBlock;
MetadataBlockHeader metadataBlockHeader; MetadataBlockHeader metadataBlockHeader;
unsigned char *metadataBlock; unsigned char *metadataBlock;
TracksHeader tracksHeader; TracksHeader tracksHeader;
TrackEntry *trackEntries; TrackEntry *trackEntries;
CicmMetadataBlock cicmBlockHeader;
unsigned char *cicmBlock;
} dicformatContext; } dicformatContext;
typedef struct dataLinkedList typedef struct dataLinkedList

View File

@@ -46,7 +46,7 @@ int close(void *context)
dicformatContext *ctx = context; dicformatContext *ctx = context;
// TODO: Cast this field without casting the whole structure, as this can buffer overlow // TODO: Cast this field without casting the whole structure, as this can buffer overflow
// Not a libdicformat context // Not a libdicformat context
if(ctx->magic != DIC_MAGIC) if(ctx->magic != DIC_MAGIC)
{ {
@@ -93,6 +93,7 @@ int close(void *context)
free(ctx->metadataBlock); free(ctx->metadataBlock);
free(ctx->trackEntries); free(ctx->trackEntries);
free(ctx->cicmBlock);
free(context); free(context);

View File

@@ -570,8 +570,44 @@ void *open(const char *filepath)
// TODO: ImageInfo // TODO: ImageInfo
break; break;
case CicmBlock: // CICM XML metadata block
// TODO case CicmBlock:readBytes = fread(&ctx->cicmBlockHeader, sizeof(CicmMetadataBlock), 1, ctx->imageStream);
if(readBytes != sizeof(CicmMetadataBlock))
{
memset(&ctx->cicmBlockHeader, 0, sizeof(CicmMetadataBlock));
fprintf(stderr, "libdicformat: Could not read CICM XML metadata header, continuing...");
break;
}
if(ctx->cicmBlockHeader.identifier != CicmBlock)
{
memset(&ctx->cicmBlockHeader, 0, sizeof(CicmMetadataBlock));
fprintf(stderr,
"libdicformat: Incorrect identifier for data block at position %"PRIu64"",
idxEntries[i].offset);
}
ctx->cicmBlock = malloc(ctx->cicmBlockHeader.length);
if(ctx->cicmBlock == NULL)
{
memset(&ctx->cicmBlockHeader, 0, sizeof(CicmMetadataBlock));
fprintf(stderr,
"libdicformat: Could not allocate memory for CICM XML metadata block, continuing...");
break;
}
readBytes = fread(ctx->cicmBlock, ctx->cicmBlockHeader.length, 1, ctx->imageStream);
if(readBytes != ctx->metadataBlockHeader.blockSize)
{
memset(&ctx->cicmBlockHeader, 0, sizeof(CicmMetadataBlock));
free(ctx->cicmBlock);
fprintf(stderr, "libdicformat: Could not read CICM XML metadata block, continuing...");
}
fprintf(stderr, "libdicformat: Found CICM XML metadata block %"PRIu64".", idxEntries[i].offset);
break; break;
case DumpHardwareBlock: case DumpHardwareBlock:
// TODO // TODO