mirror of
https://github.com/vgmstream/vgmstream.git
synced 2024-12-14 07:32:52 +01:00
101 lines
3.0 KiB
C
101 lines
3.0 KiB
C
|
#ifndef _GH3_BAR_STREAMFILE_H_
|
||
|
#define _GH3_BAR_STREAMFILE_H_
|
||
|
#include "../streamfile.h"
|
||
|
|
||
|
/* a streamfile wrapping another for decryption */
|
||
|
|
||
|
enum {BAR_KEY_LENGTH = 16};
|
||
|
|
||
|
// don't know if this is unique, but seems accurate
|
||
|
static const uint8_t bar_key[BAR_KEY_LENGTH] = {
|
||
|
0xbd,0x14,0x0e,0x0a,0x91,0xeb,0xaa,0xf6,
|
||
|
0x11,0x44,0x17,0xc2,0x1c,0xe4,0x66,0x80
|
||
|
};
|
||
|
|
||
|
typedef struct _BARSTREAMFILE {
|
||
|
STREAMFILE sf;
|
||
|
STREAMFILE *real_file;
|
||
|
} BARSTREAMFILE;
|
||
|
|
||
|
|
||
|
/*static*/ STREAMFILE *wrap_bar_STREAMFILE(STREAMFILE *file);
|
||
|
|
||
|
|
||
|
static size_t read_bar(BARSTREAMFILE *streamFile, uint8_t *dest, off_t offset, size_t length) {
|
||
|
off_t i;
|
||
|
size_t read_length = streamFile->real_file->read(streamFile->real_file, dest, offset, length);
|
||
|
|
||
|
for (i = 0; i < read_length; i++) {
|
||
|
dest[i] = dest[i] ^ bar_key[(i+offset)%BAR_KEY_LENGTH];
|
||
|
}
|
||
|
|
||
|
return read_length;
|
||
|
}
|
||
|
|
||
|
static size_t get_size_bar(BARSTREAMFILE *streamFile) {
|
||
|
return streamFile->real_file->get_size(streamFile->real_file);
|
||
|
}
|
||
|
|
||
|
static size_t get_offset_bar(BARSTREAMFILE *streamFile) {
|
||
|
return streamFile->real_file->get_offset(streamFile->real_file);
|
||
|
}
|
||
|
|
||
|
static void get_name_bar(BARSTREAMFILE *streamFile, char *name, size_t length) {
|
||
|
return streamFile->real_file->get_name(streamFile->real_file, name, length);
|
||
|
}
|
||
|
|
||
|
static void get_realname_bar(BARSTREAMFILE *streamFile, char *name, size_t length) {
|
||
|
return streamFile->real_file->get_realname(streamFile->real_file, name, length);
|
||
|
}
|
||
|
|
||
|
STREAMFILE *open_bar(BARSTREAMFILE *streamFile, const char * const filename, size_t buffersize) {
|
||
|
STREAMFILE *newfile = streamFile->real_file->open(streamFile->real_file,filename,buffersize);
|
||
|
if (!newfile)
|
||
|
return NULL;
|
||
|
|
||
|
return wrap_bar_STREAMFILE(newfile);
|
||
|
}
|
||
|
|
||
|
static void close_bar(BARSTREAMFILE *streamFile) {
|
||
|
streamFile->real_file->close(streamFile->real_file);
|
||
|
free(streamFile);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
#ifdef PROFILE_STREAMFILE
|
||
|
size_t get_bytes_read_bar(BARSTREAMFILE *streamFile) {
|
||
|
return streamFile->real_file->get_bytes_read(streamFile->real_file);
|
||
|
}
|
||
|
|
||
|
int (*get_error_count)(BARSTREAMFILE *streamFile) {
|
||
|
return streamFile->real_file->get_error_count(streamFile->real_file);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/*static*/ STREAMFILE *wrap_bar_STREAMFILE(STREAMFILE *file) {
|
||
|
BARSTREAMFILE *streamfile = malloc(sizeof(BARSTREAMFILE));
|
||
|
|
||
|
if (!streamfile)
|
||
|
return NULL;
|
||
|
|
||
|
memset(streamfile, 0, sizeof(BARSTREAMFILE));
|
||
|
|
||
|
streamfile->sf.read = (void*)read_bar;
|
||
|
streamfile->sf.get_size = (void*)get_size_bar;
|
||
|
streamfile->sf.get_offset = (void*)get_offset_bar;
|
||
|
streamfile->sf.get_name = (void*)get_name_bar;
|
||
|
streamfile->sf.get_realname = (void*)get_realname_bar;
|
||
|
streamfile->sf.open = (void*)open_bar;
|
||
|
streamfile->sf.close = (void*)close_bar;
|
||
|
#ifdef PROFILE_STREAMFILE
|
||
|
streamfile->sf.get_bytes_read = get_bytes_read_bar;
|
||
|
streamfile->sf.get_error_count = get_error_count_bar;
|
||
|
#endif
|
||
|
|
||
|
streamfile->real_file = file;
|
||
|
|
||
|
return &streamfile->sf;
|
||
|
}
|
||
|
|
||
|
#endif /* _GH3_BAR_STREAMFILE_H_ */
|