Пример #1
0
bool Packet::deserialize(ByteArray& buffer)
{
    _header = 0;
    _id = 0;
    _lengthType = 0;
    _length = 0;
    _data.clear();

    BinaryReader reader(buffer);
    uint countReadedBytes = 0;

    if (reader.bytesAvailable() < sizeof(_header))
    {
        return false;
    }

    _header = reader.readUShort();
    _id = getMessageId(_header);
    _lengthType = getMessageLengthType(_header);
    countReadedBytes += sizeof(_header);

    if (reader.bytesAvailable() < _lengthType)
    {
        return false;
    }

    _length = getMessageLength(_lengthType, reader);
    countReadedBytes += _lengthType;

    if (reader.bytesAvailable() < _length)
    {
        return false;
    }

    _data = reader.readBytes(_length);
    countReadedBytes += _length;

    buffer.erase(buffer.begin(), buffer.begin() + countReadedBytes);

    return true;
}
shared_ptr<PfileHeader>PfileHeaderReader::ReadHeader(
  rmscrypto::api::SharedStream stream,
  uint32_t                     majorVersion,
  uint32_t                     minorVersion,
  const string               & cleartextRedirectionHeader)
{
  uint32_t headerSize;
  uint32_t extensionOffset = 0;
  uint32_t extensionLength = 0;
  uint32_t plOffset        = 0;
  uint32_t plLength        = 0;
  uint32_t contentOffset   = 0;

  stream->Read(reinterpret_cast<uint8_t *>(&headerSize),      sizeof(uint32_t));
  stream->Read(reinterpret_cast<uint8_t *>(&extensionOffset), sizeof(uint32_t));
  stream->Read(reinterpret_cast<uint8_t *>(&extensionLength), sizeof(uint32_t));
  stream->Read(reinterpret_cast<uint8_t *>(&plOffset),        sizeof(uint32_t));
  stream->Read(reinterpret_cast<uint8_t *>(&plLength),        sizeof(uint32_t));
  stream->Read(reinterpret_cast<uint8_t *>(&contentOffset),   sizeof(uint32_t));

  uint32_t endOfHeader      = plOffset + plLength;
  uint64_t originalFileSize = 0;
  uint32_t metadataOffset   = 0;
  uint32_t metadataLength   = 0;

  ByteArray metadata;
  ByteArray publishingLicense;

  if ((majorVersion >= 2) && (minorVersion >= 1))
  {
    stream->Read(reinterpret_cast<uint8_t *>(&originalFileSize),
                 sizeof(uint64_t));
    stream->Read(reinterpret_cast<uint8_t *>(&metadataOffset),
                 sizeof(uint32_t));
    stream->Read(reinterpret_cast<uint8_t *>(&metadataLength),
                 sizeof(uint32_t));
    endOfHeader = metadataOffset + metadataLength;
  }

  if (contentOffset < endOfHeader) {
    throw exceptions::RMSPFileException("Bad content offset",
                                        exceptions::RMSPFileException::BadArguments);
  }

  string extension = ReadExtension(stream, extensionOffset, extensionLength);

  ReadAtOffset(publishingLicense, stream, plOffset, plLength);

  // remove UTF-8 BOM
  if ((publishingLicense.size() > 3) &&
      (memcmp(publishingLicense.data(), "\xEF\xBB\xBF", 3) == 0)) {
    publishingLicense.erase(publishingLicense.begin(),
                            publishingLicense.begin() + 3);
  }

  if ((majorVersion == 2) && (minorVersion == 1))
  {
    ReadAtOffset(metadata, stream, metadataOffset, metadataLength);
  }
  return make_shared<PfileHeader>(move(publishingLicense), extension,
                                  contentOffset, originalFileSize,
                                  move(metadata), majorVersion, minorVersion,
                                  cleartextRedirectionHeader);
}