library of assembled shared sources

http://lass.cocamware.com

socket.cpp

Go to the documentation of this file.
00001 /**     @file
00002  *      @author Bram de Greve (bramz@users.sourceforge.net)
00003  *      @author Tom De Muer (tomdemuer@users.sourceforge.net)
00004  *
00005  *      *** BEGIN LICENSE INFORMATION ***
00006  *      
00007  *      The contents of this file are subject to the Common Public Attribution License 
00008  *      Version 1.0 (the "License"); you may not use this file except in compliance with 
00009  *      the License. You may obtain a copy of the License at 
00010  *      http://lass.sourceforge.net/cpal-license. The License is based on the 
00011  *      Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover 
00012  *      use of software over a computer network and provide for limited attribution for 
00013  *      the Original Developer. In addition, Exhibit A has been modified to be consistent 
00014  *      with Exhibit B.
00015  *      
00016  *      Software distributed under the License is distributed on an "AS IS" basis, WITHOUT 
00017  *      WARRANTY OF ANY KIND, either express or implied. See the License for the specific 
00018  *      language governing rights and limitations under the License.
00019  *      
00020  *      The Original Code is LASS - Library of Assembled Shared Sources.
00021  *      
00022  *      The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
00023  *      The Original Developer is the Initial Developer.
00024  *      
00025  *      All portions of the code written by the Initial Developer are:
00026  *      Copyright (C) 2004-2007 the Initial Developer.
00027  *      All Rights Reserved.
00028  *      
00029  *      Contributor(s):
00030  *
00031  *      Alternatively, the contents of this file may be used under the terms of the 
00032  *      GNU General Public License Version 2 or later (the GPL), in which case the 
00033  *      provisions of GPL are applicable instead of those above.  If you wish to allow use
00034  *      of your version of this file only under the terms of the GPL and not to allow 
00035  *      others to use your version of this file under the CPAL, indicate your decision by 
00036  *      deleting the provisions above and replace them with the notice and other 
00037  *      provisions required by the GPL License. If you do not delete the provisions above,
00038  *      a recipient may use your version of this file under either the CPAL or the GPL.
00039  *      
00040  *      *** END LICENSE INFORMATION ***
00041  */
00042 
00043 #include "io_common.h"
00044 #include "socket.h"
00045 
00046 #if LASS_HAVE_SYS_SOCKET_H && !defined(LASS_IO_SOCKET_HAVE_LIBC)
00047 #       define LASS_IO_SOCKET_HAVE_LIBC
00048 #endif
00049 
00050 #if defined(LASS_IO_SOCKET_HAVE_WINSOCK)
00051 #       include "impl/socket_winsock.inl"
00052 #elif defined(LASS_IO_SOCKET_HAVE_LIBC)
00053 #       include "impl/socket_libc.inl"
00054 #else
00055 #       error "[LASS BUILD MSG] Socket not supported for this platform"
00056 #endif
00057 
00058 #if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
00059 #       pragma warning(push)
00060 #       pragma warning(disable: 4244) // conversion from '__w64 int' to 'cont int', possible loss of data
00061 #endif
00062 
00063 namespace lass
00064 {
00065 namespace io
00066 {
00067 
00068 Socket::Socket()
00069 {
00070         pimpl_ = new impl::SocketImpl;
00071 }
00072 
00073 
00074 
00075 
00076 Socket::~Socket()
00077 {
00078         LASS_ASSERT(pimpl_);
00079         impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00080         delete pimpl;
00081         pimpl_ = 0;
00082 }
00083 
00084 
00085 
00086 void Socket::bind(unsigned short iPortNumber)
00087 {
00088         LASS_ASSERT(pimpl_);
00089         impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00090         pimpl->bind(iPortNumber);
00091 }
00092 
00093 
00094 
00095 void Socket::listen()
00096 {
00097         LASS_ASSERT(pimpl_);
00098         impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00099         pimpl->listen();
00100 }
00101 
00102 
00103 
00104 void Socket::accept(Socket& oConnection)
00105 {
00106         LASS_ASSERT(pimpl_);
00107         impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00108         LASS_ASSERT(oConnection.pimpl_);
00109         impl::SocketImpl* connection = static_cast<impl::SocketImpl*>(oConnection.pimpl_);
00110         pimpl->accept(connection);
00111 }
00112 
00113 
00114 
00115 void Socket::connect(const std::string& iIpAddress, unsigned short iPort)
00116 {
00117         LASS_ASSERT(pimpl_);
00118         impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00119         pimpl->connect(iIpAddress, iPort);
00120 }
00121 
00122 
00123 const int Socket::send(const void* iBegin, int iLength)
00124 {
00125         LASS_ASSERT(pimpl_);
00126         impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00127         return pimpl->send(iBegin, iLength);
00128 }
00129 
00130 
00131 
00132 const void* const Socket::send(const void* iBegin, const void* iEnd)
00133 {
00134         LASS_ASSERT(pimpl_);
00135         impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00136         const char* begin = static_cast<const char*>(iBegin);
00137         const char* end = static_cast<const char*>(iEnd);
00138         const int length = end - begin;
00139         const int sent = pimpl->send(begin, length);
00140         LASS_ASSERT(sent >= 0);
00141         return begin + sent;
00142 }
00143 
00144 
00145 
00146 const int Socket::receive(void* iBegin, int iLength)
00147 {
00148         LASS_ASSERT(pimpl_);
00149         impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00150         return pimpl->receive(iBegin, iLength);
00151 }
00152 
00153 
00154 
00155 void* const Socket::receive(void* iBegin, void* iEnd)
00156 {
00157         LASS_ASSERT(pimpl_);
00158         impl::SocketImpl* pimpl = static_cast<impl::SocketImpl*>(pimpl_);
00159         char* begin = static_cast<char*>(iBegin);
00160         char* end = static_cast<char*>(iEnd);
00161         const int length = end - begin;
00162         const int sent = pimpl->receive(begin, length);
00163         LASS_ASSERT(sent >= 0);
00164         return begin + sent;
00165 }
00166 
00167 
00168 
00169 void Socket::swap(Socket& ioOther)
00170 {
00171         std::swap(pimpl_, ioOther.pimpl_);
00172 }
00173 
00174 
00175 
00176 }
00177 }
00178 
00179 // EOF

Generated on Mon Nov 10 14:21:34 2008 for Library of Assembled Shared Sources by doxygen 1.5.7.1
SourceForge.net Logo