Diffstat (limited to 'library/qcopenvelope_qws.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | library/qcopenvelope_qws.cpp | 66 |
1 files changed, 20 insertions, 46 deletions
diff --git a/library/qcopenvelope_qws.cpp b/library/qcopenvelope_qws.cpp index 81bb0f5..0aac32b 100644 --- a/library/qcopenvelope_qws.cpp +++ b/library/qcopenvelope_qws.cpp @@ -73,101 +73,75 @@ connect( myChannel, SIGNAL(received(const QCString &, const QByteArray &)), this, SLOT(fooBarMessage( const QCString &, const QByteArray &)) ); \endcode See also, the \link qcop.html list of Qtopia messages\endlink. */ /*! Constructs a QCopEnvelope that will write \a message to \a channel. If \a message has parameters, you must then use operator<<() to add these parameters to the envelope. */ QCopEnvelope::QCopEnvelope( const QCString& channel, const QCString& message ) : QDataStream(new QBuffer), ch(channel), msg(message) { device()->open(IO_WriteOnly); } /*! Writes the message and then destroys the QCopEnvelope. */ QCopEnvelope::~QCopEnvelope() { QByteArray data = ((QBuffer*)device())->buffer(); const int pref=16; if ( qstrncmp(ch.data(),"QPE/Application/",pref)==0 ) { QString qcopfn("/tmp/qcop-msg-"); qcopfn += ch.mid(pref); QFile qcopfile(qcopfn); if ( qcopfile.open(IO_WriteOnly | IO_Append) ) { +#ifndef Q_OS_WIN32 if(flock(qcopfile.handle(), LOCK_EX)) { - /* some error occured */ + /* some error occurred */ qWarning(QString("Failed to obtain file lock on %1 (%2)") .arg(qcopfn).arg( errno )); } - /* file locked, but might be stale (e.g. program for whatever - reason did not start). I modified more than 1 minute ago, - truncate the file */ - struct stat buf; - time_t t; - if (!fstat(qcopfile.handle(), &buf) && (time(&t) != (time_t)-1) ) { - // success on fstat, lets compare times - if (buf.st_ctime + 60 < t) { - qWarning("stale file " + qcopfn + " found. Truncating"); - ftruncate(qcopfile.handle(), 0); - qcopfile.reset(); - } +#endif + { + QDataStream ds(&qcopfile); + ds << ch << msg << data; + qcopfile.flush(); +#ifndef Q_OS_WIN32 + flock(qcopfile.handle(), LOCK_UN); +#endif + qcopfile.close(); } - if ( !QCopChannel::isRegistered(ch) ) { - int fsize = qcopfile.size(); - { - QDataStream ds(&qcopfile); - ds << ch << msg << data; - flock(qcopfile.handle(), LOCK_UN); - qcopfile.close(); - } - - if (fsize == 0) { - QString cmd = ch.mid(pref); - Global::execute(cmd); - } - - char c; - for (int i=0; (c=msg[i]); i++) { - if ( c == ' ' ) { - // Return-value required - // ###### wait for it - break; - } else if ( c == '(' ) { - // No return value - break; - } - } - goto end; - } // endif isRegisterd - flock(qcopfile.handle(), LOCK_UN); - qcopfile.close(); - qcopfile.remove(); + QByteArray b; + QDataStream stream(b, IO_WriteOnly); + stream << QString(ch.mid(pref)); + QCopChannel::send("QPE/Server", "processQCop(QString)", b); + delete device(); + return; } else { - qWarning(QString("Failed to obtain file lock on %1") + qWarning(QString("Failed to open file %1") .arg(qcopfn)); } // endif open } else if (qstrncmp(ch.data(), "QPE/SOAP/", 9) == 0) { // If this is a message that should go along the SOAP channel, we move the // endpoint URL to the data section. QString endpoint = ch.mid(9); - + ch = "QPE/SOAP"; // Since byte arrays are explicitly shared, this is appended to the data variable.. *this << endpoint; } + QCopChannel::send(ch,msg,data); -end: delete device(); } #endif |