Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
L
libplist
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
pwn
libplist
Commits
bfd57eb1
Commit
bfd57eb1
authored
Jan 22, 2009
by
Jonathan Beck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add Unicode support.
parent
8da4dac2
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
59 additions
and
29 deletions
+59
-29
Makefile.am
src/Makefile.am
+1
-1
bplist.c
src/bplist.c
+25
-13
plist.c
src/plist.c
+5
-4
plist.h
src/plist.h
+1
-2
utils.c
src/utils.c
+0
-3
xplist.c
src/xplist.c
+27
-6
No files found.
src/Makefile.am
View file @
bfd57eb1
INCLUDES
=
-I
$(top_srcdir)
/include
AM_CFLAGS
=
$(GLOBAL_CFLAGS)
$(libxml2_CFLAGS)
$(libglib2_CFLAGS)
-D_GNU_SOURCE
AM_CFLAGS
=
$(GLOBAL_CFLAGS)
$(libxml2_CFLAGS)
$(libglib2_CFLAGS)
AM_LDFLAGS
=
$(libxml2_LIBS)
$(libglib2_LIBS)
lib_LTLIBRARIES
=
libplist.la
...
...
src/bplist.c
View file @
bfd57eb1
...
...
@@ -21,7 +21,6 @@
#include "plist.h"
#include <wchar.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
...
...
@@ -152,7 +151,7 @@ static plist_t parse_date_node(char *bnode, uint8_t size)
return
node
;
}
static
plist_t
parse_string_node
(
char
*
bnode
,
uint
8
_t
size
)
static
plist_t
parse_string_node
(
char
*
bnode
,
uint
64
_t
size
)
{
plist_data_t
data
=
plist_new_plist_data
();
...
...
@@ -165,16 +164,17 @@ static plist_t parse_string_node(char *bnode, uint8_t size)
return
g_node_new
(
data
);
}
static
plist_t
parse_unicode_node
(
char
*
bnode
,
uint
8
_t
size
)
static
plist_t
parse_unicode_node
(
char
*
bnode
,
uint
64
_t
size
)
{
plist_data_t
data
=
plist_new_plist_data
();
uint64_t
i
=
0
;
data
->
type
=
PLIST_UNICODE
;
data
->
unicodeval
=
(
wchar_t
*
)
malloc
(
sizeof
(
wchar_t
)
*
(
size
+
1
));
memcpy
(
data
->
unicodeval
,
bnode
,
size
);
data
->
unicodeval
[
size
]
=
'\0'
;
data
->
length
=
wcslen
(
data
->
unicodeval
);
data
->
unicodeval
=
(
gunichar2
*
)
malloc
(
sizeof
(
gunichar2
)
*
(
size
+
1
));
memcpy
(
data
->
unicodeval
,
bnode
,
sizeof
(
gunichar2
)
*
size
);
data
->
unicodeval
[
sizeof
(
gunichar2
)
*
size
]
=
'\0'
;
data
->
length
=
size
;
for
(
i
=
0
;
i
<=
size
;
i
++
)
byte_convert
(
data
->
unicodeval
+
i
,
sizeof
(
gunichar2
));
return
g_node_new
(
data
);
}
...
...
@@ -338,7 +338,8 @@ static gpointer copy_plist_data(gconstpointer src, gpointer data)
dstdata
->
strval
=
strdup
(
srcdata
->
strval
);
break
;
case
PLIST_UNICODE
:
dstdata
->
unicodeval
=
wcsdup
(
srcdata
->
unicodeval
);
dstdata
->
unicodeval
=
(
gunichar2
*
)
malloc
(
srcdata
->
length
*
sizeof
(
gunichar2
));
memcpy
(
dstdata
->
unicodeval
,
srcdata
->
unicodeval
,
srcdata
->
length
*
sizeof
(
gunichar2
));
break
;
case
PLIST_DATA
:
case
PLIST_ARRAY
:
...
...
@@ -493,7 +494,7 @@ static guint plist_data_hash(gconstpointer key)
break
;
case
PLIST_UNICODE
:
buff
=
(
char
*
)
data
->
unicodeval
;
size
=
strlen
(
buff
)
*
sizeof
(
wchar_t
)
;
size
=
data
->
length
;
break
;
case
PLIST_DATA
:
case
PLIST_ARRAY
:
...
...
@@ -544,7 +545,7 @@ static gboolean plist_data_compare(gconstpointer a, gconstpointer b)
else
return
FALSE
;
case
PLIST_UNICODE
:
if
(
!
wcscmp
(
val_a
->
unicodeval
,
val_b
->
unicodeval
))
if
(
!
memcmp
(
val_a
->
unicodeval
,
val_b
->
unicodeval
,
val_a
->
length
))
return
TRUE
;
else
return
FALSE
;
...
...
@@ -662,6 +663,17 @@ static void write_string(GByteArray * bplist, char *val)
write_raw_data
(
bplist
,
BPLIST_STRING
,
(
uint8_t
*
)
val
,
size
);
}
static
void
write_unicode
(
GByteArray
*
bplist
,
gunichar2
*
val
,
uint64_t
size
)
{
uint64_t
i
=
0
;
uint64_t
size2
=
size
*
sizeof
(
gunichar2
);
uint8_t
*
buff
=
(
uint8_t
*
)
malloc
(
size2
);
memcpy
(
buff
,
val
,
size2
);
for
(
i
=
0
;
i
<
size
;
i
++
)
byte_convert
(
buff
+
i
*
sizeof
(
gunichar2
),
sizeof
(
gunichar2
));
write_raw_data
(
bplist
,
BPLIST_STRING
,
buff
,
size2
);
}
static
void
write_array
(
GByteArray
*
bplist
,
GNode
*
node
,
GHashTable
*
ref_table
,
uint8_t
dict_param_size
)
{
uint64_t
size
=
g_node_n_children
(
node
);
...
...
@@ -784,7 +796,7 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length)
write_string
(
bplist_buff
,
data
->
strval
);
break
;
case
PLIST_UNICODE
:
//TODO
write_unicode
(
bplist_buff
,
data
->
unicodeval
,
data
->
length
);
break
;
case
PLIST_DATA
:
write_data
(
bplist_buff
,
data
->
buff
,
data
->
length
);
...
...
src/plist.c
View file @
bfd57eb1
...
...
@@ -24,7 +24,6 @@
#include <assert.h>
#include "utils.h"
#include "plist.h"
#include <wchar.h>
#include <stdlib.h>
#include <stdio.h>
...
...
@@ -99,7 +98,8 @@ plist_t plist_add_sub_element(plist_t node, plist_type type, void *value, uint64
data
->
strval
=
strdup
((
char
*
)
value
);
break
;
case
PLIST_UNICODE
:
data
->
unicodeval
=
wcsdup
((
wchar_t
*
)
value
);
data
->
unicodeval
=
(
gunichar2
*
)
malloc
(
length
*
sizeof
(
gunichar2
));
memcpy
(
data
->
unicodeval
,
value
,
length
*
sizeof
(
gunichar2
));
break
;
case
PLIST_DATA
:
memcpy
(
data
->
buff
,
value
,
length
);
...
...
@@ -158,7 +158,7 @@ static char compare_node_value(plist_type type, plist_data_t data, void *value,
res
=
!
strcmp
(
data
->
strval
,
((
char
*
)
value
));
break
;
case
PLIST_UNICODE
:
res
=
!
wcscmp
(
data
->
unicodeval
,
((
wchar_t
*
)
value
)
);
res
=
!
memcpy
(
data
->
unicodeval
,
value
,
length
);
break
;
case
PLIST_DATA
:
res
=
memcmp
(
data
->
buff
,
(
char
*
)
value
,
length
);
...
...
@@ -229,7 +229,8 @@ void plist_get_type_and_value(plist_t node, plist_type * type, void *value, uint
*
((
char
**
)
value
)
=
strdup
(
data
->
strval
);
break
;
case
PLIST_UNICODE
:
*
((
wchar_t
**
)
value
)
=
wcsdup
(
data
->
unicodeval
);
*
((
gunichar2
**
)
value
)
=
malloc
(
*
length
*
sizeof
(
gunichar2
));
memcpy
(
*
((
gunichar2
**
)
value
),
data
->
unicodeval
,
*
length
*
sizeof
(
gunichar2
));
break
;
case
PLIST_DATA
:
case
PLIST_ARRAY
:
...
...
src/plist.h
View file @
bfd57eb1
...
...
@@ -25,7 +25,6 @@
#include "plist/plist.h"
#include <stdint.h>
#include <wchar.h>
#include <sys/types.h>
#include <sys/stat.h>
...
...
@@ -42,7 +41,7 @@ struct plist_data_s {
uint64_t
intval
;
double
realval
;
char
*
strval
;
wchar_t
*
unicodeval
;
gunichar2
*
unicodeval
;
uint8_t
*
buff
;
GTimeVal
timeval
;
};
...
...
src/utils.c
View file @
bfd57eb1
...
...
@@ -35,8 +35,6 @@ void iphone_set_debug(int level)
toto_debug
=
level
;
}
void
log_debug_msg
(
const
char
*
format
,
...)
{
#ifndef STRIP_DEBUG_CODE
...
...
@@ -60,7 +58,6 @@ inline void log_debug_buffer(const char *data, const int length)
/* run the real fprintf */
if
(
toto_debug
)
fwrite
(
data
,
1
,
length
,
stderr
);
#endif
}
...
...
src/xplist.c
View file @
bfd57eb1
...
...
@@ -24,7 +24,6 @@
#include <assert.h>
#include "utils.h"
#include "plist.h"
#include <wchar.h>
#include <stdlib.h>
#include <stdio.h>
...
...
@@ -139,6 +138,12 @@ static void node_to_xml(GNode * node, gpointer xml_struct)
const
xmlChar
*
tag
=
NULL
;
gchar
*
val
=
NULL
;
//for unicode
glong
len
=
0
;
glong
items_read
=
0
;
glong
items_written
=
0
;
GError
*
error
=
NULL
;
switch
(
node_data
->
type
)
{
case
PLIST_BOOLEAN
:
{
...
...
@@ -166,7 +171,8 @@ static void node_to_xml(GNode * node, gpointer xml_struct)
case
PLIST_UNICODE
:
tag
=
XPLIST_STRING
;
val
=
g_strdup
((
gchar
*
)
node_data
->
unicodeval
);
len
=
node_data
->
length
;
val
=
g_utf16_to_utf8
(
node_data
->
unicodeval
,
len
,
&
items_read
,
&
items_written
,
&
error
);
break
;
case
PLIST_KEY
:
...
...
@@ -278,13 +284,28 @@ static void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)
g_time_val_from_iso8601
((
char
*
)
xmlNodeGetContent
(
node
),
&
data
->
timeval
);
data
->
type
=
PLIST_DATE
;
data
->
length
=
sizeof
(
GTimeVal
);
continue
;
//TODO : handle date tag
continue
;
}
if
(
!
xmlStrcmp
(
node
->
name
,
XPLIST_STRING
))
{
unsigned
char
*
tmp
=
xmlNodeGetContent
(
node
);
glong
len
=
strlen
((
char
*
)
tmp
);
glong
items_read
=
0
;
glong
items_written
=
0
;
GError
*
error
=
NULL
;
int
type
=
xmlDetectCharEncoding
(
tmp
,
len
);
if
(
XML_CHAR_ENCODING_UTF8
==
type
)
{
data
->
unicodeval
=
g_utf8_to_utf16
((
char
*
)
tmp
,
len
,
&
items_read
,
&
items_written
,
&
error
);
data
->
type
=
PLIST_UNICODE
;
data
->
length
=
items_written
;
}
else
if
(
XML_CHAR_ENCODING_ASCII
==
type
||
XML_CHAR_ENCODING_NONE
==
type
)
{
data
->
strval
=
strdup
((
char
*
)
xmlNodeGetContent
(
node
));
data
->
type
=
PLIST_STRING
;
data
->
length
=
strlen
(
data
->
strval
);
}
continue
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment