CoreFoundationBasics.h
1 #ifndef __CORE_FOUNDATION_BASICS__ 2 #define __CORE_FOUNDATION_BASICS__ 3 4 5 6 /* 7 This file contains basics for supporting our objects as CoreFoundation 8 objects. 9 */ 10 11 #include <CoreFoundation/CFRuntime.h> 12 #include <string> 13 #include "LinkedList.h" 14 15 void CoreFoundationObjectsRegister(); 16 17 extern const CFStringRef gInternalCFObjectName; 18 extern const CFStringRef gInternalProtectedCFObjectName; 19 20 struct CoreFoundationHolder; 21 22 class CoreFoundationObject 23 { 24 private: 25 CoreFoundationHolder* mHolder; 26 27 protected: 28 CoreFoundationObject(CFStringRef objectType); 29 30 protected: 31 CFStringRef mObjectType; 32 33 public: 34 virtual ~CoreFoundationObject(); 35 36 // compares mHolder's pointer, if you override you need 37 // to also override Hash. 38 virtual Boolean Equal(const CoreFoundationObject* object); 39 virtual CFHashCode Hash(); 40 virtual std::string FormattingDescription(CFDictionaryRef options); 41 virtual std::string DebugDescription(); 42 // default is to call delete. Complex objects with queues may wish to release the queue and use the queue finalizer to call delete. 43 virtual void Finalize(); 44 45 // register your class with the CFRuntime. You must supply 46 // a class name for your object. 47 static void RegisterObject(CFStringRef name, bool protectFromDelete); 48 static CFTypeID FindObjectType(CFStringRef name); 49 static LinkedListHeader* GetClassRegistryList(); 50 51 void SetHolder(CoreFoundationHolder* holder) {mHolder = holder;} 52 CFTypeRef GetCFObject() {return mHolder;} 53 54 CFStringRef GetTypeAsCFString(); 55 }; 56 57 58 59 struct CoreFoundationHolder 60 { 61 CFRuntimeBase mRuntimeBase; 62 CoreFoundationObject* mObject; 63 // name should really be a CFStringRef, not std::string (better memory use) 64 static CoreFoundationHolder* MakeHolder(CFStringRef name, CoreFoundationObject* object); 65 static CoreFoundationObject* ObjectFromCFType(CFTypeRef cfRef); 66 }; 67 68 69 70 #endif