[libavg-devel] [Fwd: Dynamic Node Creation Enhancements]
Ulrich von Zadow
uzadow at libavg.de
Tue Feb 5 20:24:01 CET 2008
Hi,
forwarded due to mailing list configuration issues...
Cheers,
Uli
-------- Original Message --------
Subject: Dynamic Node Creation Enhancements
Date: Tue, 05 Feb 2008 19:08:41 +0100
From: libavg-devel-owner at datenhain.de
To: libavg-devel-owner at datenhain.de
Hey All,
Over the weekend, I took a little break from audio to work on some
enhancements to dynamic node creation. With the included patch, nodes
may be created through Player::createNode(typeString,
argsPythonDictionary). (e.g. newNode = Player.createNode("video",
{"href":"video.mpg"}) ). To support this, I have reworked how arguments
are passed to node constructors, and created a generic registration
mechanism for adding support for different types of nodes (also
resulting in the ability to dynamically build/change the avg DTD). The
changes are discussed below.
NodeDefinition
A NodeDefinition is basically represents all of the information formerly
found in the avg DTD, that is information about what a type of node is.
It is composed of a type string, all valid arguments and their default
values, all valid child nodes, and a function that may be used to build
a node of this type (Node::buildNode() is a generic template NodeBuilder
function that can be used in most cases). NodeDefinitions may be
extended by subclasses, making inheritance of arguments/child nodes
simple. Each node type now implements a static getNodeDefinition()
function which returns the information about the type.
NodeFactory
NodeDefinitions are registered with a NodeFactory, which can then
construct nodes of the registered type. The NodeFactory handles
validation of arguments passed to the create function based on the
registered NodeDefinition of the type being created. Also, all unset
args are replaced with the default values defined in the NodeDefinition
for the type so the node constructor may safely request any arg defined
in its NodeDefinition. Additionally, the NodeFactory can dynamically
build a DTD from the complete set of NodeDefinitions currently
registered with it. The DTD contains a single special entity called
%anyNode; which contains a | separated list of all of the node types
registered, and can be used for generic container nodes (e.g. avg and
div). The dynamic nature of the DTD is very flexible, and has been
designed with the idea of node plugins in mind, however, it is now less
visible then before. It would be nice to make the full DTD available to
the designer (should we add a Player::getDTD() that returns the
current DTD string in python?).
Arg/ArgList
An ArgList is the structure passed to node constructors. It may be build
from either an xmlNode or a python dictionary object. It provides a
simple interface for getting arguments in various formats.
The dynamic node tests currently in place have been expanded to use both
interfaces, and all still pass.
Well, thats all I have for now. Please let me know what you think of the
attached patch.
Thanks,
Nick Hebner
--
Ulrich von Zadow | +49-172-7872715
Jabber: cocacoder at jabber.berlin.ccc.de
Skype: uzadow
-------------- next part --------------
A non-text attachment was scrubbed...
Name: dyn_nodes.patch
Type: text/x-patch
Size: 81735 bytes
Desc: not available
Url : http://mail.datenhain.de/pipermail/libavg-devel/attachments/20080205/9bc649bb/attachment-0001.bin
More information about the libavg-devel
mailing list