void Data::wireDecode(const Blob& input, WireFormat& wireFormat) { size_t signedPortionBeginOffset, signedPortionEndOffset; wireFormat.decodeData(*this, input.buf(), input.size(), &signedPortionBeginOffset, &signedPortionEndOffset); if (&wireFormat == WireFormat::getDefaultWireFormat()) // This is the default wire encoding. // Take a pointer to the input Blob without copying. setDefaultWireEncoding (SignedBlob(input, signedPortionBeginOffset, signedPortionEndOffset), WireFormat::getDefaultWireFormat()); else setDefaultWireEncoding(SignedBlob(), 0); }
/** * Return a reference to the defaultWireEncoding, which was encoded with * getDefaultWireEncodingFormat(). The SignedBlob may have a null pointer. */ const SignedBlob& getDefaultWireEncoding() const { if (getDefaultWireEncodingChangeCount_ != getChangeCount()) { // The values have changed, so the default wire encoding is invalidated. // This method can be called on a const object, but we want to be able to update the default cached value. const_cast<Data*>(this)->defaultWireEncoding_ = SignedBlob(); const_cast<Data*>(this)->defaultWireEncodingFormat_ = 0; const_cast<Data*>(this)->getDefaultWireEncodingChangeCount_ = getChangeCount(); } return defaultWireEncoding_; }
SignedBlob Data::wireEncode(WireFormat& wireFormat) const { if (getDefaultWireEncoding() && getDefaultWireEncodingFormat() == &wireFormat) // We already have an encoding in the desired format. return getDefaultWireEncoding(); size_t signedPortionBeginOffset, signedPortionEndOffset; Blob encoding = wireFormat.encodeData(*this, &signedPortionBeginOffset, &signedPortionEndOffset); SignedBlob wireEncoding = SignedBlob(encoding, signedPortionBeginOffset, signedPortionEndOffset); if (&wireFormat == WireFormat::getDefaultWireFormat()) // This is the default wire encoding. const_cast<Data*>(this)->setDefaultWireEncoding (wireEncoding, WireFormat::getDefaultWireFormat()); return wireEncoding; }