/*****************************************************************************
 * RemoteControl.h
 * RemoteControlWrapper
 *
 * Created by Martin Kahr on 11.03.06 under a MIT-style license.
 * Copyright (c) 2006 martinkahr.com. All rights reserved.
 *
 * Code modified and adapted to OpenOffice.org
 * by Eric Bachard on 11.08.2008 under the same License
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 *****************************************************************************/

#import <Cocoa/Cocoa.h>

// notification names that are being used to signal that an application wants to
// have access to the remote control device or if the application has finished
// using the remote control device
extern NSString* REQUEST_FOR_REMOTE_CONTROL_NOTIFCATION;
extern NSString* FINISHED_USING_REMOTE_CONTROL_NOTIFICATION;

// keys used in user objects for distributed notifications
extern NSString* kRemoteControlDeviceName;
extern NSString* kApplicationIdentifier;
extern NSString* kTargetApplicationIdentifier;

// we have a 6 bit offset to make a hold event out of a normal event
#define EVENT_TO_HOLD_EVENT_OFFSET 6

@class RemoteControl;

typedef enum _RemoteControlEventIdentifier {
	// normal events
	kRemoteButtonPlus				=1<<1,
	kRemoteButtonMinus				=1<<2,
	kRemoteButtonMenu				=1<<3,
	kRemoteButtonPlay				=1<<4,
	kRemoteButtonRight				=1<<5,
	kRemoteButtonLeft				=1<<6,

	// hold events
	kRemoteButtonPlus_Hold			=1<<7,
	kRemoteButtonMinus_Hold			=1<<8,
	kRemoteButtonMenu_Hold			=1<<9,
	kRemoteButtonPlay_Hold			=1<<10,
	kRemoteButtonRight_Hold			=1<<11,
	kRemoteButtonLeft_Hold			=1<<12,

	// special events (not supported by all devices)
	kRemoteControl_Switched			=1<<13,

	// New values for the "metallic" Remote (2009 model)
	kMetallicRemote2009ButtonPlay		=1<<14,
	kMetallicRemote2009ButtonMiddlePlay	=1<<15

} RemoteControlEventIdentifier;

@interface NSObject(RemoteControlDelegate)

- (void) sendRemoteButtonEvent: (RemoteControlEventIdentifier) event pressedDown: (BOOL) pressedDown remoteControl: (RemoteControl*) remoteControl;

@end

/*
	Base Interface for Remote Control devices
*/
@interface RemoteControl : NSObject {
	id delegate;
}

// returns nil if the remote control device is not available
- (id) initWithDelegate: (id) remoteControlDelegate;

- (void) setListeningToRemote: (BOOL) value;
- (BOOL) isListeningToRemote;

- (BOOL) isOpenInExclusiveMode;
- (void) setOpenInExclusiveMode: (BOOL) value;

- (void) startListening: (id) sender;
- (void) stopListening: (id) sender;

// is this remote control sending the given event?
- (BOOL) sendsEventForButtonIdentifier: (RemoteControlEventIdentifier) identifier;

// sending of notifications between applications
+ (void) sendFinishedNotifcationForAppIdentifier: (NSString*) identifier;
+ (void) sendRequestForRemoteControlNotification;

// name of the device
+ (const char*) remoteControlDeviceName;

@end
