summaryrefslogtreecommitdiffstats
path: root/tqtinterface/qt4/src/kernel/tqsocketnotifier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tqtinterface/qt4/src/kernel/tqsocketnotifier.cpp')
-rw-r--r--tqtinterface/qt4/src/kernel/tqsocketnotifier.cpp270
1 files changed, 270 insertions, 0 deletions
diff --git a/tqtinterface/qt4/src/kernel/tqsocketnotifier.cpp b/tqtinterface/qt4/src/kernel/tqsocketnotifier.cpp
new file mode 100644
index 0000000..9275de3
--- /dev/null
+++ b/tqtinterface/qt4/src/kernel/tqsocketnotifier.cpp
@@ -0,0 +1,270 @@
+/****************************************************************************
+**
+** Implementation of TQSocketNotifier class
+**
+** Created : 951114
+**
+** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA.
+**
+** This file is part of the kernel module of the TQt GUI Toolkit.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free TQt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** This file may be used under the terms of the Q Public License as
+** defined by Trolltech ASA and appearing in the file LICENSE.TQPL
+** included in the packaging of this file. Licensees holding valid TQt
+** Commercial licenses may use this file in accordance with the TQt
+** Commercial License Agreement provided with the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "tqsocketnotifier.h"
+#include "tqapplication.h"
+#include "tqevent.h"
+#include "tqeventloop.h"
+#include "tqplatformdefs.h"
+
+#if defined(TQ_OS_UNIX)
+#include <sys/types.h>
+#endif
+
+#ifdef USE_QT4
+
+#else // USE_QT4
+
+/*!
+ \class TQSocketNotifier tqsocketnotifier.h
+ \brief The TQSocketNotifier class provides support for socket callbacks.
+
+ \ingroup io
+
+ This class makes it possible to write asynchronous socket-based
+ code in TQt. Using synchronous socket operations blocks the
+ program, which is clearly not acceptable for an event-driven GUI
+ program.
+
+ Once you have opened a non-blocking socket (whether for TCP, UDP,
+ a UNIX-domain socket, or any other protocol family your operating
+ system supports), you can create a socket notifier to monitor the
+ socket. Then you connect the activated() signal to the slot you
+ want to be called when a socket event occurs.
+
+ Note for Windows users: the socket passed to TQSocketNotifier will
+ become non-blocking, even if it was created as a blocking socket.
+
+ There are three types of socket notifiers (read, write and
+ exception); you must specify one of these in the constructor.
+
+ The type specifies when the activated() signal is to be emitted:
+ \list 1
+ \i TQSocketNotifier::Read - There is data to be read (socket read event).
+ \i TQSocketNotifier::Write - Data can be written (socket write event).
+ \i TQSocketNofifier::Exception - An exception has occurred (socket
+ exception event). We recommend against using this.
+ \endlist
+
+ For example, if you need to monitor both reads and writes for the
+ same socket you must create two socket notifiers.
+
+ For read notifiers it makes little sense to connect the
+ activated() signal to more than one slot because the data can be
+ read from the socket only once.
+
+ Also observe that if you do not read all the available data when
+ the read notifier fires, it fires again and again.
+
+ For write notifiers, immediately disable the notifier after the
+ activated() signal has been received and you have sent the data to
+ be written on the socket. When you have more data to be written,
+ enable it again to get a new activated() signal. The exception is
+ if the socket data writing operation (send() or equivalent) fails
+ with a "would block" error, which means that some buffer is full
+ and you must wait before sending more data. In that case you do
+ not need to disable and re-enable the write notifier; it will fire
+ again as soon as the system allows more data to be sent.
+
+ The behavior of a write notifier that is left in enabled state
+ after having emitting the first activated() signal (and no "would
+ block" error has occurred) is undefined. Depending on the
+ operating system, it may fire on every pass of the event loop or
+ not at all.
+
+ If you need a time-out for your sockets you can use either \link
+ TQObject::startTimer() timer events\endlink or the TQTimer class.
+
+ Socket action is detected in the \link TQApplication::exec() main
+ event loop\endlink of TQt. The X11 version of TQt has a single UNIX
+ select() call that incorporates all socket notifiers and the X
+ socket.
+
+ Note that on XFree86 for OS/2, select() works only in the thread
+ in which main() is running; you should therefore use that thread
+ for GUI operations.
+
+ \sa TQSocket, TQServerSocket, TQSocketDevice, TQFile::handle()
+*/
+
+/*!
+ \enum TQSocketNotifier::Type
+
+ \value Read
+ \value Write
+ \value Exception
+*/
+
+
+/*!
+ Constructs a socket notifier called \a name, with the tqparent, \a
+ tqparent. It watches \a socket for \a type events, and enables it.
+
+ It is generally advisable to explicitly enable or disable the
+ socket notifier, especially for write notifiers.
+
+ \sa setEnabled(), isEnabled()
+*/
+
+TQSocketNotifier::TQSocketNotifier( int socket, Type type, TQObject *tqparent,
+ const char *name )
+ : TQObject( tqparent, name )
+{
+#if defined(TQT_CHECK_RANGE)
+ if ( socket < 0 )
+ qWarning( "TQSocketNotifier: Invalid socket specified" );
+# if defined(TQ_OS_UNIX)
+ if ( socket >= FD_SETSIZE )
+ qWarning( "TQSocketNotifier: Socket descriptor too large for select()" );
+# endif
+#endif
+ sockfd = socket;
+ sntype = type;
+ snenabled = TRUE;
+ TQApplication::eventLoop()->registerSocketNotifier( this );
+}
+
+/*!
+ Destroys the socket notifier.
+*/
+
+TQSocketNotifier::~TQSocketNotifier()
+{
+ setEnabled( FALSE );
+}
+
+
+/*!
+ \fn void TQSocketNotifier::activated( int socket )
+
+ This signal is emitted under certain conditions specified by the
+ notifier type():
+ \list 1
+ \i TQSocketNotifier::Read - There is data to be read (socket read event).
+ \i TQSocketNotifier::Write - Data can be written (socket write event).
+ \i TQSocketNofifier::Exception - An exception has occurred (socket
+ exception event).
+ \endlist
+
+ The \a socket argument is the \link socket() socket\endlink identifier.
+
+ \sa type(), socket()
+*/
+
+
+/*!
+ \fn int TQSocketNotifier::socket() const
+
+ Returns the socket identifier specified to the constructor.
+
+ \sa type()
+*/
+
+/*!
+ \fn Type TQSocketNotifier::type() const
+
+ Returns the socket event type specified to the constructor: \c
+ TQSocketNotifier::Read, \c TQSocketNotifier::Write, or \c
+ TQSocketNotifier::Exception.
+
+ \sa socket()
+*/
+
+
+/*!
+ \fn bool TQSocketNotifier::isEnabled() const
+
+ Returns TRUE if the notifier is enabled; otherwise returns FALSE.
+
+ \sa setEnabled()
+*/
+
+/*!
+ Enables the notifier if \a enable is TRUE or disables it if \a
+ enable is FALSE.
+
+ The notifier is enabled by default.
+
+ If the notifier is enabled, it emits the activated() signal
+ whenever a socket event corresponding to its \link type()
+ type\endlink occurs. If it is disabled, it ignores socket events
+ (the same effect as not creating the socket notifier).
+
+ Write notifiers should normally be disabled immediately after the
+ activated() signal has been emitted; see discussion of write
+ notifiers in the \link #details class description\endlink above.
+
+ \sa isEnabled(), activated()
+*/
+
+void TQSocketNotifier::setEnabled( bool enable )
+{
+ if ( sockfd < 0 )
+ return;
+ if ( snenabled == enable ) // no change
+ return;
+ snenabled = enable;
+
+ TQEventLoop *eventloop = TQApplication::eventLoop();
+ if ( ! eventloop ) // perhaps application is shutting down
+ return;
+
+ if ( snenabled )
+ eventloop->registerSocketNotifier( this );
+ else
+ eventloop->unregisterSocketNotifier( this );
+}
+
+
+/*!\reimp
+*/
+bool TQSocketNotifier::event( TQEvent *e )
+{
+ // Emits the activated() signal when a \c TQEvent::SockAct is
+ // received.
+ TQObject::event( e ); // will activate filters
+ if ( e->type() == TQEvent::SockAct ) {
+ emit activated( sockfd );
+ return TRUE;
+ }
+ return FALSE;
+}
+
+#endif // USE_QT4 \ No newline at end of file