diff options
Diffstat (limited to 'cython/plist.pyx')
| -rw-r--r-- | cython/plist.pyx | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/cython/plist.pyx b/cython/plist.pyx index f6696d6..573f17f 100644 --- a/cython/plist.pyx +++ b/cython/plist.pyx | |||
| @@ -852,3 +852,58 @@ cdef object plist_t_to_node(plist_t c_plist, bint managed=True): | |||
| 852 | return Uid_factory(c_plist, managed) | 852 | return Uid_factory(c_plist, managed) |
| 853 | if t == PLIST_NONE: | 853 | if t == PLIST_NONE: |
| 854 | return None | 854 | return None |
| 855 | |||
| 856 | # This is to match up with the new plistlib API | ||
| 857 | # http://docs.python.org/dev/library/plistlib.html | ||
| 858 | # dump() and dumps() are not yet implemented | ||
| 859 | FMT_XML = 1 | ||
| 860 | FMT_BINARY = 2 | ||
| 861 | |||
| 862 | cpdef object load(fp, fmt=None, use_builtin_types=True, dict_type=dict): | ||
| 863 | is_binary = fp.read(6) == 'bplist' | ||
| 864 | fp.seek(0) | ||
| 865 | |||
| 866 | if not fmt: | ||
| 867 | if is_binary: | ||
| 868 | if 'b' not in fp.mode: | ||
| 869 | raise IOError('File handle must be opened in binary (b) mode to read binary property lists') | ||
| 870 | cb = from_bin | ||
| 871 | else: | ||
| 872 | cb = from_xml | ||
| 873 | else: | ||
| 874 | if fmt not in (FMT_XML, FMT_BINARY): | ||
| 875 | raise ValueError('Format must be constant FMT_XML or FMT_BINARY') | ||
| 876 | if fmt == FMT_BINARY: | ||
| 877 | cb = from_bin | ||
| 878 | elif fmt == FMT_XML: | ||
| 879 | cb = from_xml | ||
| 880 | |||
| 881 | if is_binary and fmt == FMT_XML: | ||
| 882 | raise ValueError('Cannot parse binary property list as XML') | ||
| 883 | elif not is_binary and fmt == FMT_BINARY: | ||
| 884 | raise ValueError('Cannot parse XML property list as binary') | ||
| 885 | |||
| 886 | return cb(fp.read()) | ||
| 887 | |||
| 888 | cpdef object loads(data, fmt=None, use_builtin_types=True, dict_type=dict): | ||
| 889 | is_binary = data[0:6] == 'bplist' | ||
| 890 | |||
| 891 | if fmt is not None: | ||
| 892 | if fmt not in (FMT_XML, FMT_BINARY): | ||
| 893 | raise ValueError('Format must be constant FMT_XML or FMT_BINARY') | ||
| 894 | if fmt == FMT_BINARY: | ||
| 895 | cb = from_bin | ||
| 896 | else: | ||
| 897 | cb = from_xml | ||
| 898 | else: | ||
| 899 | if is_binary: | ||
| 900 | cb = from_bin | ||
| 901 | else: | ||
| 902 | cb = from_xml | ||
| 903 | |||
| 904 | if is_binary and fmt == FMT_XML: | ||
| 905 | raise ValueError('Cannot parse binary property list as XML') | ||
| 906 | elif not is_binary and fmt == FMT_BINARY: | ||
| 907 | raise ValueError('Cannot parse XML property list as binary') | ||
| 908 | |||
| 909 | return cb(data) | ||
