gwenhywfar 4.0.3
|
00001 /*************************************************************************** 00002 $RCSfile$ 00003 ------------------- 00004 cvs : $Id$ 00005 begin : Sun Jan 25 2004 00006 copyright : (C) 2004 by Martin Preuss 00007 email : martin@libchipcard.de 00008 00009 *************************************************************************** 00010 * * 00011 * This library is free software; you can redistribute it and/or * 00012 * modify it under the terms of the GNU Lesser General Public * 00013 * License as published by the Free Software Foundation; either * 00014 * version 2.1 of the License, or (at your option) any later version. * 00015 * * 00016 * This library is distributed in the hope that it will be useful, * 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 00019 * Lesser General Public License for more details. * 00020 * * 00021 * You should have received a copy of the GNU Lesser General Public * 00022 * License along with this library; if not, write to the Free Software * 00023 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * 00024 * MA 02111-1307 USA * 00025 * * 00026 ***************************************************************************/ 00027 00028 00029 #ifdef HAVE_CONFIG_H 00030 # include <config.h> 00031 #endif 00032 00033 #include "refptr_p.h" 00034 #include <gwenhywfar/misc.h> 00035 #include <gwenhywfar/debug.h> 00036 #include <stdlib.h> 00037 00038 00039 00040 GWEN_REFPTR_POBJECT *GWEN_RefPtrObject_new(void *dp, GWEN_REFPTR_INFO *rpi){ 00041 GWEN_REFPTR_POBJECT *rpo; 00042 00043 GWEN_NEW_OBJECT(GWEN_REFPTR_POBJECT, rpo); 00044 rpo->refCount=1; 00045 rpo->ptr=dp; 00046 rpo->infoPtr=rpi; 00047 if (rpi) 00048 GWEN_RefPtrInfo_Attach(rpi); 00049 return rpo; 00050 } 00051 00052 00053 00054 void GWEN_RefPtrObject_free(GWEN_REFPTR_POBJECT *rpo){ 00055 if (rpo) { 00056 assert(rpo->refCount); 00057 if (--(rpo->refCount)==0) { 00058 DBG_VERBOUS(GWEN_LOGDOMAIN, "Freeing GWEN_RefPtrObject"); 00059 if ((rpo->flags & GWEN_REFPTR_FLAGS_AUTODELETE) && 00060 rpo->infoPtr && 00061 rpo->ptr) { 00062 if (rpo->infoPtr->freeFn) 00063 rpo->infoPtr->freeFn(rpo->ptr); 00064 } 00065 GWEN_FREE_OBJECT(rpo); 00066 } 00067 } 00068 } 00069 00070 00071 00072 void GWEN_RefPtrObject_Attach(GWEN_REFPTR_POBJECT *rpo){ 00073 assert(rpo); 00074 assert(rpo->refCount); 00075 rpo->refCount++; 00076 } 00077 00078 00079 00080 uint32_t GWEN_RefPtrInfo_GetFlags(const GWEN_REFPTR_INFO *rpi){ 00081 assert(rpi); 00082 return rpi->flags; 00083 } 00084 00085 00086 00087 void GWEN_RefPtrInfo_SetFlags(GWEN_REFPTR_INFO *rpi, uint32_t fl){ 00088 assert(rpi); 00089 rpi->flags=fl; 00090 } 00091 00092 00093 00094 void GWEN_RefPtrInfo_AddFlags(GWEN_REFPTR_INFO *rpi, uint32_t fl){ 00095 assert(rpi); 00096 rpi->flags|=fl; 00097 } 00098 00099 00100 00101 void GWEN_RefPtrInfo_DelFlags(GWEN_REFPTR_INFO *rpi, uint32_t fl){ 00102 assert(rpi); 00103 rpi->flags&=~fl; 00104 } 00105 00106 00107 00108 00109 00110 00111 00112 00113 00114 00115 GWEN_REFPTR_INFO *GWEN_RefPtrInfo_new(){ 00116 GWEN_REFPTR_INFO *rpi; 00117 00118 GWEN_NEW_OBJECT(GWEN_REFPTR_INFO, rpi); 00119 rpi->refCount=1; 00120 00121 return rpi; 00122 } 00123 00124 00125 00126 void GWEN_RefPtrInfo_free(GWEN_REFPTR_INFO *rpi){ 00127 if (rpi) { 00128 assert(rpi->refCount); 00129 if (--(rpi->refCount)==0) { 00130 DBG_VERBOUS(GWEN_LOGDOMAIN, "Freeing GWEN_RefPtrInfo"); 00131 GWEN_FREE_OBJECT(rpi); 00132 } 00133 } 00134 } 00135 00136 00137 00138 void GWEN_RefPtrInfo_Attach(GWEN_REFPTR_INFO *rpi){ 00139 assert(rpi); 00140 assert(rpi->refCount); 00141 rpi->refCount++; 00142 } 00143 00144 00145 00146 void GWEN_RefPtrInfo_SetFreeFn(GWEN_REFPTR_INFO *rpi, 00147 GWEN_REFPTR_INFO_FREE_FN f){ 00148 assert(rpi); 00149 rpi->freeFn=f; 00150 } 00151 00152 00153 00154 void GWEN_RefPtrInfo_SetDupFn(GWEN_REFPTR_INFO *rpi, 00155 GWEN_REFPTR_INFO_DUP_FN f){ 00156 assert(rpi); 00157 rpi->dupFn=f; 00158 } 00159 00160 00161 00162 00163 00164 00165 00166 00167 00168 00169 00170 00171 00172 GWEN_REFPTR *GWEN_RefPtr_new(void *dp, GWEN_REFPTR_INFO *rpi){ 00173 GWEN_REFPTR *rp; 00174 00175 GWEN_NEW_OBJECT(GWEN_REFPTR, rp); 00176 rp->objectPtr=GWEN_RefPtrObject_new(dp, rpi); 00177 if (rpi) 00178 rp->objectPtr->flags=rpi->flags; 00179 return rp; 00180 } 00181 00182 00183 00184 void GWEN_RefPtr_free(GWEN_REFPTR *rp){ 00185 if (rp) { 00186 DBG_VERBOUS(GWEN_LOGDOMAIN, "Freeing GWEN_RefPtr"); 00187 GWEN_RefPtrObject_free(rp->objectPtr); 00188 GWEN_FREE_OBJECT(rp); 00189 } 00190 } 00191 00192 00193 00194 GWEN_REFPTR *GWEN_RefPtr_dup(const GWEN_REFPTR *rp){ 00195 GWEN_REFPTR *nrp; 00196 00197 assert(rp); 00198 GWEN_NEW_OBJECT(GWEN_REFPTR, nrp); 00199 nrp->objectPtr=rp->objectPtr; 00200 GWEN_RefPtrObject_Attach(nrp->objectPtr); 00201 return nrp; 00202 } 00203 00204 00205 00206 GWEN_REFPTR *GWEN_RefPtr_copy(const GWEN_REFPTR *rp){ 00207 GWEN_REFPTR *nrp; 00208 00209 assert(rp); 00210 if (rp->objectPtr) { 00211 if (rp->objectPtr->ptr) { 00212 if (rp->objectPtr->infoPtr) { 00213 if (rp->objectPtr->infoPtr->dupFn) { 00214 void *p; 00215 00216 p=rp->objectPtr->infoPtr->dupFn(rp->objectPtr->ptr); 00217 nrp=GWEN_RefPtr_new(p, rp->objectPtr->infoPtr); 00218 return nrp; 00219 } 00220 } 00221 } 00222 } 00223 return 0; 00224 } 00225 00226 00227 00228 void *GWEN_RefPtr_GetData(const GWEN_REFPTR *rp){ 00229 if (!rp) 00230 return 0; 00231 if (rp->objectPtr) { 00232 return rp->objectPtr->ptr; 00233 } 00234 return 0; 00235 } 00236 00237 00238 00239 void GWEN_RefPtr_SetData(GWEN_REFPTR *rp, void *dp, GWEN_REFPTR_INFO *rpi){ 00240 assert(rp); 00241 00242 if (rp->objectPtr) { 00243 GWEN_RefPtrObject_free(rp->objectPtr); 00244 } 00245 rp->objectPtr=GWEN_RefPtrObject_new(dp, rpi); 00246 } 00247 00248 00249 00250 uint32_t GWEN_RefPtr_GetFlags(const GWEN_REFPTR *rp){ 00251 assert(rp); 00252 if (rp->objectPtr) 00253 return rp->objectPtr->flags; 00254 DBG_INFO(GWEN_LOGDOMAIN, "No object in RefPtr"); 00255 return 0; 00256 } 00257 00258 00259 00260 void GWEN_RefPtr_SetFlags(GWEN_REFPTR *rp, uint32_t fl){ 00261 assert(rp); 00262 if (rp->objectPtr) 00263 rp->objectPtr->flags=fl; 00264 else { 00265 DBG_INFO(GWEN_LOGDOMAIN, "No object in RefPtr"); 00266 } 00267 } 00268 00269 00270 00271 void GWEN_RefPtr_AddFlags(GWEN_REFPTR *rp, uint32_t fl){ 00272 assert(rp); 00273 if (rp->objectPtr) 00274 rp->objectPtr->flags|=fl; 00275 else { 00276 DBG_INFO(GWEN_LOGDOMAIN, "No object in RefPtr"); 00277 } 00278 } 00279 00280 00281 00282 void GWEN_RefPtr_DelFlags(GWEN_REFPTR *rp, uint32_t fl){ 00283 assert(rp); 00284 if (rp->objectPtr) 00285 rp->objectPtr->flags&=~fl; 00286 else { 00287 DBG_INFO(GWEN_LOGDOMAIN, "No object in RefPtr"); 00288 } 00289 } 00290 00291 00292 00293 00294 00295 00296 00297 00298