summaryrefslogtreecommitdiff
path: root/dxr3unixserversocket.c
diff options
context:
space:
mode:
authoraustriancoder <austriancoder>2004-08-05 23:05:21 +0000
committeraustriancoder <austriancoder>2004-08-05 23:05:21 +0000
commitc47666d42f7972e1b51f9de61ce0fa27c72f3127 (patch)
treee34a87e37901b7f892fb6f330ccb15bcba30039b /dxr3unixserversocket.c
downloadvdr-plugin-dxr3-c47666d42f7972e1b51f9de61ce0fa27c72f3127.tar.gz
vdr-plugin-dxr3-c47666d42f7972e1b51f9de61ce0fa27c72f3127.tar.bz2
initial import
Diffstat (limited to 'dxr3unixserversocket.c')
-rw-r--r--dxr3unixserversocket.c190
1 files changed, 190 insertions, 0 deletions
diff --git a/dxr3unixserversocket.c b/dxr3unixserversocket.c
new file mode 100644
index 0000000..49816fa
--- /dev/null
+++ b/dxr3unixserversocket.c
@@ -0,0 +1,190 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdio.h>
+
+
+#include <iostream>
+#include <cstring>
+#include <string>
+
+#include "dxr3unixserversocket.h"
+#include "dxr3interface.h"
+#include "dxr3log.h"
+
+using namespace std;
+
+#ifndef SOCKET_CHMOD
+#define SOCKET_CHMOD 0660
+#endif
+
+// ==================================
+cDxr3UnixServerSocket::cDxr3UnixServerSocket(const char* pFileName, int backlog)
+{
+ m_bConnected = false;
+ m_backlog = backlog;
+ m_addr.sun_family = AF_UNIX;
+ m_msgSize = 0;
+
+ m_pFileName = pFileName;
+ strcpy(m_addr.sun_path, pFileName);
+ unlink(pFileName);
+
+
+ m_fdServerSocket = socket(PF_UNIX, SOCK_STREAM, 0);
+ if (m_fdServerSocket > -1)
+ {
+ if (bind(m_fdServerSocket, (sockaddr*)&m_addr, (socklen_t)sizeof(m_addr))) {
+ cLog::Instance() << "cDxr3UnixServerSocket::cDxr3UnixServerSocket Error: binding socket failed\n";
+ }
+
+ if (listen(m_fdServerSocket, m_backlog))
+ {
+ cLog::Instance() << "cDxr3UnixServerSocket::cDxr3UnixServerSocket Error: Listen failed\n";
+ }
+
+ if (chmod(m_pFileName, SOCKET_CHMOD))
+ {
+ cLog::Instance() << "cDxr3UnixServerSocket::cDxr3UnixServerSocket Error: Chmod failed\n";
+ }
+ }
+ else
+ {
+ cLog::Instance() << "cDxr3UnixServerSocket::cDxr3UnixServerSocket Error: Unable to create socket\n";
+ }
+}
+
+// ==================================
+bool cDxr3UnixServerSocket::WaitForConnection()
+{
+ cLog::Instance() << "cDxr3UnixServerSocket::WaitForConnection Waiting ...\n";
+ if (m_fdServerSocket > -1)
+ {
+ m_fdConnectionSocket = accept(m_fdServerSocket, 0, 0);
+ if (m_fdConnectionSocket > -1)
+ {
+ m_bConnected = true;
+ cLog::Instance() << "cDxr3UnixServerSocket::WaitForConnection Connected\n";
+ }
+ else
+ {
+ m_bConnected = false;
+ cLog::Instance() << "cDxr3UnixServerSocket::WaitForConnection failed\n";
+ }
+ }
+ else
+ {
+ m_bConnected = false;
+ }
+ return m_bConnected;
+}
+
+// ==================================
+bool cDxr3UnixServerSocket::GetNextMessage()
+{
+ bool ret = false;
+ m_msgSize = 0;
+ memset(m_msg, 0, MAX_REC_SIZE);
+
+ if (m_bConnected)
+ {
+ m_msgSize = read(m_fdConnectionSocket, m_msg, MAX_REC_SIZE - 1);
+ if (m_msgSize <= 0)
+ {
+ m_msgSize = 0;
+ m_bConnected = 0;
+ close(m_fdConnectionSocket);
+ cLog::Instance() << "cDxr3UnixServerSocket::GetNextMessage failed/connection closed\n";
+ }
+ else
+ {
+ ret = true;
+ }
+ }
+
+ if (ret) ProcessMessage();
+
+ return ret;
+}
+
+// ==================================
+bool cDxr3UnixServerSocket::IsConnected()
+{
+ return m_bConnected;
+}
+
+// ==================================
+cDxr3UnixServerSocket::~cDxr3UnixServerSocket()
+{
+ close(m_fdConnectionSocket);
+ close(m_fdServerSocket);
+ unlink(m_pFileName);
+}
+
+// ==================================
+void cDxr3StartStopSocket::SendStatus()
+{
+ if (cDxr3Interface::Instance().IsExternalReleased())
+ {
+ string res("CloseDxr3DeviceRsp\n");
+ write(m_fdConnectionSocket, res.c_str(), res.size());
+ }
+ else
+ {
+ string res("OpenDxr3DeviceRsp\n");
+ write(m_fdConnectionSocket, res.c_str(), res.size());
+ }
+}
+
+// ==================================
+void cDxr3StartStopSocket::ProcessMessage(void)
+{
+ cLog::Instance() << "cDxr3StartStopSocket::ProcessMessage Rec: " << (const char*) m_msg << "\n";
+
+ if (string((const char*)m_msg) == string("OpenDxr3DeviceCmd"))
+ {
+ cDxr3Interface::Instance().ExternalReopenDevices();
+ SendStatus();
+ }
+ else if (string((const char*)m_msg) == string("CloseDxr3DeviceCmd"))
+ {
+ cDxr3Interface::Instance().ExternalReleaseDevices();
+ SendStatus();
+ }
+ else if (string((const char*)m_msg) == string("StatusDxr3DeviceCmd"))
+ {
+ SendStatus();
+ }
+ else if (string((const char *)m_msg) == string("SaveDxr3DeviceCmd"))
+ {
+ m_bSavedState = cDxr3Interface::Instance().IsExternalReleased();
+ SendStatus();
+ }
+ else if (string((const char *)m_msg) == string("RestoreDxr3DeviceCmd"))
+ {
+ if (m_bSavedState)
+ {
+ cDxr3Interface::Instance().ExternalReleaseDevices();
+ }
+ else
+ {
+ cDxr3Interface::Instance().ExternalReopenDevices();
+ }
+ SendStatus();
+ }
+ else
+ {
+ string res("Error\n");
+ write(m_fdConnectionSocket, res.c_str(), res.size());
+ }
+}
+
+// ==================================
+void cDxr3StartStopThread::Action()
+{
+ cDxr3StartStopSocket mySocket;
+ while (mySocket.WaitForConnection())
+ {
+ while (mySocket.GetNextMessage());
+ }
+}