ICNSTranslator: Minor fixes
* documentIndex not zero-based * more error handling * memory leak
This commit is contained in:
@@ -60,6 +60,9 @@ ICNSLoader::ICNSLoader(BPositionIO *stream)
|
|||||||
stream->Seek(0, SEEK_END);
|
stream->Seek(0, SEEK_END);
|
||||||
fStreamSize = stream->Position();
|
fStreamSize = stream->Position();
|
||||||
stream->Seek(0, SEEK_SET);
|
stream->Seek(0, SEEK_SET);
|
||||||
|
|
||||||
|
if (fStreamSize <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
uint8* icnsDataBuffer = new uint8[fStreamSize];
|
uint8* icnsDataBuffer = new uint8[fStreamSize];
|
||||||
size_t readedBytes = stream->Read(icnsDataBuffer,fStreamSize);
|
size_t readedBytes = stream->Read(icnsDataBuffer,fStreamSize);
|
||||||
@@ -67,8 +70,11 @@ ICNSLoader::ICNSLoader(BPositionIO *stream)
|
|||||||
fIconFamily = NULL;
|
fIconFamily = NULL;
|
||||||
int status = icns_import_family_data(readedBytes, icnsDataBuffer,
|
int status = icns_import_family_data(readedBytes, icnsDataBuffer,
|
||||||
&fIconFamily);
|
&fIconFamily);
|
||||||
if (status != 0)
|
|
||||||
|
if (status != 0) {
|
||||||
|
delete icnsDataBuffer;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
icns_byte_t *dataPtr = (icns_byte_t*)fIconFamily;
|
icns_byte_t *dataPtr = (icns_byte_t*)fIconFamily;
|
||||||
off_t dataOffset = sizeof(icns_type_t) + sizeof(icns_size_t);
|
off_t dataOffset = sizeof(icns_type_t) + sizeof(icns_size_t);
|
||||||
@@ -89,10 +95,10 @@ ICNSLoader::ICNSLoader(BPositionIO *stream)
|
|||||||
}
|
}
|
||||||
dataOffset += iconElement.elementSize;
|
dataOffset += iconElement.elementSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
fFormatList.SortItems(compareTypes);
|
fFormatList.SortItems(compareTypes);
|
||||||
|
|
||||||
delete icnsDataBuffer;
|
delete icnsDataBuffer;
|
||||||
|
|
||||||
fLoaded = true;
|
fLoaded = true;
|
||||||
}
|
}
|
||||||
@@ -275,7 +281,7 @@ ICNSSaver::ICNSSaver(BPositionIO *stream, uint32 rowBytes, icns_type_t type)
|
|||||||
icns_free_image(&icnsMask);
|
icns_free_image(&icnsMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!fCreated) {
|
if (!fCreated) {
|
||||||
free(fIconFamily);
|
free(fIconFamily);
|
||||||
fIconFamily = NULL;
|
fIconFamily = NULL;
|
||||||
}
|
}
|
||||||
@@ -297,9 +303,11 @@ ICNSSaver::SaveData(BPositionIO *target)
|
|||||||
icns_size_t dataSize;
|
icns_size_t dataSize;
|
||||||
icns_byte_t *dataPtrOut;
|
icns_byte_t *dataPtrOut;
|
||||||
icns_export_family_data(fIconFamily, &dataSize, &dataPtrOut);
|
icns_export_family_data(fIconFamily, &dataSize, &dataPtrOut);
|
||||||
target->Write(dataPtrOut, dataSize);
|
if (dataSize != 0 && dataPtrOut != NULL) {
|
||||||
|
if (target->Write(dataPtrOut, dataSize) == dataSize);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
}
|
||||||
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ ICNSTranslator::DerivedTranslate(BPositionIO *source,
|
|||||||
if (!icnsFile.IsLoaded() || icnsFile.IconsCount() <= 0)
|
if (!icnsFile.IsLoaded() || icnsFile.IconsCount() <= 0)
|
||||||
return B_NO_TRANSLATOR;
|
return B_NO_TRANSLATOR;
|
||||||
|
|
||||||
int32 documentIndex = 0;
|
int32 documentIndex = 1;
|
||||||
|
|
||||||
if (ioExtension) {
|
if (ioExtension) {
|
||||||
if (ioExtension->FindInt32(DOCUMENT_INDEX, &documentIndex) != B_OK)
|
if (ioExtension->FindInt32(DOCUMENT_INDEX, &documentIndex) != B_OK)
|
||||||
|
|||||||
Reference in New Issue
Block a user