00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
#ifdef socket
00029
#undef socket
00030
#endif
00031
00032
#ifdef bind
00033
#undef bind
00034
#endif
00035
00036
#ifdef listen
00037
#undef listen
00038
#endif
00039
00040
#ifdef connect
00041
#undef connect
00042
#endif
00043
00044
#ifdef accept
00045
#undef accept
00046
#endif
00047
00048
#ifdef getpeername
00049
#undef getpeername
00050
#endif
00051
00052
#ifdef getsockname
00053
#undef getsockname
00054
#endif
00055
00056
#ifndef KSOCKETBASE_H
00057
#define KSOCKETBASE_H
00058
00059
#include <qiodevice.h>
00060
#include <qstring.h>
00061
00062
#include "ksocketaddress.h"
00063
00064
00065
00066
00067
00068
00069
00070
00071
#define IO_ListenError (IO_UnspecifiedError+1)
00072
#define IO_AcceptError (IO_UnspecifiedError+2)
00073
#define IO_LookupError (IO_UnspecifiedError+3)
00074
#define IO_SocketCreateError (IO_UnspecifiedError+4)
00075
#define IO_BindError (IO_UnspecifiedError+5)
00076
00077
class QMutex;
00078
00079
namespace KNetwork {
00080
00081
class KResolverEntry;
00082
class KSocketDevice;
00083
00084
class KSocketBasePrivate;
00096 class KSocketBase
00097 {
00098
public:
00117 enum SocketOptions
00118 {
00119 Blocking = 0x01,
00120 AddressReuseable = 0x02,
00121 IPv6Only = 0x04,
00122 Keepalive = 0x08,
00123 Broadcast = 0x10
00124 };
00125
00150 enum SocketError
00151 {
00152 NoError = 0,
00153 LookupFailure,
00154 AddressInUse,
00155 AlreadyCreated,
00156 AlreadyBound,
00157 AlreadyConnected,
00158 NotConnected,
00159 NotBound,
00160 NotCreated,
00161 WouldBlock,
00162 ConnectionRefused,
00163 ConnectionTimedOut,
00164 InProgress,
00165 NetFailure,
00166 NotSupported,
00167 Timeout,
00168 UnknownError
00169 };
00170
00171
public:
00175
KSocketBase();
00176
00180
virtual ~KSocketBase();
00181
00182
00183
00184
00185
00186
00187
protected:
00201
virtual bool setSocketOptions(
int opts);
00202
00212
virtual int socketOptions() const;
00213
00214 public:
00230 virtual
bool setBlocking(
bool enable);
00231
00238
bool blocking() const;
00239
00254 virtual
bool setAddressReuseable(
bool enable);
00255
00262
bool addressReuseable() const;
00263
00279 virtual
bool setIPv6Only(
bool enable);
00280
00287
bool isIPv6Only() const;
00288
00300 virtual
bool setBroadcast(
bool enable);
00301
00308
bool broadcast() const;
00309
00316
KSocketDevice* socketDevice() const;
00317
00331 virtual
void setSocketDevice(
KSocketDevice* device);
00332
00354
int setRequestedCapabilities(
int add,
int remove = 0);
00355
00356 protected:
00361
bool hasDevice() const;
00362
00368
void setError(SocketError error);
00369
00370 public:
00375 SocketError error() const;
00376
00380 inline
QString errorString()
const
00381
{
return errorString(
error()); }
00382
00398
QMutex*
mutex() const;
00399
00400 public:
00406 static
QString errorString(SocketError code);
00407
00416 static
bool isFatalError(
int code);
00417
00418 private:
00421
void unsetSocketDevice();
00422
00423
KSocketBase(const
KSocketBase&);
00424 KSocketBase& operator =(const KSocketBase&);
00425
00426 KSocketBasePrivate *d;
00427
00428 friend class
KSocketDevice;
00429 };
00430
00440 class
KActiveSocketBase: public
QIODevice, virtual public KSocketBase
00441 {
00442
public:
00446
KActiveSocketBase();
00447
00451
virtual ~
KActiveSocketBase();
00452
00463
virtual bool bind(
const KResolverEntry& address) = 0;
00464
00481
virtual bool connect(
const KResolverEntry& address) = 0;
00482
00498
virtual bool disconnect() = 0;
00499
00504 virtual Offset size()
const
00505
{
return 0; }
00506
00511 virtual Offset at()
const
00512
{
return 0; }
00513
00518 virtual bool at(Offset)
00519 {
return false; }
00520
00525 virtual bool atEnd()
const
00526
{
return true; }
00527
00532
virtual Q_LONG bytesAvailable() const = 0;
00533
00545 virtual Q_LONG waitForMore(
int msecs,
bool *timeout = 0L) = 0;
00546
00553 virtual Q_LONG readBlock(
char *data, Q_ULONG len) = 0;
00554
00566 virtual Q_LONG readBlock(
char *data, Q_ULONG maxlen,
KSocketAddress& from) = 0;
00567
00579 virtual Q_LONG peekBlock(
char *data, Q_ULONG maxlen) = 0;
00580
00593 virtual Q_LONG peekBlock(
char *data, Q_ULONG maxlen,
KSocketAddress& from) = 0;
00594
00601 virtual Q_LONG writeBlock(const
char *data, Q_ULONG len) = 0;
00602
00614 virtual Q_LONG writeBlock(const
char *data, Q_ULONG len, const
KSocketAddress& to) = 0;
00615
00620 virtual
int getch();
00621
00626 virtual
int putch(
int ch);
00627
00632 virtual
int ungetch(
int)
00633 {
return -1; }
00634
00638
virtual KSocketAddress localAddress() const = 0;
00639
00645 virtual
KSocketAddress peerAddress() const = 0;
00646
00647 protected:
00654
void setError(
int status, SocketError error);
00655
00659
void resetError();
00660 };
00661
00671 class
KPassiveSocketBase: virtual public KSocketBase
00672 {
00673
public:
00677
KPassiveSocketBase();
00678
00682
virtual ~
KPassiveSocketBase();
00683
00694
virtual bool bind(
const KResolverEntry& address) = 0;
00695
00710
virtual bool listen(
int backlog) = 0;
00711
00716
virtual void close() = 0;
00717
00731
virtual KActiveSocketBase* accept() = 0;
00732
00736
virtual KSocketAddress localAddress()
const = 0;
00737
00741
virtual KSocketAddress externalAddress()
const = 0;
00742
00743
private:
00744
KPassiveSocketBase(
const KPassiveSocketBase&);
00745
KPassiveSocketBase& operator = (
const KPassiveSocketBase&);
00746 };
00747
00748 }
00749
00750
#endif