blob: 84fd60c629c112832ebc868c8598f4c3ca7f3a2b [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2013, Regents of the University of California
* Alexander Afanasyev
*
* BSD license, See the LICENSE file for more information
*
* Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
*/
#include "key-locator.h"
#include "ndn-cpp/error.h"
namespace ndn {
KeyLocator::KeyLocator ()
: m_type (NOTSET)
, m_data (0)
{
}
KeyLocator::KeyLocator (const KeyLocator &keyLocator)
: m_type (keyLocator.getType ())
, m_data (0)
{
switch (m_type)
{
case NOTSET:
break;
case KEY:
m_data = new Blob (keyLocator.getKey ());
break;
case CERTIFICATE:
m_data = new Blob (keyLocator.getCertificate ());
break;
case KEYNAME:
m_data = new Name (keyLocator.getKeyName ());
break;
}
}
KeyLocator::~KeyLocator ()
{
deleteData ();
}
KeyLocator &
KeyLocator::operator = (const KeyLocator &keyLocator)
{
if (this == &keyLocator)
return *this;
deleteData ();
m_type = keyLocator.getType ();
switch (m_type)
{
case NOTSET:
break;
case KEY:
m_data = new Blob (keyLocator.getKey ());
break;
case CERTIFICATE:
m_data = new Blob (keyLocator.getCertificate ());
break;
case KEYNAME:
m_data = new Name (keyLocator.getKeyName ());
break;
}
return *this;
}
void
KeyLocator::deleteData ()
{
switch (m_type)
{
case NOTSET: // nothing to clean up
break;
case KEY:
delete reinterpret_cast<Blob*> (m_data);
break;
case CERTIFICATE:
delete reinterpret_cast<Blob*> (m_data);
break;
case KEYNAME:
delete reinterpret_cast<Name*> (m_data);
break;
}
}
void
KeyLocator::setType (KeyLocator::Type type)
{
if (m_type == type)
return;
deleteData ();
m_type = type;
switch (m_type)
{
case NOTSET:
m_data = 0;
case KEY:
m_data = new Blob;
break;
case CERTIFICATE:
m_data = new Blob;
break;
case KEYNAME:
m_data = new Name;
break;
}
}
const Blob &
KeyLocator::getKey () const
{
if (m_type != KEY)
BOOST_THROW_EXCEPTION (error::KeyLocator ()
<< error::msg ("getKey called, but KeyLocator is not of type KeyLocator::KEY"));
return *reinterpret_cast<const Blob*> (m_data);
}
Blob &
KeyLocator::getKey ()
{
if (m_type != KEY)
BOOST_THROW_EXCEPTION (error::KeyLocator ()
<< error::msg ("getKey called, but KeyLocator is not of type KeyLocator::KEY"));
return *reinterpret_cast<Blob*> (m_data);
}
void
KeyLocator::setKey (const Blob &key)
{
if (m_type != KEY)
BOOST_THROW_EXCEPTION (error::KeyLocator ()
<< error::msg ("setKey called, but KeyLocator is not of type KeyLocator::KEY"));
*reinterpret_cast<Blob*> (m_data) = key;
}
const Blob &
KeyLocator::getCertificate () const
{
if (m_type != CERTIFICATE)
BOOST_THROW_EXCEPTION (error::KeyLocator ()
<< error::msg ("getCertificate called, but KeyLocator is not of type KeyLocator::CERTIFICATE"));
return *reinterpret_cast<const Blob*> (m_data);
}
Blob &
KeyLocator::getCertificate ()
{
if (m_type != CERTIFICATE)
BOOST_THROW_EXCEPTION (error::KeyLocator ()
<< error::msg ("getCertificate called, but KeyLocator is not of type KeyLocator::CERTIFICATE"));
return *reinterpret_cast<Blob*> (m_data);
}
void
KeyLocator::setCertificate (const Blob &certificate)
{
if (m_type != CERTIFICATE)
BOOST_THROW_EXCEPTION (error::KeyLocator ()
<< error::msg ("setCertificate called, but KeyLocator is not of type KeyLocator::CERTIFICATE"));
*reinterpret_cast<Blob*> (m_data) = certificate;
}
const Name &
KeyLocator::getKeyName () const
{
if (m_type != KEYNAME)
BOOST_THROW_EXCEPTION (error::KeyLocator ()
<< error::msg ("getKeyName called, but KeyLocator is not of type KeyLocator::KEYNAME"));
return *reinterpret_cast<const Name*> (m_data);
}
Name &
KeyLocator::getKeyName ()
{
if (m_type != KEYNAME)
BOOST_THROW_EXCEPTION (error::KeyLocator ()
<< error::msg ("getKeyName called, but KeyLocator is not of type KeyLocator::KEYNAME"));
return *reinterpret_cast<Name*> (m_data);
}
void
KeyLocator::setKeyName (const Name &name)
{
if (m_type != KEYNAME)
BOOST_THROW_EXCEPTION (error::KeyLocator ()
<< error::msg ("setKeyName called, but KeyLocator is not of type KeyLocator::KEYNAME"));
*reinterpret_cast<Name*> (m_data) = name;
}
}