gwenhywfar  4.3.1
refptr.c
Go to the documentation of this file.
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(void){
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