diff options
Diffstat (limited to 'src/bplist.c')
| -rw-r--r-- | src/bplist.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/src/bplist.c b/src/bplist.c index 6136fe9..a5b1c9b 100644 --- a/src/bplist.c +++ b/src/bplist.c | |||
| @@ -567,15 +567,15 @@ void serialize_plist(GNode * node, gpointer data) | |||
| 567 | return; | 567 | return; |
| 568 | } | 568 | } |
| 569 | 569 | ||
| 570 | 570 | #define Log2(x) (x == 8 ? 3 : (x == 4 ? 2 : (x == 2 ? 1 : 0))) | |
| 571 | 571 | ||
| 572 | void write_int(GByteArray * bplist, uint64_t val) | 572 | void write_int(GByteArray * bplist, uint64_t val) |
| 573 | { | 573 | { |
| 574 | uint64_t size = get_needed_bytes(val); | 574 | uint64_t size = get_needed_bytes(val); |
| 575 | uint8_t *buff = (uint8_t *) malloc(sizeof(uint8_t) + size); | 575 | uint8_t *buff = (uint8_t *) malloc(sizeof(uint8_t) + size); |
| 576 | buff[0] = BPLIST_UINT | size >> 1; | 576 | buff[0] = BPLIST_UINT | Log2(size); |
| 577 | memcpy(buff + 1, &val, size); | 577 | memcpy(buff + 1, &val, size); |
| 578 | swap_n_bytes(buff + 1, size); | 578 | byte_convert(buff + 1, size); |
| 579 | g_byte_array_append(bplist, buff, sizeof(uint8_t) + size); | 579 | g_byte_array_append(bplist, buff, sizeof(uint8_t) + size); |
| 580 | free(buff); | 580 | free(buff); |
| 581 | } | 581 | } |
| @@ -584,9 +584,9 @@ void write_real(GByteArray * bplist, double val) | |||
| 584 | { | 584 | { |
| 585 | uint64_t size = get_real_bytes(*((uint64_t *) & val)); //cheat to know used space | 585 | uint64_t size = get_real_bytes(*((uint64_t *) & val)); //cheat to know used space |
| 586 | uint8_t *buff = (uint8_t *) malloc(sizeof(uint8_t) + size); | 586 | uint8_t *buff = (uint8_t *) malloc(sizeof(uint8_t) + size); |
| 587 | buff[0] = BPLIST_REAL | size >> 1; | 587 | buff[0] = BPLIST_REAL | Log2(size); |
| 588 | memcpy(buff + 1, &val, size); | 588 | memcpy(buff + 1, &val, size); |
| 589 | swap_n_bytes(buff + 1, size); | 589 | byte_convert(buff + 1, size); |
| 590 | g_byte_array_append(bplist, buff, sizeof(uint8_t) + size); | 590 | g_byte_array_append(bplist, buff, sizeof(uint8_t) + size); |
| 591 | free(buff); | 591 | free(buff); |
| 592 | } | 592 | } |
| @@ -638,7 +638,7 @@ void write_array(GByteArray * bplist, GNode * node, GHashTable * ref_table, uint | |||
| 638 | for (i = 0, cur = node->children; cur && i < size; cur = cur->next, i++) { | 638 | for (i = 0, cur = node->children; cur && i < size; cur = cur->next, i++) { |
| 639 | idx = GPOINTER_TO_UINT(g_hash_table_lookup(ref_table, cur)); | 639 | idx = GPOINTER_TO_UINT(g_hash_table_lookup(ref_table, cur)); |
| 640 | memcpy(buff + i * dict_param_size, &idx, dict_param_size); | 640 | memcpy(buff + i * dict_param_size, &idx, dict_param_size); |
| 641 | swap_n_bytes(buff + i * dict_param_size, dict_param_size); | 641 | byte_convert(buff + i * dict_param_size, dict_param_size); |
| 642 | } | 642 | } |
| 643 | 643 | ||
| 644 | //now append to bplist | 644 | //now append to bplist |
| @@ -650,7 +650,7 @@ void write_array(GByteArray * bplist, GNode * node, GHashTable * ref_table, uint | |||
| 650 | void write_dict(GByteArray * bplist, GNode * node, GHashTable * ref_table, uint8_t dict_param_size) | 650 | void write_dict(GByteArray * bplist, GNode * node, GHashTable * ref_table, uint8_t dict_param_size) |
| 651 | { | 651 | { |
| 652 | uint64_t size = g_node_n_children(node) / 2; | 652 | uint64_t size = g_node_n_children(node) / 2; |
| 653 | uint8_t marker = BPLIST_ARRAY | (size < 15 ? size : 0xf); | 653 | uint8_t marker = BPLIST_DICT | (size < 15 ? size : 0xf); |
| 654 | g_byte_array_append(bplist, &marker, sizeof(uint8_t)); | 654 | g_byte_array_append(bplist, &marker, sizeof(uint8_t)); |
| 655 | if (size >= 15) { | 655 | if (size >= 15) { |
| 656 | GByteArray *int_buff = g_byte_array_new(); | 656 | GByteArray *int_buff = g_byte_array_new(); |
| @@ -668,22 +668,24 @@ void write_dict(GByteArray * bplist, GNode * node, GHashTable * ref_table, uint8 | |||
| 668 | for (i = 0, cur = node->children; cur && i < size; cur = cur->next->next, i++) { | 668 | for (i = 0, cur = node->children; cur && i < size; cur = cur->next->next, i++) { |
| 669 | idx1 = GPOINTER_TO_UINT(g_hash_table_lookup(ref_table, cur)); | 669 | idx1 = GPOINTER_TO_UINT(g_hash_table_lookup(ref_table, cur)); |
| 670 | memcpy(buff + i * dict_param_size, &idx1, dict_param_size); | 670 | memcpy(buff + i * dict_param_size, &idx1, dict_param_size); |
| 671 | swap_n_bytes(buff + i * dict_param_size, dict_param_size); | 671 | byte_convert(buff + i * dict_param_size, dict_param_size); |
| 672 | 672 | ||
| 673 | idx2 = GPOINTER_TO_UINT(g_hash_table_lookup(ref_table, cur->next)); | 673 | idx2 = GPOINTER_TO_UINT(g_hash_table_lookup(ref_table, cur->next)); |
| 674 | memcpy(buff + (i + size) * dict_param_size, &idx2, dict_param_size); | 674 | memcpy(buff + (i + size) * dict_param_size, &idx2, dict_param_size); |
| 675 | swap_n_bytes(buff + (i + size) * dict_param_size, dict_param_size); | 675 | byte_convert(buff + (i + size) * dict_param_size, dict_param_size); |
| 676 | } | 676 | } |
| 677 | 677 | ||
| 678 | //now append to bplist | 678 | //now append to bplist |
| 679 | g_byte_array_append(bplist, buff, size * dict_param_size); | 679 | g_byte_array_append(bplist, buff, size * 2 * dict_param_size); |
| 680 | free(buff); | 680 | free(buff); |
| 681 | 681 | ||
| 682 | } | 682 | } |
| 683 | 683 | ||
| 684 | void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length) | 684 | void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length) |
| 685 | { | 685 | { |
| 686 | //first serialize tree | 686 | //check for valid input |
| 687 | if (!plist || !plist_bin || *plist_bin || !length) | ||
| 688 | return; | ||
| 687 | 689 | ||
| 688 | //list of objects | 690 | //list of objects |
| 689 | GPtrArray *objects = g_ptr_array_new(); | 691 | GPtrArray *objects = g_ptr_array_new(); |
| @@ -692,7 +694,7 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length) | |||
| 692 | 694 | ||
| 693 | //serialize plist | 695 | //serialize plist |
| 694 | struct serialize_s ser_s = { objects, ref_table }; | 696 | struct serialize_s ser_s = { objects, ref_table }; |
| 695 | g_node_children_foreach(plist, G_TRAVERSE_ALL, serialize_plist, &ser_s); | 697 | serialize_plist(plist, &ser_s); |
| 696 | 698 | ||
| 697 | //now stream to output buffer | 699 | //now stream to output buffer |
| 698 | uint8_t offset_size = 0; //unknown yet | 700 | uint8_t offset_size = 0; //unknown yet |
| @@ -759,10 +761,11 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length) | |||
| 759 | 761 | ||
| 760 | //write offsets | 762 | //write offsets |
| 761 | offset_size = get_needed_bytes(bplist_buff->len); | 763 | offset_size = get_needed_bytes(bplist_buff->len); |
| 764 | offset_table_index = bplist_buff->len; | ||
| 762 | for (i = 0; i <= num_objects; i++) { | 765 | for (i = 0; i <= num_objects; i++) { |
| 763 | uint8_t *buff = (uint8_t *) malloc(offset_size); | 766 | uint8_t *buff = (uint8_t *) malloc(offset_size); |
| 764 | memcpy(buff, offsets + i, offset_size); | 767 | memcpy(buff, offsets + i, offset_size); |
| 765 | swap_n_bytes(buff, offset_size); | 768 | byte_convert(buff, offset_size); |
| 766 | g_byte_array_append(bplist_buff, buff, offset_size); | 769 | g_byte_array_append(bplist_buff, buff, offset_size); |
| 767 | free(buff); | 770 | free(buff); |
| 768 | } | 771 | } |
