68 py_plugin->
gp->
gp = gp;
69 CallPythonMethod(py_plugin->
instance,
"init",
"O", py_plugin->
gp);
78 PyObject* result = CallPythonMethod(py_plugin->
instance,
"open_connection",
"O", py_plugin->
gp);
79 return result == Py_True;
91 PyObject* result = CallPythonMethod(py_plugin->
instance,
"close_connection",
"O", py_plugin->
gp);
92 return result == Py_True;
101 pyFeature->
type = (gint)feature->
type;
102 pyFeature->
id = feature->
id;
110 PyObject* result = CallPythonMethod(py_plugin->
instance,
"query_feature",
"OO", py_plugin->
gp, pyFeature);
111 Py_DecRef((PyObject*)pyFeature);
112 Py_DecRef((PyObject*)pyFeature->opt1);
113 Py_DecRef((PyObject*)pyFeature->opt2);
114 Py_DecRef((PyObject*)pyFeature->opt3);
115 return result == Py_True;
120 TRACE_CALL(__func__);
123 pyFeature->
type = (gint)feature->
type;
124 pyFeature->
id = feature->
id;
135 CallPythonMethod(py_plugin->
instance,
"call_feature",
"OO", py_plugin->
gp, pyFeature);
136 Py_DecRef((PyObject*)pyFeature);
137 Py_DecRef((PyObject*)pyFeature->opt1);
138 Py_DecRef((PyObject*)pyFeature->opt2);
139 Py_DecRef((PyObject*)pyFeature->opt3);
143 const guint keystrokes[],
146 TRACE_CALL(__func__);
148 PyObject* obj = PyList_New(keylen);
150 for (
int i = 0; i < keylen; ++i)
152 PyList_SetItem(obj, i, PyLong_FromLong(keystrokes[i]));
154 CallPythonMethod(py_plugin->
instance,
"send_keystrokes",
"OO", py_plugin->
gp, obj);
161 TRACE_CALL(__func__);
165 Py_IncRef((PyObject*)data);
166 PyObject* result = CallPythonMethod(py_plugin->
instance,
"get_plugin_screenshot",
"OO", py_plugin->
gp, data);
167 if (result == Py_True)
169 if (!PyByteArray_Check((PyObject*)data->buffer))
171 g_printerr(
"Unable to parse screenshot data. 'buffer' needs to be an byte array!");
174 Py_ssize_t buffer_len = PyByteArray_Size((PyObject*)data->buffer);
182 memcpy(rpsd->
buffer, PyByteArray_AsString((PyObject*)data->buffer),
sizeof(
unsigned char) * buffer_len);
185 rpsd->
height = data->height;
186 rpsd->
width = data->width;
188 Py_DecRef((PyObject*)data->buffer);
189 Py_DecRef((PyObject*)data);
190 return result == Py_True;
196 PyObject* result = CallPythonMethod(plugin->
instance,
"map_event",
"O", plugin->
gp);
197 return PyBool_Check(result) && result == Py_True;
203 PyObject* result = CallPythonMethod(plugin->
instance,
"unmap_event",
"O", plugin->
gp);
204 return PyBool_Check(result) && result == Py_True;
209 PyObject* instance = plugin->
instance;
218 g_printerr(
"Unable to create protocol plugin. Aborting!\n");
225 remmina_plugin->
domain = GETTEXT_PACKAGE;
230 remmina_plugin->
name = PyUnicode_AsUTF8(PyObject_GetAttrString(instance,
ATTR_NAME));
232 remmina_plugin->
version = PyUnicode_AsUTF8(PyObject_GetAttrString(instance,
ATTR_VERSION));
236 PyObject* list = PyObject_GetAttrString(instance,
"basic_settings");
237 Py_ssize_t len = PyList_Size(list);
244 for (Py_ssize_t i = 0; i < len; ++i)
254 list = PyObject_GetAttrString(instance,
"advanced_settings");
255 len = PyList_Size(list);
262 for (Py_ssize_t i = 0; i < len; ++i)
274 list = PyObject_GetAttrString(instance,
"features");
275 len = PyList_Size(list);
282 for (Py_ssize_t i = 0; i < len; ++i)
291 remmina_plugin->
features = features;
PyObject_HEAD RemminaProtocolFeatureType type
void(* call_feature)(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
Wrapper for a Python object that contains a pointer to an instance of RemminaProtocolFeature.
void remmina_protocol_call_feature_wrapper(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
void remmina_protocol_send_keytrokes_wrapper(RemminaProtocolWidget *gp, const guint keystrokes[], const gint keylen)
gboolean remmina_protocol_open_connection_wrapper(RemminaProtocolWidget *gp)
Maps an instance of a Python plugin to a Remmina one.
RemminaProtocolSSHSetting ssh_setting
void remmina_plugin_python_to_protocol_feature(RemminaProtocolFeature *dest, PyObject *feature)
Converts the PyObject to RemminaProtocolFeature.
void(* init)(RemminaProtocolWidget *gp)
static RemminaProtocolPlugin remmina_plugin
gboolean remmina_protocol_get_plugin_screenshot_wrapper(RemminaProtocolWidget *gp, RemminaPluginScreenshotData *rpsd)
const RemminaProtocolFeature * features
gboolean remmina_protocol_close_connection_wrapper(RemminaProtocolWidget *gp)
long remmina_plugin_python_get_attribute_long(PyObject *instance, const char *attr_name, long def)
Gets the attribute as long value.
void remmina_protocol_init_wrapper(RemminaProtocolWidget *gp)
Contains the implementation of the Python module 'remmina', provided to interface with the applicatio...
PyPlugin * remmina_plugin_python_get_plugin(const char *name)
Tries to find the Python plugin matching to the given instance of RemminaPlugin.
RemminaProtocolPlugin * protocol_plugin
gboolean(* open_connection)(RemminaProtocolWidget *gp)
Contains the specialisation of RemminaPluginFile plugins in Python.
gboolean remmina_protocol_unmap_event_wrapper(RemminaProtocolWidget *gp)
PyRemminaPluginScreenshotData * remmina_plugin_python_screenshot_data_new(void)
const gchar * icon_name_ssh
PyRemminaProtocolWidget * gp
gboolean remmina_protocol_map_event_wrapper(RemminaProtocolWidget *gp)
const char * ATTR_ADVANCED_SETTINGS
const char * ATTR_DESCRIPTION
gboolean(* unmap_event)(RemminaProtocolWidget *gp)
const char * ATTR_ICON_NAME_SSH
const gchar * description
RemminaProtocolFeatureType type
void(* send_keystrokes)(RemminaProtocolWidget *gp, const guint keystrokes[], const gint keylen)
RemminaPlugin * generic_plugin
PyRemminaProtocolFeature * remmina_plugin_python_protocol_feature_new(void)
RemminaProtocolSSHSetting
void remmina_plugin_python_add_plugin(PyPlugin *plugin)
Registers the given plugin if no other plugin with the same name has been already registered...
gboolean remmina_protocol_query_feature_wrapper(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
const RemminaProtocolSetting * basic_settings
const char * ATTR_FEATURES
RemminaTypeHint opt1_type_hint
gboolean remmina_plugin_python_check_attribute(PyObject *instance, const char *attr_name)
Checks if a given attribute exists.
const char * ATTR_BASIC_SETTINGS
void remmina_plugin_python_to_protocol_setting(RemminaProtocolSetting *dest, PyObject *setting)
Converts the PyObject to RemminaProtocolSetting.
gboolean(* close_connection)(RemminaProtocolWidget *gp)
RemminaProtocolSettingType type
RemminaTypeHint type_hint
RemminaTypeHint opt2_type_hint
gboolean(* map_event)(RemminaProtocolWidget *gp)
gboolean(* query_feature)(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
Contains functions and constants that are commonly used throughout the Python plugin implementation...
const RemminaProtocolSetting * advanced_settings
void * remmina_plugin_python_malloc(int bytes)
Allocates memory and checks for errors before returning.
gboolean(* get_plugin_screenshot)(RemminaProtocolWidget *gp, RemminaPluginScreenshotData *rpsd)
RemminaPlugin * remmina_plugin_python_create_protocol_plugin(PyPlugin *plugin)
Creates a new instance of the RemminaPluginProtocol, initializes its members and references the wrapp...
const char * ATTR_ICON_NAME
void remmina_plugin_python_protocol_init(void)
Initializes the Python plugin specialisation for protocol plugins.
PyGeneric * remmina_plugin_python_generic_new(void)
Creates a new instance of PyGeneric.
RemminaTypeHint opt3_type_hint
const char * ATTR_SSH_SETTING
const char * ATTR_VERSION