| /* ------------------------------------------------------------------ |
| * Copyright (C) 2008 PacketVideo |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
| * express or implied. |
| * See the License for the specific language governing permissions |
| * and limitations under the License. |
| * ------------------------------------------------------------------- |
| */ |
| |
| #ifndef RTSP_PARSER_H_ |
| #define RTSP_PARSER_H_ |
| |
| #include "rtsp_par_com_basic_ds.h" |
| #include "rtsp_par_com_message.h" |
| |
| class RTSPParser |
| { |
| private: |
| |
| RTSPParser(const RTSPParser &); |
| RTSPParser & operator= (const RTSPParser &); |
| |
| public: |
| |
| typedef enum |
| { |
| IS_WAITING_FOR_REQUEST_MEMORY, |
| IS_LOOKING_FOR_END_OF_REQUEST, |
| IS_WAITING_FOR_DATA, |
| IS_REQUEST_IS_READY, |
| IS_WAITING_FOR_ENTITY_BODY_MEMORY, |
| IS_ERROR_REQUEST_TOO_BIG, |
| IS_SKIPPING_OVER_ENTITY_BODY, |
| IS_STARTING_TO_FILL_OUT_ENTITY_BODY, |
| IS_CONTINUING_TO_FILL_OUT_ENTITY_BODY, |
| IS_ENTITY_BODY_IS_READY, |
| IS_INTERNAL_ERROR, |
| IS_START_LOOKING_FOR_RESYNC, |
| IS_LOOKING_FOR_RESYNC, |
| IS_WAITING_FOR_EMBEDDED_DATA_MEMORY, |
| IS_EMBEDDED_DATA_IS_READY, |
| IS_SKIPPING_OVER_EMBEDDED_DATA, |
| IS_STARTING_TO_FILL_OUT_EMBEDDED_DATA, |
| IS_CONTINUING_TO_FILL_OUT_EMBEDDED_DATA |
| |
| |
| } InternalState; |
| |
| typedef enum |
| { |
| WAITING_FOR_DATA, |
| WAITING_FOR_REQUEST_MEMORY, |
| REQUEST_IS_READY, |
| WAITING_FOR_ENTITY_BODY_MEMORY, |
| ENTITY_BODY_IS_READY, |
| ERROR_REQUEST_TOO_BIG, |
| WAITING_FOR_EMBEDDED_DATA_MEMORY, |
| EMBEDDED_DATA_IS_READY, |
| INTERNAL_ERROR |
| } ParserState; |
| |
| |
| OSCL_IMPORT_REF RTSPParser(); |
| |
| protected: |
| |
| InternalState internalState; |
| |
| char mainBuffer[ RTSP_PARSER_BUFFER_SIZE + 3 ]; |
| char * mainBufferEntry; |
| char * mainBufferSpace; |
| int mainBufferSizeUsed; |
| |
| RTSPIncomingMessage * requestStruct; |
| |
| StrPtrLen dataBufferSpec; |
| |
| uint32 ebFullSizeExpected; |
| uint32 ebSizeCoveredSoFar; |
| uint32 ebCurrentIndex; |
| uint32 ebCurrentOffset; |
| OsclMemoryFragment * entityBody; |
| |
| char * eorptr; |
| |
| |
| // for field repetitions |
| // |
| StrPtrLen fields[ RTSP_HUGE_NUMBER_OF_FIELDS_IN_PARSER ]; |
| uint32 numFieldsUsed; |
| |
| void continueProcessing(); |
| void lookForEndOfRequest(); |
| void lookForResync(); |
| void skipOverEntityBody(); |
| void startFillingOutEntityBody(); |
| void dealWithLineContinuations(RTSPIncomingMessage *); |
| void dealWithFieldRepetitions(RTSPIncomingMessage *); |
| void skipOverEmbeddedData(); |
| void startFillingOutEmbeddedData(); |
| |
| public: |
| |
| |
| ParserState |
| OSCL_IMPORT_REF getState(); |
| |
| |
| // to get the address and size of data |
| // to be written to Parser's raw buffer |
| // |
| OSCL_IMPORT_REF const StrPtrLen * |
| getDataBufferSpec(); |
| |
| // to register that data buffer has been |
| // written |
| // |
| OSCL_IMPORT_REF bool |
| registerDataBufferWritten(uint32 sizeWritten); |
| |
| // to register the RTSPIncomingMessage structure to |
| // be filled out |
| // |
| OSCL_IMPORT_REF bool |
| registerNewRequestStruct(RTSPIncomingMessage * newRequestStruct); |
| |
| // to register the RTSPEntityBody buffer |
| // that the entity body should be written into |
| // |
| OSCL_IMPORT_REF bool |
| registerEntityBody(RTSPEntityBody * newBody); |
| |
| // to register the RTSPEntityBody buffer |
| // that the embedded data should be written into |
| // |
| OSCL_IMPORT_REF bool |
| registerEmbeddedDataMemory(RTSPEntityBody * newBody); |
| |
| // to flush the currently available information // and make a request out of |
| // whatever was |
| // available |
| OSCL_IMPORT_REF void flush(void); |
| OSCL_IMPORT_REF bool parseEntityBody(RTSPEntityBody * entityBody); |
| }; |
| |
| |
| #endif // RTSP_PARSER_H_ |