Welcome to mirror list, hosted at ThFree Co, Russian Federation.

md__builds__remmina_remmina-ci__remmina_8wiki__development__plugin-_development__python__protocol-_example.html « public - gitlab.com/Remmina/remminadoc.gitlab.io.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 94f7a7dfd873cc7cf359cdace767b083a1a8b54f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Remmina - The GTK+ Remote Desktop Client: Example plugin to provide a new protocol</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="org.remmina.Remmina.png"/></td>
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">Remmina - The GTK+ Remote Desktop Client
   &#160;<span id="projectnumber">v1.4.33</span>
   </div>
   <div id="projectbrief">Remmina is a remote desktop client written in GTK+, aiming to be useful for system administrators and travellers, who need to work with lots of remote computers in front of either large monitors or tiny netbooks. Remmina supports multiple network protocols in an integrated and consistent user interface. Currently RDP, VNC, NX, XDMCP and SSH are supported.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('md__builds__remmina_remmina-ci__remmina_8wiki__development__plugin-_development__python__protocol-_example.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">Example plugin to provide a new protocol </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><div class="fragment"><div class="line">import sys</div><div class="line">import remmina</div><div class="line">import enum</div><div class="line">import gi</div><div class="line">import inspect</div><div class="line">gi.require_version(&quot;Gtk&quot;, &quot;3.0&quot;)</div><div class="line">from gi.repository import Gtk, GLib</div><div class="line"></div><div class="line"></div><div class="line">class VncFeature:</div><div class="line">&quot;&quot;&quot;</div><div class="line">   Internal data struct to hold ids to feature settings.</div><div class="line">&quot;&quot;&quot;</div><div class="line">    PrefQuality = 1</div><div class="line">    PrefViewonly = 2</div><div class="line">    PrefDisableserverinput = 3</div><div class="line">    ToolRefresh = 4</div><div class="line">    ToolChat = 5</div><div class="line">    ToolSendCtrlAltDel = 6</div><div class="line">    Scale = 7</div><div class="line">    Unfocus = 8</div><div class="line"></div><div class="line">class VncData:</div><div class="line">&quot;&quot;&quot;</div><div class="line">   Internal data struct to hold state.</div><div class="line">&quot;&quot;&quot;</div><div class="line">    def __init__(self):</div><div class="line">        self.connected = False</div><div class="line">        self.running = False</div><div class="line">        self.auth_called = False</div><div class="line">        self.auth_first = False</div><div class="line">        self.drawing_area = False</div><div class="line">        self.vnc_buffer = False</div><div class="line">        self.rgb_buffer = False</div><div class="line"></div><div class="line">class Plugin:</div><div class="line">&quot;&quot;&quot;</div><div class="line">   Plugin implementation</div><div class="line">&quot;&quot;&quot;</div><div class="line"></div><div class="line">    def __init__(self):</div><div class="line">        # This constructor is called before Remmina attempts to register the plugin since it this class has to be instantiated before registering it.</div><div class="line">        self.name = &quot;A short name of the plugin that also appears in the &#39;Plugin&#39; column in the main dialog.&quot;</div><div class="line">        # One of possible values: &quot;pref&quot;, &quot;tool&quot;, &quot;entry&quot;, &quot;protocol&quot; or &quot;secret&quot;. This value decides which methods are expected to be defined</div><div class="line">        # in this class.</div><div class="line">        self.type = &quot;protocol&quot;</div><div class="line">        self.description = &quot;VNC but in Python!&quot;</div><div class="line">        self.version = &quot;1.0&quot;</div><div class="line">        self.icon_name = &quot;org.remmina.Remmina-vnc-symbolic&quot;</div><div class="line">        self.icon_name_ssh = &quot;org.remmina.Remmina-vnc-ssh-symbolic&quot;</div><div class="line">        # Specifies which settings are available for this protocol</div><div class="line">        self.ssh_setting = remmina.PROTOCOL_SSH_SETTING_TUNNEL</div><div class="line"></div><div class="line">        self.gpdata = VncData()</div><div class="line">        self.qualities = (&quot;0&quot;, &quot;Poor Pixelmess&quot;, &quot;1&quot;,&quot;Mhh kayy&quot;, &quot;2&quot;,&quot;Nice&quot;, &quot;9&quot;,&quot;hot sh*t&quot;)</div><div class="line">        # Define the features this module supports:</div><div class="line">        self.features = [</div><div class="line">            remmina.Feature(</div><div class="line">                type=remmina.PROTOCOL_FEATURE_TYPE_PREF,</div><div class="line">                id=VncFeature.PrefQuality,</div><div class="line">                opt1=remmina.PROTOCOL_FEATURE_PREF_RADIO,</div><div class="line">                opt2=&quot;quality&quot;,</div><div class="line">                opt3=self.qualities)</div><div class="line">            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_PREF, VncFeature.PrefViewonly, remmina.PROTOCOL_FEATURE_PREF_CHECK, &quot;viewonly&quot;, None)</div><div class="line">            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_PREF, VncFeature.PrefDisableserverinput, remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;disableserverinput&quot;, &quot;Disable server input&quot;)</div><div class="line">            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_TOOL, VncFeature.ToolRefresh, &quot;Refresh&quot;, &quot;face-smile&quot;, None)</div><div class="line">            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_TOOL, VncFeature.ToolChat, &quot;Open Chat…&quot;, &quot;face-smile&quot;, None)</div><div class="line">            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_TOOL, VncFeature.ToolSendCtrlAltDel,     &quot;Send Ctrl+Alt+Delete&quot;, None, None)</div><div class="line">            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_SCALE, VncFeature.Scale, None, None, None)</div><div class="line">            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_UNFOCUS, VncFeature.Unfocus, None, None, None)</div><div class="line">        ]</div><div class="line"></div><div class="line">        colordepths = (&quot;8&quot;, &quot;256 colors (8 bpp)&quot;, &quot;16&quot;, &quot;High color (16 bpp)&quot;, &quot;32&quot;, &quot;True color (32 bpp)&quot;)</div><div class="line">        self.basic_settings = [</div><div class="line">            remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_SERVER,  name=&quot;server&quot;,    label=&quot;&quot;,             compact=False, opt1=&quot;_rfb._tcp&quot;,opt2=None)</div><div class="line">            , remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_TEXT,    name=&quot;proxy&quot;,     label=&quot;Repeater&quot;,     compact=False, opt1=None,       opt2=None)</div><div class="line">            , remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_TEXT,    name=&quot;username&quot;,  label=&quot;Username&quot;,     compact=False, opt1=None,       opt2=None)</div><div class="line">            , remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_PASSWORD,name=&quot;password&quot;,  label=&quot;User password&quot;,compact=False, opt1=None,       opt2=None)</div><div class="line">            , remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_SELECT,  name=&quot;colordepth&quot;,label=&quot;Color depth&quot;,  compact=False, opt1=colordepths,opt2=None)</div><div class="line">            , remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_SELECT,  name=&quot;quality&quot;,   label=&quot;Quality&quot;,      compact=False, opt1=self.qualities, opt2=None)</div><div class="line">            , remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_KEYMAP,  name=&quot;keymap&quot;,    label=&quot;&quot;,             compact=False, opt1=None,       opt2=None)</div><div class="line">        ]</div><div class="line">        self.advanced_settings = [</div><div class="line">            remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;showcursor&quot;,             &quot;Show remote cursor&quot;,       True,  None, None)</div><div class="line">            , remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;viewonly&quot;,               &quot;View only&quot;,                False, None, None)</div><div class="line">            , remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;disableclipboard&quot;,       &quot;Disable clipboard sync&quot;,   True,  None, None)</div><div class="line">            , remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;disableencryption&quot;,      &quot;Disable encryption&quot;,       False, None, None)</div><div class="line">            , remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;disableserverinput&quot;,     &quot;Disable server input&quot;,     True,  None, None)</div><div class="line">            , remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;disablepasswordstoring&quot;, &quot;Disable password storing&quot;, True, None, None)</div><div class="line">            , remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;disablesmoothscrolling&quot;, &quot;Disable smooth scrolling&quot;, True, None, None)</div><div class="line">        ]</div><div class="line"></div><div class="line">    def init(self, gp):</div><div class="line">        # this is called when the plugin is loaded from Remmina.</div><div class="line">        cfile = gp.get_file()</div><div class="line">        self.gpdata.disable_smooth_scrolling = cfile.get_setting(key=&quot;disablesmoothscrolling&quot;, default=False)</div><div class="line">        self.gpdata.drawing_area = gp.get_viewport()</div><div class="line">        return True</div><div class="line"></div><div class="line">    def open_connection(self, gp):</div><div class="line">        # Is called when the user wants to open a connection whith this plugin.</div><div class="line"></div><div class="line">        # Write code to initiate the connection. Example:</div><div class="line">        connection_file = gp.get_file()</div><div class="line">        connection_file.set_setting(&quot;disablepasswordstoring&quot;, False)</div><div class="line">        password = None</div><div class="line"></div><div class="line">        # Determine if passwords should not be allowed to be stored.</div><div class="line">        dont_save_passwords = connection_file.get_setting(&quot;disablepasswordstoring&quot;, False)</div><div class="line">        # Open a dialog prompting connection information and credentials</div><div class="line">        ret = remmina.protocol_plugin_init_auth(widget=gp,</div><div class="line">                                                flags= remmina.REMMINA_MESSAGE_PANEL_FLAG_USERNAME | remmina.REMMINA_MESSAGE_PANEL_FLAG_USERNAME_READONLY | remmina.REMMINA_MESSAGE_PANEL_FLAG_DOMAIN | remmina.REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD,</div><div class="line">                                                title=&quot;Python Rocks!&quot;,</div><div class="line">                                                default_username=&quot;&quot;,</div><div class="line">                                                default_password=connection_file.get_setting(&quot;password&quot;, &quot;&quot;),</div><div class="line">                                                default_domain=&quot;&quot;,</div><div class="line">                                                password_prompt=&quot;Your Password Rocks!&quot;)</div><div class="line"></div><div class="line">        # Process the result of the dialog</div><div class="line">        if ret == Gtk.ResponseType.CANCEL:</div><div class="line">            return False</div><div class="line">        elif ret == Gtk.ResponseType.OK:</div><div class="line">            # Indicate that the connection has been established!</div><div class="line">            remmina.protocol_plugin_signal_connection_opened(gp)</div><div class="line"></div><div class="line">        return True</div><div class="line"></div><div class="line">    def close_connection(self, gp):</div><div class="line">        # The user requested to close the connection.</div><div class="line">        remmina.protocol_plugin_signal_connection_closed(gp)</div><div class="line"></div><div class="line">    def query_feature(self, gp, feature):</div><div class="line">        # Remmina asks if the given feature is available (remember Features registered in the construtor).</div><div class="line">        return True</div><div class="line"></div><div class="line">    def map_event(self, gp):</div><div class="line">        # This is called when the widget is again on screen.</div><div class="line">        return True</div><div class="line"></div><div class="line">    def unmap_event(self, gp):</div><div class="line">        # This is called when the widget is again not being shown on screen anymore. Any intensive graphical output</div><div class="line">        # can be halted.</div><div class="line">        return True</div><div class="line"></div><div class="line">    def call_feature(self, gp, feature):</div><div class="line">        # Remmina asks to execute on of the features.</div><div class="line"></div><div class="line">        if feature.type == remmina.REMMINA_PROTOCOL_FEATURE_TYPE_PREF and feature.id is VncFeature.PrefQuality:</div><div class="line">            file = gp.get_file()</div><div class="line">            quality = file.get_setting(&quot;quality&quot;, 0)</div><div class="line">            if quality == 9:</div><div class="line">                print(&quot;Ramping up graphics. Enjoy!&quot;)</div><div class="line">            if quality == 0:</div><div class="line">                print(&quot;Squeezing image into a few pixels...&quot;)</div><div class="line">            if quality == 1:</div><div class="line">                print(&quot;More the average guy, eh?&quot;)</div><div class="line">            if quality == 2:</div><div class="line">                print(&quot;Not great, not terrible...&quot;)</div><div class="line"></div><div class="line">    def send_keystrokes(self, gp, strokes):</div><div class="line">        # Remmina received a key stroke and wants to pass it to the remote.</div><div class="line">        return True</div><div class="line"></div><div class="line">    def get_plugin_screenshot(self, gp, data):</div><div class="line">        # data is of type RemminaScreenshotData and should contain the raw pixels for the screenshot. Remmina takes care of storing it into a jpg.</div><div class="line">        # Return True when a screenshot has been done. Otherwise False.</div><div class="line">        return False</div><div class="line"></div><div class="line"># Instantiate &amp; Register</div><div class="line">myPlugin = Plugin()</div><div class="line">remmina.register_plugin(myPlugin)</div></div><!-- fragment --> </div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer">Generated by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
  </ul>
</div>
</body>
</html>