[Pipet Devel] orbit/python bindings (was Re: [Pipet Devel] GMS)

Jeff Turner jturner at raba.com
Wed Mar 15 07:34:04 EST 2000


> ...
> BTW, do you know of anyone working on Python bindings to Bonobo?  I
saw Miguel
> de Icaza speek last week and give a demo of Bonobo.  He showed an 'SVG
Bonobo
> component'.  I think this would be great to use for visuals, but we
need the
> Python bindings to do it.
> ...

the following message came across the bonobo mailing list yesterday,
and shows how you can use omniORBPy and a cvs version of bonobo to
script gnumeric (the gnome spreadsheet)


------- Forwarded Message

Date: Tue, 14 Mar 2000 21:10:46 +0100
From: Jon K Hellan <hellan at acm.org>
To: gnome-components-list at gnome.org
Subject: Scripting with Python and omniORB

Hi,

I've made some experiments with Gnome CORBA objects and omniORB for
Python. omniORB is fast, even with Python, as you kan see in a
separate article.

omniidl is the idl compiler of omniORB. To compile Gnome IDL and
produce Python stubs and skeletons, you need the following flags:

   omniidl -bpython -Wbinline <idlfile>

I used the latest omniORBpy with the official omniORB 2.8.0
release. According to the announcement, omniORB 3.0 should now also
work.

You need the latest Bonobo from CVS: We used some constructs which
weren't standard, and omniORB is strict about checking. The IDL in CVS
is now compatible with omniORB.

The Gnorba authentication mechanism isn't portable, so in order to
experiment with a "foreign" ORB, you have to disable authentication. I
hacked gnome_ORBit_request_validate in gnome-libs/libgnorba/orbitgtk.c
to always return ORBIT_MESSAGE_ALLOW_ALL. This is something you only
want to do behind a firewall where you can trust everybody.

Here's a small script to walk the naming tree, and a script to
exercise Gnumeric. You have to write the IOR of the gnome name service
to /tmp/naming.ref before trying these scripts. And you must change
the file name given to factory.read() in the Gnumeric script.

Jon KÃ¥re

- --

- --
#!/usr/bin/env python

# nsbrowse.py
#
# Author: Jon K Hellan <hellan at acm.org>
#
# Do what you wish with this script. No warranties - if it breaks, you
get
# keep both pieces.

"""Script to walk the naming tree of a CORBA name service.
Uses omniORBpy. Can locate the Gnome Name Service."""

# Standard/built-in modules.
import sys

# omniORB modules.
from omniORB import CORBA
import CosNaming

## gnames find the Gnome Name Service in the same way as gnome apps do.
#try:
#    import gnames
#except:
#    print """Did not find the "gnames" extension module.
#Use orb.resolve_initial_references or read the IOR from a file."""

def name_to_string(name):
    """Convert CosNaming Name to a list of (id, kind) tuples."""
    res = []
    for i in range(len(name)):
        binding_name = name[i]
        res = res + [(binding_name.id, binding_name.kind)]
    return `res`

def walk(sofar, nameservice, visitor):
    """Walk the naming tree. Call visitor at object nodes."""
    (bl, bi) = nameservice.list(10000)
    print "%d bindings at naming context %s" % (len(bl),
name_to_string(sofar))
    print "binding iterator: " + `bi`

    for i in range(len(bl)):
        binding = bl[i]
        try:
            obj = nameservice.resolve(binding.binding_name)
        except CosNaming.NamingContext.NotFound:
            print "Could not find %s" % name_to_string(sofar
                                                       +
binding.binding_name)
            continue

        if binding.binding_type is CosNaming.ncontext:
            walk(sofar + binding.binding_name, obj, visitor)
        else:
            visitor(sofar, binding, obj)

def walk_print(nameservice):
    """Walk the naming tree. Print object nodes."""
    def printit(sofar, binding, obj):
        """Print object node."""
        print name_to_string(sofar + binding.binding_name)
        print obj

    walk([], nameservice, printit)

# Initialise the ORB.
orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)

# Locate the name service.
# This is how it's supposed to work:
#nameservice=orb.resolve_initial_references("NameService")
# This is the last resort - have the name server write IOR to file.
ior = open("/tmp/naming.ref").read()
# This works with the Gnome name service and the 'gnames' extension
module.
#ior = gnames.get_ior()
nameservice = orb.string_to_object(ior)

# Breaks with normal libgnorba:
walk_print(nameservice)

- --
#!/usr/bin/env python

# gntest.py
#
# Author: Jon K Hellan <hellan at acm.org>
#
# Do what you wish with this script. No warranties - if it breaks, you
get
# keep both pieces.

"""Script to explore the CORBA interface of Gnumeric.
Uses omniORBpy.

Gnome uses an authentication mechanism for CORBA interactions which only

works with the ORBit ORB. To use other ORBs, you have to disable
authentication. Change gnome_ORBit_request_validate in
gnome-libs/libgnorba/orbitgtk.c to always return
ORBIT_MESSAGE_ALLOW_ALL.
Needless to say, you should only do this if trust *everybody* who can
access your system.
"""
# Standard/built-in modules.
import sys

# omniORB modules.
from omniORB import CORBA
import CosNaming
import GNOME

## gnames find the Gnome Name Service in the same way as gnome apps do.
#try:
#    import gnames
#except:
#    print """Did not find the "gnames" extension module.
#Use orb.resolve_initial_references or read the IOR from a file."""

def name_to_string(name):
    """Convert CosNaming Name to a list of (id, kind) tuples."""
    res = []
    for i in range(len(name)):
        binding_name = name[i]
        res = res + [(binding_name.id, binding_name.kind)]
    return `res`

# Initialise the ORB.
orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)

# Locate the name service.
# This is how it's supposed to work:
#nameservice=orb.resolve_initial_references("NameService")
# This is the last resort - have the name server write IOR to file.
ior = open("/tmp/naming.ref").read()
## This works with the Gnome name service and the 'gnames' extension
module.
#ior = gnames.get_ior()
nameservice = orb.string_to_object(ior)

def resolve_goad_object(nameservice, id):
    """Resolve a name with the standard Gnome prefix."""
    nc = CosNaming.NameComponent
    prefix = [nc('GNOME', 'subcontext'), nc('Servers', 'subcontext')]
    name   = prefix + [nc(id, 'object')]
    return nameservice.resolve(name)

# Breaks with normal libgnorba:
#walk_print(nameservice)
try:
    factory = resolve_goad_object(nameservice,

'GOADID:GNOME:Gnumeric:WorkbookFactory:1.0')
except CosNaming.NamingContext.NotFound:
    print 'Gnumeric not found'
    sys.exit()
#Other exceptions ...

if not factory._is_a('IDL:GNOME/Gnumeric/WorkbookFactory:1.0'):
    raise 'This is not a Gnumeric WorkbookFactory'

newbook = factory.read("/home/jk/tmp/test.gnumeric")
sc=newbook.sheet_current()

sc.cursor_set(4, 4, 1, 1, 5, 5)

sc.make_cell_visible(4, 500)
sc.cursor_move(3, 500)
sc.cursor_move(1, 1)
sc.make_cell_visible(1, 1)
sc.make_cell_visible(0, 0)

v=GNOME.Gnumeric.Value(GNOME.Gnumeric.VALUE_FLOAT, 1)
sc.cell_set_value(1, 1, v)
v=GNOME.Gnumeric.Value(GNOME.Gnumeric.VALUE_BOOLEAN, 1)
sc.cell_set_value(1, 3, v)
v=GNOME.Gnumeric.Value(GNOME.Gnumeric.VALUE_FLOAT, 3.1415926)
sc.cell_set_value(1, 4, v)


- --
        FAQ: Frequently-Asked Questions at http://www.gnome.org/gnomefaq

         To unsubscribe: mail gnome-components-list-request at gnome.org
with
                       "unsubscribe" as the Subject.

------- End of Forwarded Message







More information about the Pipet-Devel mailing list