PageRenderTime 1518ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/veewee/provider/parallels/box/helper/console_type.rb

https://github.com/maestrodev/veewee
Ruby | 182 lines | 152 code | 21 blank | 9 comment | 3 complexity | b8c6ce4e5a3803ca9a004ceedd7d3fb9 MD5 | raw file
  1. module Veewee
  2. module Provider
  3. module Parallels
  4. module BoxCommand
  5. # Type on the console
  6. def console_type(sequence,type_options={})
  7. #FIXME
  8. send_sequence(sequence)
  9. end
  10. def send_sequence(sequence)
  11. ui.info ""
  12. counter=0
  13. sequence.each { |s|
  14. counter=counter+1
  15. ui.info "Typing:[#{counter}]: "+s
  16. # No need to send the state, we always PRESS then RELEASE.
  17. # So we send the whole string at once and press/release every string item
  18. keystring=self.string_to_parallels_keycode_string(s)
  19. send_string(keystring);
  20. }
  21. ui.info "Done typing."
  22. ui.info ""
  23. end
  24. def send_string(keystring)
  25. python_script=File.join(File.dirname(__FILE__),'..','..','..','..','..','python','parallels_send_string.py')
  26. command="python #{python_script} '#{self.name}' '#{keystring}'"
  27. shell_results=shell_exec("#{command}")
  28. end
  29. # Returns array
  30. def press_key(key)
  31. return key
  32. end
  33. # Returns array
  34. def shift(sequence)
  35. seq=Array.new
  36. seq << press_key('SHIFT_LEFT')
  37. # We never apply SHIFT_LEFT to more than one logical character at a
  38. # time
  39. seq << sequence
  40. return seq
  41. end
  42. def string_to_parallels_keycode_string(thestring)
  43. # Setup one key presses
  44. k=Hash.new
  45. for key in 'A'..'Z'
  46. k[key] = shift(press_key(key))
  47. end
  48. for key in 'a'..'z'
  49. k[key] = press_key(key.upcase)
  50. end
  51. for key in '0'..'9'
  52. k[key] = press_key(key.upcase)
  53. end
  54. k['>'] = shift(press_key('GREATER'))
  55. k['.'] = press_key('GREATER')
  56. k['<'] = shift(press_key('LESS'))
  57. k[':'] = shift(press_key('COLON'))
  58. k[';'] = press_key('COLON')
  59. k['/'] = press_key('SLASH')
  60. k[' '] = press_key('SPACE')
  61. k['-'] = press_key('MINUS')
  62. k['\''] = press_key('QUOTE')
  63. k['{'] = press_key('CBRACE_LEFT')
  64. k['}'] = press_key('CBRACE_RIGHT')
  65. k['`'] = press_key('TILDA')
  66. k['~'] = shift(press_key('TILDA'))
  67. k['_'] = shift(press_key('MINUS'))
  68. k['?'] = shift(press_key('SLASH'))
  69. k['"'] = shift(press_key('QUOTE'))
  70. k[')'] = shift(press_key('0'))
  71. k['!'] = shift(press_key('1'))
  72. k['@'] = shift(press_key('2'))
  73. k['#'] = shift(press_key('3'))
  74. k['$'] = shift(press_key('4'))
  75. k['%'] = shift(press_key('5'))
  76. k['^'] = shift(press_key('6'))
  77. k['&'] = shift(press_key('7'))
  78. k['*'] = shift(press_key('8'))
  79. k['('] = shift(press_key('9'))
  80. k['|'] = shift(press_key('BACKSLASH'))
  81. k[','] = press_key('LESS')
  82. k['\\'] = press_key('BACKSLASH')
  83. k['+'] = shift(press_key('PLUS'))
  84. k['='] = press_key('PLUS')
  85. # Setup special keys
  86. special=Hash.new;
  87. special['<Enter>'] = [{ 'code' => 'ENTER', 'state' => 'press' }]
  88. special['<Backspace>'] = [{ 'code' => 'BACKSPACE', 'state' => 'press' }]
  89. special['<Spacebar>'] = [{ 'code' => 'SPACE', 'state' => 'press' }]
  90. special['<Return>'] = [{ 'code' => 'RETURN', 'state' => 'press' }]
  91. special['<Esc>'] = [{ 'code' => 'ESC', 'state' => 'press' }]
  92. special['<Tab>'] = [{ 'code' => 'TAB', 'state' => 'press' }]
  93. #FIXME
  94. special['<KillX>'] = '1d 38 0e';
  95. special['<Wait>'] = [{'code' => 'wait', 'state' => ''}];
  96. special['<Up>'] = [{ 'code' => 'UP', 'state' => 'press' }]
  97. special['<Down>'] = [{ 'code' => 'DOWN', 'state' => 'press' }]
  98. special['<PageUp'] = [{ 'code' => 'PAGE_UP', 'state' => 'press' }]
  99. special['<PageDown'] = [{ 'code' => 'PAGE_DOWN', 'state' => 'press' }]
  100. special['<End>'] = [{ 'code' => 'END', 'state' => 'press' }]
  101. special['<Insert>'] = [{ 'code' => 'INSERT', 'state' => 'press' }]
  102. special['<Delete>'] = [{ 'code' => 'DELETE', 'state' => 'press' }]
  103. special['<Left>'] = [{ 'code' => 'LEFT', 'state' => 'press' }]
  104. special['<Right>'] = [{ 'code' => 'RIGHT', 'state' => 'press' }]
  105. special['<Home>'] = [{ 'code' => 'HOME', 'state' => 'press' }]
  106. for i in 1..12 do
  107. special["<F#{i}>"] = press_key("F#{i}")
  108. end
  109. keycodes= ""
  110. until thestring.length == 0
  111. nospecial=true;
  112. special.keys.each { |key|
  113. if thestring.start_with?(key)
  114. #take thestring
  115. #check if it starts with a special key + pop special string
  116. if key=="<Wait>"
  117. sleep 1
  118. else
  119. special[key].each do |c|
  120. keycodes.concat("#{c['code']} ")
  121. end
  122. end
  123. thestring=thestring.slice(key.length,thestring.length-key.length)
  124. nospecial=false;
  125. break;
  126. end
  127. }
  128. if nospecial
  129. code=k[thestring.slice(0,1)]
  130. if !code.nil?
  131. code=[code] if code.class==String
  132. code.each do |c|
  133. if(c == 'SHIFT_LEFT')
  134. keycodes.concat("#{c}\#")
  135. else
  136. keycodes.concat("#{c} ")
  137. end
  138. end
  139. else
  140. ui.info "no scan code for #{thestring.slice(0,1)}"
  141. end
  142. #pop one
  143. thestring=thestring.slice(1,thestring.length-1)
  144. end
  145. end
  146. return keycodes
  147. end
  148. end
  149. end
  150. end
  151. end
  152. #
  153. # {'WWW_FAVORITES': (224, 102), 'LESS': (51,), 'F23': (110,), 'F22': (109,), 'F21': (108,), 'F20': ( 107,), 'F24': (118,), 'VOLUME_DOWN': (224, 46), 'MINUS': (12,), 'EUROPE_1': (43,), 'ZENKAKU_HANKAKU': (118,), 'QUOTE': (40,), 'HANGUEL': (242,), '0': (11,), 'PLUS': (13,), '4': (5,), 'TAB': (15,),'8': (9,), 'RO': (115,), 'PAD_STAR': (55,), 'D': (32,), 'EJECT': (224, 99), 'HIRAGANA_KATAKANA': 112,), 'APP_MAIL': (224, 108), 'HANJA': (241,), 'L': (38,), 'P': (25,), 'T': (20,), 'SLASH': (53,, 'ENTER': (28,), 'X': (45,), 'KATAKANA': (120,), 'GREATER': (52,), 'APP_MY_COMPUTER': (224, 107), 'MENU': (224, 93), 'PAD_MINUS': (74,), 'WWW_REFRESH': (224, 103), 'PAD_SLASH': (224, 53), 'YEN':(125,), 'WWW_BACK': (224, 106), 'DELETE': (224, 83), 'MEDIA_PREV_TRACK': (224, 16), 'SYSTEM_WAKE': (224, 99), 'WWW_FORWARD': (224, 105), 'PAGE_UP': (224, 73), 'DOWN': (224, 80), 'MEDIA_STOP': (224, 36), 'BACKSPACE': (14,), 'HOME': (224, 71), 'CMD_LEFT': (224, 91), 'ALT_RIGHT': (224, 56), 'VOLUME_UP': (224, 48), 'APP_CALCULATOR': (224, 33), 'CBRACE_LEFT': (26,), 'WWW_STOP': (224, 104), 'SPACE': (57,), 'MEDIA_SELECT': (224, 109), 'MEDIA_NEXT_TRACK': (224, 25), '3': (4,), 'COLON': (39,),'PAD_PLUS': (78,), '7': (8,), 'TILDA': (41,), 'C': (46,), 'MUHENKAN': (123,), 'END': (224, 79), 'G': (34,), 'M': (50,), 'K': (37,), 'CMD_RIGHT': (224, 92), 'F18': (105,), 'F19': (106,), 'O': (24,, 'W': (17,), 'F12': (88,), 'F13': (100,), 'F10': (68,), 'F11': (87,), 'F16': (103,), 'F17': (104,), 'F14': (101,), 'F15': (102,), 'SYSTEM_POWER': (224, 94), 'PRINT_SCREEN': (224, 42, 224, 55), 'S': (31,), 'SHIFT_LEFT': (42,), 'PAD_3': (81,), 'U': (22,), 'SCROLL_LOCK': (70,), 'NUM_8': (9,), 'NUM_9': (10,), 'ALT_LEFT': (56,), 'NUM_0': (11,), 'NUM_1': (2,), 'NUM_2': (3,), 'NUM_3': (4,), 'NUM_4': (5,), 'NUM_5': (6,), 'NUM_6': (7,), 'NUM_7': (8,), 'WWW_SEARCH': (224, 101), 'HIRAGANA': (119,), 'BACKSLASH': (43,), 'MEDIA_PLAY_PAUSE': (224, 34), '2': (3,), '6': (7,), 'LEFT': (224, 75), 'B': (48,), 'F': (33,), 'HENKAN': (121,), 'N': (49,), 'R': (19,), 'NUM_LOCK': (69,), 'V': (47,), 'Z': (44,), 'EURO': (224, 51), 'F1': (59,), 'F2': (60,), 'F3': (61,), 'F4': (62,), 'F5': (63,), 'F6': (64,), 'F7': (65,), 'F8': (66,), 'F9': (67,), 'BREAK': (224, 70, 224, 198), 'CTRL_LEFT': (29,), CAPS_LOCK': (58,), 'UP': (224, 72), 'PRINT_SCREEN2': (224, 55), 'LESS_GREATER': (86,), 'PAUSE_BREAK': (225, 29, 69, 225, 157, 197), 'INSERT': (224, 82), 'CBRACE_RIGHT': (27,), '1': (2,), 'PAD_9':(73,), 'PAD_8': (72,), '5': (6,), 'H': (35,), '9': (10,), 'PAD_2': (80,), 'PAD_1': (79,), 'PAD_0': (82,), 'PAD_7': (71,), 'PAD_6': (77,), 'PAD_5': (76,), 'PAD_4': (75,), 'A': (30,), 'PAGE_DOWN': 224, 81), 'J': (36,), 'E': (18,), 'PC9800_KEYPAD': (92,), 'MUTE': (224, 32), 'I': (23,), 'DOLLAR': (224, 52), 'Q': (16,), 'SYSTEM_SLEEP': (224, 95), 'ESC': (1,), 'Y': (21,), 'PAD_DEL': (83,), 'BRAZILIAN_KEYPAD': (126,), 'RIGHT': (224, 77), 'SHIFT_RIGHT': (54,), 'PAD_EQUAL': (89,), 'PAD_ENTER': (224, 28), 'SYSRQ': (84,), 'WWW_HOME': (224, 50), 'CTRL_RIGHT': (224, 29)}