mirror of
https://github.com/AxioDL/boo.git
synced 2025-12-09 05:27:58 +00:00
Sync macOS with API changes
This commit is contained in:
@@ -1,157 +0,0 @@
|
||||
#ifndef __CFPOINTER_HPP__
|
||||
#define __CFPOINTER_HPP__
|
||||
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <CoreFoundation/CFPlugInCOM.h>
|
||||
#include <utility>
|
||||
|
||||
/// A smart pointer that can manage the lifecycle of Core Foundation objects.
|
||||
template<typename T>
|
||||
class CFPointer {
|
||||
public:
|
||||
CFPointer() : storage(nullptr) { }
|
||||
|
||||
CFPointer(T pointer) : storage(toStorageType(pointer)) {
|
||||
if (storage) {
|
||||
CFRetain(storage);
|
||||
}
|
||||
}
|
||||
|
||||
CFPointer(const CFPointer & other) : storage(other.storage) {
|
||||
if (CFTypeRef ptr = storage) {
|
||||
CFRetain(ptr);
|
||||
}
|
||||
}
|
||||
|
||||
CFPointer(CFPointer && other) : storage(std::exchange(other.storage, nullptr)) { }
|
||||
|
||||
~CFPointer() {
|
||||
if (CFTypeRef pointer = storage) {
|
||||
CFRelease(pointer);
|
||||
}
|
||||
}
|
||||
|
||||
static inline CFPointer<T> adopt(T CF_RELEASES_ARGUMENT ptr) {
|
||||
return CFPointer<T>(ptr, CFPointer<T>::Adopt);
|
||||
}
|
||||
|
||||
T get() const {
|
||||
return fromStorageType(storage);
|
||||
}
|
||||
|
||||
CFPointer &operator=(CFPointer other) {
|
||||
swap(other);
|
||||
return *this;
|
||||
}
|
||||
|
||||
CFTypeRef* operator&()
|
||||
{
|
||||
if (CFTypeRef pointer = storage) {
|
||||
CFRelease(pointer);
|
||||
}
|
||||
return &storage;
|
||||
}
|
||||
operator bool() const { return storage != nullptr; }
|
||||
|
||||
void reset()
|
||||
{
|
||||
if (storage)
|
||||
{
|
||||
CFRelease(storage);
|
||||
storage = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
CFTypeRef storage;
|
||||
|
||||
enum AdoptTag { Adopt };
|
||||
CFPointer(T ptr, AdoptTag) : storage(toStorageType(ptr)) { }
|
||||
|
||||
inline CFTypeRef toStorageType(CFTypeRef ptr) const {
|
||||
return (CFTypeRef)ptr;
|
||||
}
|
||||
|
||||
inline T fromStorageType(CFTypeRef pointer) const {
|
||||
return (T)pointer;
|
||||
}
|
||||
|
||||
void swap(CFPointer &other) {
|
||||
std::swap(storage, other.storage);
|
||||
}
|
||||
};
|
||||
|
||||
/// A smart pointer that can manage the lifecycle of CoreFoundation IUnknown objects.
|
||||
template<typename T>
|
||||
class IUnknownPointer {
|
||||
public:
|
||||
IUnknownPointer() : _storage(nullptr) { }
|
||||
|
||||
IUnknownPointer(T** pointer) : _storage(toStorageType(pointer)) {
|
||||
if (_storage) {
|
||||
(*pointer)->AddRef(pointer);
|
||||
}
|
||||
}
|
||||
|
||||
IUnknownPointer(const IUnknownPointer & other) : _storage(other._storage) {
|
||||
if (IUnknownVTbl** ptr = _storage) {
|
||||
(*ptr)->AddRef(ptr);
|
||||
}
|
||||
}
|
||||
IUnknownPointer& operator=(const IUnknownPointer & other) {
|
||||
if (IUnknownVTbl** pointer = _storage) {
|
||||
(*pointer)->Release(pointer);
|
||||
}
|
||||
_storage = other._storage;
|
||||
if (IUnknownVTbl** ptr = _storage) {
|
||||
(*ptr)->AddRef(ptr);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
IUnknownPointer(IUnknownPointer && other) : _storage(std::exchange(other._storage, nullptr)) { }
|
||||
|
||||
~IUnknownPointer() {
|
||||
if (IUnknownVTbl** pointer = _storage) {
|
||||
(*pointer)->Release(pointer);
|
||||
}
|
||||
}
|
||||
|
||||
static inline IUnknownPointer<T> adopt(T** ptr) {
|
||||
return IUnknownPointer<T>(ptr, IUnknownPointer<T>::Adopt);
|
||||
}
|
||||
|
||||
T* get() const {
|
||||
return fromStorageType(_storage);
|
||||
}
|
||||
|
||||
T* operator->() const { return get(); }
|
||||
T** storage() const { return (T**)_storage; }
|
||||
LPVOID* operator&() {
|
||||
if (IUnknownVTbl** pointer = _storage) {
|
||||
printf("%p RELEASE %d\n", pointer, (*pointer)->Release(pointer));
|
||||
}
|
||||
return (LPVOID*)&_storage;
|
||||
}
|
||||
operator bool() const { return _storage != nullptr; }
|
||||
|
||||
private:
|
||||
IUnknownVTbl** _storage;
|
||||
|
||||
enum AdoptTag { Adopt };
|
||||
IUnknownPointer(T** ptr, AdoptTag) : _storage(toStorageType(ptr)) { }
|
||||
|
||||
inline IUnknownVTbl** toStorageType(T** ptr) const {
|
||||
return (IUnknownVTbl**)ptr;
|
||||
}
|
||||
|
||||
inline T* fromStorageType(IUnknownVTbl** pointer) const {
|
||||
return *(T**)pointer;
|
||||
}
|
||||
|
||||
void swap(IUnknownPointer &other) {
|
||||
std::swap(_storage, other._storage);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // __CFPOINTER_HPP__
|
||||
@@ -9,7 +9,7 @@
|
||||
#include <IOKit/IOCFPlugIn.h>
|
||||
#include <sys/utsname.h>
|
||||
#include "IOKitPointer.hpp"
|
||||
#include "CFPointer.hpp"
|
||||
#include "../CFPointer.hpp"
|
||||
|
||||
namespace boo
|
||||
{
|
||||
@@ -182,9 +182,9 @@ class HIDListenerIOKit : public IHIDListener
|
||||
|
||||
/* Game controllers only */
|
||||
CFPointer<CFNumberRef> usagePage;
|
||||
dev->getProperty(dev.storage(), CFSTR(kIOHIDPrimaryUsagePageKey), &usagePage);
|
||||
dev->getProperty(dev.storage(), CFSTR(kIOHIDPrimaryUsagePageKey), (CFTypeRef*)&usagePage);
|
||||
CFPointer<CFNumberRef> usage;
|
||||
dev->getProperty(dev.storage(), CFSTR(kIOHIDPrimaryUsageKey), &usage);
|
||||
dev->getProperty(dev.storage(), CFSTR(kIOHIDPrimaryUsageKey), (CFTypeRef*)&usage);
|
||||
int usagePageV, usageV;
|
||||
CFNumberGetValue(usagePage.get(), kCFNumberIntType, &usagePageV);
|
||||
CFNumberGetValue(usage.get(), kCFNumberIntType, &usageV);
|
||||
@@ -199,14 +199,14 @@ class HIDListenerIOKit : public IHIDListener
|
||||
}
|
||||
|
||||
CFPointer<CFNumberRef> vid, pid;
|
||||
dev->getProperty(dev.storage(), CFSTR(kIOHIDVendorIDKey), &vid);
|
||||
dev->getProperty(dev.storage(), CFSTR(kIOHIDProductIDKey), &pid);
|
||||
dev->getProperty(dev.storage(), CFSTR(kIOHIDVendorIDKey), (CFTypeRef*)&vid);
|
||||
dev->getProperty(dev.storage(), CFSTR(kIOHIDProductIDKey), (CFTypeRef*)&pid);
|
||||
CFNumberGetValue(vid.get(), kCFNumberIntType, &vidv);
|
||||
CFNumberGetValue(pid.get(), kCFNumberIntType, &pidv);
|
||||
|
||||
CFPointer<CFStringRef> vstridx, pstridx;
|
||||
dev->getProperty(dev.storage(), CFSTR(kIOHIDManufacturerKey), &vstridx);
|
||||
dev->getProperty(dev.storage(), CFSTR(kIOHIDProductKey), &pstridx);
|
||||
dev->getProperty(dev.storage(), CFSTR(kIOHIDManufacturerKey), (CFTypeRef*)&vstridx);
|
||||
dev->getProperty(dev.storage(), CFSTR(kIOHIDProductKey), (CFTypeRef*)&pstridx);
|
||||
|
||||
if (vstridx)
|
||||
CFStringGetCString(vstridx.get(), vstr, 128, kCFStringEncodingUTF8);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef __IOKITPOINTER_HPP__
|
||||
#define __IOKITPOINTER_HPP__
|
||||
|
||||
#include "CFPointer.hpp"
|
||||
#include "../CFPointer.hpp"
|
||||
#include <IOKit/IOTypes.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/IOCFPlugIn.h>
|
||||
|
||||
Reference in New Issue
Block a user