/* */ #ifndef D_BENCODE_PARSER_H #define D_BENCODE_PARSER_H #include "common.h" #include namespace aria2 { class StructParserStateMachine; namespace bittorrent { enum BencodeError { ERR_UNEXPECTED_CHAR_BEFORE_VAL = -1, ERR_INVALID_NUMBER = -2, ERR_NUMBER_OUT_OF_RANGE = -3, ERR_PREMATURE_DATA = -4, ERR_STRUCTURE_TOO_DEEP = -5, ERR_INVALID_STRING_LENGTH = -6, ERR_STRING_LENGTH_OUT_OF_RANGE = -7, ERR_INVALID_FLOAT_NUMBER = -8, }; class BencodeParser { public: BencodeParser(StructParserStateMachine* psm); ~BencodeParser(); // Parses |size| bytes of data |data| and returns the number of // bytes processed. On error, one of the negative error codes is // returned. ssize_t parseUpdate(const char* data, size_t size); // Parses |size| bytes of data |data| and returns the number of // bytes processed. On error, one of the negative error codes is // returned. Call this function to signal the parser that this is // the last piece of data. This function does NOT reset the internal // state. ssize_t parseFinal(const char* data, size_t size); // Resets the internal state of the parser and makes it ready for // reuse. void reset(); private: int pushState(int state); int stateTop() const; int popState(); void runBeginCallback(int elementType); void runEndCallback(int elementType); void runCharactersCallback(const char* data, size_t len); void runNumberCallback(int64_t number); void onStringEnd(); void onNumberEnd(); void onDictEnd(); void onListEnd(); void onValueEnd(); StructParserStateMachine* psm_; std::stack stateStack_; int currentState_; int64_t strLength_; int numberSign_; int64_t number_; size_t numConsumed_; int lastError_; }; } // namespace bittorrent } // namespace aria2 #endif // D_BENCODE_PARSER_H