You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.8 KiB
C++
85 lines
1.8 KiB
C++
14 years ago
|
#include "ipcserver.h"
|
||
|
|
||
|
#include <qsocket.h>
|
||
|
#include <qvariant.h>
|
||
|
#include <qimage.h>
|
||
|
#include <qpalette.h>
|
||
|
#include <qapplication.h>
|
||
|
|
||
|
class IpcSocket : public QSocket
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
IpcSocket( QObject *parent) : QSocket( parent )
|
||
|
{
|
||
|
packetSize = 0;
|
||
|
connect( this, SIGNAL(readyRead()), SLOT(read()) );
|
||
|
}
|
||
|
|
||
|
signals:
|
||
|
void receivedText( const QString& );
|
||
|
void receivedPixmap( const QPixmap& );
|
||
|
|
||
|
private slots:
|
||
|
void read()
|
||
|
{
|
||
|
Q_ULONG bytesAvail = bytesAvailable();
|
||
|
for ( ;; ) {
|
||
|
if ( packetSize == 0 ) {
|
||
|
QDataStream ds( this );
|
||
|
if ( bytesAvail < 4 )
|
||
|
return;
|
||
|
ds >> packetSize;
|
||
|
bytesAvail -= 4;
|
||
|
} else {
|
||
|
if ( bytesAvail < packetSize )
|
||
|
return;
|
||
|
// read the packet in a byte array to be sure that you don't
|
||
|
// read too much or too less
|
||
|
QByteArray ba( packetSize );
|
||
|
readBlock( ba.data(), packetSize );
|
||
|
bytesAvail -= packetSize;
|
||
|
packetSize = 0;
|
||
|
|
||
|
QVariant variant;
|
||
|
QDataStream ds( ba, IO_ReadOnly );
|
||
|
ds >> variant;
|
||
|
switch ( variant.type() ) {
|
||
|
case QVariant::String:
|
||
|
emit receivedText( variant.toString() );
|
||
|
break;
|
||
|
case QVariant::Image:
|
||
|
emit receivedPixmap( QPixmap(variant.toImage()) );
|
||
|
break;
|
||
|
case QVariant::Palette:
|
||
|
QApplication::setPalette( variant.toPalette(), TRUE );
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
Q_UINT32 packetSize;
|
||
|
};
|
||
|
|
||
|
IpcServer::IpcServer( Q_UINT16 port, QObject *parent ) :
|
||
|
QServerSocket( 0x7f000001, port, 1, parent )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void IpcServer::newConnection( int socket )
|
||
|
{
|
||
|
IpcSocket *s = new IpcSocket( this );
|
||
|
s->setSocket( socket );
|
||
|
connect( s, SIGNAL(receivedText(const QString&)),
|
||
|
SIGNAL(receivedText(const QString&)) );
|
||
|
connect( s, SIGNAL(receivedPixmap(const QPixmap&)),
|
||
|
SIGNAL(receivedPixmap(const QPixmap&)) );
|
||
|
}
|
||
|
|
||
|
#include "ipcserver.moc"
|