summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/CsUtil.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2009-02-09 19:20:38 +0100
committerBenoit Foucher <benoit@zeroc.com>2009-02-09 19:20:38 +0100
commit124b43c7bd718655556bd3cba2a554293bf63d16 (patch)
tree5c3138e3c96e9f3a4763e1b6eea92018d892b241 /cpp/src/Slice/CsUtil.cpp
parentBug 3519 - fix use of tolower in slice2freeze (diff)
downloadice-124b43c7bd718655556bd3cba2a554293bf63d16.tar.bz2
ice-124b43c7bd718655556bd3cba2a554293bf63d16.tar.xz
ice-124b43c7bd718655556bd3cba2a554293bf63d16.zip
Support for serializable and protobuf metadata (from cs_serial branch)
Diffstat (limited to 'cpp/src/Slice/CsUtil.cpp')
-rw-r--r--cpp/src/Slice/CsUtil.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/cpp/src/Slice/CsUtil.cpp b/cpp/src/Slice/CsUtil.cpp
index a2f722b2dcb..58b41e7045c 100644
--- a/cpp/src/Slice/CsUtil.cpp
+++ b/cpp/src/Slice/CsUtil.cpp
@@ -214,6 +214,13 @@ Slice::CsGenerator::typeToString(const TypePtr& type)
}
}
+ prefix = "clr:serializable:";
+ if(seq->findMetaData(prefix, meta))
+ {
+ string type = meta.substr(prefix.size());
+ return global() + type;
+ }
+
return typeToString(seq->type()) + "[]";
}
@@ -888,6 +895,21 @@ Slice::CsGenerator::writeSequenceMarshalUnmarshalCode(Output& out,
}
default:
{
+ string prefix = "clr:serializable:";
+ string meta;
+ if(seq->findMetaData(prefix, meta))
+ {
+ if(marshal)
+ {
+ out << nl << stream << ".writeSerializable(" << param << ");";
+ }
+ else
+ {
+ out << nl << param << " = (" << typeToString(seq) << ")" << stream << ".readSerializable();";
+ }
+ break;
+ }
+
typeS[0] = toupper(static_cast<unsigned char>(typeS[0]));
if(marshal)
{
@@ -1688,6 +1710,22 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont)
continue; // Custom type or List<T>
}
}
+ if(s.substr(prefix.size(), 13) == "serializable:")
+ {
+ string meta;
+ if(cont->findMetaData(prefix + "collection", meta)
+ || cont->findMetaData(prefix + "generic:", meta))
+ {
+ emitWarning(file, cont->line(), msg + " `" + meta + "':\n" +
+ "serialization can only be used with the array mapping for byte sequences");
+ }
+ string type = s.substr(prefix.size() + 13);
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(seq->type());
+ if(!type.empty() && builtin && builtin->kind() == Builtin::KindByte)
+ {
+ continue;
+ }
+ }
}
else if(StructPtr::dynamicCast(cont))
{