/*
* This file is part of the libCEC(R) library.
*
- * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved.
+ * libCEC(R) is Copyright (C) 2011-2013 Pulse-Eight Limited. All rights reserved.
* libCEC(R) is an original work, containing original code.
*
* libCEC(R) is a trademark of Pulse-Eight Limited.
* http://www.pulse-eight.net/
*/
-#include "../threads/mutex.h"
-#include "../util/StdString.h"
+#include "lib/platform/threads/mutex.h"
#if defined(__WINDOWS__)
-#include "../windows/os-socket.h"
+#include "lib/platform/windows/os-socket.h"
#else
-#include "../posix/os-socket.h"
+#include "lib/platform/posix/os-socket.h"
#endif
+#include <string>
+
// Common socket operations
namespace PLATFORM
virtual bool IsOpen(void) = 0;
virtual ssize_t Write(void* data, size_t len) = 0;
virtual ssize_t Read(void* data, size_t len, uint64_t iTimeoutMs = 0) = 0;
- virtual CStdString GetError(void) = 0;
+ virtual std::string GetError(void) = 0;
virtual int GetErrorNumber(void) = 0;
- virtual CStdString GetName(void) = 0;
+ virtual std::string GetName(void) = 0;
};
template <typename _SType>
class CCommonSocket : public ISocket
{
public:
- CCommonSocket(_SType initialSocketValue, const CStdString &strName) :
+ CCommonSocket(_SType initialSocketValue, const std::string &strName) :
m_socket(initialSocketValue),
m_strName(strName),
m_iError(0) {}
virtual ~CCommonSocket(void) {}
- virtual CStdString GetError(void)
+ virtual std::string GetError(void)
{
- CStdString strError;
- strError = m_strError.IsEmpty() && m_iError != 0 ? strerror(m_iError) : m_strError;
+ std::string strError;
+ strError = m_strError.empty() && m_iError != 0 ? strerror(m_iError) : m_strError;
return strError;
}
return m_iError;
}
- virtual CStdString GetName(void)
+ virtual std::string GetName(void)
{
- CStdString strName;
+ std::string strName;
strName = m_strName;
return strName;
}
protected:
_SType m_socket;
- CStdString m_strError;
- CStdString m_strName;
+ std::string m_strError;
+ std::string m_strName;
int m_iError;
CMutex m_mutex;
};
public:
CProtectedSocket(_Socket *socket) :
m_socket(socket),
- m_iUseCount(0) {}
+ m_bIsIdle(true) {}
virtual ~CProtectedSocket(void)
{
virtual bool IsBusy(void)
{
CLockObject lock(m_mutex);
- return m_socket && m_iUseCount > 0;
+ return m_socket && !m_bIsIdle;
}
- virtual int GetUseCount(void)
+ virtual bool IsIdle(void)
{
CLockObject lock(m_mutex);
- return m_iUseCount;
+ return m_socket && m_bIsIdle;
}
virtual ssize_t Write(void* data, size_t len)
{
if (!m_socket || !WaitReady())
- return EINVAL;
+ return -EINVAL;
ssize_t iReturn = m_socket->Write(data, len);
MarkReady();
virtual ssize_t Read(void* data, size_t len, uint64_t iTimeoutMs = 0)
{
if (!m_socket || !WaitReady())
- return EINVAL;
+ return -EINVAL;
ssize_t iReturn = m_socket->Read(data, len, iTimeoutMs);
MarkReady();
return iReturn;
}
- virtual CStdString GetError(void)
+ virtual std::string GetError(void)
{
- CStdString strError;
+ std::string strError;
CLockObject lock(m_mutex);
strError = m_socket ? m_socket->GetError() : "";
return strError;
virtual int GetErrorNumber(void)
{
CLockObject lock(m_mutex);
- return m_socket ? m_socket->GetErrorNumber() : EINVAL;
+ return m_socket ? m_socket->GetErrorNumber() : -EINVAL;
}
- virtual CStdString GetName(void)
+ virtual std::string GetName(void)
{
- CStdString strName;
+ std::string strName;
CLockObject lock(m_mutex);
strName = m_socket ? m_socket->GetName() : "";
return strName;
bool WaitReady(void)
{
CLockObject lock(m_mutex);
- if (m_iUseCount > 0)
- m_condition.Wait(m_mutex);
-
- if (m_iUseCount > 0)
- return false;
-
- ++m_iUseCount;
+ m_condition.Wait(m_mutex, m_bIsIdle);
+ m_bIsIdle = false;
return true;
}
void MarkReady(void)
{
CLockObject lock(m_mutex);
- if (m_iUseCount > 0)
- --m_iUseCount;
- m_condition.Broadcast();
+ m_bIsIdle = true;
+ m_condition.Signal();
}
- _Socket *m_socket;
- CMutex m_mutex;
- CCondition m_condition;
- int m_iUseCount;
+ _Socket * m_socket;
+ CMutex m_mutex;
+ CCondition<bool> m_condition;
+ bool m_bIsIdle;
};
};