--- /dev/null
+#ifndef __CORE_FOUNDATION_BASICS__
+#define __CORE_FOUNDATION_BASICS__
+
+
+
+/*
+ This file contains basics for supporting our objects as CoreFoundation
+ objects.
+*/
+
+#include <CoreFoundation/CFRuntime.h>
+#include <string>
+#include "LinkedList.h"
+
+void CoreFoundationObjectsRegister();
+
+extern const CFStringRef gInternalCFObjectName;
+extern const CFStringRef gInternalProtectedCFObjectName;
+
+struct CoreFoundationHolder;
+
+class CoreFoundationObject
+{
+private:
+ CoreFoundationHolder* mHolder;
+
+protected:
+ CoreFoundationObject(CFStringRef objectType);
+
+protected:
+ CFStringRef mObjectType;
+
+public:
+ virtual ~CoreFoundationObject();
+
+ // compares mHolder's pointer, if you override you need
+ // to also override Hash.
+ virtual Boolean Equal(const CoreFoundationObject* object);
+ virtual CFHashCode Hash();
+ virtual std::string FormattingDescription(CFDictionaryRef options);
+ virtual std::string DebugDescription();
+ // default is to call delete. Complex objects with queues may wish to release the queue and use the queue finalizer to call delete.
+ virtual void Finalize();
+
+ // register your class with the CFRuntime. You must supply
+ // a class name for your object.
+ static void RegisterObject(CFStringRef name, bool protectFromDelete);
+ static CFTypeID FindObjectType(CFStringRef name);
+ static LinkedListHeader* GetClassRegistryList();
+
+ void SetHolder(CoreFoundationHolder* holder) {mHolder = holder;}
+ CFTypeRef GetCFObject() {return mHolder;}
+
+ CFStringRef GetTypeAsCFString();
+};
+
+
+
+struct CoreFoundationHolder
+{
+ CFRuntimeBase mRuntimeBase;
+ CoreFoundationObject* mObject;
+ // name should really be a CFStringRef, not std::string (better memory use)
+ static CoreFoundationHolder* MakeHolder(CFStringRef name, CoreFoundationObject* object);
+ static CoreFoundationObject* ObjectFromCFType(CFTypeRef cfRef);
+};
+
+
+
+#endif