1 | #include "ipcserver.h"
|
---|
2 |
|
---|
3 | #include <qsocket.h>
|
---|
4 | #include <qvariant.h>
|
---|
5 | #include <qimage.h>
|
---|
6 | #include <qpalette.h>
|
---|
7 | #include <qapplication.h>
|
---|
8 |
|
---|
9 | class IpcSocket : public QSocket
|
---|
10 | {
|
---|
11 | Q_OBJECT
|
---|
12 |
|
---|
13 | public:
|
---|
14 | IpcSocket( QObject *parent) : QSocket( parent )
|
---|
15 | {
|
---|
16 | packetSize = 0;
|
---|
17 | connect( this, SIGNAL(readyRead()), SLOT(read()) );
|
---|
18 | }
|
---|
19 |
|
---|
20 | signals:
|
---|
21 | void receivedText( const QString& );
|
---|
22 | void receivedPixmap( const QPixmap& );
|
---|
23 |
|
---|
24 | private slots:
|
---|
25 | void read()
|
---|
26 | {
|
---|
27 | Q_ULONG bytesAvail = bytesAvailable();
|
---|
28 | for ( ;; ) {
|
---|
29 | if ( packetSize == 0 ) {
|
---|
30 | QDataStream ds( this );
|
---|
31 | if ( bytesAvail < 4 )
|
---|
32 | return;
|
---|
33 | ds >> packetSize;
|
---|
34 | bytesAvail -= 4;
|
---|
35 | } else {
|
---|
36 | if ( bytesAvail < packetSize )
|
---|
37 | return;
|
---|
38 | // read the packet in a byte array to be sure that you don't
|
---|
39 | // read too much or too less
|
---|
40 | QByteArray ba( packetSize );
|
---|
41 | readBlock( ba.data(), packetSize );
|
---|
42 | bytesAvail -= packetSize;
|
---|
43 | packetSize = 0;
|
---|
44 |
|
---|
45 | QVariant variant;
|
---|
46 | QDataStream ds( ba, IO_ReadOnly );
|
---|
47 | ds >> variant;
|
---|
48 | switch ( variant.type() ) {
|
---|
49 | case QVariant::String:
|
---|
50 | emit receivedText( variant.toString() );
|
---|
51 | break;
|
---|
52 | case QVariant::Image:
|
---|
53 | emit receivedPixmap( QPixmap(variant.toImage()) );
|
---|
54 | break;
|
---|
55 | case QVariant::Palette:
|
---|
56 | QApplication::setPalette( variant.toPalette(), TRUE );
|
---|
57 | break;
|
---|
58 | default:
|
---|
59 | break;
|
---|
60 | }
|
---|
61 | }
|
---|
62 | }
|
---|
63 | }
|
---|
64 |
|
---|
65 | private:
|
---|
66 | Q_UINT32 packetSize;
|
---|
67 | };
|
---|
68 |
|
---|
69 | IpcServer::IpcServer( Q_UINT16 port, QObject *parent ) :
|
---|
70 | QServerSocket( 0x7f000001, port, 1, parent )
|
---|
71 | {
|
---|
72 | }
|
---|
73 |
|
---|
74 | void IpcServer::newConnection( int socket )
|
---|
75 | {
|
---|
76 | IpcSocket *s = new IpcSocket( this );
|
---|
77 | s->setSocket( socket );
|
---|
78 | connect( s, SIGNAL(receivedText(const QString&)),
|
---|
79 | SIGNAL(receivedText(const QString&)) );
|
---|
80 | connect( s, SIGNAL(receivedPixmap(const QPixmap&)),
|
---|
81 | SIGNAL(receivedPixmap(const QPixmap&)) );
|
---|
82 | }
|
---|
83 |
|
---|
84 | #include "ipcserver.moc"
|
---|