📄 mimetmac.cpp
字号:
// ----------------------------------------------------------------------------// wxCFDictionary// ----------------------------------------------------------------------------class wxCFDictionary{public: wxCFDictionary(CFTypeRef ref, bool bRetain = wxCF_RELEASE) { m_cfmdRef = (CFMutableDictionaryRef) ref; if (bRetain == wxCF_RETAIN && ref) CFRetain(ref); } wxCFDictionary(CFIndex cfiSize = 0) { CFDictionaryKeyCallBacks kcbs; CFDictionaryValueCallBacks vcbs; BuildKeyCallbacks(&kcbs); BuildValueCallbacks(&vcbs); m_cfmdRef = CFDictionaryCreateMutable( kCFAllocatorDefault, cfiSize, &kcbs, &vcbs ); } ~wxCFDictionary() { Clear(); } void Clear() { if (m_cfmdRef) CFRelease(m_cfmdRef); } static const void* RetainProc(CFAllocatorRef, const void* v) { return (const void*) CFRetain(v); } static void ReleaseProc(CFAllocatorRef, const void* v) { CFRelease(v); } void MakeMutable(CFIndex cfiSize = 0) { CFDictionaryRef oldref = (CFDictionaryRef) m_cfmdRef; m_cfmdRef = CFDictionaryCreateMutableCopy( kCFAllocatorDefault, cfiSize, oldref ); CFRelease( oldref ); } void BuildKeyCallbacks(CFDictionaryKeyCallBacks* pCbs) { pCbs->version = 0; pCbs->retain = RetainProc; pCbs->release = ReleaseProc; pCbs->copyDescription = NULL; pCbs->equal = NULL; pCbs->hash = NULL; } void BuildValueCallbacks(CFDictionaryValueCallBacks* pCbs) { pCbs->version = 0; pCbs->retain = RetainProc; pCbs->release = ReleaseProc; pCbs->copyDescription = NULL; pCbs->equal = NULL; } operator CFTypeRef () const { return (CFTypeRef)m_cfmdRef; } CFDictionaryRef GetCFDictionary() const { return (CFDictionaryRef)m_cfmdRef; } CFMutableDictionaryRef GetCFMutableDictionary() { return (CFMutableDictionaryRef) m_cfmdRef; } CFTypeRef operator [] (CFTypeRef cftEntry) const { wxASSERT(IsValid()); return (CFTypeRef) CFDictionaryGetValue((CFDictionaryRef)m_cfmdRef, cftEntry); } CFIndex GetCount() const { wxASSERT(IsValid()); return CFDictionaryGetCount((CFDictionaryRef)m_cfmdRef); } void Add(CFTypeRef cftKey, CFTypeRef cftValue) { wxASSERT(IsValid()); wxASSERT(Exists(cftKey) == false); CFDictionaryAddValue(m_cfmdRef, cftKey, cftValue); } void Remove(CFTypeRef cftKey) { wxASSERT(IsValid()); wxASSERT(Exists(cftKey)); CFDictionaryRemoveValue(m_cfmdRef, cftKey); } void Set(CFTypeRef cftKey, CFTypeRef cftValue) { wxASSERT(IsValid()); wxASSERT(Exists(cftKey)); CFDictionarySetValue(m_cfmdRef, cftKey, cftValue); } bool Exists(CFTypeRef cftKey) const { wxASSERT(IsValid()); return CFDictionaryContainsKey((CFDictionaryRef)m_cfmdRef, cftKey); } bool IsOk() const { return m_cfmdRef != NULL; } bool IsValid() const { return IsOk() && CFGetTypeID((CFTypeRef)m_cfmdRef) == CFDictionaryGetTypeID(); } void PrintOut(wxString& sMessage) { PrintOutDictionary(sMessage, m_cfmdRef); } static void PrintOutDictionary(wxString& sMessage, CFDictionaryRef cfdRef) { CFIndex cfiCount = CFDictionaryGetCount(cfdRef); CFTypeRef* pKeys = new CFTypeRef[cfiCount]; CFTypeRef* pValues = new CFTypeRef[cfiCount]; CFDictionaryGetKeysAndValues(cfdRef, pKeys, pValues); for (CFIndex i = 0; i < cfiCount; ++i) { wxString sKey = wxMacCFStringHolder(CFCopyTypeIDDescription(CFGetTypeID(pKeys[i]))).AsString(); wxString sValue = wxMacCFStringHolder(CFCopyTypeIDDescription(CFGetTypeID(pValues[i]))).AsString(); sMessage << wxString::Format(wxT("[{#%d} Key : %s]"), (int) i, sKey.c_str()); PrintOutType(sMessage, sKey, pKeys[i]); sMessage << wxString::Format(wxT("\n\t[Value : %s]"), sValue.c_str()); PrintOutType(sMessage, sValue, pValues[i]); sMessage << wxT("\n"); } delete [] pKeys; delete [] pValues; } static void PrintOutArray(wxString& sMessage, CFArrayRef cfaRef) { for (CFIndex i = 0; i < CFArrayGetCount(cfaRef); ++i) { wxString sValue = wxMacCFStringHolder(CFCopyTypeIDDescription(CFGetTypeID( CFArrayGetValueAtIndex(cfaRef, i) ))).AsString(); sMessage << wxString::Format(wxT("\t\t[{#%d} ArrayValue : %s]\n"), (int) i, sValue.c_str()); PrintOutType(sMessage, sValue, CFArrayGetValueAtIndex(cfaRef, i)); } } static void PrintOutType(wxString& sMessage, const wxString& sValue, CFTypeRef cfRef) { sMessage << wxT(" {"); if (sValue == wxT("CFString")) { sMessage << wxMacCFStringHolder((CFStringRef)cfRef, false).AsString(); } else if (sValue == wxT("CFNumber")) { int nOut; CFNumberGetValue((CFNumberRef)cfRef, kCFNumberIntType, &nOut); sMessage << nOut; } else if (sValue == wxT("CFDictionary")) { PrintOutDictionary(sMessage, (CFDictionaryRef)cfRef); } else if (sValue == wxT("CFArray")) { PrintOutArray(sMessage, (CFArrayRef)cfRef); } else if (sValue == wxT("CFBoolean")) { sMessage << (cfRef == kCFBooleanTrue ? wxT("true") : wxT("false")); } else if (sValue == wxT("CFURL")) { sMessage << wxMacCFStringHolder(CFURLCopyPath((CFURLRef) cfRef)).AsString(); } else { sMessage << wxT("*****UNKNOWN TYPE******"); } sMessage << wxT("} "); }#if wxUSE_MIMETYPE void MakeValidXML();#endif CFTypeRef WriteAsXML() { return CFPropertyListCreateXMLData(kCFAllocatorDefault, m_cfmdRef); } bool ReadAsXML(CFTypeRef cfData, wxString* pErrorMsg = NULL) { Clear(); CFStringRef cfsError=NULL; m_cfmdRef = (CFMutableDictionaryRef) CFPropertyListCreateFromXMLData( kCFAllocatorDefault, (CFDataRef)cfData, kCFPropertyListMutableContainersAndLeaves, &cfsError ); if (cfsError) { if (pErrorMsg) *pErrorMsg = wxMacCFStringHolder(cfsError).AsString(); else CFRelease(cfsError); } return m_cfmdRef != NULL; }private: CFMutableDictionaryRef m_cfmdRef;};// ----------------------------------------------------------------------------// wxCFArray// ----------------------------------------------------------------------------class wxCFArray{public: wxCFArray(CFTypeRef ref, bool bRetain = wxCF_RELEASE) { m_cfmaRef = (CFMutableArrayRef)ref; if (bRetain == wxCF_RETAIN && ref) CFRetain(ref); } wxCFArray(CFIndex cfiSize = 0) : m_cfmaRef(NULL) { Create(cfiSize); } ~wxCFArray() { Clear(); } void MakeMutable(CFIndex cfiSize = 0) { wxASSERT(IsValid()); CFMutableArrayRef oldref = m_cfmaRef; m_cfmaRef = CFArrayCreateMutableCopy( kCFAllocatorDefault, cfiSize, (CFArrayRef)oldref); CFRelease(oldref); } void BuildCallbacks(CFArrayCallBacks* pCbs) { pCbs->version = 0; pCbs->retain = RetainProc; pCbs->release = ReleaseProc; pCbs->copyDescription = NULL; pCbs->equal = NULL; } void Create(CFIndex cfiSize = 0) { Clear(); CFArrayCallBacks cb; BuildCallbacks(&cb); m_cfmaRef = CFArrayCreateMutable(kCFAllocatorDefault, cfiSize, &cb); } void Clear() { if (m_cfmaRef) CFRelease(m_cfmaRef); } static const void* RetainProc(CFAllocatorRef, const void* v) { return (const void*) CFRetain(v); } static void ReleaseProc(CFAllocatorRef, const void* v) { CFRelease(v); } operator CFTypeRef () const { return (CFTypeRef)m_cfmaRef; } CFArrayRef GetCFArray() const { return (CFArrayRef)m_cfmaRef; } CFMutableArrayRef GetCFMutableArray() { return (CFMutableArrayRef) m_cfmaRef; } CFTypeRef operator [] (CFIndex cfiIndex) const { wxASSERT(IsValid()); return (CFTypeRef) CFArrayGetValueAtIndex((CFArrayRef)m_cfmaRef, cfiIndex); } CFIndex GetCount() { wxASSERT(IsValid()); return CFArrayGetCount((CFArrayRef)m_cfmaRef); } void Add(CFTypeRef cftValue) { wxASSERT(IsValid()); CFArrayAppendValue(m_cfmaRef, cftValue); } void Remove(CFIndex cfiIndex) { wxASSERT(IsValid()); wxASSERT(cfiIndex < GetCount()); CFArrayRemoveValueAtIndex(m_cfmaRef, cfiIndex); } void Set(CFIndex cfiIndex, CFTypeRef cftValue) { wxASSERT(IsValid()); wxASSERT(cfiIndex < GetCount()); CFArraySetValueAtIndex(m_cfmaRef, cfiIndex, cftValue); } bool IsOk() const { return m_cfmaRef != NULL; } bool IsValid() const { return IsOk() && CFGetTypeID((CFTypeRef)m_cfmaRef) == CFArrayGetTypeID(); }#if wxUSE_MIMETYPE void MakeValidXML();#endifprivate: CFMutableArrayRef m_cfmaRef;};// ----------------------------------------------------------------------------// wxCFString// ----------------------------------------------------------------------------class wxCFString{public: wxCFString(CFTypeRef ref, bool bRetain = wxCF_RELEASE) : m_Holder((CFStringRef)ref, bRetain == wxCF_RELEASE) {} wxCFString(const wxChar* szString) : m_Holder(wxString(szString), wxLocale::GetSystemEncoding()) {} wxCFString(const wxString& sString) : m_Holder(sString, wxLocale::GetSystemEncoding()) {} virtual ~wxCFString() {} operator CFTypeRef() const { return (CFTypeRef) ((CFStringRef) m_Holder); } bool IsOk() { return ((CFTypeRef)(*this)) != NULL; } wxString BuildWXString() { return m_Holder.AsString(); }private: wxMacCFStringHolder m_Holder;};// ----------------------------------------------------------------------------// wxCFNumber// ----------------------------------------------------------------------------class wxCFNumber{public: wxCFNumber(int nValue) { m_cfnRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &nValue); } wxCFNumber(CFTypeRef ref, bool bRetain = wxCF_RELEASE) : m_cfnRef((CFNumberRef)ref) { if (bRetain == wxCF_RETAIN && ref) CFRetain(ref); } virtual ~wxCFNumber() {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -