/*! \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; }
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; }
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()); }
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; }