2001-06-18 05:27:18 +00:00
|
|
|
# -*- python -*-
|
|
|
|
#
|
2001-10-12 17:14:41 +00:00
|
|
|
# $Id: ethereal_be.py,v 1.5 2001/10/12 17:14:41 guy Exp $
|
2001-06-18 05:27:18 +00:00
|
|
|
#
|
|
|
|
# File : ethereal_be.py
|
|
|
|
#
|
|
|
|
# Author : Frank Singleton (frank.singleton@ericsson.com)
|
|
|
|
#
|
|
|
|
# Copyright (C) 2001 Frank Singleton, Ericsson Inc.
|
|
|
|
#
|
|
|
|
# This file is a backend to "omniidl", used to generate "Ethereal"
|
|
|
|
# dissectors from IDL descriptions. The output language generated
|
|
|
|
# is "C". It will generate code to use the GIOP/IIOP get_CDR_XXX API.
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# Please see packet-giop.h in Ethereal distro for API description.
|
|
|
|
# Ethereal is available at http://www.ethereal.com/
|
|
|
|
#
|
|
|
|
# Omniidl is part of the OmniOrb distribution, and is available at
|
|
|
|
# http://www.uk.research.att.com/omniORB/omniORB.html
|
|
|
|
#
|
|
|
|
# This program is free software; you can redistribute it and/or modify it
|
|
|
|
# under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
# General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program; if not, write to the Free Software
|
|
|
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
|
|
# 02111-1307, USA.
|
|
|
|
#
|
|
|
|
# Description:
|
|
|
|
#
|
|
|
|
# Omniidl Back-end which parses an IDL data structure provided by the frontend
|
|
|
|
# and generates packet-idl-xxx.[ch] for compiling as a dissector in
|
|
|
|
# Ethereal IP protocol anlayser.
|
|
|
|
#
|
|
|
|
#
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# Strategy.
|
|
|
|
#
|
|
|
|
# Crawl all the way down all branches until I hit "Operation" nodes
|
2001-07-27 18:35:22 +00:00
|
|
|
# and "Attribute" nodes. Then store the "operation" nodes in oplist[]
|
|
|
|
# and "attribute" nodes in atlist[].
|
2001-06-18 05:27:18 +00:00
|
|
|
#
|
2001-07-27 18:35:22 +00:00
|
|
|
# Pass the obj.oplist[] and obj.atlist[](via an object ref) to the src code
|
|
|
|
# generator (ethereal_gen) class and let it do the hard work !
|
2001-06-18 05:27:18 +00:00
|
|
|
#
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
|
|
"""Ethereal IDL compiler back-end."""
|
|
|
|
|
|
|
|
from omniidl import idlast, idltype, idlvisitor, idlutil, output
|
|
|
|
import sys, string
|
2001-08-30 19:31:53 +00:00
|
|
|
from os import path
|
2001-06-18 05:27:18 +00:00
|
|
|
from ethereal_gen import ethereal_gen_C
|
|
|
|
|
|
|
|
#
|
2001-07-27 18:35:22 +00:00
|
|
|
# This class finds the "Operation" nodes and "Attribute" nodes, and hands them off
|
2001-06-18 05:27:18 +00:00
|
|
|
# to an instance of the source code generator class "ethereal_gen"
|
|
|
|
#
|
|
|
|
|
|
|
|
class EtherealVisitor:
|
|
|
|
|
|
|
|
def __init__(self, st):
|
|
|
|
self.st = st
|
|
|
|
self.oplist = [] # list of operation nodes
|
2001-10-12 17:14:41 +00:00
|
|
|
self.enlist = [] # list of enum nodes
|
2001-07-27 18:35:22 +00:00
|
|
|
self.atlist = [] # list of attribute nodes
|
|
|
|
|
2001-06-18 05:27:18 +00:00
|
|
|
|
|
|
|
def visitAST(self, node):
|
|
|
|
for n in node.declarations():
|
|
|
|
if isinstance(n, idlast.Module):
|
|
|
|
self.visitModule(n)
|
|
|
|
if isinstance(n, idlast.Interface):
|
|
|
|
self.visitInterface(n)
|
|
|
|
if isinstance(n, idlast.Operation):
|
|
|
|
self.visitOperation(n)
|
2001-07-27 18:35:22 +00:00
|
|
|
if isinstance(n, idlast.Attribute):
|
|
|
|
self.visitAttribute(n)
|
2001-10-12 17:14:41 +00:00
|
|
|
if isinstance(n, idlast.Enum):
|
|
|
|
self.visitEnum(n)
|
|
|
|
|
2001-06-18 05:27:18 +00:00
|
|
|
|
|
|
|
def visitModule(self, node):
|
|
|
|
for n in node.definitions():
|
|
|
|
if isinstance(n, idlast.Module):
|
|
|
|
self.visitModule(n)
|
|
|
|
if isinstance(n, idlast.Interface):
|
|
|
|
self.visitInterface(n)
|
|
|
|
if isinstance(n, idlast.Operation):
|
|
|
|
self.visitOperation(n)
|
2001-07-27 18:35:22 +00:00
|
|
|
if isinstance(n, idlast.Attribute):
|
|
|
|
self.visitAttribute(n)
|
2001-10-12 17:14:41 +00:00
|
|
|
if isinstance(n, idlast.Enum):
|
|
|
|
self.visitEnum(n)
|
|
|
|
|
2001-06-18 05:27:18 +00:00
|
|
|
def visitInterface(self, node):
|
2001-07-27 18:35:22 +00:00
|
|
|
#if node.mainFile():
|
|
|
|
for c in node.callables():
|
|
|
|
if isinstance(c, idlast.Operation):
|
|
|
|
self.visitOperation(c)
|
|
|
|
if isinstance(c, idlast.Attribute):
|
|
|
|
self.visitAttribute(c)
|
|
|
|
|
2001-10-12 17:14:41 +00:00
|
|
|
for d in node.contents():
|
|
|
|
if isinstance(d, idlast.Enum):
|
|
|
|
self.visitEnum(d)
|
2001-06-18 05:27:18 +00:00
|
|
|
#
|
|
|
|
# visitOperation
|
|
|
|
#
|
|
|
|
# populates the operations node list "oplist"
|
|
|
|
#
|
|
|
|
#
|
|
|
|
|
|
|
|
def visitOperation(self,opnode):
|
|
|
|
self.oplist.append(opnode) # store operation node
|
2001-07-27 18:35:22 +00:00
|
|
|
|
2001-06-18 05:27:18 +00:00
|
|
|
#
|
2001-07-27 18:35:22 +00:00
|
|
|
# visitAttribute
|
2001-06-18 05:27:18 +00:00
|
|
|
#
|
2001-07-27 18:35:22 +00:00
|
|
|
# populates the attribute node list "atlist"
|
2001-06-18 05:27:18 +00:00
|
|
|
#
|
2001-07-27 18:35:22 +00:00
|
|
|
#
|
|
|
|
|
|
|
|
def visitAttribute(self,atnode):
|
|
|
|
self.atlist.append(atnode) # store attribute node
|
2001-06-18 05:27:18 +00:00
|
|
|
|
2001-10-12 17:14:41 +00:00
|
|
|
#
|
|
|
|
# visitEnum
|
|
|
|
#
|
|
|
|
# populates the enum node list "enumlist"
|
|
|
|
#
|
|
|
|
#
|
|
|
|
|
|
|
|
def visitEnum(self,enode):
|
|
|
|
#print "XXX - enum found" , enode
|
|
|
|
self.enlist.append(enode) # store enum node
|
|
|
|
|
|
|
|
|
2001-06-18 05:27:18 +00:00
|
|
|
|
|
|
|
def run(tree, args):
|
|
|
|
|
|
|
|
st = output.Stream(sys.stdout, 4) # set indent for stream
|
|
|
|
ev = EtherealVisitor(st) # create visitor object
|
|
|
|
|
|
|
|
ev.visitAST(tree) # go find some operations
|
2001-07-17 18:36:46 +00:00
|
|
|
|
|
|
|
#
|
|
|
|
# Grab name of main IDL file being compiled.
|
|
|
|
#
|
|
|
|
# Assumption: Name is of the form abcdefg.xyz (eg: CosNaming.idl)
|
|
|
|
#
|
|
|
|
|
2001-08-30 19:31:53 +00:00
|
|
|
fname = path.basename(tree.file()) # grab basename only, dont care about path
|
|
|
|
nl = string.split(fname,".")[0] # split name of main IDL file using "." as separator
|
2001-07-17 18:36:46 +00:00
|
|
|
# and grab first field (eg: CosNaming)
|
2001-06-18 05:27:18 +00:00
|
|
|
|
|
|
|
# create a C generator object
|
|
|
|
# and generate some C code
|
2001-07-17 18:36:46 +00:00
|
|
|
|
|
|
|
eg = ethereal_gen_C(ev.st, string.upper(nl), string.lower(nl), string.capitalize(nl) + " Dissector Using GIOP API")
|
2001-10-12 17:14:41 +00:00
|
|
|
eg.genCode(ev.oplist, ev.atlist, ev.enlist) # pass them onto the C generator
|
2001-06-18 05:27:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
|