CCA
InfoConverter.cpp
Go to the documentation of this file.
00001 /* ============================================================
00002  *
00003  * This file is a part of CCA project
00004  *
00005  * Copyright (C) 2011 by Arne Nordmann <anordman at cor-lab dot uni-bielefeld dot de>
00006  *
00007  * This file may be licensed under the terms of the
00008  * GNU Lesser General Public License Version 3 (the ``LGPL''),
00009  * or (at your option) any later version.
00010  *
00011  * Software distributed under the License is distributed
00012  * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
00013  * express or implied. See the LGPL for the specific language
00014  * governing rights and limitations.
00015  *
00016  * You should have received a copy of the LGPL along with this
00017  * program. If not, go to http://www.gnu.org/licenses/lgpl.html
00018  * or write to the Free Software Foundation, Inc.,
00019  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00020  *
00021  * The development of this software was supported by:
00022  *   CoR-Lab, Research Institute for Cognition and Robotics
00023  *     Bielefeld University
00024  *
00025  * ============================================================ */
00026 
00027 #include "InfoConverter.h"
00028 
00029 #include <rsb/converter/SerializationException.h>
00030 #include <rsb/converter/ProtocolBufferConverter.h>
00031 
00032 #include <rst/cbse/ComponentInfo.pb.h>
00033 
00034 using namespace std;
00035 using namespace nemo;
00036 
00037 namespace cca {
00038 
00039 ComponentInfoConverter::ComponentInfoConverter() :
00040                 rsb::converter::Converter<string>(
00041                         rsc::runtime::typeName<rst::cbse::ComponentInfo>(),
00042                         RSB_TYPE_TAG(cca::ComponentInfo)), converter() {
00043                             converter = boost::shared_ptr < rsb::converter::Converter<string>
00044                             > (new rsb::converter::ProtocolBufferConverter<
00045                                     rst::cbse::ComponentInfo>);
00046                         }
00047 
00048 ComponentInfoConverter::~ComponentInfoConverter() {
00049 }
00050 
00051 string ComponentInfoConverter::getWireSchema() const {
00052     return converter->getWireSchema();
00053 }
00054 
00055 string ComponentInfoConverter::serialize(const rsb::AnnotatedData &data,
00056         string &wire) {
00057 
00058     // Cast to original domain type
00059     boost::shared_ptr<cca::ComponentInfo> domain = boost::static_pointer_cast<
00060             cca::ComponentInfo>(data.second);
00061 
00062     // Fill protocol buffer object
00063     rst::cbse::ComponentInfo proto;
00064 
00065     //    1. reserve()
00066     //    2. std::copy(begin, begin+n) // oder memcpy
00067     proto.set_id(domain->name);
00068 
00069     // Use embedded ProtoBuf converter for serialization to wire
00070     return converter->serialize(
00071             make_pair(rsc::runtime::typeName<rst::cbse::ComponentInfo>(),
00072                     boost::shared_ptr<void>(&proto, rsc::misc::NullDeleter())),
00073             wire);
00074 }
00075 
00076 rsb::AnnotatedData ComponentInfoConverter::deserialize(
00077         const std::string &wireType, const std::string &wire) {
00078 
00079     // Deserialize and cast to specific ProtoBuf type
00080     boost::shared_ptr<rst::cbse::ComponentInfo> proto =
00081             boost::static_pointer_cast<rst::cbse::ComponentInfo>(
00082                     converter->deserialize(wireType, wire).second);
00083 
00084     // Read domain data from ProtoBuf
00085     ComponentInfoPtr domain(new ComponentInfo(proto->id()));
00086 
00087     return rsb::AnnotatedData(getDataType(), domain);
00088 
00089 }
00090 
00091 }