nexmon – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 # -*- python -*-
2 #
3 # File : wireshark_be.py
4 #
5 # Author : Frank Singleton (frank.singleton@ericsson.com)
6 #
7 # Copyright (C) 2001 Frank Singleton, Ericsson Inc.
8 #
9 # This file is a backend to "omniidl", used to generate "Wireshark"
10 # dissectors from IDL descriptions. The output language generated
11 # is "C". It will generate code to use the GIOP/IIOP get_CDR_XXX API.
12 #
13 # Please see packet-giop.h in Wireshark distro for API description.
14 # Wireshark is available at http://www.wireshark.org/
15 #
16 # Omniidl is part of the OmniOrb distribution, and is available at
17 # http://omniorb.sourceforge.net
18 #
19 # This program is free software; you can redistribute it and/or modify it
20 # under the terms of the GNU General Public License as published by
21 # the Free Software Foundation; either version 2 of the License, or
22 # (at your option) any later version.
23 #
24 # This program is distributed in the hope that it will be useful,
25 # but WITHOUT ANY WARRANTY; without even the implied warranty of
26 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27 # General Public License for more details.
28 #
29 # You should have received a copy of the GNU General Public License
30 # along with this program; if not, write to the Free Software
31 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
32 #
33 # Description:
34 #
35 # Omniidl Back-end which parses an IDL data structure provided by the frontend
36 # and generates packet-idl-xxx.[ch] for compiling as a dissector in
37 # Wireshark IP protocol anlayser.
38 #
39 #
40 #
41 #
42 # Strategy.
43 #
44 # Crawl all the way down all branches until I hit "Operation", "Enum", "Attribute",
45 # "Struct" and "Union" nodes. Then store these nodes in lists.
46 #
47 # Pass these lists (via an object ref) to the src code
48 # generator (wireshark_gen) class and let it do the hard work !
49 #
50 #
51 # Don't forget structs can contain embedded structs etc .. so don't forget
52 # to peek inside and check :-)
53 #
54 #
55  
56  
57 """Wireshark IDL compiler back-end."""
58  
59 from omniidl import idlast, idltype, idlvisitor, idlutil, output
60 import sys, string
61 from os import path
62 from wireshark_gen import wireshark_gen_C
63  
64 #
65 # This class finds the "Operation" nodes ,Enum Nodes, "Attribute" nodes, Struct Nodes
66 # and Union Nodes. Then it hands them off to an instance of the source code generator
67 # class "wireshark_gen"
68 #
69  
70 class WiresharkVisitor:
71  
72 DEBUG = 0 # debug flag
73  
74 def __init__(self, st):
75 self.st = st
76 self.oplist = [] # list of operation nodes
77 self.enlist = [] # list of enum nodes
78 self.atlist = [] # list of attribute nodes
79 self.stlist = [] # list of struct nodes
80 self.unlist = [] # list of union nodes
81  
82  
83 def visitAST(self, node):
84 if self.DEBUG:
85 print "XXX visitAST() node = ", node
86  
87 for n in node.declarations():
88 if isinstance(n, idlast.Module):
89 self.visitModule(n)
90 if isinstance(n, idlast.Interface):
91 self.visitInterface(n)
92 if isinstance(n, idlast.Operation):
93 self.visitOperation(n)
94 if isinstance(n, idlast.Attribute):
95 self.visitAttribute(n)
96 if isinstance(n, idlast.Enum):
97 self.visitEnum(n)
98 if isinstance(n, idlast.Struct):
99 self.visitStruct(n)
100 if isinstance(n, idlast.Union):
101 self.visitUnion(n)
102  
103 # Check for Typedef structs and unions
104  
105 if isinstance(n, idlast.Typedef):
106 self.visitTypedef(n) # who are you ?
107  
108  
109 def visitModule(self, node):
110 if self.DEBUG:
111 print "XXX visitModule() node = ", node
112  
113 for n in node.definitions():
114 if isinstance(n, idlast.Module):
115 self.visitModule(n)
116 if isinstance(n, idlast.Interface):
117 self.visitInterface(n)
118 if isinstance(n, idlast.Operation):
119 self.visitOperation(n)
120 if isinstance(n, idlast.Attribute):
121 self.visitAttribute(n)
122 if isinstance(n, idlast.Enum):
123 self.visitEnum(n)
124 if isinstance(n, idlast.Struct):
125 self.visitStruct(n)
126 if isinstance(n, idlast.Union):
127 self.visitUnion(n)
128  
129 # Check for Typedef structs and unions
130  
131 if isinstance(n, idlast.Typedef):
132 self.visitTypedef(n) # who are you ?
133  
134  
135 def visitInterface(self, node):
136 if self.DEBUG:
137 print "XXX visitInterface() node = ", node
138  
139 for c in node.callables():
140 if isinstance(c, idlast.Operation):
141 self.visitOperation(c)
142 if isinstance(c, idlast.Attribute):
143 self.visitAttribute(c)
144  
145 for d in node.contents():
146 if isinstance(d, idlast.Enum):
147 self.visitEnum(d)
148  
149 if isinstance(d, idlast.Struct):
150 self.visitStruct(d)
151  
152 if isinstance(d, idlast.Union):
153 self.visitUnion(d)
154  
155 # Check for Typedef structs and unions
156  
157 if isinstance(d, idlast.Typedef):
158 self.visitTypedef(d) # who are you ?
159  
160  
161 #
162 # visitOperation
163 #
164 # populates the operations node list "oplist"
165 #
166 #
167  
168 def visitOperation(self,opnode):
169 if not opnode in self.oplist:
170 self.oplist.append(opnode) # store operation node
171  
172 #
173 # visitAttribute
174 #
175 # populates the attribute node list "atlist"
176 #
177 #
178  
179 def visitAttribute(self,atnode):
180 if not atnode in self.atlist:
181 self.atlist.append(atnode) # store attribute node
182  
183  
184 #
185 # visitEnum
186 #
187 # populates the Enum node list "enlist"
188 #
189 #
190  
191 def visitEnum(self,enode):
192 if not enode in self.enlist:
193 self.enlist.append(enode) # store enum node if unique
194  
195 #
196 # visitTypedef
197 #
198 # Search to see if its a typedef'd struct, union, or enum
199 #
200 # eg: typdef enum colors {red, green, blue } mycolors;
201 #
202  
203 def visitTypedef(self,td):
204 d = td.aliasType() # get Type, possibly Declared
205 if isinstance(d,idltype.Declared):
206 self.visitDeclared(d)
207  
208  
209 #
210 # visitDeclared
211 #
212 # Search to see if its a struct, union, or enum
213 #
214 #
215  
216 def visitDeclared(self,d):
217 if isinstance(d,idltype.Declared):
218 sue = d.decl() # grab the struct or union or enum
219  
220 if isinstance(sue, idlast.Struct):
221 self.visitStruct(sue)
222 if isinstance(sue, idlast.Union):
223 self.visitUnion(sue)
224 if isinstance(sue, idlast.Enum):
225 self.visitEnum(sue)
226  
227  
228  
229  
230 #
231 # visitStruct
232 #
233 # populates the struct node list "stlist"
234 # and checks its members also
235 #
236 #
237  
238 def visitStruct(self,stnode):
239 if not stnode in self.stlist:
240 self.stlist.append(stnode) # store struct node if unique and avoid recursive loops
241 # if we come across recursive structs
242  
243 for m in stnode.members(): # find embedded struct definitions within this
244 mt = m.memberType()
245 if isinstance(mt,idltype.Declared):
246 self.visitDeclared(mt) # if declared, then check it out
247  
248  
249 #
250 # visitUnion
251 #
252 # populates the struct node list "unlist"
253 # and checks its members also
254 #
255 #
256  
257 def visitUnion(self,unnode):
258 if not unnode in self.unlist:
259 self.unlist.append(unnode) # store union node if unique
260  
261 if unnode.constrType(): # enum defined within switch type
262 if isinstance(unnode.switchType(),idltype.Declared):
263 self.visitDeclared(unnode.switchType())
264  
265 for c in unnode.cases():
266 ct = c.caseType()
267 if isinstance(ct,idltype.Declared):
268 self.visitDeclared(ct) # if declared, then check it out
269  
270  
271 def run(tree, args):
272  
273 st = output.Stream(sys.stdout, 4) # set indent for stream
274 ev = WiresharkVisitor(st) # create visitor object
275  
276 ev.visitAST(tree) # go find some operations
277  
278 #
279 # Grab name of main IDL file being compiled.
280 #
281 # Assumption: Name is of the form abcdefg.xyz (eg: CosNaming.idl)
282 #
283  
284 fname = path.basename(tree.file()) # grab basename only, dont care about path
285 nl = string.split(fname,".")[0] # split name of main IDL file using "." as separator
286 # and grab first field (eg: CosNaming)
287  
288 if ev.DEBUG:
289 for i in ev.oplist:
290 print "XXX - Operation node ", i, " repoId() = ", i.repoId()
291 for i in ev.atlist:
292 print "XXX - Attribute node ", i, " identifiers() = ", i.identifiers()
293 for i in ev.enlist:
294 print "XXX - Enum node ", i, " repoId() = ", i.repoId()
295 for i in ev.stlist:
296 print "XXX - Struct node ", i, " repoId() = ", i.repoId()
297 for i in ev.unlist:
298 print "XXX - Union node ", i, " repoId() = ", i.repoId()
299  
300  
301 # create a C generator object
302 # and generate some C code
303  
304  
305 eg = wireshark_gen_C(ev.st, string.upper(nl), string.lower(nl), string.capitalize(nl) + " Dissector Using GIOP API")
306 eg.genCode(ev.oplist, ev.atlist, ev.enlist, ev.stlist, ev.unlist) # pass them onto the C generator
307  
308 #
309 # Editor modelines - http://www.wireshark.org/tools/modelines.html
310 #
311 # Local variables:
312 # c-basic-offset: 4
313 # indent-tabs-mode: nil
314 # End:
315 #
316 # vi: set shiftwidth=4 expandtab:
317 # :indentSize=4:noTabs=true:
318 #