summaryrefslogtreecommitdiffstats
path: root/src/bplist.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bplist.c')
-rw-r--r--src/bplist.c29
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
572void write_int(GByteArray * bplist, uint64_t val) 572void 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
650void write_dict(GByteArray * bplist, GNode * node, GHashTable * ref_table, uint8_t dict_param_size) 650void 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
684void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length) 684void 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 }