Development/Tutorials/KIO Slaves/Hello World: Difference between revisions

From KDE TechBase
(use qbytearray where appropriate)
Line 50: Line 50:


== hello.cpp ==
== hello.cpp ==
<pre>
<code cppqt>
#include "hello.h"
#include "hello.h"
#include <kdebug.h>  
#include <kdebug.h>  
Line 83: Line 83:
hello::hello( const QByteArray &pool, const QByteArray &app )
hello::hello( const QByteArray &pool, const QByteArray &app )
: SlaveBase( "hello", pool, app ) {}
: SlaveBase( "hello", pool, app ) {}
</pre>
</code>


== hello.protocol ==  
== hello.protocol ==  

Revision as of 17:00, 22 July 2009

Understanding

A kioslave allows you to represent any kind of storage in a way you want. As an example, the kio_http kioslave loads data from the network over the http (protocol) and shows it rendered as html. Technically, a kioslave is a shared object plus its description. E.g. the imap4 kioslave consist of the following files:

tweedleburg:/usr/local # find -iname "*imap4*"
./lib/kde4/kio_imap4.so
./share/kde4/services/imap4.protocol

The files

We want to write a "hello world" kioslave here. This can be seen as a learning exercise and as a template for future programming projects.

CMakeLists.txt

PROJECT( tutorial )
FIND_PACKAGE(KDE4 REQUIRED)
INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} . )

set(kio_hello_PART_SRCS
   hello.cpp)

kde4_add_plugin(kio_hello ${kio_hello_PART_SRCS})

target_link_libraries(kio_hello ${KDE4_KIO_LIBS})

install(TARGETS kio_hello  DESTINATION ${PLUGIN_INSTALL_DIR})


########### install files ###############

install(FILES hello.protocol DESTINATION ${SERVICES_INSTALL_DIR})

hello.h

#ifndef HELLO_H
#define HELLO_H

#include <kio/slavebase.h>

/**
  This class implements a hello-world kioslave
 */
class hello : public KIO::SlaveBase
{
  public:
    hello( const QByteArray &pool, const QByteArray &app );
    void get( const KUrl &url );
};

#endif

hello.cpp

  1. include "hello.h"
  2. include <kdebug.h>
  3. include <kcomponentdata.h>


extern "C" int KDE_EXPORT kdemain( int argc, char **argv ) {

 kDebug(7000) << "Entering function";
 KComponentData instance( "kio_hello" );
 if (argc != 4) 
 {
   fprintf( stderr, "Usage: kio_hello protocol domain-socket1 domain-socket2\n");
   exit( -1 );
 }
 hello slave( argv[2], argv[3] );
 slave.dispatchLoop();
 return 0;

}

void hello::get( const KUrl &url ) {

 kDebug(7000) << "Entering function";
 mimeType( "text/plain" );
 QByteArray str( "Hello_world" );
 data( str );
 finished();
 kDebug(7000) << "Leaving function";

}

hello::hello( const QByteArray &pool, const QByteArray &app )

SlaveBase( "hello", pool, app ) {}

hello.protocol

[Protocol]
DocPath=kioslave/kio_hello.html 
exec=kio_hello
input=none
output=filesystem
protocol=hello
reading=true

Compile the stuff

g++ -shared -lkdeui -lkio -lkdecore -fPIC -I/usr/local/include hello.cpp -o kio_hello.so

Install the stuff

Find out where your protocols are lying:

kde4-config --path services
/usr/share/kde4/services/
cp kio_hello.so /usr/local/lib/kde4/
cp kio_hello.so /usr/lib64/kde4/
cp kio_hello.protocol /usr/share/kde4/services/

Test it

Start kinfocenter, choose hello as protocol. If this is possible, start konqueror, type hello:/// into the URL bar.