*/
void Socket::Start(void)
{
- ObjectLock olock(this);
-
ASSERT(!m_ReadThread.joinable() && !m_WriteThread.joinable());
ASSERT(GetFD() != INVALID_SOCKET);
*/
void Socket::Close(void)
{
- ObjectLock olock(this);
+ {
+ ObjectLock olock(this);
- if (m_FD == INVALID_SOCKET)
- return;
+ if (m_FD == INVALID_SOCKET)
+ return;
- closesocket(m_FD);
- m_FD = INVALID_SOCKET;
+ closesocket(m_FD);
+ m_FD = INVALID_SOCKET;
+ }
Stream::Close();
}
*/
size_t Socket::Read(void *buffer, size_t size)
{
- ObjectLock olock(this);
-
- if (m_Listening)
- throw new logic_error("Socket does not support Read().");
-
{
- ObjectLock olock(m_RecvQueue);
-
- if (m_RecvQueue->GetAvailableBytes() == 0)
- CheckException();
+ ObjectLock olock(this);
- return m_RecvQueue->Read(buffer, size);
+ if (m_Listening)
+ throw new logic_error("Socket does not support Read().");
}
+
+ if (m_RecvQueue->GetAvailableBytes() == 0)
+ CheckException();
+
+ return m_RecvQueue->Read(buffer, size);
}
/**
throw new logic_error("Socket does not support Peek().");
}
- {
- ObjectLock olock(m_RecvQueue);
-
- if (m_RecvQueue->GetAvailableBytes() == 0)
- CheckException();
+ if (m_RecvQueue->GetAvailableBytes() == 0)
+ CheckException();
- return m_RecvQueue->Peek(buffer, size);
- }
+ return m_RecvQueue->Peek(buffer, size);
}
/**
*/
void Socket::Listen(void)
{
- ObjectLock olock(this);
-
if (listen(GetFD(), SOMAXCONN) < 0)
BOOST_THROW_EXCEPTION(SocketException("listen() failed", GetError()));
- m_Listening = true;
+ {
+ ObjectLock olock(this);
+ m_Listening = true;
+ }
}
void Socket::HandleWritable(void)
if (fd < 0)
BOOST_THROW_EXCEPTION(SocketException("accept() failed", GetError()));
- TcpSocket::Ptr client = boost::make_shared<TcpSocket>();
+ Socket::Ptr client = boost::make_shared<Socket>();
client->SetFD(fd);
OnNewClient(GetSelf(), client);
}
SetConnected(false);
}
+
+bool Stream::ReadLine(String *line, size_t maxLength)
+{
+ char buffer[maxLength];
+
+ size_t rc = Peek(buffer, maxLength);
+
+ for (int i = 0; i < rc; i++) {
+ if (buffer[i] == '\n') {
+ *line = String(buffer, &(buffer[i]));
+
+ Read(NULL, rc);
+
+ return true;
+ }
+ }
+
+ return false;
+}