← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dc-plugin-sdk/trunk] Rev 14: Adding Python base library

 

------------------------------------------------------------
revno: 14
committer: Fredrik Ullner <ullner@xxxxxxxxx>
branch nick: dc-plugin-sdk
timestamp: Tue 2014-05-06 22:38:46 +0200
message:
  Adding Python base library
added:
  Libraries/PyPlugin.DataTypes/
  Libraries/PyPlugin.DataTypes/DCPluginBase.py
  Libraries/PyPlugin.DataTypes/DCPluginSinkProxy.py
  Libraries/PyPlugin.DataTypes/DataTypes.py
  Libraries/PyPlugin.DataTypes/Enumerations.py
  Libraries/PyPlugin.DataTypes/IDCPlugin.py
  Libraries/PyPlugin.DataTypes/IDCPluginSink.py
  Libraries/PyPlugin.DataTypes/__init__.py


--
lp:dc-plugin-sdk
https://code.launchpad.net/~dcplusplus-team/dc-plugin-sdk/trunk

Your team Dcplusplus-team is subscribed to branch lp:dc-plugin-sdk.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dc-plugin-sdk/trunk/+edit-subscription
=== added directory 'Libraries/PyPlugin.DataTypes'
=== added file 'Libraries/PyPlugin.DataTypes/DCPluginBase.py'
--- Libraries/PyPlugin.DataTypes/DCPluginBase.py	1970-01-01 00:00:00 +0000
+++ Libraries/PyPlugin.DataTypes/DCPluginBase.py	2014-05-06 20:38:46 +0000
@@ -0,0 +1,145 @@
+
+from IDCPlugin import *
+from Enumerations import *
+
+import traceback
+
+class DCPluginBase(IDCPlugin):
+
+    def __init__(self):
+        self._info = PluginInformation();
+        self._sink = "";
+
+    """ Properties """
+    def GetInfo(self):
+        return self._info;
+    def SetInfo(self, info):
+        self._info = info;
+
+    def GetSink(self):
+        return self._sink;
+    def SetSink(self, sink):
+        self._sink = sink;
+    
+    """ Methods """
+    def Initialize(self, install, runtime):
+        """ if install: """
+        """ This only executes when the plugin has been installed for the first time. """
+                    
+        """ if runtime: """
+        """ If the plugin doesn't support being enabled at runtime, cancel its loading here. """         
+
+        return True;
+
+    def Uninitialize(self):
+        return True;
+
+    """ Hooks """
+
+    """ Chat """
+    def OnChatIncoming(self, hubData, data, refBreak):
+        return False;
+    
+    def OnChatOutgoing(self, hubData, data, refBreak):
+        return False;
+    
+    def OnChatIncomingPM(self, userData, data, refBreak):
+        return False;
+
+    """ Timer """
+    def OnTimerSecond(self, data, refBreak): 
+        return False;
+
+    def OnTimerMinute(self, data, refBreak): 
+        return False;
+
+    """ Hubs """
+    def OnHubOnline(self, hubData, refBreak): 
+        return False;
+
+    def OnHubOffline(self, hubData, refBreak): 
+        return False;
+
+    """ Users """
+    def OnUserOnline(self, userData, refBreak): 
+        return False;
+
+    def OnUserOffline(self, userData, refBreak): 
+        return False;
+
+    """ Network """
+    def OnNetworkHubDataIn(self, hubData, data, refBreak): 
+        return False;
+
+    def OnNetworkHubDataOut(self, hubData, data, refBreak): 
+        return False;
+
+    def OnNetworkClientDataIn(self, connectionData, data, refBreak): 
+        return False;
+
+    def OnNetworkClientDataOut(self, connectionData, data, refBreak): 
+        return False;
+
+    def OnNetworkUDPDataIn(self, udpData, data, refBreak): 
+        return False;
+
+    def OnNetworkUDPDataOut(self, udpData, data, refBreak): 
+        return False;
+
+    """ Queue """
+    def OnQueueAdded(self, queueData, refBreak): 
+        return False;
+
+    def OnQueueMoved(self, queueData, refBreak): 
+        return False;
+
+    def OnQueueRemoved(self, queueData, refBreak): 
+        return False;
+
+    def OnQueueFinished(self, queueData, refBreak): 
+        return False;
+
+    """ UI """
+    def OnUICreated(self, data, refBreak): 
+        return False;
+
+    def OnUIChatTags(self, userData, tagData, refBreak): 
+        return False;
+
+    def OnUIChatDisplay(self, userData, stringData, refBreak): 
+        return False;
+
+    def OnUIChatCommand(self, hubData, data, refBreak): 
+        return False;
+
+    def OnUIChatCommandPM(self, userData, data, refBreak): 
+        return False;
+
+    """ Methods """
+    
+    def LogException(self, exceptionMessage):
+        self.LogError("An unknown exception occured: " + exceptionMessage);
+
+    def LogException(self, exception):
+        self.LogException(exception, True);
+
+    def LogException(self, exception, logStacktrace):
+        if logStacktrace:
+            self.LogError("An exception occured with stacktrace: " + exception.format_exc());
+        else:
+            self.LogError("An exception occured: " + exception.format_exc());
+
+    def LogError(self, message):
+        self.LogMessage("[ERROR] " + message);
+        
+    def LogWarning(self, message):
+        self.LogMessage("[WARNING] " + message);
+
+    def LogMessage(self, message):
+        self.GetSink().LogMessage( "[" + self.GetInfo().GetName() + "]" + message);
+        
+    def TryIt(self, sink):
+        print( "In tryit");
+        sink.SendData("I like dogs");
+        print( "after tryit");
+

=== added file 'Libraries/PyPlugin.DataTypes/DCPluginSinkProxy.py'
--- Libraries/PyPlugin.DataTypes/DCPluginSinkProxy.py	1970-01-01 00:00:00 +0000
+++ Libraries/PyPlugin.DataTypes/DCPluginSinkProxy.py	2014-05-06 20:38:46 +0000
@@ -0,0 +1,134 @@
+
+from IDCPluginSink import *
+
+import DCPluginSink
+
+class DCPluginProxySink(IDCPluginSink):
+
+    def __init__(self, sink):
+        self._sink = sink;
+
+    """ Core """
+    def GetApplicationName(self):
+        return DCPluginSink.GetApplicationName(self._sink);
+    
+    def SetApplicationName(self, name):
+        DCPluginSink.SetApplicationName(self._sink, name);
+
+    """ Log """
+    def LogMessage(self, message):
+        DCPluginSink.LogMessage(self._sink, message);
+
+    """ Config """
+    def GetInstallPath(self):
+        return DCPluginSink.GetInstallPath(self._sink);
+    
+    def GetPath(self, pathType):
+        return DCPluginSink.GetPath(self._sink, pathType);
+
+    def GetStringConfig(self, name):
+        return DCPluginSink.GetStringConfig(self._sink, name);
+    def SetStringConfig(self, name, value):
+        DCPluginSink.SetStringConfig(self._sink, name, value);
+    
+    def GetBoolConfig(self, name):
+        return DCPluginSink.GetBoolConfig(self._sink, name);
+    def SetBoolConfig(self, name, value): 
+        DCPluginSink.SetStringConfig(self._sink, name, value);
+    
+    def GetInt32Config(self, name):
+        return DCPluginSink.GetInt32Config(self._sink, name);
+    def SetInt32Config(self, name, value): 
+        DCPluginSink.SetStringConfig(self._sink, name, value);
+    
+    def GetInt64Config(self, name):
+        return DCPluginSink.GetInt64Config(self._sink, name);
+    def SetInt64Config(self, name, value): 
+        DCPluginSink.SetStringConfig(self._sink, name, value);
+    
+    def GetLanguage(self):
+        return DCPluginSink.GetLanguage(self._sink);
+
+    """ Connection """
+    def SendUDPData(self, ipAddress, port, data, amount):
+        DCPluginSink.SendUDPData(self._sink, ipAddress, port, data, amount);
+        
+    def SendProtocolCommand(self, connectionData, command):
+        DCPluginSink.SendProtocolCommand(self._sink, connectionData, command);
+        
+    def TerminateConnection(self, connectionData, graceLess):
+        DCPluginSink.TerminateConnection(self._sink, connectionData, graceLess);
+        
+    def GetConnectionUser(self, connectionData):
+        return DCPluginSink.GetConnectionUser(self._sink, connectionData);
+
+    """ Hub """
+    def AddHub(self, url, nick, password):
+        return DCPluginSink.AddHub(self._sink, url, nick, password);
+
+    def FindHub(self, url):
+        return DCPluginSink.FindHub(self._sink, url);
+    
+    def RemoveHub(self, hubData):
+        DCPluginSink.RemoveHub(self._sink, hubData);
+        
+    def EmulateProtocolCommand(self, hubData, command):
+        DCPluginSink.EmualteProtocolCommand(self._sink, hubData, command);
+        
+    def SendProtocolCommand(self, hubData, command):
+        DCPluginSink.SendProtocolCommand(self._sink, hubData, command);
+        
+    def SendMessage(self, hubData, message, thirdPerson):
+        DCPluginSink.SendMessage(self._sink, hubData, message, thirdPerson);
+        
+    def LocalMessage(self, hubData, message, messageType):
+        DCPluginSink.LocalMessage(self._sink, hubData, message, messageType);
+        
+    def SendPrivateMessage(self, userData, message, thirdPerson):
+        DCPluginSink.SendPrivateMessage(self._sink, userdata, message, thirdPerson);
+        
+    def FindUser(self, cid, hubURL):
+        return DCPluginSink.FindUser(self._sink, cid, hubURL);
+
+    """ Queue """
+    def AddList(self, userData, silent):
+        return DCPluginSink.AddList(self._sink, userData, silent);
+    
+    def AddDownload(self, hashData, size, target):
+        return DCPluginSink.AddDownload(self._sink, hashData, size, target);
+    
+    def FindDownload(self, target):
+        return DCPluginSink.FindDownload(self._sink, target);
+    
+    def RemoveDownload(self, queueData):
+        DCPluginSink.RemoveDownload(self._sink, queueData);
+        
+    def SetPriority(self, queueData, priority):
+        DCPluginSink.SetPriority(self._sink, queueData, priority);
+        
+    def Pause(self, queueData):
+        return DCPluginSink.Pause(self._sink, queueData);
+
+    """ Tagger """
+    def GetText(self, tagData):
+        return DCPluginSink.GetText(self._sink, tagData);
+    
+    def AddTag(self, tagData, startPlace, endPlace, tagId, attributes):
+        DCPluginSink.AddTag(self._sink, tagData, startPlace, endPlace, tagId, attributes);
+        
+    def ReplaceTagText(self, tagData, startPlace, endPlace, replacement):
+        DCPluginSink.ReplaceTagText(self._sink, tagData, startPlace, endPlace, replacement);
+
+    """ UI """
+    def AddCommand(self, name):
+        DCPluginSink.AddCommand(self._sink, name);
+        
+    def RemoveCommand(self, name):
+        DCPluginSink.RemoveCommand(self._sink, name);
+        
+    def PlaySoundInUI(self, path):
+        DCPluginSink.PlaySoundInUI(self._sink, path);
+        
+    def Notify(self, title, message):
+        DCPluginSink.Notify(self._sink, title, message);
+    

=== added file 'Libraries/PyPlugin.DataTypes/DataTypes.py'
--- Libraries/PyPlugin.DataTypes/DataTypes.py	1970-01-01 00:00:00 +0000
+++ Libraries/PyPlugin.DataTypes/DataTypes.py	2014-05-06 20:38:46 +0000
@@ -0,0 +1,227 @@
+
+class PluginSetting:
+    def __init__(self):
+        self._name = "";
+        self._value = "";
+        self._defaultvalue = "";
+        self._datatype = "";
+        self._description = "";
+        self._validvalues = "";
+
+    def GetName(self):
+        return self._name;
+    def SetName(self, value):
+        self._name = value;
+
+    def GetValue(self):
+        return self._value;
+    def SetValue(self, value):
+        self._value = value;
+
+    def GetDefaultValue(self):
+        return self._defaultvalue;
+    def SetDefaultValue(self, value):
+        self._defaultvalue = value;
+
+    def GetDataType(self):
+        return self._datatype;
+    def SetDataType(self, value):
+        self._datatype = value;
+
+    def GetDescription(self):
+        return self._description;
+    def SetDescription(self, value):
+        self._description = value;
+
+    def GetValidValues(self):
+        return self._validvalues;
+    def SetValidValues(self, value):
+        self._validvalues = value;
+
+class CommandData:
+    def __init__(self, command, parameters, internalPointer):
+        self._command = command;
+        self._parameters = parameters;
+        self._internalPointer = internalPointer;
+
+    def GetCommand(self):
+        return self._command;
+    def GetParameters(self):
+        return self._parameters;
+    def GetInternalPointer(self):
+        return self._internalPointer;
+    
+
+class ConnectionData:
+    def __init__(self, ip, port, protocolType, isOperator, isEncrypted, internalPointer):
+        self._ip = ip;
+        self._port = port;
+        self._protocolType = protocolType;
+        self._isOperator = isOperator;
+        self._isEncrypted = isEncrypted;
+        self._internalPointer = internalPointer;
+
+    def GetIP(self):
+        return self._ip;
+    def GetPort(self):
+        return self._port;
+    def GetProtocolType(self):
+        return self._protocolType;
+    def GetIsOperator(self):
+        return self._isOperator;
+    def GetIsEncrypted(self):
+        return self._isEncrypted;
+    def GetInternalPointer(self):
+        return self._internalPointer;
+
+class HubData:
+    def __init__(self, url, ip, port, protocolType):
+        self._url = url;
+        self._ip = ip;
+        self._port = port;
+        self._protocolType = protocolType;
+
+    def GetUrl(self):
+        return self._url;
+    def GetIP(self):
+        return self._ip;
+    def GetPort(self):
+        return self._port;
+    
+    def SetUrl(self, url):
+        self._url = url;
+    def SetIP(self, ip):
+        self._ip = ip;
+    def SetPort(self, port):
+        self._port = port;
+
+class PluginInformation:
+    def __init__(self):
+        self._name = "";
+        self._description = "";
+        self._author = "";
+        self._web = "";
+        self._version = 0.0;
+        self._apiversion = 0.0;
+        self._uuid = "";
+        self._settings = list();
+
+    def GetName(self):
+        return self._name;
+    def SetName(self, name):
+        self._name = name;
+
+    def GetDescription(self):
+        return self._description;
+    def SetDescription(self, description):
+        self._description = description;
+
+    def GetAuthor(self):
+        return self._author;
+    def SetAuthor(self, value):
+        self._author = value;
+
+    def GetWeb(self):
+        return self._web;
+    def SetWeb(self, value):
+        self._web = value;
+
+    def GetVersion(self):
+        return self._version;
+    def SetVersion(self, value):
+        self._version = value;
+
+    def GetAPIVersion(self):
+        return self._apiversion;
+    def SetAPIVersion(self, value):
+        self._apiversion = value;
+
+    def GetUUID(self):
+        return self._uuid;
+    def SetUUID(self, value):
+        self._uuid = value;
+
+    def GetSettings(self):
+        return self._settings;
+    def SetSettings(self, value):
+        self._settings = value;
+
+class QueueData:
+    def __init__(self, target, location, hash, filesize, isfilelist, internalpointer):
+        self._target = target;
+        self._location = location;
+        self._hash = hash;
+        self._fileSize = filesize;
+        self._isFileList = isfilelist;
+        self._internalPointer = internalpointer;
+
+    def GetTarget(self):
+        return self._target;
+    def GetLocation(self):
+        return self._location;
+    def GetHash(self):
+        return self._hash;
+    def GetFileSize(self):
+        return self._hash;
+    def GetIsFileList(self):
+        return self._isFileList;
+    def GetInternalPointer(self):
+        return self._internalPointer;
+
+class StringData:
+    def __init__(self, input, output, internalpointer):
+        self._input = input;
+        self._output = output;
+        self._internalPointer = internalPointer;
+
+    def GetInput(self):
+        return self._input;
+    def GetOutput(self):
+        return self._output;
+    def GetInternalPointer(self):
+        return self._internalPointer;
+
+class TagData:
+    def __init__(self, internalpointer):
+        self._internalPointer = internalPointer;
+
+    def GetInternalPointer(self):
+        return self._internalPointer;
+
+class UDPData:
+    def __init__(self, remoteAddress, port, internalpointer):
+        self._remoteAddress = remoteAddress;
+        self._port = port;
+        self._internalPointer = internalPointer;
+
+    def GetRemoteAddress(self):
+        return self._remoteAddress;
+    def GetPort(self):
+        return self._port;
+    def GetInternalPointer(self):
+        return self._internalPointer;
+
+class UserData:
+    def __init__(self, nick, hubUrl, cid, sid, protocol, isOperator, internalpointer):
+        self._nick = nick;
+        self._hubUrl = hubUrl;
+        self._cid = cid;
+        self._sid = sid;
+        self._protocol = protocol;
+        self._isOperator = isOperator;
+        self._internalPointer = internalPointer;
+
+    def GetNick(self):
+        return self._nick;
+    def GetHubURL(self):
+        return self._hubUrl;
+    def GetCID(self):
+        return self._cid;
+    def GetSID(self):
+        return self._sid;
+    def GetProtocol(self):
+        return self._protocol;
+    def GetIsOperator(self):
+        return self._isOperator;
+    def GetInternalPointer(self):
+        return self._internalPointer;

=== added file 'Libraries/PyPlugin.DataTypes/Enumerations.py'
--- Libraries/PyPlugin.DataTypes/Enumerations.py	1970-01-01 00:00:00 +0000
+++ Libraries/PyPlugin.DataTypes/Enumerations.py	2014-05-06 20:38:46 +0000
@@ -0,0 +1,44 @@
+
+def enum(**enums):
+    return type('Enum', (), enums)
+def enum2(*sequential, **named):
+    enums = dict(zip(sequential, range(len(sequential))), **named)
+    return type('Enum', (), enums)
+
+TagPathType = enum2(
+    'GlobalConfig',
+    'UserConfig',
+    'UserLocal',
+    'Resources',
+    'Locale'
+    )
+
+ProtocolType = enum2(
+    'ADC',
+    'NMDC',
+    'DHT'
+    )
+
+MessageType = enum2(
+    'Client',
+    'Status',
+    'System'
+    )
+
+QueuePriority = enum(
+    Default = -1,
+    Lowest = 1,
+    Low = 2,
+    Normal = 3,
+    High = 4,
+    Highest = 5
+    )
+
+DataType = enum2(
+    'Unknown',
+    'String',
+    'Byte',
+    'Short',
+    'Int',
+    'Long'
+    )

=== added file 'Libraries/PyPlugin.DataTypes/IDCPlugin.py'
--- Libraries/PyPlugin.DataTypes/IDCPlugin.py	1970-01-01 00:00:00 +0000
+++ Libraries/PyPlugin.DataTypes/IDCPlugin.py	2014-05-06 20:38:46 +0000
@@ -0,0 +1,56 @@
+
+from DataTypes import *
+from IDCPluginSink import *
+
+class IDCPlugin:
+    """ Properties """
+    def GetInfo(self): NotImplementedError
+    def SetInfo(self, data): NotImplementedError
+
+    def GetSink(self): NotImplementedError
+    def SetSink(self, data): NotImplementedError
+    
+    """ Methods """
+    def Initialize(self, install, runtime): NotImplementedError
+
+    def Uninitialize(self): NotImplementedError
+
+    """ Hooks """
+
+    """ Chat """
+    def OnChatIncoming(self, hubData, data, refBreak): NotImplementedError
+    def OnChatOutgoing(self, hubData, data, refBreak): NotImplementedError
+    def OnChatIncomingPM(self, userData, data, refBreak): NotImplementedError
+
+    """ Timer """
+    def OnTimerSecond(self, data, refBreak): NotImplementedError
+    def OnTimerMinute(self, data, refBreak): NotImplementedError
+
+    """ Hubs """
+    def OnHubOnline(self, hubData, refBreak): NotImplementedError
+    def OnHubOffline(self, hubData, refBreak): NotImplementedError
+
+    """ Users """
+    def OnUserOnline(self, userData, refBreak): NotImplementedError
+    def OnUserOffline(self, userData, refBreak): NotImplementedError
+
+    """ Network """
+    def OnNetworkHubDataIn(self, hubData, data, refBreak): NotImplementedError
+    def OnNetworkHubDataOut(self, hubData, data, refBreak): NotImplementedError
+    def OnNetworkClientDataIn(self, connectionData, data, refBreak): NotImplementedError
+    def OnNetworkClientDataOut(self, connectionData, data, refBreak): NotImplementedError
+    def OnNetworkUDPDataIn(self, udpData, data, refBreak): NotImplementedError
+    def OnNetworkUDPDataOut(self, udpData, data, refBreak): NotImplementedError
+
+    """ Queue """
+    def OnQueueAdded(self, queueData, refBreak): NotImplementedError
+    def OnQueueMoved(self, queueData, refBreak): NotImplementedError
+    def OnQueueRemoved(self, queueData, refBreak): NotImplementedError
+    def OnQueueFinished(self, queueData, refBreak): NotImplementedError
+
+    """ UI """
+    def OnUICreated(self, data, refBreak): NotImplementedError
+    def OnUIChatTags(self, userData, tagData, refBreak): NotImplementedError
+    def OnUIChatDisplay(self, userData, stringData, refBreak): NotImplementedError
+    def OnUIChatCommand(self, hubData, data, refBreak): NotImplementedError
+    def OnUIChatCommandPM(self, userData, data, refBreak): NotImplementedError

=== added file 'Libraries/PyPlugin.DataTypes/IDCPluginSink.py'
--- Libraries/PyPlugin.DataTypes/IDCPluginSink.py	1970-01-01 00:00:00 +0000
+++ Libraries/PyPlugin.DataTypes/IDCPluginSink.py	2014-05-06 20:38:46 +0000
@@ -0,0 +1,70 @@
+
+from DataTypes import *
+
+class IDCPluginSink:
+
+    """ Core """
+    def GetApplicationName(self): NotImplementedError
+    
+    def SetApplicationName(self, name): NotImplementedError
+
+    """ Log """
+    def LogMessage(self, message): NotImplementedError
+
+    """ Config """
+    def GetInstallPath(self): NotImplementedError
+    
+    def GetPath(self, pathType): NotImplementedError
+
+    def GetStringConfig(self, name): NotImplementedError
+    def SetStringConfig(self, name, value): NotImplementedError
+    
+    def GetBoolConfig(self, name): NotImplementedError
+    def SetBoolConfig(self, name, value): NotImplementedError
+    
+    def GetInt32Config(self, name): NotImplementedError
+    def SetInt32Config(self, name, value): NotImplementedError
+    
+    def GetInt64Config(self, name): NotImplementedError
+    def SetInt64Config(self, name, value): NotImplementedError
+    
+    def GetLanguage(self): NotImplementedError
+
+    """ Connection """
+    def SendUDPData(self, ipAddress, port, data, amount): NotImplementedError
+    def SendProtocolCommand(self, connectionData, command): NotImplementedError
+    def TerminateConnection(self, connectionData, graceLess): NotImplementedError
+    def GetConnectionUser(self, connectionData): NotImplementedError
+
+    """ Hub """
+    def AddHub(self, url, nick, password): NotImplementedError
+    def FindHub(self, url): NotImplementedError
+    def RemoveHub(self, hubData): NotImplementedError
+    def EmulateProtocolCommand(self, hubData, command): NotImplementedError
+    def SendProtocolCommand(self, hubData, command): NotImplementedError
+    def SendMessage(self, hubData, message, thirdPerson): NotImplementedError
+    def LocalMessage(self, hubData, message, messageType): NotImplementedError
+    def SendPrivateMessage(self, userData, message, thirdPerson): NotImplementedError
+    def FindUser(self, cid, hubURL): NotImplementedError
+
+    """ Queue """
+    def AddList(self, userData, silent): NotImplementedError
+    def AddDownload(self, hashData, size, target): NotImplementedError
+    def FindDownload(self, target): NotImplementedError
+    def RemoveDownload(self, queueData): NotImplementedError
+    def SetPriority(self, queueData, priority): NotImplementedError
+    def Pause(self, queueData): NotImplementedError
+
+    """ Tagger """
+    def GetText(self, tagData): NotImplementedError
+    def AddTag(self, tagData, startPlace, endPlace, tagId, attributes): NotImplementedError
+    def ReplaceTagText(self, tagData, startPlace, endPlace, replacement): NotImplementedError
+
+    """ UI """
+    def AddCommand(self, name): NotImplementedError
+    def RemoveCommand(self, name): NotImplementedError
+    def PlaySoundInUI(self, path): NotImplementedError
+    def Notify(self, title, message): NotImplementedError
+
+    """ Other """
+    def SendData(self, data): NotImplementedError

=== added file 'Libraries/PyPlugin.DataTypes/__init__.py'