oRTP 0.16.5
|
00001 /* 00002 The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) stack. 00003 Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Lesser General Public 00007 License as published by the Free Software Foundation; either 00008 version 2.1 of the License, or (at your option) any later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Lesser General Public License for more details. 00014 00015 You should have received a copy of the GNU Lesser General Public 00016 License along with this library; if not, write to the Free Software 00017 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00018 */ 00019 00020 #ifndef STR_UTILS_H 00021 #define STR_UTILS_H 00022 00023 00024 #include <ortp/port.h> 00025 00026 00027 typedef struct msgb 00028 { 00029 struct msgb *b_prev; 00030 struct msgb *b_next; 00031 struct msgb *b_cont; 00032 struct datab *b_datap; 00033 unsigned char *b_rptr; 00034 unsigned char *b_wptr; 00035 uint32_t reserved1; 00036 uint32_t reserved2; 00037 } mblk_t; 00038 00039 typedef struct datab 00040 { 00041 unsigned char *db_base; 00042 unsigned char *db_lim; 00043 void (*db_freefn)(void*); 00044 int db_ref; 00045 } dblk_t; 00046 00047 typedef struct _queue 00048 { 00049 mblk_t _q_stopper; 00050 int q_mcount; /*number of packet in the q */ 00051 } queue_t; 00052 00053 #ifdef __cplusplus 00054 extern "C" { 00055 #endif 00056 00057 void qinit(queue_t *q); 00058 00059 void putq(queue_t *q, mblk_t *m); 00060 00061 mblk_t * getq(queue_t *q); 00062 00063 void insq(queue_t *q,mblk_t *emp, mblk_t *mp); 00064 00065 void remq(queue_t *q, mblk_t *mp); 00066 00067 mblk_t * peekq(queue_t *q); 00068 00069 /* remove and free all messages in the q */ 00070 #define FLUSHALL 0 00071 void flushq(queue_t *q, int how); 00072 00073 void mblk_init(mblk_t *mp); 00074 00075 /* allocates a mblk_t, that points to a datab_t, that points to a buffer of size size. */ 00076 mblk_t *allocb(int size, int unused); 00077 #define BPRI_MED 0 00078 00079 /* allocates a mblk_t, that points to a datab_t, that points to buf; buf will be freed using freefn */ 00080 mblk_t *esballoc(uint8_t *buf, int size, int pri, void (*freefn)(void*) ); 00081 00082 /* frees a mblk_t, and if the datab ref_count is 0, frees it and the buffer too */ 00083 void freeb(mblk_t *m); 00084 00085 /* frees recursively (follow b_cont) a mblk_t, and if the datab 00086 ref_count is 0, frees it and the buffer too */ 00087 void freemsg(mblk_t *mp); 00088 00089 /* duplicates a mblk_t , buffer is not duplicated*/ 00090 mblk_t *dupb(mblk_t *m); 00091 00092 /* duplicates a complex mblk_t, buffer is not duplicated */ 00093 mblk_t *dupmsg(mblk_t* m); 00094 00095 /* returns the size of data of a message */ 00096 int msgdsize(const mblk_t *mp); 00097 00098 /* concatenates all fragment of a complex message*/ 00099 void msgpullup(mblk_t *mp,int len); 00100 00101 /* duplicates a single message, but with buffer included */ 00102 mblk_t *copyb(mblk_t *mp); 00103 00104 /* duplicates a complex message with buffer included */ 00105 mblk_t *copymsg(mblk_t *mp); 00106 00107 mblk_t * appendb(mblk_t *mp, const char *data, int size, bool_t pad); 00108 void msgappend(mblk_t *mp, const char *data, int size, bool_t pad); 00109 00110 mblk_t *concatb(mblk_t *mp, mblk_t *newm); 00111 00112 #define qempty(q) (&(q)->_q_stopper==(q)->_q_stopper.b_next) 00113 #define qfirst(q) ((q)->_q_stopper.b_next!=&(q)->_q_stopper ? (q)->_q_stopper.b_next : NULL) 00114 #define qbegin(q) ((q)->_q_stopper.b_next) 00115 #define qlast(q) ((q)->_q_stopper.b_prev!=&(q)->_q_stopper ? (q)->_q_stopper.b_prev : NULL) 00116 #define qend(q,mp) ((mp)==&(q)->_q_stopper) 00117 #define qnext(q,mp) ((mp)->b_next) 00118 00119 typedef struct _msgb_allocator{ 00120 queue_t q; 00121 }msgb_allocator_t; 00122 00123 void msgb_allocator_init(msgb_allocator_t *pa); 00124 mblk_t *msgb_allocator_alloc(msgb_allocator_t *pa, int size); 00125 void msgb_allocator_uninit(msgb_allocator_t *pa); 00126 00127 #ifdef __cplusplus 00128 } 00129 #endif 00130 00131 #endif