1 // **********************************************************************
3 // Copyright (c) 2003-2011 ZeroC, Inc. All rights reserved.
5 // This copy of Ice is licensed to you under the terms described in the
6 // ICE_LICENSE file included in this distribution.
8 // **********************************************************************
10 #include <Slice/Checksum.h>
11 #include <Slice/MD5.h>
14 using namespace Slice
;
19 class ChecksumVisitor
: public ParserVisitor
23 ChecksumVisitor(ChecksumMap
&);
25 virtual bool visitClassDefStart(const ClassDefPtr
&);
26 virtual bool visitExceptionStart(const ExceptionPtr
&);
27 virtual bool visitStructStart(const StructPtr
&);
28 virtual void visitSequence(const SequencePtr
&);
29 virtual void visitDictionary(const DictionaryPtr
&);
30 virtual void visitEnum(const EnumPtr
&);
31 virtual void visitConst(const ConstPtr
&);
35 string
typeToString(const TypePtr
&);
36 void updateMap(const string
&, const string
&);
43 Slice::ChecksumVisitor::ChecksumVisitor(ChecksumMap
& m
) :
49 Slice::ChecksumVisitor::visitClassDefStart(const ClassDefPtr
& p
)
56 ClassList bases
= p
->bases();
72 if(!bases
.front()->isInterface())
74 ostr
<< " extends " << bases
.front()->scoped();
75 bases
.erase(bases
.begin());
85 ostr
<< " implements ";
87 for(ClassList::iterator q
= bases
.begin(); q
!= bases
.end(); ++q
)
89 if(q
!= bases
.begin())
93 ostr
<< (*q
)->scoped();
99 if(p
->hasDataMembers())
101 DataMemberList members
= p
->dataMembers();
102 for(DataMemberList::iterator q
= members
.begin(); q
!= members
.end(); ++q
)
104 ostr
<< typeToString((*q
)->type()) << ' ' << (*q
)->name() << endl
;
108 if(p
->hasOperations())
110 OperationList ops
= p
->operations();
111 for(OperationList::iterator q
= ops
.begin(); q
!= ops
.end(); ++q
)
113 ostr
<< typeToString((*q
)->returnType()) << ' ' << (*q
)->name() << '(';
114 ParamDeclList params
= (*q
)->parameters();
115 for(ParamDeclList::iterator r
= params
.begin(); r
!= params
.end(); ++r
)
117 if(r
!= params
.begin())
121 if((*r
)->isOutParam())
125 ostr
<< typeToString((*r
)->type()) << ' ' << (*r
)->name();
128 ExceptionList ex
= (*q
)->throws();
132 for(ExceptionList::iterator s
= ex
.begin(); s
!= ex
.end(); ++s
)
138 ostr
<< (*s
)->scoped();
145 updateMap(p
->scoped(), ostr
.str());
151 Slice::ChecksumVisitor::visitExceptionStart(const ExceptionPtr
& p
)
158 ExceptionPtr base
= p
->base();
162 ostr
<< "exception " << p
->name();
165 ostr
<< " extends " << base
->scoped();
169 DataMemberList members
= p
->dataMembers();
170 for(DataMemberList::iterator q
= members
.begin(); q
!= members
.end(); ++q
)
172 ostr
<< typeToString((*q
)->type()) << ' ' << (*q
)->name() << endl
;
175 updateMap(p
->scoped(), ostr
.str());
181 Slice::ChecksumVisitor::visitStructStart(const StructPtr
& p
)
190 ostr
<< "struct " << p
->name() << endl
;
192 DataMemberList members
= p
->dataMembers();
193 for(DataMemberList::iterator q
= members
.begin(); q
!= members
.end(); ++q
)
195 ostr
<< typeToString((*q
)->type()) << ' ' << (*q
)->name() << endl
;
198 updateMap(p
->scoped(), ostr
.str());
204 Slice::ChecksumVisitor::visitSequence(const SequencePtr
& p
)
212 ostr
<< "sequence<" << typeToString(p
->type()) << "> " << p
->name() << endl
;
213 updateMap(p
->scoped(), ostr
.str());
217 Slice::ChecksumVisitor::visitDictionary(const DictionaryPtr
& p
)
225 ostr
<< "dictionary<" << typeToString(p
->keyType()) << ", " << typeToString(p
->valueType()) << "> " << p
->name()
227 updateMap(p
->scoped(), ostr
.str());
231 Slice::ChecksumVisitor::visitEnum(const EnumPtr
& p
)
240 ostr
<< "enum " << p
->name() << endl
;
242 EnumeratorList enums
= p
->getEnumerators();
243 for(EnumeratorList::iterator q
= enums
.begin(); q
!= enums
.end(); ++q
)
245 ostr
<< (*q
)->name() << endl
;
248 updateMap(p
->scoped(), ostr
.str());
252 Slice::ChecksumVisitor::visitConst(const ConstPtr
& p
)
255 ostr
<< "const " << typeToString(p
->type()) << ' ' << p
->name() << " = " << p
->value() << endl
;
256 updateMap(p
->scoped(), ostr
.str());
260 Slice::ChecksumVisitor::typeToString(const TypePtr
& type
)
262 static const char* builtinTable
[] =
282 BuiltinPtr builtin
= BuiltinPtr::dynamicCast(type
);
285 return builtinTable
[builtin
->kind()];
288 ProxyPtr proxy
= ProxyPtr::dynamicCast(type
);
291 return proxy
->_class()->scoped() + "*";
294 ContainedPtr cont
= ContainedPtr::dynamicCast(type
);
296 return cont
->scoped();
300 Slice::ChecksumVisitor::updateMap(const string
& scoped
, const string
& data
)
302 MD5
md5(reinterpret_cast<const unsigned char*>(data
.c_str()), static_cast<int>(data
.size()));
303 vector
<unsigned char> bytes
;
305 md5
.getDigest(reinterpret_cast<unsigned char*>(&bytes
[0]));
306 _map
.insert(ChecksumMap::value_type(scoped
, bytes
));
310 Slice::createChecksums(const UnitPtr
& u
)
314 ChecksumVisitor
visitor(result
);
315 u
->visit(&visitor
, false);