1*b1cdbd2cSJim Jagielski/***************************************************************************** 2*b1cdbd2cSJim Jagielski * RemoteControl.m 3*b1cdbd2cSJim Jagielski * RemoteControlWrapper 4*b1cdbd2cSJim Jagielski * 5*b1cdbd2cSJim Jagielski * Created by Martin Kahr on 11.03.06 under a MIT-style license. 6*b1cdbd2cSJim Jagielski * Copyright (c) 2006 martinkahr.com. All rights reserved. 7*b1cdbd2cSJim Jagielski * 8*b1cdbd2cSJim Jagielski * Code modified and adapted to OpenOffice.org 9*b1cdbd2cSJim Jagielski * by Eric Bachard on 11.08.2008 under the same License 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * Permission is hereby granted, free of charge, to any person obtaining a 12*b1cdbd2cSJim Jagielski * copy of this software and associated documentation files (the "Software"), 13*b1cdbd2cSJim Jagielski * to deal in the Software without restriction, including without limitation 14*b1cdbd2cSJim Jagielski * the rights to use, copy, modify, merge, publish, distribute, sublicense, 15*b1cdbd2cSJim Jagielski * and/or sell copies of the Software, and to permit persons to whom the 16*b1cdbd2cSJim Jagielski * Software is furnished to do so, subject to the following conditions: 17*b1cdbd2cSJim Jagielski * 18*b1cdbd2cSJim Jagielski * The above copyright notice and this permission notice shall be included 19*b1cdbd2cSJim Jagielski * in all copies or substantial portions of the Software. 20*b1cdbd2cSJim Jagielski * 21*b1cdbd2cSJim Jagielski * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22*b1cdbd2cSJim Jagielski * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23*b1cdbd2cSJim Jagielski * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 24*b1cdbd2cSJim Jagielski * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25*b1cdbd2cSJim Jagielski * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26*b1cdbd2cSJim Jagielski * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27*b1cdbd2cSJim Jagielski * THE SOFTWARE. 28*b1cdbd2cSJim Jagielski * 29*b1cdbd2cSJim Jagielski *****************************************************************************/ 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski#import "RemoteControl.h" 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski// notifaction names that are being used to signal that an application wants to 34*b1cdbd2cSJim Jagielski// have access to the remote control device or if the application has finished 35*b1cdbd2cSJim Jagielski// using the remote control device 36*b1cdbd2cSJim JagielskiNSString* REQUEST_FOR_REMOTE_CONTROL_NOTIFCATION = @"mac.remotecontrols.RequestForRemoteControl"; 37*b1cdbd2cSJim JagielskiNSString* FINISHED_USING_REMOTE_CONTROL_NOTIFICATION = @"mac.remotecontrols.FinishedUsingRemoteControl"; 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski// keys used in user objects for distributed notifications 40*b1cdbd2cSJim JagielskiNSString* kRemoteControlDeviceName = @"RemoteControlDeviceName"; 41*b1cdbd2cSJim JagielskiNSString* kApplicationIdentifier = @"CFBundleIdentifier"; 42*b1cdbd2cSJim Jagielski// bundle identifier of the application that should get access to the remote control 43*b1cdbd2cSJim Jagielski// this key is being used in the FINISHED notification only 44*b1cdbd2cSJim JagielskiNSString* kTargetApplicationIdentifier = @"TargetBundleIdentifier"; 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski 47*b1cdbd2cSJim Jagielski@implementation RemoteControl 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski// returns nil if the remote control device is not available 50*b1cdbd2cSJim Jagielski- (id) initWithDelegate: (id) _remoteControlDelegate { 51*b1cdbd2cSJim Jagielski if ( (self = [super init]) ) { 52*b1cdbd2cSJim Jagielski delegate = [_remoteControlDelegate retain]; 53*b1cdbd2cSJim Jagielski#ifdef DEBUG 54*b1cdbd2cSJim Jagielski NSLog( @"Apple RemoteControl initWithDelegate ok"); 55*b1cdbd2cSJim Jagielski#endif 56*b1cdbd2cSJim Jagielski } 57*b1cdbd2cSJim Jagielski return self; 58*b1cdbd2cSJim Jagielski} 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski- (void) dealloc { 61*b1cdbd2cSJim Jagielski [delegate release]; 62*b1cdbd2cSJim Jagielski [super dealloc]; 63*b1cdbd2cSJim Jagielski} 64*b1cdbd2cSJim Jagielski 65*b1cdbd2cSJim Jagielski- (void) setListeningToRemote: (BOOL) value { 66*b1cdbd2cSJim Jagielski#ifdef DEBUG 67*b1cdbd2cSJim Jagielski NSLog( @"Apple RemoteControl setListeningToRemote ok"); 68*b1cdbd2cSJim Jagielski#endif 69*b1cdbd2cSJim Jagielski} 70*b1cdbd2cSJim Jagielski- (BOOL) isListeningToRemote { 71*b1cdbd2cSJim Jagielski return NO; 72*b1cdbd2cSJim Jagielski} 73*b1cdbd2cSJim Jagielski 74*b1cdbd2cSJim Jagielski- (void) startListening: (id) sender { 75*b1cdbd2cSJim Jagielski#ifdef DEBUG 76*b1cdbd2cSJim Jagielski NSLog( @"Apple RemoteControl startListening ok"); 77*b1cdbd2cSJim Jagielski#endif 78*b1cdbd2cSJim Jagielski} 79*b1cdbd2cSJim Jagielski- (void) stopListening: (id) sender { 80*b1cdbd2cSJim Jagielski#ifdef DEBUG 81*b1cdbd2cSJim Jagielski NSLog( @"Apple RemoteControl stopListening ok"); 82*b1cdbd2cSJim Jagielski#endif 83*b1cdbd2cSJim Jagielski} 84*b1cdbd2cSJim Jagielski 85*b1cdbd2cSJim Jagielski- (BOOL) isOpenInExclusiveMode { 86*b1cdbd2cSJim Jagielski return YES; 87*b1cdbd2cSJim Jagielski} 88*b1cdbd2cSJim Jagielski- (void) setOpenInExclusiveMode: (BOOL) value { 89*b1cdbd2cSJim Jagielski} 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski- (BOOL) sendsEventForButtonIdentifier: (RemoteControlEventIdentifier) identifier { 92*b1cdbd2cSJim Jagielski#ifdef DEBUG 93*b1cdbd2cSJim Jagielski NSLog( @"Apple RemoteControl: sending event for button identifier\n"); 94*b1cdbd2cSJim Jagielski#endif 95*b1cdbd2cSJim Jagielski return YES; 96*b1cdbd2cSJim Jagielski} 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski+ (void) sendDistributedNotification: (NSString*) notificationName targetBundleIdentifier: (NSString*) targetIdentifier 99*b1cdbd2cSJim Jagielski{ 100*b1cdbd2cSJim Jagielski NSDictionary* userInfo = [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithCString:[self remoteControlDeviceName] encoding:NSASCIIStringEncoding], 101*b1cdbd2cSJim Jagielski kRemoteControlDeviceName /* key = RemoteControlDeviceName -> OK */, 102*b1cdbd2cSJim Jagielski [[NSBundle mainBundle] bundleIdentifier] /* value = org.openoffice.script -> OK */, 103*b1cdbd2cSJim Jagielski kApplicationIdentifier/* key = CFBundleIdentifier -> OK */, 104*b1cdbd2cSJim Jagielski targetIdentifier /*value = AppleIRController -> OK */, 105*b1cdbd2cSJim Jagielski kTargetApplicationIdentifier /*targetBundleIdentifier -> does not appear, since the peer is nil*/, 106*b1cdbd2cSJim Jagielski nil]; 107*b1cdbd2cSJim Jagielski#ifdef DEBUG 108*b1cdbd2cSJim Jagielski NSLog( @"Apple Remote: sendDistributedNotification ..."); 109*b1cdbd2cSJim Jagielski // Debug purpose: returns all the existing dictionary keys. 110*b1cdbd2cSJim Jagielski NSEnumerator* itKey = [userInfo keyEnumerator]; 111*b1cdbd2cSJim Jagielski NSEnumerator* itVal = [userInfo objectEnumerator]; 112*b1cdbd2cSJim Jagielski for(;;) { 113*b1cdbd2cSJim Jagielski NSString* sKey = [itKey nextObject]; 114*b1cdbd2cSJim Jagielski NSString* sVal = [itVal nextObject]; 115*b1cdbd2cSJim Jagielski if( !sKey && !sVal) 116*b1cdbd2cSJim Jagielski break; 117*b1cdbd2cSJim Jagielski if( !sKey) sKey = @"nil"; 118*b1cdbd2cSJim Jagielski if( !sVal) sVal = @"nil"; 119*b1cdbd2cSJim Jagielski NSLog( @"\tARdict[\"%@\"] = \"%@\"",sKey,sVal); 120*b1cdbd2cSJim Jagielski } 121*b1cdbd2cSJim Jagielski#endif 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski [[NSDistributedNotificationCenter defaultCenter] postNotificationName:notificationName 124*b1cdbd2cSJim Jagielski object:nil 125*b1cdbd2cSJim Jagielski userInfo:userInfo 126*b1cdbd2cSJim Jagielski deliverImmediately:YES]; 127*b1cdbd2cSJim Jagielski} 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski+ (void) sendFinishedNotifcationForAppIdentifier: (NSString*) identifier { 130*b1cdbd2cSJim Jagielski [self sendDistributedNotification:FINISHED_USING_REMOTE_CONTROL_NOTIFICATION targetBundleIdentifier:identifier]; 131*b1cdbd2cSJim Jagielski#ifdef DEBUG 132*b1cdbd2cSJim Jagielski NSLog( @"Apple RemoteControl: sendFinishedNotifcationForAppIdentifier ..."); 133*b1cdbd2cSJim Jagielski#endif 134*b1cdbd2cSJim Jagielski} 135*b1cdbd2cSJim Jagielski+ (void) sendRequestForRemoteControlNotification { 136*b1cdbd2cSJim Jagielski [self sendDistributedNotification:REQUEST_FOR_REMOTE_CONTROL_NOTIFCATION targetBundleIdentifier:nil]; 137*b1cdbd2cSJim Jagielski#ifdef DEBUG 138*b1cdbd2cSJim Jagielski NSLog( @"Apple RemoteControl: sendRequestForRemoteControlNotification ..."); 139*b1cdbd2cSJim Jagielski#endif 140*b1cdbd2cSJim Jagielski} 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski+ (const char*) remoteControlDeviceName { 143*b1cdbd2cSJim Jagielski return NULL; 144*b1cdbd2cSJim Jagielski} 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski@end 147