• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 #ifndef PVMF_PROTOCOLENGINE_COMMON_H_INCLUDED
19 #define PVMF_PROTOCOLENGINE_COMMON_H_INCLUDED
20 
21 #include "pvmf_protocol_engine_internal.h"
22 
23 #define DATAPATHLOGGER_TAG "protocolenginenode.protocolengine"
24 #define DATAPATHERRLOGGER_TAG "datapath.sourcenode.protocolenginenode"
25 
26 class UserCommands
27 {
28     public:
~UserCommands()29         virtual ~UserCommands() {}
30 
31         // aSeekPosition can be time-based (in MS HTTP streaming) or byte-based (in progressive streaming
32         virtual void seek(const uint32 aSeekPosition) = 0;
33         virtual void stop(const bool isAfterEOS = false) = 0;
34         virtual void pause(const bool isFirstCallInPause = true) = 0;
35         virtual void resume() = 0;
36         virtual void sendRequest() = 0;
37         virtual void gotoNextState() = 0;
38         virtual void bitstreamSwitch() = 0;
39 };
40 
41 // Any http-based protocol(progressive download, fasttrack, ms http streaming and real http cloaking)
42 // can be viewed as a http request-response sequence, which can be addressed by GoF state pattern, i.e. ProtocolState class
43 // And protocol variances can be abstracted and hidden by using a common interface class, HttpBasedProtocol
44 // HttpBasedProtocol serves as the context of state class, and also provides the APIs for protocol user.
45 
46 enum ProtocolEngineOutputDataType
47 {
48     ProtocolEngineOutputDataType_HttpHeader = 0,
49     ProtocolEngineOutputDataType_FirstDataPacket,
50     ProtocolEngineOutputDataType_NormalData
51 };
52 
53 struct ProtocolEngineOutputDataSideInfo
54 {
55     ProtocolEngineOutputDataType iDataType;
56     // for OutputDataType_FirstDataPacket,  iData = iFirstPacketNumber
57     // for OutputDataType_NormalData,       iData = iCurrentDataStreamOffset (for fasttrack) / iCurrPacketNum (for http streaming)
58     OsclAny *iData;
59 
60     // constructors
ProtocolEngineOutputDataSideInfoProtocolEngineOutputDataSideInfo61     ProtocolEngineOutputDataSideInfo() : iDataType(ProtocolEngineOutputDataType_HttpHeader), iData(0)
62     {
63         ;
64     }
ProtocolEngineOutputDataSideInfoProtocolEngineOutputDataSideInfo65     ProtocolEngineOutputDataSideInfo(const ProtocolEngineOutputDataType aType, OsclAny *aData) :
66             iDataType(aType), iData(aData)
67     {
68         ;
69     }
70 
71     void set(const ProtocolEngineOutputDataType aDataType, const OsclAny *aData = 0)
72     {
73         iDataType = (ProtocolEngineOutputDataType)aDataType;
74         iData = (OsclAny *)aData;
75     }
76 };
77 
78 struct ProtocolEngineOutputDataSideInfoForFasttrack
79 {
80     uint32 iCurrDataStreamOffset;
81     uint32 iCurrPlaybackTime;
82 
ProtocolEngineOutputDataSideInfoForFasttrackProtocolEngineOutputDataSideInfoForFasttrack83     ProtocolEngineOutputDataSideInfoForFasttrack() :
84             iCurrDataStreamOffset(0), iCurrPlaybackTime(0) {}
85 };
86 
87 
88 enum ProtocolRequestType
89 {
90     ProtocolRequestType_Normaldata = 0,
91     ProtocolRequestType_Logging
92 };
93 
94 struct ProtocolStateCompleteInfo
95 {
96     bool isDownloadStreamingDone;  // true => current state complete means download or streaming is done/complete
97     bool isWholeSessionDone;         // true => current state is the last state of the state transition table
98     bool isEOSAchieved;              // true => EOS packet is received in streaming, or download reaches EOS (content-length, server discconnect or maximum file size)
99     // for protocol engine side, isDownloadStreamingDone=true <=> isEOSAchieved=true, but node will use this structure for other
100     // purposes, e.g. this flag can be used to differentiate stop case and true EOS case
101     // constructors
ProtocolStateCompleteInfoProtocolStateCompleteInfo102     ProtocolStateCompleteInfo()
103     {
104         clear();
105     }
ProtocolStateCompleteInfoProtocolStateCompleteInfo106     ProtocolStateCompleteInfo(const ProtocolStateCompleteInfo &x)
107     {
108         isDownloadStreamingDone = x.isDownloadStreamingDone;
109         isWholeSessionDone      = x.isWholeSessionDone;
110         isEOSAchieved           = x.isEOSAchieved;
111     }
ProtocolStateCompleteInfoProtocolStateCompleteInfo112     ProtocolStateCompleteInfo(const bool aDownloadStreamingDone, const bool aSessionDone, const bool aEOSAchieved) :
113             isDownloadStreamingDone(aDownloadStreamingDone),
114             isWholeSessionDone(aSessionDone),
115             isEOSAchieved(aEOSAchieved)
116     {
117         ;
118     }
119 
120     // assignment operator
121     ProtocolStateCompleteInfo& operator=(const ProtocolStateCompleteInfo& x)
122     {
123         isDownloadStreamingDone = x.isDownloadStreamingDone;
124         isWholeSessionDone      = x.isWholeSessionDone;
125         isEOSAchieved           = x.isEOSAchieved;
126         return *this;
127     }
128 
129     // clear
clearProtocolStateCompleteInfo130     void clear()
131     {
132         isDownloadStreamingDone = false;
133         isWholeSessionDone      = false;
134         isEOSAchieved           = false;
135     }
136 };
137 
138 
139 // This observer class is designed to notify state user (specifically, protocol) when one protocol state is completely finished, i.e.
140 // one http request-response is completely done or parsing response is completely done. Then user may change to next protocol state
141 class ProtocolStateObserver
142 {
143     public:
~ProtocolStateObserver()144         virtual ~ProtocolStateObserver() {}
145 
146         virtual void ProtocolStateComplete(const ProtocolStateCompleteInfo &aInfo) = 0;
147         virtual void OutputDataAvailable(OUTPUT_DATA_QUEUE &aOutputQueue, ProtocolEngineOutputDataSideInfo& aSideInfo) = 0;
148         virtual void ProtocolStateError(int32 aErrorCode) = 0; // server response error or other internal fatal error
149         virtual bool GetBufferForRequest(PVMFSharedMediaDataPtr &aMediaData) = 0; // to contruct HTTP request
150         virtual void ProtocolRequestAvailable(uint32 aRequestType = ProtocolRequestType_Normaldata) = 0; // need to send to port
151 };
152 
153 // This class is based on state pattern, to encapsulate all state specific behavior.
154 class ProtocolState : public HttpParsingBasicObjectObserver,
155         public UserCommands
156 {
157     public:
158         // has base implementation, basically create a templete
159         OSCL_IMPORT_REF virtual int32 processMicroState(INPUT_DATA_QUEUE &aDataQueue);
160 
161         // protocol objects own these objects, observer, composer and parser
162         // need to pass these objects down to state objects
setObserver(ProtocolStateObserver * aObserver)163         void setObserver(ProtocolStateObserver *aObserver)
164         {
165             iObserver = aObserver;
166         }
setComposer(HTTPComposer * aComposer)167         void setComposer(HTTPComposer *aComposer)
168         {
169             iComposer = aComposer;
170         }
setParser(HttpParsingBasicObject * aParser)171         void setParser(HttpParsingBasicObject *aParser)
172         {
173             iParser = aParser;
174         }
175 
176         // set functions, will be delegated to ProtocolState to handle
177         // set config info for composing request
setURI(const INetURI & aUri)178         void setURI(const INetURI &aUri)
179         {
180             iURI = aUri;
181         }
setLoggingURI(const INetURI & aUri)182         virtual void setLoggingURI(const INetURI &aUri)
183         {
184             OSCL_UNUSED_ARG(aUri);
185         }
186         virtual void setConfigInfo(OsclAny* aConfigInfo) = 0;
187 
188         // get functions to expose the information that node needs
189         // The header could be http header, sdp or asf header
190         OSCL_IMPORT_REF virtual bool getHeader(Oscl_Vector<OsclRefCounterMemFrag, OsclMemAllocator> &aHeader) = 0;
getContentLength()191         virtual uint32 getContentLength()
192         {
193             return (iParser == NULL ? 0 : iParser->getContentLength());
194         }
getDownloadSize()195         virtual uint32 getDownloadSize()
196         {
197             return (iParser == NULL ? 0 : iParser->getDownloadSize());
198         }
getRemainingSize()199         virtual uint32 getRemainingSize()
200         {
201             if (iParser == NULL || iParser->getContentLength() == 0) return 0;
202             return iParser->getContentLength() - iParser->getDownloadSize();
203         }
204         OSCL_IMPORT_REF virtual uint32 getDownloadRate();
205         OSCL_IMPORT_REF uint32 getDownloadTimeForEstimation();
getResponseStatusCode()206         uint32 getResponseStatusCode()
207         {
208             return (iParser == NULL ? 0 : iParser->getStatusCode());
209         }
getRedirectURI(OSCL_String & aRedirectUri)210         bool getRedirectURI(OSCL_String &aRedirectUri)
211         {
212             return iParser->getRedirectURI(aRedirectUri);
213         }
getContentType(OSCL_String & aContentType)214         bool getContentType(OSCL_String &aContentType)
215         {
216             return iParser->getContentType(aContentType);
217         }
getAuthenInfo(OSCL_String & aRealm)218         bool getAuthenInfo(OSCL_String &aRealm)
219         {
220             return iParser->getAuthenInfo(aRealm);
221         }
isServerSupportBasicAuthentication()222         bool isServerSupportBasicAuthentication()
223         {
224             return iParser->isServerSupportBasicAuthentication();
225         }
isServerSendAuthenticationHeader()226         bool isServerSendAuthenticationHeader()
227         {
228             return iParser->isServerSendAuthenticationHeader();
229         }
getBasicPtr(const StrPtrLen aAuthenValue,uint32 & length)230         void getBasicPtr(const StrPtrLen aAuthenValue, uint32 &length)
231         {
232             iParser->getBasicPtr(aAuthenValue, length);
233         }
getRealmPtr(const char * & ptrRealm,uint32 & len,uint32 & length)234         void getRealmPtr(const char *&ptrRealm, uint32 &len, uint32 &length)
235         {
236             iParser->getRealmPtr(ptrRealm, len, length);
237         }
getCurrentPlaybackTime()238         virtual uint32 getCurrentPlaybackTime()
239         {
240             return 0;    // only used in fast track
241         }
getTimeoutInMs()242         virtual uint32 getTimeoutInMs()
243         {
244             return 0;    // ms http streaming only
245         }
getServerVersionNumber()246         virtual uint32 getServerVersionNumber()
247         {
248             return (iParser == NULL ? 0 : iParser->getServerVersionNumber());
249         }
prepare()250         virtual void prepare()
251         {
252             ;    // prepare for the new state, especially store data from the previous state, for the current state
253         }
isSendingNewRequest()254         bool isSendingNewRequest()
255         {
256             return (iProcessingState == EHttpProcessingMicroState_SendRequest);
257         }
isCurrentStateOptional()258         virtual bool isCurrentStateOptional()
259         {
260             return false;    // optional state can be by-passed regardless of any error happened
261         }
setLastState()262         virtual void setLastState()
263         {
264             ;
265         }
getMediaDataLength()266         virtual uint32 getMediaDataLength()
267         {
268             return 0;
269         }
getContenBitrate()270         virtual uint32 getContenBitrate()
271         {
272             return 0;
273         }
274 
275         // user commands
seek(const uint32 aSeekPosition)276         virtual void seek(const uint32 aSeekPosition)
277         {
278             OSCL_UNUSED_ARG(aSeekPosition);    // only used in ms http streaming for now
279         }
280         virtual void stop(const bool isAfterEOS = false)
281         {
282             OSCL_UNUSED_ARG(isAfterEOS);    // only used in ms http streaming for now
283         }
284         virtual void pause(const bool isFirstCallInPause = true)
285         {
286             OSCL_UNUSED_ARG(isFirstCallInPause);    // only used in ms http streaming for now
287         }
resume()288         virtual void resume()
289         {
290             ;    // only used in ms http streaming for now
291         }
sendRequest()292         virtual void sendRequest()
293         {
294             iProcessingState = EHttpProcessingMicroState_SendRequest;
295         }
bitstreamSwitch()296         virtual void bitstreamSwitch()
297         {
298             ;
299         }
gotoNextState()300         void gotoNextState()
301         {
302             ;
303         }
304 
305         // constructor
ProtocolState()306         ProtocolState() : iComposer(NULL),
307                 iParser(NULL),
308                 iProcessingState(EHttpProcessingMicroState_SendRequest),
309                 iObserver(NULL),
310                 iNeedGetResponsePreCheck(true)
311         {
312             iDataPathLogger = PVLogger::GetLoggerObject("datapath.sourcenode.protocolenginenode");
313         }
314 
~ProtocolState()315         virtual ~ProtocolState()
316         {
317             iComposer = NULL;
318             iParser   = NULL;
319             iObserver = NULL;
320             iDataPathLogger = NULL;
321         };
322 
reset()323         virtual void reset()
324         {
325             if (iComposer) iComposer->reset();
326             if (iParser) iParser->reset();
327             iNeedGetResponsePreCheck = true;
328         }
329 
330     protected:
331         // From HttpParsingBasicObjectObserver
OutputDataAvailable(OUTPUT_DATA_QUEUE * aOutputQueue,const bool isHttpHeader)332         virtual int32 OutputDataAvailable(OUTPUT_DATA_QUEUE *aOutputQueue, const bool isHttpHeader)
333         {
334             OSCL_UNUSED_ARG(aOutputQueue);
335             OSCL_UNUSED_ARG(isHttpHeader);
336             return PROCESS_SUCCESS;
337         }
338 
339         /////////////////////////////////////////////////////////////////////////////
340         /////// Following APIs are related composing and sending http request ///////
341         /////////////////////////////////////////////////////////////////////////////
342         // check all the info is ready for composing and sending a request
343         OSCL_IMPORT_REF virtual int32 processMicroStateSendRequestPreCheck();
344         OSCL_IMPORT_REF virtual int32 processMicroStateSendRequest();
345         int32 composeRequest(OsclMemoryFragment &aFrag);
346         // By default HTTP GET method, derived class may need to override this one
347         virtual void setRequestBasics() = 0;
348         // Each derived class needs to implement this one
349         virtual bool setHeaderFields() = 0;
350         // do final compose, fixed for all derived classes
351         OSCL_IMPORT_REF virtual int32 doCompose(OsclMemoryFragment &aFrag);
352         OSCL_IMPORT_REF bool setExtensionFields(Oscl_Vector<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> &aExtensionHeaderKeys,
353                                                 Oscl_Vector<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> &aExtensionHeaderValues,
354                                                 Oscl_Vector<uint32, OsclMemAllocator> &aMaskBitForHTTPMethod,
355                                                 Oscl_Vector<bool, OsclMemAllocator> &aExtensionHeadersPurgeOnRedirect,
356                                                 const HTTPMethod aMethod = HTTP_METHOD_GET);
getProtocolRequestType()357         virtual bool getProtocolRequestType()
358         {
359             return (uint32)ProtocolRequestType_Normaldata;
360         }
361 
362         // HTTP basic/digest authentication (RFC 2617)
363         OSCL_IMPORT_REF bool constructAuthenHeader(OSCL_String &aUserID, OSCL_String &aPasswd);
364 
365         /////////////////////////////////////////////////////////////////////////////
366         /////// Following APIs are related parsing http response ////////////////////
367         /////////////////////////////////////////////////////////////////////////////
368         // check all the info is ready for parsing a new response
369         OSCL_IMPORT_REF virtual int32 processMicroStateGetResponsePreCheck();
370         OSCL_IMPORT_REF virtual int32 processMicroStateGetResponse(INPUT_DATA_QUEUE &aDataQueue);
371         // shared routine for all the download protocols
372         OSCL_IMPORT_REF virtual int32 checkParsingStatus(int32 parsingStatus);
373 
isDownloadStreamingDoneState()374         virtual bool isDownloadStreamingDoneState()
375         {
376             return false;
377         }
isLastState()378         virtual bool isLastState()
379         {
380             return false;
381         }
382 
383     private:
384 
385         // factor processMicroState() into the following methods to prevent processMicroState() getting bloated
386         int32 doProcessMicroStateSendRequestPreCheck();
387         int32 doProcessMicroStateSendRequest();
388         int32 doProcessMicroStateGetResponsePreCheck();
389         int32 doProcessMicroStateGetResponse(INPUT_DATA_QUEUE &aDataQueue);
390 
391         // support setExtensionFields()
392         uint32 getBitMaskForHttpMethod(Oscl_Vector<uint32, OsclMemAllocator> &aMaskBitForHTTPMethod,
393                                        const HTTPMethod aMethod);
394         // called by checkParsingStatus()
395         int32 handleParsingSyntaxError();
396 
397         // called by constructAuthenHeader()
398         int32 base64enc(char *data, char *out);
399 
400     protected:
401         // http composer and parser should be life-time long, shouldn't be affected by state transition.
402         // So protocol object owns these two objects.
403         HTTPComposer *iComposer;
404         HttpParsingBasicObject *iParser; // wrap http parser to do parsing for each input media data
405         pvHttpProcessingMicroState iProcessingState;
406 
407         ProtocolStateObserver *iObserver;
408         INetURI iURI; // wrapper for url parsing
409         TimeValue iStartTime;
410         bool iNeedGetResponsePreCheck;
411         ProtocolEngineOutputDataSideInfo iDataSideInfo;
412         PVLogger *iDataPathLogger;
413 };
414 
415 // This observer class is designed to notify protocol user (specifically, node) when one protocol state is completely finished, i.e.
416 // one http request-response or parsing response is completely done. Then user may change to next protocol state
417 class ProtocolObserver
418 {
419     public:
~ProtocolObserver()420         virtual ~ProtocolObserver() {}
421 
422         virtual void ProtocolStateComplete(const ProtocolStateCompleteInfo &aInfo) = 0;
423         virtual void OutputDataAvailable(OUTPUT_DATA_QUEUE &aOutputQueue, ProtocolEngineOutputDataSideInfo &aSideInfo) = 0;
424         virtual void ProtocolStateError(int32 aErrorCode) = 0; // server response error or other internal fatal error
425         virtual bool GetBufferForRequest(PVMFSharedMediaDataPtr &aMediaData) = 0; // to contruct HTTP request
426         virtual void ProtocolRequestAvailable(uint32 aRequestType = ProtocolRequestType_Normaldata) = 0; // need to send to port
427 };
428 
429 // Any http-based protocol(progressive download, fasttrack, ms http streaming and real http cloaking)
430 // can be viewed as a http request-response sequence, which can be addressed by GoF state pattern
431 class HttpBasedProtocol : public ProtocolStateObserver,
432         public UserCommands
433 {
434     public:
435         // each http based protocol must implment this interface
runStateMachine(INPUT_DATA_QUEUE & aDataQueue)436         virtual int32 runStateMachine(INPUT_DATA_QUEUE &aDataQueue)
437         {
438             return iCurrState->processMicroState(aDataQueue);
439         }
440 
441         // From ProtocolStateObserver
ProtocolStateComplete(const ProtocolStateCompleteInfo & aInfo)442         virtual void ProtocolStateComplete(const ProtocolStateCompleteInfo &aInfo)
443         {
444             // change to the next protocol state and notify the user that data processing at the current state is completely done
445             if (iObserver) iObserver->ProtocolStateComplete(aInfo);
446             //if(isSuccess) iCurrState = getNextState();
447         }
OutputDataAvailable(OUTPUT_DATA_QUEUE & aOutputQueue,ProtocolEngineOutputDataSideInfo & aSideInfo)448         virtual void OutputDataAvailable(OUTPUT_DATA_QUEUE &aOutputQueue, ProtocolEngineOutputDataSideInfo &aSideInfo)
449         {
450             if (iObserver) iObserver->OutputDataAvailable(aOutputQueue, aSideInfo);
451         }
ProtocolStateError(int32 aErrorCode)452         virtual void ProtocolStateError(int32 aErrorCode)
453         {
454             if (iObserver) iObserver->ProtocolStateError(aErrorCode);
455         }
456 
GetBufferForRequest(PVMFSharedMediaDataPtr & aMediaData)457         virtual bool GetBufferForRequest(PVMFSharedMediaDataPtr &aMediaData)
458         {
459             return iObserver->GetBufferForRequest(aMediaData);
460         }
461 
462         virtual void ProtocolRequestAvailable(uint32 aRequestType = ProtocolRequestType_Normaldata)
463         {
464             if (iObserver) iObserver->ProtocolRequestAvailable(aRequestType);
465         }
466 
467         // initialize means passing protocol owned objects down to state objects
468         virtual void initialize() = 0;
469 
470         // user commands
471         void stop(const bool isAfterEOS = false)
472         {
473             iCurrState->stop(isAfterEOS);
474         }
seek(const uint32 aSeekPosition)475         virtual void seek(const uint32 aSeekPosition)
476         {
477             iCurrState->seek(aSeekPosition);
478         }
479         virtual void pause(const bool isFirstCallInPause = true)
480         {
481             iCurrState->pause(isFirstCallInPause);
482         }
resume()483         virtual void resume()
484         {
485             iCurrState->resume();
486         }
bitstreamSwitch()487         virtual void bitstreamSwitch()
488         {
489             iCurrState->bitstreamSwitch();
490         }
sendRequest()491         void sendRequest()
492         {
493             iCurrState->sendRequest();
494         }
gotoNextState()495         void gotoNextState()
496         {
497             iCurrState = getNextState();
498             iCurrState->prepare();
499             iCurrState->reset();
500             iCurrState->sendRequest();
501         }
502 
503 
504         // set protocol observer for protocol user
setObserver(ProtocolObserver * aObserver)505         void setObserver(ProtocolObserver *aObserver)
506         {
507             iObserver = aObserver;
508         }
509 
510         // set functions, will be delegated to ProtocolState to handle
setURI(const INetURI & aUri)511         void setURI(const INetURI &aUri)
512         {
513             iCurrState->setURI(aUri);
514             ProtocolState *state = NULL;
515             while ((state = getNextState()) != iCurrState) state->setURI(aUri); // set uri for all states
516         }
setLoggingURI(const INetURI & aUri)517         void setLoggingURI(const INetURI &aUri)
518         {
519             iCurrState->setLoggingURI(aUri);
520             ProtocolState *state = NULL;
521             while ((state = getNextState()) != iCurrState) state->setLoggingURI(aUri); // set uri for all states
522         }
setConfigInfo(OsclAny * aConfigInfo)523         virtual void setConfigInfo(OsclAny* aConfigInfo)
524         {
525             iCurrState->setConfigInfo(aConfigInfo);
526             ProtocolState *state = NULL;
527             while ((state = getNextState()) != iCurrState) state->setConfigInfo(aConfigInfo); // set config info for all states
528         }
529 
530         // get functions to expose the information that node needs
531         // The header could be http header, sdp or asf header
getHeader(Oscl_Vector<OsclRefCounterMemFrag,OsclMemAllocator> & aHeader)532         bool getHeader(Oscl_Vector<OsclRefCounterMemFrag, OsclMemAllocator> &aHeader)
533         {
534             return iCurrState->getHeader(aHeader);
535         }
getContentLength()536         uint32 getContentLength()
537         {
538             return iCurrState->getContentLength();
539         }
getDownloadSize()540         uint32 getDownloadSize()
541         {
542             return iCurrState->getDownloadSize();
543         }
getRemainingSize()544         uint32 getRemainingSize()
545         {
546             return iCurrState->getRemainingSize();
547         }
getDownloadRate()548         uint32 getDownloadRate()
549         {
550             return iCurrState->getDownloadRate();
551         }
getDownloadTimeForEstimation()552         uint32 getDownloadTimeForEstimation()
553         {
554             return iCurrState->getDownloadTimeForEstimation();
555         }
getResponseStatusCode()556         uint32 getResponseStatusCode()
557         {
558             return iCurrState->getResponseStatusCode();
559         }
getRedirectURI(OSCL_String & aRedirectUri)560         bool getRedirectURI(OSCL_String &aRedirectUri)
561         {
562             return iCurrState->getRedirectURI(aRedirectUri);
563         }
getContentType(OSCL_String & aContentType)564         bool getContentType(OSCL_String &aContentType)
565         {
566             return iCurrState->getContentType(aContentType);
567         }
getAuthenInfo(OSCL_String & aRealm)568         bool getAuthenInfo(OSCL_String &aRealm)
569         {
570             return iCurrState->getAuthenInfo(aRealm);
571         }
isServerSupportBasicAuthentication()572         bool isServerSupportBasicAuthentication()
573         {
574             return iParser->isServerSupportBasicAuthentication();
575         }
isServerSendAuthenticationHeader()576         bool isServerSendAuthenticationHeader()
577         {
578             return iParser->isServerSendAuthenticationHeader();
579         }
getBasicPtr(const StrPtrLen aAuthenValue,uint32 & length)580         void getBasicPtr(const StrPtrLen aAuthenValue, uint32 &length)
581         {
582             iParser->getBasicPtr(aAuthenValue, length);
583         }
getRealmPtr(const char * & ptrRealm,uint32 & len,uint32 & length)584         void getRealmPtr(const char *&ptrRealm, uint32 &len, uint32 &length)
585         {
586             iParser->getRealmPtr(ptrRealm, len, length);
587         }
getCurrentPlaybackTime()588         uint32 getCurrentPlaybackTime()
589         {
590             return iCurrState->getCurrentPlaybackTime();    // only used in fast track
591         }
getTimeoutInMs()592         uint32 getTimeoutInMs()
593         {
594             return iCurrState->getTimeoutInMs();    // only used in ms http streaming
595         }
getServerVersionNum()596         uint32 getServerVersionNum()
597         {
598             return iCurrState->getServerVersionNumber();
599         }
isSendingNewRequest()600         bool isSendingNewRequest()
601         {
602             return iCurrState->isSendingNewRequest();
603         }
isCurrentStateOptional()604         bool isCurrentStateOptional()
605         {
606             return iCurrState->isCurrentStateOptional();    // optional state can be by-passed regardless of any error happened
607         }
getMediaDataLength()608         uint32 getMediaDataLength()
609         {
610             return iCurrState->getMediaDataLength();    // only used in Shoutcast streaming
611         }
getContenBitrate()612         uint32 getContenBitrate()
613         {
614             return iCurrState->getContenBitrate();    // only used in Shoutcast streaming
615         }
616 
resetTotalHttpStreamingSize()617         void resetTotalHttpStreamingSize()
618         {
619             if (iParser) iParser->resetTotalHttpStreamingSize();
620         }
621 
reset()622         virtual void reset()
623         {
624             if (iParser) iParser->resetForBadConnectionDetection();
625             iCurrState->reset();
626         }
627 
628         // constructor
HttpBasedProtocol()629         HttpBasedProtocol() : iCurrState(NULL),
630                 iObserver(NULL),
631                 iComposer(NULL),
632                 iParser(NULL)
633         {
634             ;
635         }
636 
~HttpBasedProtocol()637         virtual ~HttpBasedProtocol()
638         {
639             ;
640         }
641 
642     protected:
643         virtual ProtocolState* getNextState() = 0;
644 
645     protected:
646         ProtocolState *iCurrState;
647         ProtocolObserver *iObserver;
648         HTTPComposer *iComposer;
649         HttpParsingBasicObject *iParser; // wrap http parser to do parsing for each input media data
650 };
651 
652 #endif // PVMF_PROTOCOLENGINE_H_INCLUDED
653 
654