summaryrefslogtreecommitdiffstats
path: root/dcop/dcopref.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dcop/dcopref.cpp')
-rw-r--r--dcop/dcopref.cpp218
1 files changed, 218 insertions, 0 deletions
diff --git a/dcop/dcopref.cpp b/dcop/dcopref.cpp
new file mode 100644
index 000000000..9e94821fc
--- /dev/null
+++ b/dcop/dcopref.cpp
@@ -0,0 +1,218 @@
+/*****************************************************************
+
+Copyright (c) 1999 Preston Brown <pbrown@kde.org>
+Copyright (c) 1999 Matthias Ettrich <ettrich@kde.org>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************/
+
+#include "dcopref.h"
+#include "dcopclient.h"
+#include "dcopobject.h"
+
+#include <qdatastream.h>
+
+#define STR( s ) ( s.data() ? s.data() : "" )
+
+bool DCOPReply::typeCheck( const char* t )
+{
+ return typeCheck( t, true );
+}
+
+bool DCOPReply::typeCheck( const char* t, bool warn )
+{
+ if ( type == t )
+ return true;
+ if( warn
+ || strcmp( t, "<unknown>" )) // type not listed in dcoptypes.h
+ qWarning( "WARNING: DCOPReply<%s>: cast to '%s' error",
+ STR( type ), t );
+ return false;
+}
+
+// this has to stay BC too even if private, because it's called from inlines
+DCOPReply DCOPRef::callInternal( const QCString& fun, const QCString& args, const QByteArray& data )
+{
+ return callInternal( fun, args, data, NoEventLoop, -1 );
+}
+
+DCOPReply DCOPRef::callInternal( const QCString& fun, const QCString& args, const QByteArray& data,
+ EventLoopFlag useEventLoop, int timeout )
+{
+ DCOPReply reply;
+ if ( isNull() ) {
+ qWarning( "DCOPRef: call '%s' on null reference error",
+ STR( fun ) );
+ return reply;
+ }
+ QCString sig = fun;
+ if ( fun.find('(') == -1 ) {
+ sig += args;
+ if( args.find( "<unknown" ) != -1 )
+ qWarning("DCOPRef: unknown type error "
+ "<\"%s\",\"%s\">::call(\"%s\",%s",
+ STR(m_app), STR(m_obj), STR(fun), args.data()+1 );
+ }
+ DCOPClient* dc = dcopClient();
+ if ( !dc || !dc->isAttached() ) {
+ qWarning( "DCOPRef::call(): no DCOP client or client not attached error" );
+ return reply;
+ }
+ dc->call( m_app, m_obj, sig, data, reply.type, reply.data, useEventLoop == UseEventLoop, timeout );
+ return reply;
+}
+
+bool DCOPRef::sendInternal( const QCString& fun, const QCString& args, const QByteArray& data )
+{
+ if ( isNull() ) {
+ qWarning( "DCOPRef: send '%s' on null reference error",
+ STR( fun ) );
+ return false;
+ }
+ Q_UNUSED( data );
+ QCString sig = fun;
+ if ( fun.find('(') == -1 ) {
+ sig += args;
+ if( args.find( "<unknown" ) != -1 )
+ qWarning("DCOPRef: unknown type error "
+ "<\"%s\",\"%s\">::send(\"%s\",%s",
+ STR(m_app), STR(m_obj), STR(fun), args.data()+1 );
+ }
+ DCOPClient* dc = dcopClient();
+ if ( !dc || !dc->isAttached() ) {
+ qWarning( "DCOPRef::send(): no DCOP client or client not attached error" );
+ return false;
+ }
+ return dc->send( m_app, m_obj, sig, data );
+}
+
+DCOPRef::DCOPRef()
+ :d(0)
+{
+}
+
+DCOPRef::DCOPRef( const DCOPRef& ref )
+ :d( ref.d )
+{
+ m_app = ref.app();
+ m_obj = ref.obj();
+ m_type = ref.type();
+}
+
+DCOPRef::DCOPRef( DCOPObject *o )
+ : m_app( DCOPClient::mainClient() ? DCOPClient::mainClient()->appId() : QCString() ),
+ m_obj( o->objId() ), m_type( o->interfaces().last() ), d(0)
+
+{
+}
+
+DCOPRef::DCOPRef( const QCString& _app, const QCString& obj )
+ : m_app( _app ), m_obj( obj ), d(0)
+{
+}
+
+DCOPRef::DCOPRef( const QCString& _app, const QCString& _obj, const QCString& _type )
+ : m_app( _app ), m_obj( _obj ), m_type( _type ), d(0)
+{
+}
+
+bool DCOPRef::isNull() const
+{
+ return ( m_app.isNull() || m_obj.isNull() );
+}
+
+QCString DCOPRef::app() const
+{
+ return m_app;
+}
+
+QCString DCOPRef::obj() const
+{
+ return m_obj;
+}
+
+QCString DCOPRef::object() const
+{
+ return m_obj;
+}
+
+
+QCString DCOPRef::type() const
+{
+ return m_type;
+}
+
+void DCOPRef::setDCOPClient( DCOPClient* dc )
+{
+ d = (DCOPRefPrivate*) dc;
+}
+
+DCOPClient* DCOPRef::dcopClient() const
+{
+ return d ? (DCOPClient*)d : DCOPClient::mainClient();
+}
+
+DCOPRef& DCOPRef::operator=( const DCOPRef& ref )
+{
+ d = ref.d;
+ m_app = ref.app();
+ m_obj = ref.obj();
+ m_type = ref.type();
+ return *this;
+}
+
+void DCOPRef::setRef( const QCString& _app, const QCString& _obj )
+{
+ m_app = _app;
+ m_obj = _obj;
+ m_type = 0;
+}
+
+void DCOPRef::setRef( const QCString& _app, const QCString& _obj, const QCString& _type )
+{
+ m_app = _app;
+ m_obj = _obj;
+ m_type = _type;
+}
+
+void DCOPRef::clear()
+{
+ m_app = 0;
+ m_obj = 0;
+ m_type = 0;
+}
+
+QDataStream& operator<<( QDataStream& str, const DCOPRef& ref )
+{
+ str << ref.app();
+ str << ref.obj();
+ str << ref.type();
+
+ return str;
+}
+
+QDataStream& operator>>( QDataStream& str, DCOPRef& ref )
+{
+ QCString a, o, t;
+ str >> a >> o >> t;
+
+ ref.setRef( a, o, t );
+
+ return str;
+}