Index: content/browser/mac/media_device_notifications.mm |
=================================================================== |
--- content/browser/mac/media_device_notifications.mm (revision 124333) |
+++ content/browser/mac/media_device_notifications.mm (working copy) |
@@ -1,133 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/browser/mac/media_device_notifications.h" |
- |
-#include <Carbon/Carbon.h> |
-#include <CoreFoundation/CoreFoundation.h> |
- |
-#include "base/file_path.h" |
-#include "base/mac/foundation_util.h" |
-#include "base/mac/scoped_cftyperef.h" |
-#include "base/sys_string_conversions.h" |
-#include "base/system_monitor/system_monitor.h" |
- |
-namespace content { |
- |
-namespace { |
- |
-const CFStringRef kICAUserAssignedDeviceNameKey = |
- CFSTR("ICAUserAssignedDeviceNameKey"); |
-const CFStringRef kICDeviceNameKey = CFSTR("ifil"); |
-const CFStringRef kICDeviceBSDNameKey = CFSTR("bsdName"); |
- |
-CFStringRef CopyMountPointFromBSDName(CFStringRef bsd_name) { |
- base::mac::ScopedCFTypeRef<DASessionRef> session( |
- DASessionCreate(kCFAllocatorDefault)); |
- if (!session.get()) |
- return NULL; |
- |
- base::mac::ScopedCFTypeRef<DADiskRef> disk( |
- DADiskCreateFromBSDName(kCFAllocatorDefault, session.get(), |
- base::SysCFStringRefToUTF8(bsd_name).c_str())); |
- if (!disk.get()) |
- return NULL; |
- |
- base::mac::ScopedCFTypeRef<CFDictionaryRef> description( |
- DADiskCopyDescription(disk)); |
- if (!description.get()) |
- return NULL; |
- |
- CFURLRef mount_point = base::mac::GetValueFromDictionary<CFURLRef>( |
- description, kDADiskDescriptionVolumePathKey); |
- if (!mount_point) |
- return NULL; |
- |
- return CFURLCopyFileSystemPath(mount_point, kCFURLPOSIXPathStyle); |
-} |
- |
-bool GetDeviceInfo(unsigned long device_number, std::string* name, |
- FilePath* location) { |
- ICACopyObjectPropertyDictionaryPB properties_request; |
- properties_request.object = device_number; |
- CFDictionaryRef device_properties; |
- properties_request.theDict = &device_properties; |
- if (ICACopyObjectPropertyDictionary(&properties_request, NULL) != noErr) |
- return false; |
- base::mac::ScopedCFTypeRef<CFDictionaryRef> scoped_device_properties( |
- device_properties); |
- |
- CFStringRef device_name = base::mac::GetValueFromDictionary<CFStringRef>( |
- device_properties, kICAUserAssignedDeviceNameKey); |
- if (device_name == NULL) { |
- device_name = base::mac::GetValueFromDictionary<CFStringRef>( |
- device_properties, kICDeviceNameKey); |
- } |
- if (device_name == NULL) |
- return false; |
- *name = base::SysCFStringRefToUTF8(device_name); |
- |
- // TODO(vandebo) Support all media device, for now we only support mass |
- // storage media devices. |
- CFStringRef device = base::mac::GetValueFromDictionary<CFStringRef>( |
- device_properties, kICDeviceBSDNameKey); |
- if (device == NULL) |
- return false; |
- base::mac::ScopedCFTypeRef<CFStringRef> |
- path(CopyMountPointFromBSDName(device)); |
- if (path.get() == NULL) |
- return false; |
- |
- *location = FilePath(base::SysCFStringRefToUTF8(path).c_str()); |
- |
- return true; |
-} |
- |
-void MediaDeviceNotificationCallback(CFStringRef notification_type, |
- CFDictionaryRef notification_dictionary) { |
- bool attach = false; |
- if (CFEqual(notification_type, kICANotificationTypeDeviceAdded)) { |
- attach = true; |
- } else if (!CFEqual(notification_type, kICANotificationTypeDeviceRemoved)) { |
- return; |
- } |
- |
- base::SystemMonitor* system_monitor = base::SystemMonitor::Get(); |
- |
- CFNumberRef device_number_object = |
- base::mac::GetValueFromDictionary<CFNumberRef>( |
- notification_dictionary, kICANotificationDeviceICAObjectKey); |
- unsigned long device_number = |
- [base::mac::CFToNSCast(device_number_object) unsignedLongValue]; |
- if (attach) { |
- std::string device_name; |
- FilePath location; |
- if (GetDeviceInfo(device_number, &device_name, &location)) { |
- system_monitor->ProcessMediaDeviceAttached(device_number, device_name, |
- location); |
- } |
- } else { |
- system_monitor->ProcessMediaDeviceDetached(device_number); |
- } |
-} |
- |
-} // namespace |
- |
-void StartMediaDeviceNotifications() { |
- NSArray* events_of_interest = [NSArray arrayWithObjects: |
- (id)kICANotificationTypeDeviceAdded, |
- (id)kICANotificationTypeDeviceRemoved, |
- nil]; |
- |
- ICARegisterForEventNotificationPB notification_request; |
- notification_request.objectOfInterest = 0; // Zero means all objects |
- notification_request.eventsOfInterest = |
- base::mac::NSToCFCast(events_of_interest); |
- notification_request.notificationProc = &MediaDeviceNotificationCallback; |
- notification_request.options = NULL; |
- OSErr err = ICARegisterForEventNotification(¬ification_request, NULL); |
- CHECK_EQ(err, noErr); |
-} |
- |
-} // namespace content |