Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
901 lines (764 sloc) 38.3 KB
# Copyright: (c) 2018, Jordan Borean (@jborean93) <jborean93@gmail.com>
# MIT License (see LICENSE or https://opensource.org/licenses/MIT)
import logging
import uuid
from pypsrp.complex_objects import Color, Coordinates, ObjectMeta, Size
log = logging.getLogger(__name__)
class PSHost(object):
def __init__(self, current_culture, current_ui_culture, debugger_enabled,
name, private_data, ui, version):
"""
Defines the properties and facilities provided by an application
hosting a RunspacePool.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshost
This is a basic implementation some methods being noop or not
implemented.
:param current_culture: pypsrp.complex_objects.CultureInfo, the host's
culture
:param current_ui_culture: pypsrp.complex_objects.CultureInfo, the
host's UI culture
:param debugger_enabled: This property enables and disables the host
debugger if debugging is supported
:param name: Gets the hosting application identification in some user-
friendly fashion.
:param private_data: Used to allow the host to pass private data
through a Runspace to cmdlets inside that Runspace
:param ui: The hosts implementation of PSHostUserInterface. Should be
None if the host that does not want to support user interaction
:param version: The version of the hosting application
"""
self.ui = ui
self.debugger_enabled = debugger_enabled
self.private_data = private_data
self.rc = None
self.name = name
self.version = version
self.instance_id = uuid.uuid4()
self.current_culture = current_culture
self.current_ui_culture = current_ui_culture
def run_method(self, method_identifier, args, runspace, pipeline=None):
"""
Run a host call method requested by the server and return the response
from this method to send back to the server.
https://msdn.microsoft.com/en-us/library/dd306624.aspx
Each method will have access to the current runspace and pipeline (if
applicable) during the method call as well as any args sent from the
server.
:param method_identifier: pypsrp.complex_objects.HostMethodIdentifier
in the host call message.
:param args: The list of arguments for the host call function.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: The response (if any) to send back to the server
"""
response = None
if method_identifier.value < 11:
func = getattr(self, str(method_identifier))
response = func(runspace, pipeline, *args)
elif method_identifier.value < 27:
func = getattr(self.ui, str(method_identifier))
response = func(runspace, pipeline, *args)
elif method_identifier.value < 52:
func = getattr(self.ui.raw_ui, str(method_identifier))
response = func(runspace, pipeline, *args)
else:
log.warning("Received unexpected/unsupported host method "
"identifier: %d" % method_identifier.value)
return response
# Start of Host Methods, the names of these functions are important as
# they line up to the names defined by MS and are sent in the host call
# messages
def GetName(self, runspace, pipeline):
"""
MI: 1
SHOULD return a string identifying the hosting application in a user
friendly way.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshost.name
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: String of the user-friendly name of the hosting application
"""
return self.name
def GetVersion(self, runspace, pipeline):
"""
MI: 2
SHOULD return the version number of the hosting application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshost.version
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: Version number of the hosting application
"""
meta = ObjectMeta("Version")
value = runspace.serialize(self.version, meta)
return value
def GetInstanceId(self, runspace, pipeline):
"""
MI: 3
SHOULD return a GUID that uniquely identifies the hosting application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshost.instanceid
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: GUID of the hosting application
"""
return self.instance_id
def GetCurrentCulture(self, runspace, pipeline):
"""
MI: 4
SHOULD return the host's culture.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshost.currentculture
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: pypsrp.complex_objects.CultureInfo of the host's culture
"""
return self.current_culture
def GetCurrentUICulture(self, runspace, pipeline):
"""
MI: 5
MUST return the host's UI culture.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshost.currentuiculture
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: pypsrp.complex_objects.CultureInfo of the host's UI culture
"""
return self.current_ui_culture
def SetShouldExit(self, runspace, pipeline, exit_code):
"""
MI: 6
SHOULD shut down the hosting application and close the current
runspace. The default implementation just sets the rc on the host
object and doesn't shutdown the runspace.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshost.setshouldexit
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param exit_code: The exit code accompanying the exit keyword.
Typically after exiting a runspace, a host will also terminate
"""
self.rc = exit_code
def EnterNestedPrompt(self, runspace, pipeline):
"""
MI: 7
SHOULD interrupt the current pipeline and start a nested pipeline.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshost.enternestedprompt
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
"""
raise NotImplementedError()
def ExitNestedPrompt(self, runspace, pipeline):
"""
MI: 8
SHOULD stop the nested pipeline and resume the current pipeline.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshost.exitnestedprompt
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
"""
raise NotImplementedError()
def NotifyBeginApplication(self, runspace, pipeline):
"""
MI: 9
Called by an application to indicate that it is executing a command
line application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshost.notifybeginapplication
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
"""
pass
def NotifyEndApplication(self, runspace, pipeline):
"""
MI: 10
Called by an application to indicate that it has finished executing a
command line application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshost.notifyendapplication
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
"""
pass
class PSHostUserInterface(object):
def __init__(self, raw_ui=None):
"""
Defines the properties and facilities provided by a hosting application
deriving from PSHost that offers dialog-oriented and line-oriented
interactive features.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface
This is a basic implementation some methods being noop or not
implemented.
:param raw_ui: Implementation of PSHostRawUserInterface, set to None
if there is no raw user interface
"""
self.raw_ui = raw_ui
# the below properties don't need to be used, they are just here for
# the default implementation
self.stdout = []
self.stderr = []
def ReadLine(self, runspace, pipeline):
"""
MI: 11
SHOULD read a line of characters from a user.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.readline
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: A string of characters to return to the read line call
"""
raise NotImplementedError()
def ReadLineAsSecureString(self, runspace, pipeline):
"""
MI: 12
SHOULD read a line of characters from a user, with the user input not
echoed.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.readlineassecurestring
Because the return value is meant to be a SecureString, the user must
either have called or will call runspace.exchange_keys() in this
implementation so that the serializer can create the string.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: The characters types by the user in an encrypted form
"""
raise NotImplementedError()
def Write1(self, runspace, pipeline, value):
"""
MI: 13
SHOULD write specified characters on the hosting application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.write
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param value: The string of characters to be written
"""
self.stdout.append(value)
def Write2(self, runspace, pipeline, foreground_color, background_color,
value):
"""
MI: 14
SHOULD write the specified characters with the specified foreground and
background color on the hosting application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.write
This implementation just adds this result to the stdout list and
ignores the colors, create your own method implementation if you wish
to utilise this correctly
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param foreground_color: The int value of pypsrp.complex_objects.Color
of the foreground color to display the text with
:param background_color: The int value of pypsrp.complex_objects.Color
of the background color to display the text with
:param value: The string of characters to be written
"""
self.stdout.append(value)
def WriteLine1(self, runspace, pipeline):
"""
MI: 15
SHOULD write a carriage return on the hosting application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.writeline
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
"""
self.stdout.append("\r\n")
def WriteLine2(self, runspace, pipeline, value):
"""
MI: 16
SHOULD write the specified line on the hosting application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.writeline
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param value: The string of characters to be written
"""
self.stdout.append(value + "\r\n")
def WriteLine3(self, runspace, pipeline, foreground_color,
background_color, value):
"""
MI: 17
SHOULD write the specified line with the specified foreground and
background color on the hosting application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.writeline
This implementation just adds this result to the stdout list and
ignores the colors, create your own method implementation if you wish
to utilise this correctly
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param foreground_color: The int value of pypsrp.complex_objects.Color
of the foreground color to display the text with
:param background_color: The int value of pypsrp.complex_objects.Color
of the background color to display the text with
:param value: The string of characters to be written
"""
self.stdout.append(value + "\r\n")
def WriteErrorLine(self, runspace, pipeline, message):
"""
MI: 18
SHOULD write a line to the error display of the hosting application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.writeerrorline
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param message: The message to display
"""
self.stderr.append(message + "\r\n")
def WriteDebugLine(self, runspace, pipeline, message):
"""
MI: 19
SHOULD write a line to the debug display of the hosting application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.writedebugline
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param message: The message to display
"""
self.stdout.append("DEBUG: %s\r\n" % message)
def WriteProgress(self, runspace, pipeline, source_id, record):
"""
MI: 20
SHOULD display a progress record on the hosting application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.writeprogress
Because of the way MS serializes the record in the method call args,
the value for record is the serialized XML string for a ProgressRecord
message. You can manually parse it like;
from pypsrp.messages import ProgressRecord
meta = ObjectMeta("Obj", object=ProgressRecord)
rec = runspace._serializer.deserialize(record, meta)
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param source_id: Unique identifier of the source of the record
:param record: A ProgressRecord serialized as XML
"""
pass
def WriteVerboseLine(self, runspace, pipeline, message):
"""
MI: 21
SHOULD write a line on the verbose display of the hosting application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.writeverboseline
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param message: The verbose message to display
"""
self.stdout.append("VERBOSE: %s\r\n" % message)
def WriteWarningLine(self, runspace, pipeline, message):
"""
MI: 22
SHOULD write a line on the warning display of the hosting application.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.writewarningline
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param message: The warning message to display
"""
self.stdout.append("WARNING: %s\r\n" % message)
def Prompt(self, runspace, pipeline, caption, message, descriptions):
"""
MI: 23
SHOULD prompt the user with a set of choices.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.prompt
The descriptions arg is a list of GenericComplexObjects with the
following extended attributes (correlates to FieldDescription in .NET):
attributes
defaultValue
helpMessage
isMandatory
label
name
parameterAssemblyFullName
parameterTypeFullName
parameterTypeName
For example you can access the prompt name from `Read-Host -Prompt`
with descriptions[i].extended_properties['name'].
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param caption: Caption to precede or title the prompt
:param message: A text description of the set of fields to be prompted
:param descriptions: list of serialized FieldDescriptions that contain
information about each field to be prompted for
:return: Dict with results of prompting. Key are the field names from
the FieldDescriptions, the values are objects representing the
values of the corresponding fields as collected from the user.
"""
raise NotImplementedError()
def PromptForCredential1(self, runspace, pipeline, caption, message,
user_name, target_name):
"""
MI: 24
SHOULD prompt the user for entering credentials with the specified
caption, message, user name and target name.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.promptforcredential
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param caption: Caption for the message
:param message: Text description for the credential to be prompted
:param user_name: Name of the user whose credential is to be prompted
for. If set to null or empty string, the function will prompt for
the user name first
:param target_name: Name of the target for which the credential is
being collected
:return: PSCredential object of the user input credential
"""
raise NotImplementedError()
def PromptForCredential2(self, runspace, pipeline, caption, message,
user_name, target_name, allowed_credential_types,
options):
"""
MI: 25
SHOULD prompt the user for entering credentials with the specified
caption, message, username, target name, allowed credential types and
options.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.promptforcredential
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param caption: Caption for the message
:param message: Text description for the credential to be prompted
:param user_name: Name of the user whose credential is to be prompted
for. If set to null or empty string, the function will prompt for
the user name first
:param target_name: Name of the target for which the credential is
being collected
:param allowed_credential_types: the int value for PSCredentialTypes,
types of credentials that can be supplied by the user
:param options: the int value for PSCredentialUIOptions, options that
control the credential gathering UI behavior
:return: PSCredential object of the user input credential
"""
raise NotImplementedError()
def PromptForChoice(self, runspace, pipeline, caption, message, choices,
default_choice):
"""
MI: 26
SHOULD display a list of choices to the user and MUST return the index
of the selected option.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.promptforchoice
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param caption: The caption to precede or title the prompt
:param message: A message that describes what the choice is for
:param choices: A list of serialized (GenericComplexObject)
ChoiceDescription objects that describe each choice
:param default_choice: The index of the label in the choices collection
element to be present to the user as the default choice, -1 means
no default
:return: The index of the choices element that corresponds to the
option selected
"""
raise NotImplementedError()
class PSHostRawUserInterface(object):
def __init__(self, window_title, cursor_size, foreground_color,
background_color, cursor_position, window_position,
buffer_size, max_physical_window_size, max_window_size,
window_size):
"""
Defines the lowest-level user interface functions that an interactive
application hosting a Runspace can choose to implement if it wants
to support any cmdlet that does character-mode interaction with the
user.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostrawuserinterface
This is a basic framework implementation with the majority of the
methods not implemented or tested.
:param window_title: The titlebar text of the current view window
:param cursor_size: The size of the cursor as a percentage (0 to 100)
:param foreground_color: The pypsrp.complex_objects.Color used to
render characters on the screen buffer
:param background_color: The pypsrp.complex_objects.Color used to
render the backfround behind characters on the screen buffer
:param cursor_position: The pypsrp.complex_objects.Coordinates of the
position of the cursor in the screen buffer
:param window_position: The pypsrp.complex_objects.Coordinates of the
position of the window relative to the screen buffer, (0, 0) is the
upper left of the screen buffer
:param buffer_size: The pypsrp.complex_objects.Size of the screen
buffer
:param max_physical_window_size: The pypsrp.complex_objects.Size of the
largest windows possible for the display hardward
:param max_window_size: The pypsrp.complex_objects.Size of the window
possible for the current buffer
:param window_size: The pypsrp.complex_objects.Size of the current
window, cannot be larger than max_physical_window_size
"""
self.key_available = False
self.window_title = window_title
self.cursor_size = cursor_size
self.foreground_color = foreground_color
self.background_color = background_color
self.cursor_position = cursor_position
self.window_position = window_position
self.buffer_size = buffer_size
self.max_physical_window_size = max_physical_window_size
self.max_window_size = max_window_size
self.window_size = window_size
def GetForegroundColor(self, runspace, pipeline):
"""
MI: 27
SHOULD return the foreground color of the hosting application.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: A pypsrp.complex_objects.Color to return to the server
"""
return self.foreground_color
def SetForegroundColor(self, runspace, pipeline, color):
"""
MI: 28
SHOULD set the foreground color of the hosting application.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param color: The int value for pypsrp.complex_objects.Color to set
"""
self.foreground_color = Color(value=color)
def GetBackgroundColor(self, runspace, pipeline):
"""
MI: 29
SHOULD return the background color of the hosting application.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: A pypsrp.complex_objects.Color to return to the server
"""
return self.background_color
def SetBackgroundColor(self, runspace, pipeline, color):
"""
MI: 30
SHOULD set the background color of the hosting application.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param color: The int value for pypsrp.complex_objects.Color to set
"""
self.background_color = Color(value=color)
def GetCursorPosition(self, runspace, pipeline):
"""
MI: 31
SHOULD return the current cursor position in the hosting application.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: A pypsrp.complex_objects.Coordinates to return to the server
"""
return self.cursor_position
def SetCursorPosition(self, runspace, pipeline, coordinates):
"""
MI: 32
SHOULD return the current cursor position in the hosting application.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param coordinates: A GenericComplexObject that contains the extended
properties for the coordinates
"""
pos = Coordinates(x=coordinates.extended_properties['x'],
y=coordinates.extended_properties['y'])
self.cursor_position = pos
def GetWindowPosition(self, runspace, pipeline):
"""
MI: 33
SHOULD return the position of the view window relative to the screen
buffer.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: A pypsrp.complex_objects.Coordinates to return to the server
"""
return self.window_position
def SetWindowPosition(self, runspace, pipeline, coordinates):
"""
MI: 34
SHOULD set the position of the view window relative to the screen
buffer.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param coordinates: A GenericComplexObject that contains the extended
properties for the coordinates
"""
pos = Coordinates(x=coordinates.extended_properties['x'],
y=coordinates.extended_properties['y'])
self.window_position = pos
def GetCursorSize(self, runspace, pipeline):
"""
MI: 35
SHOULD return the cursor size as a percentage.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: The int value for the cursor size
"""
return self.cursor_size
def SetCursorSize(self, runspace, pipeline, percentage):
"""
MI: 36
SHOULD set the cursor size based on the percentage value specified.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param percentage: The int value representing the cursor size
"""
self.cursor_size = percentage
def GetBufferSize(self, runspace, pipeline):
"""
MI: 37
SHOULD return the current size of the screen buffer, measured in
character cells.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: pypsrp.complex_object.Size of the screen buffer, measured in
character cells
"""
return self.buffer_size
def SetBufferSize(self, runspace, pipeline, size):
"""
MI: 38
SHOULD set the size of the screen buffer with the specified size in
character cells.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param size: A GenericComplexObject that contains the extended
properties for the size
"""
obj = Size(height=size.extended_properties['height'],
width=size.extended_properties['width'])
self.buffer_size = obj
def GetWindowSize(self, runspace, pipeline):
"""
MI: 39
SHOULD return the current view window size.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: pypsrp.complex_objects.Size of the current window
"""
return self.window_size
def SetWindowSize(self, runspace, pipeline, size):
"""
MI: 40
SHOULD set the view window size based on the size specified.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param size: A GenericComplexObject that contains the extended
properties for the size
"""
obj = Size(height=size.extended_properties['height'],
width=size.extended_properties['width'])
self.window_size = obj
def GetWindowTitle(self, runspace, pipeline):
"""
MI: 41
SHOULD return the title of the hosting application's window.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: The window title of the hosting application
"""
return self.window_title
def SetWindowTitle(self, runspace, pipeline, title):
"""
MI: 42
SHOULD set the view window size based on the size specified.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param title: The string for the window title to set
"""
self.window_title = title
def GetMaxWindowSize(self, runspace, pipeline):
"""
MI: 43
SHOULD return the maximum window size possible for the current buffer,
current font, and current display hardware.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: pypsrp.complex_objects.Size of the max possible window size
"""
return self.max_window_size
def GetMaxPhysicalWindowSize(self, runspace, pipeline):
"""
MI: 44
SHOULD return the maximum window size possible for the current font and
current display hardware, ignoring the current buffer size.
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: pypsrp.complex_objects.Size of the max physically possible
window size
"""
return self.max_physical_window_size
def GetKeyAvailable(self, runspace, pipeline):
"""
MI: 45
SHOULD examine if a keystroke is waiting on the input, returning TRUE
if so and FALSE otherwise
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:return: bool if a keystroke is waiting on the input
"""
return self.key_available
def ReadKey(self, runspace, pipeline, options=4):
"""
MI: 46
SHOULD read a key stroke from the keyboard, blocking until a key is
typed.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostrawuserinterface.readkey
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param options: Bit mask combo of ReadKeyOptions, default is
ReadKeyOptions.IncludeKeyDown
:return: KeyInfo - key stroke depending on the value of options
"""
raise NotImplementedError()
def FlushInputBuffer(self, runspace, pipeline):
"""
MI: 47
SHOULD reset the keyboard input buffer.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostrawuserinterface.flushinputbuffer
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
"""
pass
def SetBufferContents1(self, runspace, pipeline, rectangle, fill):
"""
MI: 49
SHOULD copy the specified buffer cell into all the cells within the
specified rectangle.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostrawuserinterface.setbuffercontents
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param rectange: A GenericComplexObject that represents the rectangle
in which to fill. If all element are -1, the entire screen buffer
will be copied with fill. Contains the following extended
properties: left, top, right, bottom
:param fill: A GenericComplexObject of the characters and attributes
used to fill the rectangle
"""
pass
def SetBufferContents2(self, runspace, pipeline, origin, contents):
"""
MI: 48
SHOULD copy the specified buffer cell array into the screen buffer at
the specified coordinates (as specified in section 2.2.3.1).
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostrawuserinterface.setbuffercontents
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param origin: A GenericComplexObject that represents the coordinates,
x and y are extended properties of this object
origin.extended_properties['x']
origin.extended_properties['y']
:param contents: A rectangle of BufferCell objects to be copied to the
screen buffer. This is also a GenericComplexObject which is a multi
dimensional array.
https://msdn.microsoft.com/en-us/library/dd340684.aspx
# number of elements in each row
contents.extended_properties['mal']
# each BufferCell is in this list, use mal to determine what
# rows they are in
contents.extended_properties['mae']
"""
pass
def GetBufferContents(self, runspace, pipeline, rectangle):
"""
MI: 50
SHOULD return the contents in a specified rectangular region of the
hosting application's window and MUST return an array of buffer cells.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostrawuserinterface.getbuffercontents
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param rectangle: The rectangle on the screen buffer to extract
:return: A pypsrp.complex_objects.Array of BufferCell objects extracted
from the rectangular region of the screen buffer specified by
rectangle
"""
raise NotImplementedError()
def ScrollBufferContents(self, runspace, pipeline, source, destination,
clip, fill):
"""
MI: 51
SHOULD scroll a region on the screen buffer.
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostrawuserinterface.scrollbuffercontents
:param runspace: The runspace the host call relates to
:param pipeline: The pipeline (if any) that the call relates to
:param source: Rectangle - Indicates the region of the screen to be
scrolled
:param destination: Coordinates - Indicates the upper left coordinates
of the region of the screen to receive the source region contents.
That target region is the same size as the source region
:param clip: Rectangle - Indicates the region of the screen to include
in the operation. If a cell would be changed by the operation but
does not fall within the clip region, it will be unchanged
:param fill: BufferCell - The character and attributes to be used to
fill any cells within the intersection of the source rectangle and
clipping rectangle that are left "empty" by the move
"""
pass
You can’t perform that action at this time.