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

From KDE TechBase
m (Text replace - "<code>" to "<syntaxhighlight lang="text">")
m (Text replace - "</code>" to "</syntaxhighlight>")
Line 47: Line 47:


#endif
#endif
</code>
</syntaxhighlight>


== hello.cpp ==
== hello.cpp ==
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 ) {}
</code>
</syntaxhighlight>


== hello.protocol ==  
== hello.protocol ==  
Line 99: Line 99:
mkdir build
mkdir build
cd build
cd build
</code>
</syntaxhighlight>
Run cmake and make
Run cmake and make
<syntaxhighlight lang="text">
<syntaxhighlight lang="text">
cmake ..
cmake ..
make
make
</code>
</syntaxhighlight>


now you can install it (maybe you should use an experimental setup?)
now you can install it (maybe you should use an experimental setup?)
<syntaxhighlight lang="text">
<syntaxhighlight lang="text">
make install
make install
</code>
</syntaxhighlight>


If you should want to do this by hand:
If you should want to do this by hand:
Line 123: Line 123:
<syntaxhighlight lang="text">
<syntaxhighlight lang="text">
make install
make install
</code>
</syntaxhighlight>


or if you want to install it to your system:
or if you want to install it to your system:
<syntaxhighlight lang="text">
<syntaxhighlight lang="text">
sudo make install
sudo make install
</code>
</syntaxhighlight>


Of course you can also do this by hand
Of course you can also do this by hand

Revision as of 20:52, 29 June 2011

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

#include "hello.h"
#include <kdebug.h> 
#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

Create a new Folder "build":

mkdir build
cd build

Run cmake and make

cmake ..
make

now you can install it (maybe you should use an experimental setup?)

make install

If you should want to do this by hand:

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

this does not complile if the qt headers are not in /usr/local/include

On my system I could fix it by changing -I/usr/local/include to -I/usr/include/qt4

Install the stuff

now you can install it (maybe you should use an experimental setup?)

make install

or if you want to install it to your system:

sudo make install

Of course you can also do this by hand

Find out where your protocols are lying:

kde4-config --path services
/usr/share/kde4/services/
kde4-config --path module
/usr/lib64/kde4/
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

in Konqueror

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

on the command line

kioclient 'cat' 'hello:///'