From 6df2c52fa8616ca21f09f546bfac3d82ceb02bed Mon Sep 17 00:00:00 2001 From: davilla Date: Sat, 8 Oct 2011 22:30:29 -0400 Subject: [PATCH] add darwin support --- src/lib/AdapterDetection.cpp | 81 ++++++++++++++++++++++++++- src/lib/platform/linux/serialport.cpp | 11 ++++ src/lib/platform/timeutils.h | 8 ++- 3 files changed, 97 insertions(+), 3 deletions(-) diff --git a/src/lib/AdapterDetection.cpp b/src/lib/AdapterDetection.cpp index 5d957a7..98c3a0e 100644 --- a/src/lib/AdapterDetection.cpp +++ b/src/lib/AdapterDetection.cpp @@ -34,7 +34,17 @@ #include "platform/os-dependent.h" #include "util/StdString.h" -#if !defined(__WINDOWS__) +#if defined(__APPLE__) +#include +#include +#include +#include +#include +#include +#include +#include + +#elif !defined(__WINDOWS__) #include #include #include @@ -104,7 +114,74 @@ uint8_t CAdapterDetection::FindAdapters(cec_adapter *deviceList, uint8_t iBufSiz { uint8_t iFound(0); -#if !defined(__WINDOWS__) +#if defined(__APPLE__) + kern_return_t kresult; + char bsdPath[MAXPATHLEN] = {0}; + io_iterator_t serialPortIterator; + + CFMutableDictionaryRef classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue); + if (classesToMatch) + { + CFDictionarySetValue(classesToMatch, CFSTR(kIOSerialBSDTypeKey), CFSTR(kIOSerialBSDModemType)); + kresult = IOServiceGetMatchingServices(kIOMasterPortDefault, classesToMatch, &serialPortIterator); + if (kresult == KERN_SUCCESS) + { + io_object_t serialService; + while ((serialService = IOIteratorNext(serialPortIterator))) + { + int iVendor = 0, iProduct = 0; + CFTypeRef bsdPathAsCFString; + + // fetch the device path. + bsdPathAsCFString = IORegistryEntryCreateCFProperty(serialService, + CFSTR(kIOCalloutDeviceKey), kCFAllocatorDefault, 0); + if (bsdPathAsCFString) + { + // convert the path from a CFString to a C (NUL-terminated) string. + CFStringGetCString((CFStringRef)bsdPathAsCFString, bsdPath, MAXPATHLEN - 1, kCFStringEncodingUTF8); + CFRelease(bsdPathAsCFString); + + // now walk up the hierarchy until we find the entry with vendor/product IDs + io_registry_entry_t parent; + CFTypeRef vendorIdAsCFNumber = NULL; + CFTypeRef productIdAsCFNumber = NULL; + kern_return_t kresult = IORegistryEntryGetParentEntry(serialService, kIOServicePlane, &parent); + while (kresult == KERN_SUCCESS) + { + vendorIdAsCFNumber = IORegistryEntrySearchCFProperty(parent, + kIOServicePlane, CFSTR(kUSBVendorID), kCFAllocatorDefault, 0); + productIdAsCFNumber = IORegistryEntrySearchCFProperty(parent, + kIOServicePlane, CFSTR(kUSBProductID), kCFAllocatorDefault, 0); + if (vendorIdAsCFNumber && productIdAsCFNumber) + { + CFNumberGetValue((CFNumberRef)vendorIdAsCFNumber, kCFNumberIntType, &iVendor); + CFRelease(vendorIdAsCFNumber); + CFNumberGetValue((CFNumberRef)productIdAsCFNumber, kCFNumberIntType, &iProduct); + CFRelease(productIdAsCFNumber); + IOObjectRelease(parent); + break; + } + io_registry_entry_t oldparent = parent; + kresult = IORegistryEntryGetParentEntry(parent, kIOServicePlane, &parent); + IOObjectRelease(oldparent); + } + if (strlen(bsdPath) && iVendor == CEC_VID && iProduct == CEC_PID) + { + if (!strDevicePath || !strcmp(bsdPath, strDevicePath)) + { + // on darwin, the device path is the same as the comm path. + snprintf(deviceList[iFound ].path, sizeof(deviceList[iFound].path), "%s", bsdPath); + snprintf(deviceList[iFound++].comm, sizeof(deviceList[iFound].path), "%s", bsdPath); + } + } + } + IOObjectRelease(serialService); + } + } + IOObjectRelease(serialPortIterator); + } + +#elif !defined(__WINDOWS__) struct udev *udev; if (!(udev = udev_new())) return -1; diff --git a/src/lib/platform/linux/serialport.cpp b/src/lib/platform/linux/serialport.cpp index 0bb4e2c..de60da6 100644 --- a/src/lib/platform/linux/serialport.cpp +++ b/src/lib/platform/linux/serialport.cpp @@ -22,6 +22,17 @@ #include "../baudrate.h" #include "../timeutils.h" +#if defined(__APPLE__) +#ifndef XCASE +#define XCASE 0 +#endif +#ifndef OLCUC +#define OLCUC 0 +#endif +#ifndef IUCLC +#define IUCLC 0 +#endif +#endif using namespace std; using namespace CEC; diff --git a/src/lib/platform/timeutils.h b/src/lib/platform/timeutils.h index 20b6eff..3d9b72f 100644 --- a/src/lib/platform/timeutils.h +++ b/src/lib/platform/timeutils.h @@ -20,12 +20,18 @@ #include #include +#if defined(__APPLE__) +#include +#include +#endif namespace CEC { inline int64_t GetTimeMs() { - #ifdef __WINDOWS__ + #if defined(__APPLE__) + return (int64_t) (CVGetCurrentHostTime() * 1000 / CVGetHostClockFrequency()); + #elif defined(__WINDOWS__) time_t rawtime; time(&rawtime); -- 2.34.1