forked from cztomczak/cefpython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstring_utils.pyx
More file actions
123 lines (110 loc) · 4.36 KB
/
string_utils.pyx
File metadata and controls
123 lines (110 loc) · 4.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# Copyright (c) 2012-2014 The CEF Python authors. All rights reserved.
# License: New BSD License.
# Website: http://code.google.com/p/cefpython/
# TODO: cleanup the code in string_utils.pyx and string_utils_win.pyx,
# see this topic for a review of the code in this file, see the
# posts by Stefan Behnel:
# https://groups.google.com/d/topic/cython-users/VICzhVn-zPw/discussion
# TODO: make this configurable through ApplicationSettings.
UNICODE_ENCODE_ERRORS = "replace"
BYTES_DECODE_ERRORS = "replace"
# Any bytes/unicode encoding and decoding in cefpython should
# be performed only using functions from this file - let's
# keep it in one place for future fixes - see Issue 60 ("Strings
# should be unicode by default, if bytes is required make it
# explicit").
cdef py_string AnyToPyString(object value):
cdef object valueType = type(value)
if valueType == str or valueType == bytes:
return value
elif PY_MAJOR_VERSION < 3 and valueType == unicode:
# The unicode type is not defined in Python 3
return value
else:
return ""
cdef py_string CharToPyString(
const char* charString):
if PY_MAJOR_VERSION < 3:
return <bytes>charString
else:
return <unicode>((<bytes>charString).decode(
g_applicationSettings["string_encoding"],
errors=BYTES_DECODE_ERRORS))
# cdef py_string CppToPyString(
# cpp_string cppString):
# if PY_MAJOR_VERSION < 3:
# return <bytes>cppString
# else:
# return <unicode>((<bytes>cppString).decode(
# g_applicationSettings["string_encoding"],
# errors=BYTES_DECODE_ERRORS))
# cdef cpp_string PyToCppString(py_string pyString) except *:
# cdef cpp_string cppString = pyString
# return cppString
cdef py_string CefToPyString(
ConstCefString& cefString):
cdef cpp_string cppString
if cefString.empty():
return ""
IF UNAME_SYSNAME == "Windows":
cdef wchar_t* wcharstr = <wchar_t*> cefString.c_str()
return WidecharToPyString(wcharstr)
ELSE:
cppString = cefString.ToString()
if PY_MAJOR_VERSION < 3:
return <bytes>cppString
else:
return <unicode>((<bytes>cppString).decode(
g_applicationSettings["string_encoding"],
errors=BYTES_DECODE_ERRORS))
cdef void PyToCefString(
py_string pyString,
CefString& cefString
) except *:
if PY_MAJOR_VERSION < 3:
if type(pyString) == unicode:
pyString = <bytes>(pyString.encode(
g_applicationSettings["string_encoding"],
errors=UNICODE_ENCODE_ERRORS))
else:
# The unicode type is not defined in Python 3.
if type(pyString) == str:
pyString = <bytes>(pyString.encode(
g_applicationSettings["string_encoding"],
errors=UNICODE_ENCODE_ERRORS))
cdef cpp_string cppString = pyString
# Using cefString.FromASCII() will result in DCHECK failures
# when a non-ascii character is encountered.
cefString.FromString(cppString)
cdef CefString PyToCefStringValue(
py_string pyString
) except *:
cdef CefString cefString
PyToCefString(pyString, cefString)
return cefString
cdef void PyToCefStringPointer(
py_string pyString,
CefString* cefString
) except *:
if PY_MAJOR_VERSION < 3:
if type(pyString) == unicode:
pyString = <bytes>(pyString.encode(
g_applicationSettings["string_encoding"],
errors=UNICODE_ENCODE_ERRORS))
else:
# The unicode type is not defined in Python 3.
if type(pyString) == str:
pyString = <bytes>(pyString.encode(
g_applicationSettings["string_encoding"],
errors=UNICODE_ENCODE_ERRORS))
cdef cpp_string cppString = pyString
# When used cefString.FromASCII(), a DCHECK failed
# when passed a unicode string.
cefString.FromString(cppString)
cdef py_string VoidPtrToString(const void* data, size_t dataLength):
if PY_MAJOR_VERSION < 3:
return <bytes>((<char*>data)[:dataLength])
else:
return <unicode>((<bytes>(<char*>data)[:dataLength]).decode(
g_applicationSettings["string_encoding"],
errors=BYTES_DECODE_ERRORS))