示例#1
0
文件: EbmlMaster.cpp 项目: ares89/vlc
/*!
	\todo handle exception on errors
	\todo write all the Mandatory elements in the Context, otherwise assert
*/
filepos_t EbmlMaster::RenderData(IOCallback & output, bool bForceRender, bool bWithDefault)
{
	filepos_t Result = 0;
	size_t Index;

	if (!bForceRender) {
		assert(CheckMandatory());
	}

	if (!bChecksumUsed) { // old school
		for (Index = 0; Index < ElementList.size(); Index++) {
			if (!bWithDefault && (ElementList[Index])->IsDefaultValue())
				continue;
			Result += (ElementList[Index])->Render(output, bWithDefault, false ,bForceRender);
		}
	} else { // new school
		MemIOCallback TmpBuf(GetSize() - 6);
		for (Index = 0; Index < ElementList.size(); Index++) {
			if (!bWithDefault && (ElementList[Index])->IsDefaultValue())
				continue;
			(ElementList[Index])->Render(TmpBuf, bWithDefault, false ,bForceRender);
		}
		Checksum.FillCRC32(TmpBuf.GetDataBuffer(), TmpBuf.GetDataBufferSize());
		Result += Checksum.Render(output, true, false ,bForceRender);
		output.writeFully(TmpBuf.GetDataBuffer(), TmpBuf.GetDataBufferSize());
		Result += TmpBuf.GetDataBufferSize();
	}

	return Result;
}
示例#2
0
    virtual bool Process(volatile const bool *isRun)
    {
      SocketHandle Sock = GetHandle();
      std::vector<char> Buffer;
      while (*isRun)
      {
        fd_set RDSet = { 0 };
        FD_ZERO(&RDSet);
        FD_SET(Sock, &RDSet);
        fd_set RDErr = { 0 };
        FD_ZERO(&RDErr);
        FD_SET(Sock, &RDErr);
        timeval TV = { 0 };
        TV.tv_sec = SelectTimeout / 1000;
        TV.tv_usec = SelectTimeout % 1000;
        int Ret = ::select(static_cast<int>(Sock + 1), &RDSet, 0, &RDErr, &TV);
        if (Ret < 0)
        {
          OpenFlag = false;
          break;
        }
        if (!Ret)
        {
          if (!Buffer.empty())
            OpenFlag = Receiver->OnData(&Buffer[0], static_cast<unsigned>(Buffer.size()));
          return OpenFlag;
        }
        if (!FD_ISSET(Sock, &RDSet) || FD_ISSET(Sock, &RDErr))
        {
          OpenFlag = false;
          return false;
        }
        const int BufSize = 4096;
				std::vector<char> TmpBuf(BufSize, 0);
        int RecvBytes = ::recv(Sock, &TmpBuf[0], static_cast<int>(TmpBuf.size()), 0);
        if (RecvBytes <= 0)
        {
          OpenFlag = false;
          return false;
        }
        for (int i = 0 ; i < RecvBytes ; ++i)
          Buffer.push_back(TmpBuf[i]);
      }
      if (!*isRun)
      {
        OpenFlag = false;
        return false;
      }
      if (!OpenFlag)
        return false;
      if (!Buffer.empty())
        OpenFlag = Receiver->OnData(&Buffer[0], static_cast<unsigned>(Buffer.size()));
      return OpenFlag;
    }
示例#3
0
文件: EbmlMaster.cpp 项目: ares89/vlc
bool EbmlMaster::VerifyChecksum() const
{
	if (!bChecksumUsed)
		return true;

	EbmlCrc32 aChecksum;
	/// \todo remove the Checksum if it's in the list
	/// \todo find another way when not all default values are saved or (unknown from the reader !!!)
	MemIOCallback TmpBuf(GetSize() - 6);
	for (size_t Index = 0; Index < ElementList.size(); Index++) {
		(ElementList[Index])->Render(TmpBuf, true, false, true);
	}
	aChecksum.FillCRC32(TmpBuf.GetDataBuffer(), TmpBuf.GetDataBufferSize());
	return (aChecksum.GetCrc32() == Checksum.GetCrc32());
}
示例#4
0
  TCPClient::BufPtr TCPClient::Recv(unsigned long timeout)
  {
    SocketHandle Sock = GetHandle();
    BufPtr Buffer(new std::vector<char>);
    while (Buffer->empty())
    {
      fd_set RDSet = { 0 };
      FD_ZERO(&RDSet);
      FD_SET(Sock, &RDSet);
      fd_set RDErr = { 0 };
      FD_ZERO(&RDErr);
      FD_SET(Sock, &RDErr);
      timeval TV = { 0 };
      TV.tv_sec = timeout / 1000;
      TV.tv_usec = timeout % 1000;
      int Ret = ::select(static_cast<int>(Sock + 1), &RDSet, 0, &RDErr, &TV);
      if (Ret < 0)
      {
        Disconnect();
        throw TCPClientException("Error receive data");
      }
      if (!Ret)
      {
        if (!Buffer->empty())
          return Buffer;
        return BufPtr(0);
      }
      if (!FD_ISSET(Sock, &RDSet) || FD_ISSET(Sock, &RDErr))
      {
        Disconnect();
        throw TCPClientException("Error receive data");
      }
      const int BufSize = 4096;
			std::vector<char> TmpBuf(BufSize, 0);
      int RecvBytes = ::recv(Sock, &TmpBuf[0], static_cast<int>(TmpBuf.size()), 0);
      if (RecvBytes <= 0)
      {
        Disconnect();
        throw TCPClientException("Error receive data");
      }
      for (int i = 0 ; i < RecvBytes ; ++i)
        Buffer->push_back(TmpBuf[i]);
    }
    return Buffer;
  }