summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/JavaUtil.cpp
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2011-12-30 00:50:17 +0100
committerJose <jose@zeroc.com>2011-12-30 00:50:17 +0100
commit7c87650730bd406521e4a75a7374e62ba3128ad2 (patch)
treedddad39775ca64d5324f0be7b75469d6c1d78999 /cpp/src/Slice/JavaUtil.cpp
parentICE-4565 - Generate default value initialization in header file (diff)
downloadice-7c87650730bd406521e4a75a7374e62ba3128ad2.tar.bz2
ice-7c87650730bd406521e4a75a7374e62ba3128ad2.tar.xz
ice-7c87650730bd406521e4a75a7374e62ba3128ad2.zip
ICE-3441 - Compute serialVersionUID
Diffstat (limited to 'cpp/src/Slice/JavaUtil.cpp')
-rw-r--r--cpp/src/Slice/JavaUtil.cpp100
1 files changed, 100 insertions, 0 deletions
diff --git a/cpp/src/Slice/JavaUtil.cpp b/cpp/src/Slice/JavaUtil.cpp
index e124b33292d..533342a6593 100644
--- a/cpp/src/Slice/JavaUtil.cpp
+++ b/cpp/src/Slice/JavaUtil.cpp
@@ -11,6 +11,7 @@
#include <Slice/JavaUtil.h>
#include <Slice/FileTracker.h>
#include <Slice/Util.h>
+#include <Slice/MD5.h>
#include <IceUtil/Functional.h>
#include <IceUtil/DisableWarnings.h>
@@ -31,6 +32,100 @@ using namespace Slice;
using namespace IceUtil;
using namespace IceUtilInternal;
+long
+Slice::computeSerialVersionUUID(const ClassDefPtr& p)
+{
+ ostringstream os;
+
+ ClassList bases = p->bases();
+ os << "Name: " << p->scoped();
+
+ os << " Bases: [";
+ for(ClassList::const_iterator i = bases.begin(); i != bases.end();)
+ {
+ os << (*i)->scoped();
+ i++;
+ if(i != l.end())
+ {
+ os << ", ";
+ }
+ }
+ os << "]";
+
+ os << " Members: [";
+ DataMemberList members = p->dataMembers();
+ for(DataMemberList::const_iterator i = members.begin(); i != members.end();)
+ {
+ os << (*i)->name() << ":" << (*i)->type();
+ i++;
+ if(i != l.end())
+ {
+ os << ", ";
+ }
+ }
+ os << "]";
+
+ const string data = os.str();
+ MD5 md5(reinterpret_cast<const unsigned char*>(data.c_str()), static_cast<int>(data.size()));
+ vector<unsigned char> bytes;
+ bytes.resize(16);
+ md5.getDigest(reinterpret_cast<unsigned char*>(&bytes[0]));
+
+ long h0 = 0;
+ long h1 = 0;
+ for(int i = 0; i < 8; ++i)
+ {
+ h0 |= (long)bytes[i] << (i * 4);
+ }
+ if(h0)
+
+ for(int i = 0; i < 8; ++i)
+ {
+ h1 |= (long)bytes[i + 8] << (i * 4);
+ }
+ return abs(h0 ^ h1);
+}
+
+long
+Slice::computeSerialVersionUUID(const StructPtr& p)
+{
+ ostringstream os;
+
+ os << "Name: " << p->scoped();
+ os << " Members: [";
+ DataMemberList members = p->dataMembers();
+ for(DataMemberList::const_iterator i = members.begin(); i != members.end();)
+ {
+ os << (*i)->name() << ":" << (*i)->type();
+ i++;
+ if(i != l.end())
+ {
+ os << ", ";
+ }
+ }
+ os << "]";
+
+ const string data = os.str();
+ MD5 md5(reinterpret_cast<const unsigned char*>(data.c_str()), static_cast<int>(data.size()));
+ vector<unsigned char> bytes;
+ bytes.resize(16);
+ md5.getDigest(reinterpret_cast<unsigned char*>(&bytes[0]));
+
+ long h0 = 0;
+ long h1 = 0;
+ for(int i = 0; i < 8; ++i)
+ {
+ h0 |= (long)bytes[i] << (i * 4);
+ }
+
+ for(int i = 0; i < 8; ++i)
+ {
+ h1 |= (long)bytes[i + 8] << (i * 4);
+ }
+
+ return abs(h0 ^ h1);
+}
+
Slice::JavaOutput::JavaOutput()
{
}
@@ -2829,6 +2924,11 @@ Slice::JavaGenerator::MetaDataVisitor::getMetaData(const ContainedPtr& cont)
result.push_back(s);
continue;
}
+ else if(s.substr(prefix.size(), pos - prefix.size()) == "serialVersionUID")
+ {
+ result.push_back(s);
+ continue;
+ }
emitWarning(cont->file(), cont->line(), "ignoring invalid metadata `" + s + "'");
}