const std::string& VariantImpl::getString() const { switch(type) { case VAR_STRING: return *reinterpret_cast<std::string*>(value.v); default: throw InvalidConversion(QPID_MSG("Variant is not a string; use asString() if conversion is required.")); } }
const Variant::Map& VariantImpl::asMap() const { switch(type) { case VAR_MAP: return *reinterpret_cast<Variant::Map*>(value.v); default: throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_MAP))); } }
Variant::List& VariantImpl::asList() { switch(type) { case VAR_LIST: return *reinterpret_cast<Variant::List*>(value.v); default: throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_LIST))); } }
int EMailImapService::toInt(std::string s) { std::stringstream ss(s); int ret; ss >> ret; if (ss.rdbuf()->in_avail() == 0) return ret; else throw InvalidConversion("Invalid integer " + s + "."); }
float VariantImpl::asFloat() const { switch(type) { case VAR_FLOAT: return value.f; case VAR_STRING: return convertFromString<float>(); default: throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_FLOAT))); } }
int8_t VariantImpl::asInt8() const { switch(type) { case VAR_INT8: return value.i8; case VAR_STRING: return convertFromString<int8_t>(); default: throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_INT8))); } }
double VariantImpl::asDouble() const { switch(type) { case VAR_FLOAT: return value.f; case VAR_DOUBLE: return value.d; case VAR_STRING: return convertFromString<double>(); default: throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_DOUBLE))); } }
uint16_t VariantImpl::asUint16() const { switch(type) { case VAR_UINT8: return value.ui8; case VAR_UINT16: return value.ui16; case VAR_STRING: return convertFromString<uint16_t>(); default: throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_UINT16))); } }
template<class T> T convertFromString() const { std::string* s = reinterpret_cast<std::string*>(value.v); try { return boost::lexical_cast<T>(*s); } catch(const boost::bad_lexical_cast&) { throw InvalidConversion(QPID_MSG("Cannot convert " << *s)); } }
void EMailImapService::addEIDList(dtn::data::Block &block, vmime::utility::ref<const vmime::attachment> &attachment) { std::vector<vmime::ref<vmime::headerField> > eidFiels = attachment->getHeader().constCast<vmime::header>()->findAllFields("Block-EID-Reference"); try { for(std::vector<vmime::ref<vmime::headerField> >::iterator it = eidFiels.begin(); it != eidFiels.end(); ++it) block.addEID(dtn::data::EID((*it)->getValue()->generate())); }catch(vmime::exceptions::no_such_field&) { throw InvalidConversion("Invalid EID field."); } }
dtn::data::BundleID EMailImapService::extractBID(const std::string &message) { try { dtn::data::BundleID ret; ret.source = searchString("Bundle-Source: ", message); ret.timestamp = toInt(searchString("Bundle-Creation-Time: ", message)); ret.sequencenumber = toInt(searchString("Bundle-Sequence-Number: ", message)); try { ret.fragmentoffset = toInt(searchString("Bundle-Fragment-Offset: ", message)); ret.setFragment(true); }catch(...){} return ret; }catch(...) { throw InvalidConversion("No bundle ID was found"); } }
bool VariantImpl::asBool() const { switch(type) { case VAR_VOID: return false; case VAR_BOOL: return value.b; case VAR_UINT8: return value.ui8; case VAR_UINT16: return value.ui16; case VAR_UINT32: return value.ui32; case VAR_UINT64: return value.ui64; case VAR_INT8: return value.i8; case VAR_INT16: return value.i16; case VAR_INT32: return value.i32; case VAR_INT64: return value.i64; case VAR_STRING: return toBool(*reinterpret_cast<std::string*>(value.v)); default: throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_BOOL))); } }
std::string VariantImpl::asString() const { switch(type) { case VAR_VOID: return EMPTY; case VAR_BOOL: return value.b ? TRUE : FALSE; case VAR_UINT8: return boost::lexical_cast<std::string>((int) value.ui8); case VAR_UINT16: return boost::lexical_cast<std::string>(value.ui16); case VAR_UINT32: return boost::lexical_cast<std::string>(value.ui32); case VAR_UINT64: return boost::lexical_cast<std::string>(value.ui64); case VAR_INT8: return boost::lexical_cast<std::string>((int) value.i8); case VAR_INT16: return boost::lexical_cast<std::string>(value.i16); case VAR_INT32: return boost::lexical_cast<std::string>(value.i32); case VAR_INT64: return boost::lexical_cast<std::string>(value.i64); case VAR_DOUBLE: return boost::lexical_cast<std::string>(value.d); case VAR_FLOAT: return boost::lexical_cast<std::string>(value.f); case VAR_STRING: return *reinterpret_cast<std::string*>(value.v); case VAR_LIST: return toString(asList()); case VAR_MAP: return toString(asMap()); default: throw InvalidConversion(QPID_MSG("Cannot convert from " << getTypeName(type) << " to " << getTypeName(VAR_STRING))); } }