int ArchiveFile::ExtractItem(int index, const char* outFilename) const { assert(!s_formatInfos.empty()); //assert(index >= 0 && index < m_numItems); if(!(index >= 0 && index < m_numItems)) return 0; ArchiveItem& item = m_items[index]; int rv = item.size; DWORD outAttributes = GetFileAttributes(outFilename); if(outAttributes & FILE_ATTRIBUTE_READONLY) SetFileAttributes(outFilename, outAttributes & ~FILE_ATTRIBUTE_READONLY); // temporarily remove read-only attribute so we can decompress to there if(m_typeIndex < 0) { // uncompressed if(!CopyFile(m_filename, outFilename, false)) rv = 0; } else { fex_t * object; fex_err_t err = fex_open_type( &object, m_filename, s_formatInfos[m_typeIndex].type ); if ( !err ) { if ( index != 0 ) err = fex_seek_arc( object, item.offset ); if ( !err ) { unsigned char * buffer = new unsigned char[item.size]; err = fex_read( object, buffer, item.size ); if ( !err ) { FILE * f = fopen(outFilename, "wb"); if (f) { fwrite( buffer, 1, item.size, f ); fclose( f ); } else rv = 0; } else rv = 0; } else rv = 0; fex_close( object ); } else rv = 0; } if(outAttributes & FILE_ATTRIBUTE_READONLY) SetFileAttributes(outFilename, outAttributes); // restore read-only attribute return rv; }
static fex_err_t fex_data_( File_Extractor* fe ) { if ( !fe->data ) { fe->data = malloc( fe->size ); if ( !fe->data ) return "Out of memory"; fex_err_t err = fex_read( fe, fe->data, fe->size ); if ( err ) { free( fe->data ); return err; } } return 0; }
int ArchiveFile::ExtractItem(int index, unsigned char* outBuffer, int bufSize) const { assert(!s_formatInfos.empty()); //assert(index >= 0 && index < m_numItems); if(!(index >= 0 && index < m_numItems)) return 0; ArchiveItem& item = m_items[index]; if(bufSize < item.size) return 0; if(m_typeIndex < 0) { // uncompressed FILE* file = fopen(m_filename, "rb"); fread(outBuffer, 1, item.size, file); fclose(file); } else { fex_t * object; fex_err_t err = fex_open_type( &object, m_filename, s_formatInfos[m_typeIndex].type ); if ( !err ) { if ( index != 0 ) err = fex_seek_arc( object, item.offset ); if ( !err ) { err = fex_read( object, outBuffer, item.size ); if ( !err ) { fex_close( object ); return item.size; } } fex_close( object ); } return 0; } return item.size; }
fex_err_t fex_read_once ( File_Extractor* fe, void* out, long count ) { return fex_read( fe, out, count ); }