/*
 RDP Keyboard helper

 Copyright 2013 Thincast Technologies GmbH, Author: Martin Fleisz

 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
 If a copy of the MPL was not distributed with this file, You can obtain one at
 http://mozilla.org/MPL/2.0/.
 */

#import <Foundation/Foundation.h>
#import "RDPSession.h"

@class RDPKeyboard;

@protocol RDPKeyboardDelegate <NSObject>
@optional
- (void)modifiersChangedForKeyboard:(RDPKeyboard *)keyboard;
@end

@interface RDPKeyboard : NSObject
{

	RDPSession *_session;

	int _virtual_key_map[256];
	BOOL _virtual_key_shift_map[256];

	NSObject<RDPKeyboardDelegate> *_delegate;

	BOOL _ctrl_pressed;
	BOOL _alt_pressed;
	BOOL _shift_pressed;
	BOOL _win_pressed;
}

@property(assign) id<RDPKeyboardDelegate> delegate;
@property(readonly) BOOL ctrlPressed;
@property(readonly) BOOL altPressed;
@property(readonly) BOOL shiftPressed;
@property(readonly) BOOL winPressed;

// returns a keyboard instance
+ (RDPKeyboard *)getSharedRDPKeyboard;

// init the keyboard and assign the given rdp session and delegate
- (void)initWithSession:(RDPSession *)session delegate:(NSObject<RDPKeyboardDelegate> *)delegate;

// called to reset any pending key states (i.e. pressed modifier keys)
- (void)reset;

// sends the given unicode character to the server
- (void)sendUnicode:(int)character;

// send a key stroke event using the given virtual key code
- (void)sendVirtualKeyCode:(int)keyCode;

// send a single key down or up event for the given virtual key code
- (void)sendVirtualKey:(int)vKey up:(BOOL)up;

// toggle ctrl key, returns true if pressed, otherwise false
- (void)toggleCtrlKey;

// toggle alt key, returns true if pressed, otherwise false
- (void)toggleAltKey;

// toggle shift key, returns true if pressed, otherwise false
- (void)toggleShiftKey;

// toggle windows key, returns true if pressed, otherwise false
- (void)toggleWinKey;

// send key strokes
- (void)sendEnterKeyStroke;
- (void)sendEscapeKeyStroke;
- (void)sendBackspaceKeyStroke;

@end
