• 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 HTTP_PARCOM_INTERNAL_H_
19 #define HTTP_PARCOM_INTERNAL_H_
20 
21 #ifndef OSCL_REFCOUNTER_MEMFRAG_H_INCLUDED
22 #include "oscl_refcounter_memfrag.h"
23 #endif
24 
25 
26 ///////////////////////////////////////////////////////////////////////////////////////
27 const char HTTP_CHAR_CR      = 13;
28 const char HTTP_CHAR_LF      = 10;
29 const char HTTP_CHAR_NULL    = 0;
30 const char HTTP_CHAR_COLON   = ':';
31 const char HTTP_CHAR_DOLLAR  = '$';
32 const char HTTP_CHAR_SPACE   = ' ';
33 const char HTTP_CHAR_SLASH   = '/';
34 const char HTTP_CHAR_SEMICOLON = ';';
35 const char HTTP_CHAR_STAR    = '*';
36 const char HTTP_CHAR_PLUS    = '+';
37 const char HTTP_CHAR_MINUS   = '-';
38 const char HTTP_CHAR_DOT     = '.';
39 const char HTTP_CHAR_TAB     = '\t';
40 const char HTTP_CHAR_COMMA   = ',';
41 const char HTTP_CHAR_EQUAL   = '=';
42 
43 
44 //An array of strings corresponding to HTTPMethod enum
45 static const char* const HTTPMethodString[] =
46 {
47     "GET",      //METHOD_GET
48     "HEAD",     //METHOD_HEAD
49     "POST",     //METHOD_POST
50     "DELETE",   //METHOD_DELETE
51     "LINK",     //METHOD_LINK
52     "UNLINK",   //METHOD_UNLINK
53     "OPTIONS",  //METHOD_OPTIONS
54     "PUT",      //METHOD_PUT
55     "TRACE",    //METHOD_TRACE
56     "CONNECT",  //METHOD_CONNECT
57 };
58 
59 // The following structure is an extension of OsclMemoryFragment with a differentation between memory usage and memory capacity
60 struct HTTPMemoryFragment
61 {
62     void *iPtr;
63     uint32 iLen; // refer to the memory usage, initially (no memory use), len=0
64     uint32 iCapacity;
65 
66     // constructor
HTTPMemoryFragmentHTTPMemoryFragment67     HTTPMemoryFragment()
68     {
69         clear();
70     }
71 
72     // copy constructor
HTTPMemoryFragmentHTTPMemoryFragment73     HTTPMemoryFragment(const void *aPtr, const uint32 aCapacity) : iPtr((void *)aPtr), iLen(0), iCapacity(aCapacity)
74     {
75         ;
76     }
77 
78     // copy constructor
HTTPMemoryFragmentHTTPMemoryFragment79     HTTPMemoryFragment(const OsclMemoryFragment &x)
80     {
81         iPtr = x.ptr;
82         iLen = 0;
83         iCapacity = x.len;
84     }
85 
86     // operator "="
87     HTTPMemoryFragment& operator=(const HTTPMemoryFragment& rhs)
88     {
89         iPtr = rhs.iPtr;
90         iLen = rhs.iLen;
91         iCapacity = rhs.iCapacity;
92         return *this;
93     }
94 
95     // operator "="
96     HTTPMemoryFragment& operator=(const OsclMemoryFragment& rhs)
97     {
98         iPtr = rhs.ptr;
99         iLen = 0;
100         iCapacity = rhs.len;
101         return *this;
102     }
103 
104     // destructor
~HTTPMemoryFragmentHTTPMemoryFragment105     ~HTTPMemoryFragment()
106     {
107         clear();
108     }
109 
110     // clear
clearHTTPMemoryFragment111     void clear()
112     {
113         oscl_memset(this, 0, sizeof(HTTPMemoryFragment));
114     }
115 
116     // bind
bindHTTPMemoryFragment117     void bind(const void *aPtr, const uint32 aCapacity)
118     {
119         iPtr = (void *)aPtr;
120         iLen = 0;
121         iCapacity = aCapacity;
122     }
123 
bindHTTPMemoryFragment124     void bind(const OsclMemoryFragment &x)
125     {
126         iPtr = x.ptr;
127         iLen = 0;
128         iCapacity = x.len;
129     }
130 
131     // empty
emptyHTTPMemoryFragment132     bool empty()
133     {
134         return ((uint8 *)iPtr == NULL || (iCapacity == 0));
135     }
136 
137     // get functions
getPtrHTTPMemoryFragment138     void *getPtr()
139     {
140         return (void *)((uint8 *)iPtr + iLen);
141     }
getLenHTTPMemoryFragment142     uint32 getLen() const
143     {
144         return iLen;
145     }
getCapacityHTTPMemoryFragment146     uint32 getCapacity()
147     {
148         return iCapacity;
149     }
getAvailableSpaceHTTPMemoryFragment150     uint32 getAvailableSpace()
151     {
152         return iCapacity - iLen;
153     }
154 
155     // update length
updateHTTPMemoryFragment156     bool update(const uint32 aLength)
157     {
158         if (isSpaceEnough(aLength))
159         {
160             iLen += aLength;
161             return true;
162         }
163         return false;
164     }
165 
updateHTTPMemoryFragment166     bool update(const void *aPtr)
167     {
168         int32 aLen = (uint8*)aPtr - (uint8*)iPtr;
169         if (aLen < 0 || (uint32)aLen > iCapacity) return false;
170         iLen = aLen;
171         return true;
172     }
173 
174     // is remaining space enough for the new memory usage
isSpaceEnoughHTTPMemoryFragment175     bool isSpaceEnough(uint32 aNewUsage)
176     {
177         return (iLen + aNewUsage <= iCapacity);
178     }
179 };
180 
181 // wrap OsclMemoryFragment and add more functionalities
182 struct OsclMemoryFragWrapper
183 {
184     OsclMemoryFragment iMemFrag;
185 
186     // constructor
OsclMemoryFragWrapperOsclMemoryFragWrapper187     OsclMemoryFragWrapper()
188     {
189         clear();
190     }
191 
192     // copy constructers
OsclMemoryFragWrapperOsclMemoryFragWrapper193     OsclMemoryFragWrapper(const OsclMemoryFragWrapper &rhs)
194     {
195         iMemFrag.ptr = rhs.iMemFrag.ptr;
196         iMemFrag.len = rhs.iMemFrag.len;
197     }
OsclMemoryFragWrapperOsclMemoryFragWrapper198     OsclMemoryFragWrapper(const OsclMemoryFragment &rhs)
199     {
200         iMemFrag.ptr = rhs.ptr;
201         iMemFrag.len = rhs.len;
202     }
OsclMemoryFragWrapperOsclMemoryFragWrapper203     OsclMemoryFragWrapper(const void *aPtr, const uint32 aLen)
204     {
205         bind(aPtr, aLen);
206     }
207 
208     // assignment Operator
209     OsclMemoryFragWrapper& operator= (const OsclMemoryFragment &x)
210     {
211         bind(x);
212         return *this;
213     }
214 
215     OsclMemoryFragWrapper& operator= (OsclMemoryFragWrapper &x)
216     {
217         bind((const OsclMemoryFragment &)(x.get()));
218         return *this;
219     }
220 
221     // clear
clearOsclMemoryFragWrapper222     void clear()
223     {
224         iMemFrag.ptr = NULL;
225         iMemFrag.len = 0;
226     }
227 
228     // empty
emptyOsclMemoryFragWrapper229     bool empty()
230     {
231         return (((uint8*)iMemFrag.ptr == NULL) || (iMemFrag.len == 0));
232     }
233 
234     // bind
bindOsclMemoryFragWrapper235     void bind(const void *aPtr, const uint32 aLen)
236     {
237         iMemFrag.ptr = (void *)aPtr;
238         iMemFrag.len = aLen;
239     }
bindOsclMemoryFragWrapper240     void bind(const OsclMemoryFragment &aFrag)
241     {
242         iMemFrag.ptr = aFrag.ptr;
243         iMemFrag.len = aFrag.len;
244     }
245 
246     // update
updateOsclMemoryFragWrapper247     void update(const uint32 aLen)
248     {
249         iMemFrag.len = aLen;
250     }
updateOsclMemoryFragWrapper251     void update(const void *aPtr)
252     {
253         iMemFrag.ptr = (void *)aPtr;
254     }
255 
256     // get
getOsclMemoryFragWrapper257     OsclMemoryFragment &get()
258     {
259         return iMemFrag;
260     }
getPtrOsclMemoryFragWrapper261     void *getPtr()
262     {
263         return iMemFrag.ptr;
264     }
getLenOsclMemoryFragWrapper265     uint32 getLen()
266     {
267         return iMemFrag.len;
268     }
269 };
270 
271 // This class is based on OsclRefCounterMemFrag, but with the following change,
272 // memory fragment and its associated with reference counter can be updated any time
273 class RefCounterMemoryFragment
274 {
275     public:
276 
277         // constructor
RefCounterMemoryFragment(OsclMemoryFragment & m,OsclRefCounter * r)278         RefCounterMemoryFragment(OsclMemoryFragment &m, OsclRefCounter *r) :
279                 iMemfrag(m), iRefcnt(r)
280         {
281             if (iRefcnt) iRefcnt->addRef();
282         }
283 
RefCounterMemoryFragment(const void * aPtr,const uint32 aLen,OsclRefCounter * r)284         RefCounterMemoryFragment(const void *aPtr, const uint32 aLen, OsclRefCounter *r) :
285                 iMemfrag(aPtr, aLen), iRefcnt(r)
286         {
287             if (iRefcnt) iRefcnt->addRef();
288         }
289 
290         // Copy constructor.
RefCounterMemoryFragment(const OsclRefCounterMemFrag & x)291         RefCounterMemoryFragment(const OsclRefCounterMemFrag &x) :
292                 iMemfrag(((OsclRefCounterMemFrag &)x).getMemFrag()),
293                 iRefcnt(((OsclRefCounterMemFrag &)x).getRefCounter())
294         {
295             if (iRefcnt) iRefcnt->addRef();
296         }
297 
RefCounterMemoryFragment(const RefCounterMemoryFragment & x)298         RefCounterMemoryFragment(const RefCounterMemoryFragment &x) :
299                 iMemfrag(x.iMemfrag), iRefcnt(x.iRefcnt)
300         {
301             if (iRefcnt) iRefcnt->addRef();
302         }
303 
304         // Default constructor.
RefCounterMemoryFragment()305         RefCounterMemoryFragment()
306         {
307             iMemfrag.clear();
308             iRefcnt = 0;
309         }
310 
311         // Assignment Operator
312         RefCounterMemoryFragment& operator= (const RefCounterMemoryFragment &x)
313         {
314             if (this == &x) return *this; // protect against self-assignment
315             bind((RefCounterMemoryFragment &)x);
316             return *this;
317         }
318 
319         // Destructor
~RefCounterMemoryFragment()320         ~RefCounterMemoryFragment()
321         {
322             if (iRefcnt) iRefcnt->removeRef();
323         }
324 
empty()325         bool empty()
326         {
327             return (iMemfrag.empty() && iRefcnt == NULL);
328         }
329 
330         // get functions
331         // Returns a pointer to the contained reference counter object
getRefCounter()332         OsclRefCounter* getRefCounter()
333         {
334             return iRefcnt;
335         }
336         // Returns a reference to the contained memory fragment
getMemFrag()337         OsclMemoryFragment& getMemFrag()
338         {
339             return iMemfrag.get();
340         }
341         // Returns a pointer to the memory fragment data.
getMemFragPtr()342         OsclAny* getMemFragPtr()
343         {
344             return iMemfrag.get().ptr;
345         }
346         // Returns the size of the memory fragment data which equals its filled size.
getMemFragSize()347         uint32 getMemFragSize()
348         {
349             return iMemfrag.get().len;
350         }
351         // Returns the reference counter's current count.
getCount()352         uint32 getCount()
353         {
354             return (iRefcnt) ? iRefcnt->getCount() : 0;
355         }
getRefCountMemFrag(OsclRefCounterMemFrag & aFrag)356         void getRefCountMemFrag(OsclRefCounterMemFrag &aFrag)
357         {
358             aFrag = OsclRefCounterMemFrag(iMemfrag.get(), iRefcnt, iMemfrag.getLen());
359             iRefcnt->addRef(); // have to add ref-count manually
360         }
361 
362         // set functions
bind(OsclMemoryFragment & m,OsclRefCounter * r)363         void bind(OsclMemoryFragment &m, OsclRefCounter *r)
364         {
365             if (iRefcnt) iRefcnt->removeRef(); // remove ref for current memfrag
366             iMemfrag = m;
367             iRefcnt = r;
368             if (iRefcnt) iRefcnt->addRef(); // add ref for new memfrag
369         }
bind(OsclRefCounterMemFrag & x)370         void bind(OsclRefCounterMemFrag &x)
371         {
372             if (iRefcnt) iRefcnt->removeRef(); // remove ref for current memfrag
373             // copy assigned object
374             iMemfrag = x.getMemFrag();
375             iRefcnt = x.getRefCounter();
376             if (iRefcnt) iRefcnt->addRef(); // add ref for new memfrag
377         }
bind(RefCounterMemoryFragment & x)378         void bind(RefCounterMemoryFragment &x)
379         {
380             if (iRefcnt) iRefcnt->removeRef(); // remove ref for current memfrag
381             // copy assigned object
382             iMemfrag = x.iMemfrag;
383             iRefcnt = x.iRefcnt;
384             if (iRefcnt) iRefcnt->addRef(); // add ref for new memfrag
385         }
386 
387         // update memory fragment with the same reference counter
update(OsclMemoryFragment & m)388         void update(OsclMemoryFragment &m)
389         {
390             iMemfrag.bind(m);
391         }
update(void * aPtr)392         void update(void *aPtr)
393         {
394             iMemfrag.update(aPtr);
395         }
update(uint32 aLen)396         void update(uint32 aLen)
397         {
398             iMemfrag.update(aLen);
399         }
400 
401     private:
402         OsclMemoryFragWrapper iMemfrag;
403         OsclRefCounter *iRefcnt;
404 };
405 
406 
407 #endif // HTTP_PARCOM_INTERNAL_H_
408 
409