Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
GNOME
gupnp
Commits
57dc0d62
Commit
57dc0d62
authored
Dec 26, 2018
by
Jens Georg
Browse files
binding-tool: Fix (most) flake8 warnings
parent
3aaa95aa
Changes
1
Hide whitespace changes
Inline
Side-by-side
tools/gupnp-binding-tool-1.2
View file @
57dc0d62
...
...
@@ -18,22 +18,25 @@
# TODO:
# - finish code cleanup
# - currently allowedValueList is not used: could use it to turn
# - currently allowedValueList is not used: could use it to turn
# current char* value to an enum
# - could warn if values outside allowedValueRange are used in *_action_set()
# - add option to generate skeleton source code that uses the bindings?
# - could warn if values outside allowedValueRange are used in *_action_set()
# - add option to generate skeleton source code that uses the bindings?
import
os.path
,
re
,
xml
.
etree
.
ElementTree
as
ET
import
os.path
import
re
import
xml.etree.ElementTree
as
ET
from
optparse
import
OptionParser
# upnp type: (C type, GType, type for g_value_get_*
# upnp type: (C type, GType, type for g_value_get_*
# and g_value_set_*)
typemap
=
{
'ui1'
:
(
'guint '
,
'G_TYPE_UINT'
,
'uint'
),
'ui2'
:
(
'guint '
,
'G_TYPE_UINT'
,
'uint'
),
'ui4'
:
(
'guint '
,
'G_TYPE_UINT'
,
'uint'
),
'i1'
:
(
'gint'
,
'G_TYPE_INT'
,
'int'
),
'i1'
:
(
'gint'
,
'G_TYPE_INT'
,
'int'
),
'i2'
:
(
'gint '
,
'G_TYPE_INT'
,
'int'
),
'i4'
:
(
'gint '
,
'G_TYPE_INT'
,
'int'
),
'int'
:
(
'gint '
,
'G_TYPE_INT'
,
'int'
),
...
...
@@ -88,7 +91,7 @@ class Variable:
self
.
dummy
=
False
def
camelCaseToLowerCase
(
str
):
def
camelCaseToLowerCase
(
str
):
# http://www.djangosnippets.org/snippets/585/
tmp
=
re
.
sub
(
'(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))'
,
'_
\\
1'
,
str
)
lower_case
=
tmp
.
lower
().
strip
(
'_'
)
...
...
@@ -99,27 +102,27 @@ def getActions(action_elements, prefix, variables):
"""
Parse the action element list into a list of Action objects.
"""
actions
=
[]
for
actionElement
in
action_elements
:
a
=
Action
()
actions
.
append
(
a
)
a
.
name
=
actionElement
.
find
(
"{urn:schemas-upnp-org:service-1-0}name"
).
text
if
a
.
name
is
None
:
raise
Exception
(
"No name found for action"
)
a
.
c_name
=
camelCaseToLowerCase
(
a
.
name
)
a
.
c_name
=
camelCaseToLowerCase
(
a
.
name
)
a
.
c_prefixed_name
=
prefix
+
a
.
c_name
for
argElement
in
actionElement
.
findall
(
"{urn:schemas-upnp-org:service-1-0}argumentList/{urn:schemas-upnp-org:service-1-0}argument"
):
arg
=
Argument
()
arg
.
name
=
argElement
.
find
(
"{urn:schemas-upnp-org:service-1-0}name"
).
text
if
arg
.
name
is
None
:
raise
Exception
(
"No name found for argument"
)
arg
.
c_name
=
camelCaseToLowerCase
(
arg
.
name
)
arg
.
c_name
=
camelCaseToLowerCase
(
arg
.
name
)
var_name
=
argElement
.
find
(
"{urn:schemas-upnp-org:service-1-0}relatedStateVariable"
).
text
for
var
in
variables
:
if
var
.
name
==
var_name
:
...
...
@@ -127,14 +130,14 @@ def getActions(action_elements, prefix, variables):
break
if
arg
.
related_var
is
None
:
raise
Exception
(
"%s: related state variable %s not found"
%
(
arg
.
name
,
var_name
))
arg
.
direction
=
argElement
.
find
(
"{urn:schemas-upnp-org:service-1-0}direction"
).
text
if
arg
.
direction
==
"in"
:
a
.
in_args
.
append
(
arg
)
else
:
a
.
out_args
.
append
(
arg
)
return
actions
...
...
@@ -142,67 +145,67 @@ def getVariables(var_elements, prefix):
"""
Parse the state variable element list into a list of Variable objects.
"""
variables
=
[]
for
varElement
in
var_elements
:
var
=
Variable
()
variables
.
append
(
var
)
var
.
name
=
varElement
.
find
(
"{urn:schemas-upnp-org:service-1-0}name"
).
text
if
var
.
name
.
startswith
(
"A_ARG_TYPE_"
):
# dummy state variable, only there to give type info to getter/setter
var
.
dummy
=
True
var
.
c_name
=
camelCaseToLowerCase
(
var
.
name
)
var
.
c_name
=
camelCaseToLowerCase
(
var
.
name
)
var
.
c_prefixed_name
=
prefix
+
var
.
c_name
if
(
varElement
.
get
(
"sendEvents"
)
==
"no"
):
var
.
notified
=
False
dataType
=
varElement
.
find
(
"{urn:schemas-upnp-org:service-1-0}dataType"
).
text
if
not
dataType
in
typemap
:
if
dataType
not
in
typemap
:
raise
Exception
(
"Unknown dataType %s"
%
dataType
)
(
var
.
ctype
,
var
.
gtype
,
g_value_type
)
=
typemap
[
dataType
]
;
(
var
.
ctype
,
var
.
gtype
,
g_value_type
)
=
typemap
[
dataType
]
var
.
get_function
=
"g_value_get_"
+
g_value_type
var
.
set_function
=
"g_value_set_"
+
g_value_type
return
variables
def
printClientSyncActionBinding
(
a
):
indent
=
(
2
+
len
(
a
.
c_prefixed_name
))
*
" "
indent
=
(
2
+
len
(
a
.
c_prefixed_name
))
*
" "
print
(
"static inline gboolean"
)
print
(
"%s (GUPnPServiceProxy *proxy,"
%
a
.
c_prefixed_name
)
for
arg
in
a
.
in_args
:
print
(
"%sconst %sin_%s,"
%
(
indent
,
arg
.
related_var
.
ctype
,
arg
.
c_name
))
for
arg
in
a
.
out_args
:
print
(
"%s%s*out_%s,"
%
(
indent
,
arg
.
related_var
.
ctype
,
arg
.
c_name
))
print
(
"%sGError **error)"
%
indent
)
print
(
"{"
)
print
(
" return gupnp_service_proxy_send_action"
)
print
(
" (proxy,
\"
%s
\"
, error,"
%
a
.
name
)
for
arg
in
a
.
in_args
:
print
(
"
\"
%s
\"
, %s, in_%s,"
%
(
arg
.
name
,
arg
.
related_var
.
gtype
,
arg
.
c_name
))
print
(
" NULL,"
)
for
arg
in
a
.
out_args
:
print
(
"
\"
%s
\"
, %s, out_%s,"
%
(
arg
.
name
,
arg
.
related_var
.
gtype
,
arg
.
c_name
))
print
(
" NULL);"
)
print
(
"}
\n
"
)
def
printClientAsyncActionBinding
(
a
):
# User-callback prototype
indent
=
(
24
+
len
(
a
.
c_prefixed_name
))
*
" "
indent
=
(
24
+
len
(
a
.
c_prefixed_name
))
*
" "
print
(
"typedef void (*%s_reply) (GUPnPServiceProxy *proxy,"
%
a
.
c_prefixed_name
)
for
arg
in
a
.
out_args
:
print
(
"%sconst %sout_%s,"
%
(
indent
,
arg
.
related_var
.
ctype
,
arg
.
c_name
))
...
...
@@ -211,7 +214,7 @@ def printClientAsyncActionBinding(a):
print
(
""
)
# Generated async callback handler, calls user-provided callback
indent
=
(
30
+
len
(
a
.
c_prefixed_name
))
*
" "
indent
=
(
30
+
len
(
a
.
c_prefixed_name
))
*
" "
print
(
"static void _%s_async_callback (GUPnPServiceProxy *proxy,"
%
a
.
c_prefixed_name
)
print
(
"%sGUPnPServiceProxyAction *action,"
%
indent
)
print
(
"%sgpointer user_data)"
%
indent
)
...
...
@@ -238,7 +241,7 @@ def printClientAsyncActionBinding(a):
print
(
""
)
# Entry point
indent
=
(
8
+
len
(
a
.
c_prefixed_name
))
*
" "
indent
=
(
8
+
len
(
a
.
c_prefixed_name
))
*
" "
print
(
"static inline GUPnPServiceProxyAction *"
)
print
(
"%s_async (GUPnPServiceProxy *proxy,"
%
a
.
c_prefixed_name
)
for
arg
in
a
.
in_args
:
...
...
@@ -264,18 +267,18 @@ def printClientAsyncActionBinding(a):
def
printClientVariableNotifyBinding
(
v
):
ctype
=
re
.
sub
(
"^gchar"
,
"const gchar"
,
v
.
ctype
)
;
ctype
=
re
.
sub
(
"^gchar"
,
"const gchar"
,
v
.
ctype
)
# callback prototype
indent
=
(
22
+
len
(
v
.
c_prefixed_name
))
*
" "
indent
=
(
22
+
len
(
v
.
c_prefixed_name
))
*
" "
print
(
"typedef void"
)
print
(
"(*%s_changed_callback) (GUPnPServiceProxy *proxy,"
%
v
.
c_prefixed_name
)
print
(
"%s%s%s,"
%
(
indent
,
ctype
,
v
.
c_name
))
print
(
"%sgpointer userdata);"
%
indent
)
print
(
""
)
# private callback
indent
=
(
20
+
len
(
v
.
c_prefixed_name
))
*
" "
indent
=
(
20
+
len
(
v
.
c_prefixed_name
))
*
" "
print
(
"static void"
)
print
(
"_%s_changed_callback (GUPnPServiceProxy *proxy,"
%
v
.
c_prefixed_name
)
print
(
"%sconst gchar *variable,"
%
indent
)
...
...
@@ -295,9 +298,9 @@ def printClientVariableNotifyBinding(v):
print
(
" g_slice_free1 (sizeof (*cbdata), cbdata);"
)
print
(
"}"
)
print
(
""
)
# public notify_add function
indent
=
(
13
+
len
(
v
.
c_prefixed_name
))
*
" "
indent
=
(
13
+
len
(
v
.
c_prefixed_name
))
*
" "
print
(
"static inline gboolean"
)
print
(
"%s_add_notify (GUPnPServiceProxy *proxy,"
%
v
.
c_prefixed_name
)
print
(
"%s%s_changed_callback callback,"
%
(
indent
,
v
.
c_prefixed_name
))
...
...
@@ -320,12 +323,12 @@ def printClientVariableNotifyBinding(v):
def
printServerVariableQueryBinding
(
v
):
# User callback proto
indent
=
(
28
+
len
(
v
.
ctype
)
+
len
(
v
.
c_prefixed_name
))
*
" "
indent
=
(
28
+
len
(
v
.
ctype
)
+
len
(
v
.
c_prefixed_name
))
*
" "
print
(
"typedef %s(*%s_query_callback) (GUPnPService *service,"
%
(
v
.
ctype
,
v
.
c_prefixed_name
))
print
(
"%sgpointer userdata);"
%
indent
)
print
(
""
)
indent
=
(
12
+
len
(
v
.
c_prefixed_name
))
*
" "
indent
=
(
12
+
len
(
v
.
c_prefixed_name
))
*
" "
print
(
"static void"
)
print
(
"_%s_query_cb (GUPnPService *service,"
%
v
.
c_prefixed_name
)
print
(
"%sgchar *variable,"
%
indent
)
...
...
@@ -335,8 +338,8 @@ def printServerVariableQueryBinding(v):
print
(
" GUPnPAsyncData *cbdata;"
)
print
(
" %s%s;"
%
(
v
.
ctype
,
v
.
c_name
))
print
(
""
)
indent
=
(
36
+
len
(
v
.
c_name
)
+
len
(
v
.
c_prefixed_name
))
*
" "
indent
=
(
36
+
len
(
v
.
c_name
)
+
len
(
v
.
c_prefixed_name
))
*
" "
print
(
" cbdata = (GUPnPAsyncData *) userdata;"
)
print
(
" %s = ((%s_query_callback)cbdata->cb) (service,"
%
(
v
.
c_name
,
v
.
c_prefixed_name
))
print
(
"%scbdata->userdata);"
%
indent
)
...
...
@@ -344,8 +347,8 @@ def printServerVariableQueryBinding(v):
print
(
" %s (value, %s);"
%
(
v
.
set_function
,
v
.
c_name
))
print
(
"}"
)
print
(
""
)
indent
=
(
16
+
len
(
v
.
c_prefixed_name
))
*
" "
indent
=
(
16
+
len
(
v
.
c_prefixed_name
))
*
" "
print
(
"gulong"
)
print
(
"%s_query_connect (GUPnPService *service,"
%
v
.
c_prefixed_name
)
print
(
"%s%s_query_callback callback,"
%
(
indent
,
v
.
c_prefixed_name
))
...
...
@@ -369,8 +372,8 @@ def printServerVariableQueryBinding(v):
def
printServerActionBinding
(
a
):
# getter and setter func for GUPnPServiceAction
indent
=
(
13
+
len
(
a
.
c_prefixed_name
))
*
" "
if
len
(
a
.
in_args
)
>
0
:
indent
=
(
13
+
len
(
a
.
c_prefixed_name
))
*
" "
if
len
(
a
.
in_args
)
>
0
:
print
(
"static inline void"
)
print
(
"%s_action_get (GUPnPServiceAction *action,"
%
(
a
.
c_prefixed_name
))
for
arg
in
a
.
in_args
[:
-
1
]:
...
...
@@ -383,7 +386,7 @@ def printServerActionBinding(a):
print
(
" NULL);"
)
print
(
"}"
)
print
(
""
)
if
len
(
a
.
out_args
)
>
0
:
if
len
(
a
.
out_args
)
>
0
:
print
(
"static inline void"
)
print
(
"%s_action_set (GUPnPServiceAction *action,"
%
(
a
.
c_prefixed_name
))
for
arg
in
a
.
out_args
[:
-
1
]:
...
...
@@ -396,8 +399,8 @@ def printServerActionBinding(a):
print
(
" NULL);"
)
print
(
"}"
)
print
(
""
)
indent
=
(
17
+
len
(
a
.
c_prefixed_name
))
*
" "
indent
=
(
17
+
len
(
a
.
c_prefixed_name
))
*
" "
print
(
"static inline gulong"
)
print
(
"%s_action_connect (GUPnPService *service,"
%
a
.
c_prefixed_name
)
print
(
"%sGCallback callback,"
%
indent
)
...
...
@@ -410,11 +413,12 @@ def printServerActionBinding(a):
print
(
"}"
)
print
(
""
)
def
PrintServerVariableNotifyBinding
(
v
):
indent
=
(
18
+
len
(
v
.
c_prefixed_name
))
*
" "
indent
=
(
18
+
len
(
v
.
c_prefixed_name
))
*
" "
print
(
"void"
)
print
(
"%s_variable_notify (GUPnPService *service,"
%
v
.
c_prefixed_name
)
print
(
"%sconst %s%s)"
%
(
indent
,
v
.
ctype
,
v
.
c_name
))
print
(
"%sconst %s%s)"
%
(
indent
,
v
.
ctype
,
v
.
c_name
))
print
(
"{"
)
print
(
" gupnp_service_notify (service,"
)
print
(
"
\"
%s
\"
, %s, %s,"
%
(
v
.
name
,
v
.
gtype
,
v
.
c_name
))
...
...
@@ -422,25 +426,26 @@ def PrintServerVariableNotifyBinding(v):
print
(
"}"
)
print
(
""
)
def
parseSCPD
(
scpd
,
prefix
):
"""
Parse the scpd file into lists of Action and Variable objects.
"""
if
prefix
!=
""
:
prefix
=
prefix
.
lower
()
+
"_"
action_elements
=
scpd
.
findall
(
"{urn:schemas-upnp-org:service-1-0}actionList/{urn:schemas-upnp-org:service-1-0}action"
)
var_elements
=
scpd
.
findall
(
"{urn:schemas-upnp-org:service-1-0}serviceStateTable/{urn:schemas-upnp-org:service-1-0}stateVariable"
)
variables
=
getVariables
(
var_elements
,
prefix
)
actions
=
getActions
(
action_elements
,
prefix
,
variables
)
return
(
actions
,
variables
)
def
printClientBindings
(
binding_name
,
actions
,
variables
):
define
=
"GUPNP_GENERATED_CLIENT_BINDING_%s"
%
binding_name
print
(
"/* Generated by gupnp-binding-tool */"
)
print
(
""
)
print
(
"#include <libgupnp/gupnp.h>"
)
...
...
@@ -463,7 +468,7 @@ def printClientBindings(binding_name, actions, variables):
if
(
not
v
.
dummy
)
and
v
.
notified
:
print
(
"
\n
/* state variable %s */
\n
"
%
v
.
name
)
printClientVariableNotifyBinding
(
v
)
print
(
""
)
print
(
"G_END_DECLS"
)
print
(
""
)
...
...
@@ -472,7 +477,7 @@ def printClientBindings(binding_name, actions, variables):
def
printServerBindings
(
binding_name
,
actions
,
variables
):
define
=
"GUPNP_GENERATED_CLIENT_BINDING_%s"
%
binding_name
print
(
"/* Generated by gupnp-binding-tool */"
)
print
(
""
)
print
(
"#include <libgupnp/gupnp.h>"
)
...
...
@@ -494,7 +499,7 @@ def printServerBindings(binding_name, actions, variables):
print
(
" g_slice_free1 (sizeof (*cbdata), cbdata);"
)
print
(
"}"
)
print
(
""
)
for
a
in
actions
:
print
(
"
\n
/* action %s */
\n
"
%
a
.
name
)
printServerActionBinding
(
a
)
...
...
@@ -504,40 +509,40 @@ def printServerBindings(binding_name, actions, variables):
printServerVariableQueryBinding
(
v
)
if
v
.
notified
:
PrintServerVariableNotifyBinding
(
v
)
print
(
""
)
print
(
"G_END_DECLS"
)
print
(
""
)
print
(
"#endif /* %s */"
%
define
)
def
main
():
def
main
():
parser
=
OptionParser
(
"Usage: %prog [options] service-filename"
)
parser
.
add_option
(
"-p"
,
"--prefix"
,
dest
=
"prefix"
,
parser
.
add_option
(
"-p"
,
"--prefix"
,
dest
=
"prefix"
,
metavar
=
"PREFIX"
,
default
=
""
,
help
=
"set prefix for generated function names"
)
parser
.
add_option
(
"-m"
,
"--mode"
,
type
=
"choice"
,
dest
=
"mode"
,
parser
.
add_option
(
"-m"
,
"--mode"
,
type
=
"choice"
,
dest
=
"mode"
,
metavar
=
"MODE"
,
default
=
"client"
,
choices
=
(
"client"
,
"server"
),
help
=
"select generation mode, 'client' or 'server'"
)
(
options
,
args
)
=
parser
.
parse_args
()
(
options
,
args
)
=
parser
.
parse_args
()
if
len
(
args
)
!=
1
:
parser
.
error
(
"Expected 1 argument, got %d"
%
len
(
args
))
# get a name for header ifdef
if
options
.
prefix
==
""
:
base
=
re
.
sub
(
"[^a-zA-Z0-9]"
,
"_"
,
os
.
path
.
basename
(
args
[
0
]))
binding_name
=
base
.
upper
()
else
:
binding_name
=
options
.
prefix
.
upper
()
# parse scpd file, extract action list and state variable list
scpd
=
ET
.
parse
(
args
[
0
])
(
actions
,
variables
)
=
parseSCPD
(
scpd
,
options
.
prefix
)
(
actions
,
variables
)
=
parseSCPD
(
scpd
,
options
.
prefix
)
if
(
len
(
actions
)
==
0
and
len
(
variables
)
==
0
):
raise
Exception
(
"No actions or variables found in document"
)
raise
Exception
(
"No actions or variables found in document"
)
# generate bindings
if
(
options
.
mode
==
"client"
):
printClientBindings
(
binding_name
,
actions
,
variables
)
...
...
Write
Preview
Supports
Markdown
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