Back to index

libsfml  1.6+dfsg2
SelectorBase.cpp
Go to the documentation of this file.
00001 
00002 //
00003 // SFML - Simple and Fast Multimedia Library
00004 // Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com)
00005 //
00006 // This software is provided 'as-is', without any express or implied warranty.
00007 // In no event will the authors be held liable for any damages arising from the use of this software.
00008 //
00009 // Permission is granted to anyone to use this software for any purpose,
00010 // including commercial applications, and to alter it and redistribute it freely,
00011 // subject to the following restrictions:
00012 //
00013 // 1. The origin of this software must not be misrepresented;
00014 //    you must not claim that you wrote the original software.
00015 //    If you use this software in a product, an acknowledgment
00016 //    in the product documentation would be appreciated but is not required.
00017 //
00018 // 2. Altered source versions must be plainly marked as such,
00019 //    and must not be misrepresented as being the original software.
00020 //
00021 // 3. This notice may not be removed or altered from any source distribution.
00022 //
00024 
00025 #ifdef _MSC_VER
00026     #pragma warning(disable : 4127) // "conditional expression is constant" generated by the FD_SET macro
00027 #endif
00028 
00030 // Headers
00032 #include <SFML/Network/SelectorBase.hpp>
00033 
00034 
00035 namespace sf
00036 {
00040 SelectorBase::SelectorBase() :
00041 myMaxSocket(0)
00042 {
00043     Clear();
00044 }
00045 
00046 
00050 void SelectorBase::Add(SocketHelper::SocketType Socket)
00051 {
00052     FD_SET(Socket, &mySet);
00053 
00054     int Size = static_cast<int>(Socket);
00055     if (Size > myMaxSocket)
00056         myMaxSocket = Size;
00057 }
00058 
00059 
00063 void SelectorBase::Remove(SocketHelper::SocketType Socket)
00064 {
00065     FD_CLR(Socket, &mySet);
00066 }
00067 
00068 
00072 void SelectorBase::Clear()
00073 {
00074     FD_ZERO(&mySet);
00075     FD_ZERO(&mySetReady);
00076 
00077     myMaxSocket = 0;
00078 }
00079 
00080 
00086 unsigned int SelectorBase::Wait(float Timeout)
00087 {
00088     // Setup the timeout structure
00089     timeval Time;
00090     Time.tv_sec  = static_cast<long>(Timeout);
00091     Time.tv_usec = (static_cast<long>(Timeout * 1000) % 1000) * 1000;
00092 
00093     // Prepare the set of sockets to return
00094     mySetReady = mySet;
00095 
00096     // Wait until one of the sockets is ready for reading, or timeout is reached
00097     int NbSockets = select(myMaxSocket + 1, &mySetReady, NULL, NULL, Timeout > 0 ? &Time : NULL);
00098 
00099     return NbSockets >= 0 ? static_cast<unsigned int>(NbSockets) : 0;
00100 }
00101 
00102 
00108 SocketHelper::SocketType SelectorBase::GetSocketReady(unsigned int Index)
00109 {
00110     // The standard FD_xxx interface doesn't define a direct access,
00111     // so we must go through the whole set to find the socket we're looking for
00112     for (int i = 0; i < myMaxSocket + 1; ++i)
00113     {
00114         if (FD_ISSET(i, &mySetReady))
00115         {
00116             // Current socket is ready, but is it the Index-th one ?
00117             if (Index > 0)
00118             {
00119                 Index--;
00120             }
00121             else
00122             {
00123                 return static_cast<SocketHelper::SocketType>(i);
00124             }
00125         }
00126     }
00127 
00128     // Invalid index : return an invalid socket
00129     return SocketHelper::InvalidSocket();
00130 }
00131 
00132 } // namespace sf