Development/Tutorials/KIO Slaves/Hello World

    From KDE TechBase

    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:
        void get( const KUrl &url );
        hello( const QString &pool, const QString &app );
    };
    
    #endif
    

    hello.cpp

    #include "hello.h"
    #include <kdebug.h> 
    #include <kcomponentdata.h>
    
    extern "C" { int kdemain( int argc, char **argv ); }                                    
    
    int 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" );
      QString str( "Hello_world" );
      data( str.toAscii() );
      finished();
      kDebug(7000) << "Leaving function";
    }
    
    hello::hello( const QString &pool, const QString &app )
    : SlaveBase( QByteArray("hello"), pool.toAscii(), app.toAscii() ) {}
    

    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.