mirror of
https://github.com/aaru-dps/libaaruformat.git
synced 2025-12-16 19:24:40 +00:00
Read metadata block.
This commit is contained in:
@@ -46,18 +46,20 @@ 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;
|
||||||
|
unsigned char *metadataBlock;
|
||||||
} dicformatContext;
|
} dicformatContext;
|
||||||
|
|
||||||
typedef struct dataLinkedList
|
typedef struct dataLinkedList
|
||||||
|
|||||||
@@ -91,6 +91,8 @@ int close(void *context)
|
|||||||
free(ctx->sectorPrefixDdt);
|
free(ctx->sectorPrefixDdt);
|
||||||
free(ctx->sectorSuffixDdt);
|
free(ctx->sectorSuffixDdt);
|
||||||
|
|
||||||
|
free(ctx->metadataBlock);
|
||||||
|
|
||||||
free(context);
|
free(context);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
45
src/open.c
45
src/open.c
@@ -463,6 +463,7 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
if(readBytes != sizeof(GeometryBlockHeader))
|
if(readBytes != sizeof(GeometryBlockHeader))
|
||||||
{
|
{
|
||||||
|
memset(&ctx->geometryBlock, 0, sizeof(GeometryBlockHeader));
|
||||||
fprintf(stderr, "Could not read geometry block, continuing...");
|
fprintf(stderr, "Could not read geometry block, continuing...");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -485,8 +486,48 @@ void *open(const char *filepath)
|
|||||||
memset(&ctx->geometryBlock, 0, sizeof(GeometryBlockHeader));
|
memset(&ctx->geometryBlock, 0, sizeof(GeometryBlockHeader));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case MetadataBlock:
|
// Metadata block
|
||||||
// TODO
|
case MetadataBlock:readBytes =
|
||||||
|
fread(&ctx->metadataBlockHeader,
|
||||||
|
sizeof(MetadataBlockHeader),
|
||||||
|
1,
|
||||||
|
ctx->imageStream);
|
||||||
|
|
||||||
|
if(readBytes != sizeof(MetadataBlockHeader))
|
||||||
|
{
|
||||||
|
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
||||||
|
fprintf(stderr, "Could not read metadata block header, continuing...");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.identifier != idxEntries[i].blockType)
|
||||||
|
{
|
||||||
|
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
||||||
|
fprintf(stderr,
|
||||||
|
|
||||||
|
"libdicformat: Incorrect identifier for data block at position %"PRIu64"",
|
||||||
|
idxEntries[i].offset);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->metadataBlock = malloc(ctx->metadataBlockHeader.blockSize);
|
||||||
|
|
||||||
|
if(ctx->metadataBlock == NULL)
|
||||||
|
{
|
||||||
|
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
||||||
|
fprintf(stderr, "libdicformat: Could not allocate memory for metadata block, continuing...");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
readBytes = fread(ctx->metadataBlock, ctx->metadataBlockHeader.blockSize, 1, ctx->imageStream);
|
||||||
|
|
||||||
|
if(readBytes != ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
||||||
|
free(ctx->metadataBlock);
|
||||||
|
fprintf(stderr, "Could not read metadata block, continuing...");
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case TracksBlock:
|
case TracksBlock:
|
||||||
// TODO
|
// TODO
|
||||||
|
|||||||
Reference in New Issue
Block a user