add darwin support
authordavilla <davilla@4pi.com>
Sun, 9 Oct 2011 02:30:29 +0000 (22:30 -0400)
committerdavilla <davilla@4pi.com>
Sun, 9 Oct 2011 02:30:29 +0000 (22:30 -0400)
src/lib/AdapterDetection.cpp
src/lib/platform/linux/serialport.cpp
src/lib/platform/timeutils.h

index 5d957a7a0150300bcd582a49616077e79f81e6b2..98c3a0e60a09a083daf38fc9e8cbc80d03b2a500 100644 (file)
 #include "platform/os-dependent.h"
 #include "util/StdString.h"
 
-#if !defined(__WINDOWS__)
+#if defined(__APPLE__)
+#include <dirent.h>
+#include <sys/param.h>
+#include <IOKit/IOKitLib.h>
+#include <IOKit/IOMessage.h>
+#include <IOKit/IOCFPlugIn.h>
+#include <IOKit/usb/IOUSBLib.h>
+#include <IOKit/serial/IOSerialKeys.h>
+#include <CoreFoundation/CoreFoundation.h>
+
+#elif !defined(__WINDOWS__)
 #include <dirent.h>
 #include <libudev.h>
 #include <poll.h>
@@ -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;
index 0bb4e2cf6c419ad0980fea55ecab2033664015f4..de60da6e5f43ae58c58c89690d38eb4b6e4a4572 100644 (file)
 #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;
 
index 20b6eff8d5e9b6b5669b89f432072bb8ec9ae200..3d9b72ff2f7a491ca9eecfca2c6bbd9322b14671 100644 (file)
 
 #include <stdint.h>
 #include <sys/time.h>
+#if defined(__APPLE__)
+#include <mach/mach_time.h>
+#include <CoreVideo/CVHostTime.h>
+#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);