dnetd/source/dnetd/dplugin.d

80 lines
1.8 KiB
D

/**
* dplugin
*
* Represents a dplugin
*
* On initialization it connects over a UNIX domain socket
* to the server and then the plugin can be used whenver it
* needs to be (send and receive)
*/
module dnetd.dplugin;
import dnetd.dserver;
import std.socket;
import bmessage;
public final class DPlugin
{
/* The associated server */
private DServer server;
/* The UNIX domaion socket path */
private string unixDomainSocketPath;
/**
* Constructs a new DPugin associated with the
* given server and with the intent to connect
* to the UNIX domain socket at the path given
*/
this(DServer server, string unixDomainSocketPath)
{
this.server = server;
this.unixDomainSocketPath = unixDomainSocketPath;
}
/**
* Opens a new session to the plugin server
* then sends the data, awaits a reply, then
* closes the session (connection)
*/
public byte[] sendPlugin(byte[] data)
{
/* The response */
byte[] response;
/* The status */
bool status;
/* Open a connection to the plugin server */
Socket socket = new Socket(AddressFamily.UNIX, SocketType.STREAM, ProtocolType.RAW);
socket.connect(new UnixAddress(unixDomainSocketPath));
/* Send the data */
/* TODO: Error handling */
status = sendMessage(socket, data);
/* Encode the status in the reply */
response ~= [status];
/* If the send succeeded */
if(status)
{
/* Get the reply */
/* TODO: Error handling */
byte[] reply;
receiveMessage(socket, reply);
/* Close the connetion to the plugin server */
socket.close();
/* Encode the response */
response ~= reply;
}
return response;
}
}