PageRenderTime 35ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/mordor/streams/socket.cpp

http://github.com/mozy/mordor
C++ | 87 lines | 73 code | 13 blank | 1 comment | 2 complexity | 0d7a8c1a8baf0954aea3ed617badaf99 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. // Copyright (c) 2009 - Mozy, Inc.
  2. #include "socket.h"
  3. #include "buffer.h"
  4. #include "mordor/assert.h"
  5. #include "mordor/socket.h"
  6. namespace Mordor {
  7. SocketStream::SocketStream(Socket::ptr socket, bool own)
  8. : m_socket(socket),
  9. m_own(own)
  10. {
  11. MORDOR_ASSERT(socket);
  12. }
  13. void
  14. SocketStream::close(CloseType type)
  15. {
  16. if (m_socket && m_own) {
  17. int how;
  18. switch(type) {
  19. case READ:
  20. how = SHUT_RD;
  21. break;
  22. case WRITE:
  23. how = SHUT_WR;
  24. break;
  25. default:
  26. how = SHUT_RDWR;
  27. break;
  28. }
  29. m_socket->shutdown(how);
  30. }
  31. }
  32. size_t
  33. SocketStream::read(Buffer &buffer, size_t length)
  34. {
  35. std::vector<iovec> iovs = buffer.writeBuffers(length);
  36. size_t result = m_socket->receive(&iovs[0], iovs.size());
  37. buffer.produce(result);
  38. return result;
  39. }
  40. size_t
  41. SocketStream::read(void *buffer, size_t length)
  42. {
  43. return m_socket->receive(buffer, length);
  44. }
  45. void
  46. SocketStream::cancelRead()
  47. {
  48. m_socket->cancelReceive();
  49. }
  50. size_t
  51. SocketStream::write(const Buffer &buffer, size_t length)
  52. {
  53. const std::vector<iovec> iovs = buffer.readBuffers(length);
  54. size_t result = m_socket->send(&iovs[0], iovs.size());
  55. MORDOR_ASSERT(result > 0);
  56. return result;
  57. }
  58. size_t
  59. SocketStream::write(const void *buffer, size_t length)
  60. {
  61. return m_socket->send(buffer, length);
  62. }
  63. void
  64. SocketStream::cancelWrite()
  65. {
  66. m_socket->cancelSend();
  67. }
  68. boost::signals2::connection
  69. SocketStream::onRemoteClose(
  70. const boost::signals2::slot<void ()> &slot)
  71. {
  72. return m_socket->onRemoteClose(slot);
  73. }
  74. }