mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-09-20 02:57:55 +08:00
Patch prop_abi.diff from Nirgal
This commit is contained in:

committed by
Brian Bruns

parent
8ef50c444e
commit
3e2407044d
@@ -544,7 +544,7 @@ extern gint32 mdb_map_find_next(MdbHandle *mdb, unsigned char *map, unsigned int
|
|||||||
/* props.c */
|
/* props.c */
|
||||||
extern void mdb_free_props(MdbProperties *props);
|
extern void mdb_free_props(MdbProperties *props);
|
||||||
extern void mdb_dump_props(MdbProperties *props, FILE *outfile, int show_name);
|
extern void mdb_dump_props(MdbProperties *props, FILE *outfile, int show_name);
|
||||||
extern GArray* kkd_to_props(MdbHandle *mdb, void *kkd, size_t len);
|
extern GArray* mdb_kkd_to_props(MdbHandle *mdb, void *kkd, size_t len);
|
||||||
|
|
||||||
|
|
||||||
/* worktable.c */
|
/* worktable.c */
|
||||||
|
@@ -117,7 +117,7 @@ GPtrArray *mdb_read_catalog (MdbHandle *mdb, int objtype)
|
|||||||
size_t kkd_len;
|
size_t kkd_len;
|
||||||
void *kkd = mdb_ole_read_full(mdb, col_props, &kkd_len);
|
void *kkd = mdb_ole_read_full(mdb, col_props, &kkd_len);
|
||||||
//buffer_dump(kkd, 0, kkd_len);
|
//buffer_dump(kkd, 0, kkd_len);
|
||||||
entry->props = kkd_to_props(mdb, kkd, kkd_len);
|
entry->props = mdb_kkd_to_props(mdb, kkd, kkd_len);
|
||||||
free(kkd);
|
free(kkd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -5,7 +5,6 @@ LIBMDB_1.0 {
|
|||||||
# LIBMDB_2.0 {
|
# LIBMDB_2.0 {
|
||||||
global:
|
global:
|
||||||
mdb_*;
|
mdb_*;
|
||||||
kkd_to_props;
|
|
||||||
_mdb_put_int16;
|
_mdb_put_int16;
|
||||||
_mdb_put_int32;
|
_mdb_put_int32;
|
||||||
buffer_dump;
|
buffer_dump;
|
||||||
|
@@ -147,8 +147,13 @@ mdb_dump_props(MdbProperties *props, FILE *outfile, int show_name) {
|
|||||||
fputc('\n', outfile);
|
fputc('\n', outfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* That function takes a raw KKD/MR2 binary buffer,
|
||||||
|
* typically read from LvProp in table MSysbjects
|
||||||
|
* and returns a GPtrArray of MdbProps*
|
||||||
|
*/
|
||||||
GArray*
|
GArray*
|
||||||
kkd_to_props(MdbHandle *mdb, void *kkd, size_t len) {
|
mdb_kkd_to_props(MdbHandle *mdb, void *buffer, size_t len) {
|
||||||
guint32 record_len;
|
guint32 record_len;
|
||||||
guint16 record_type;
|
guint16 record_type;
|
||||||
size_t pos;
|
size_t pos;
|
||||||
@@ -156,12 +161,12 @@ kkd_to_props(MdbHandle *mdb, void *kkd, size_t len) {
|
|||||||
MdbProperties *props;
|
MdbProperties *props;
|
||||||
|
|
||||||
#if MDB_DEBUG
|
#if MDB_DEBUG
|
||||||
buffer_dump(kkd, 0, len);
|
buffer_dump(buffer, 0, len);
|
||||||
#endif
|
#endif
|
||||||
mdb_debug(MDB_DEBUG_PROPS,"starting prop parsing of type %s", kkd);
|
mdb_debug(MDB_DEBUG_PROPS,"starting prop parsing of type %s", buffer);
|
||||||
if (strcmp("KKD", kkd) && strcmp("MR2", kkd)) {
|
if (strcmp("KKD", buffer) && strcmp("MR2", buffer)) {
|
||||||
fprintf(stderr, "Unrecognized format.\n");
|
fprintf(stderr, "Unrecognized format.\n");
|
||||||
buffer_dump(kkd, 0, len);
|
buffer_dump(buffer, 0, len);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,14 +174,14 @@ kkd_to_props(MdbHandle *mdb, void *kkd, size_t len) {
|
|||||||
|
|
||||||
pos = 4;
|
pos = 4;
|
||||||
while (pos < len) {
|
while (pos < len) {
|
||||||
record_len = mdb_get_int32(kkd, pos);
|
record_len = mdb_get_int32(buffer, pos);
|
||||||
record_type = mdb_get_int16(kkd, pos + 4);
|
record_type = mdb_get_int16(buffer, pos + 4);
|
||||||
mdb_debug(MDB_DEBUG_PROPS,"prop chunk type:0x%04x len:%d", record_type, record_len);
|
mdb_debug(MDB_DEBUG_PROPS,"prop chunk type:0x%04x len:%d", record_type, record_len);
|
||||||
//buffer_dump(kkd, pos+4, record_len);
|
//buffer_dump(buffer, pos+4, record_len);
|
||||||
switch (record_type) {
|
switch (record_type) {
|
||||||
case 0x80:
|
case 0x80:
|
||||||
if (names) free_names(names);
|
if (names) free_names(names);
|
||||||
names = mdb_read_props_list(mdb, kkd+pos+6, record_len - 6);
|
names = mdb_read_props_list(mdb, buffer+pos+6, record_len - 6);
|
||||||
break;
|
break;
|
||||||
case 0x00:
|
case 0x00:
|
||||||
case 0x01:
|
case 0x01:
|
||||||
@@ -184,7 +189,7 @@ kkd_to_props(MdbHandle *mdb, void *kkd, size_t len) {
|
|||||||
fprintf(stderr,"sequence error!\n");
|
fprintf(stderr,"sequence error!\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
props = mdb_read_props(mdb, names, kkd+pos+6, record_len - 6);
|
props = mdb_read_props(mdb, names, buffer+pos+6, record_len - 6);
|
||||||
g_array_append_val(result, props);
|
g_array_append_val(result, props);
|
||||||
//mdb_dump_props(props, stderr, 1);
|
//mdb_dump_props(props, stderr, 1);
|
||||||
break;
|
break;
|
||||||
|
@@ -96,8 +96,10 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
void dump_kkd(MdbHandle *mdb, void *kkd, size_t len)
|
void dump_kkd(MdbHandle *mdb, void *kkd, size_t len)
|
||||||
{
|
{
|
||||||
GArray *aprops = kkd_to_props(mdb, kkd, len);
|
GArray *aprops = mdb_kkd_to_props(mdb, kkd, len);
|
||||||
int i;
|
int i;
|
||||||
|
if (!aprops)
|
||||||
|
return;
|
||||||
for (i=0; i<aprops->len; ++i) {
|
for (i=0; i<aprops->len; ++i) {
|
||||||
MdbProperties *props = g_array_index(aprops, MdbProperties*, i);
|
MdbProperties *props = g_array_index(aprops, MdbProperties*, i);
|
||||||
mdb_dump_props(props, stdout, 1);
|
mdb_dump_props(props, stdout, 1);
|
||||||
|
Reference in New Issue
Block a user