Input/Output slaves.

Тема в разделе "WASM.HEAP", создана пользователем device, 29 июл 2008.

  1. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Вот я думаю: а не рассказать ли о этих штуках, а?

    Откуда берутся "нестандартные" протоколы в KDE? Мы знаем file: http: ftp:
    А zip: tar: и прочее?
    Те, кто знает о слейвах - читают и следят за ошибками, а кто не знает - учится.

    И так, KDE Input/Output slave предназначен для обработки некоего URL с помощью приложения-обработчика.
    В качестве примера, создадим проект "KWasmFinger" и зарегистрируем протокол aboutme:

    1. Прежде, чем приступать к программированию протокола, мы должны создать конфигурационный файл, который его опишет.
    Легче всего протокол программируется в среде KDevelop, так как там есть уже скелет стандартного протокола.

    Код (Text):
    1. ФАЙЛ kaboutme.protocol
    2. -----------
    3. [Protocol]
    4. exec=kio_kaboutme -- Это - наше приложение-обработчик
    5. protocol=aboutme -- имя протокола (типа file:, http:, то есть в адресной строке мы будем вводить aboutme:)
    6. input=none
    7. output=stream
    8. reading=true
    9. defaultMimetype=text/html
    10. Icon=remote
    11. Description=A kioslave for kaboutme
    12. --Думаю, остальное будет ясно - там идут описания на разных языках
    2. У нас в распоряжении есть 2 файла.
    kaboutme.h - заголовочный файл с описателем касса kio_kaboutmeProtocol, который наследует свойства и методы от KIO::SlaveBase
    и
    kaboutme.cpp - собственно, файл, с которым нам придется работать.

    Основная функция обработки данных - virtual void get(KURL &url)

    Код (Text):
    1. Пусть наш протокол определяет Finger информацию о пользователе, если URL=aboutme:user, где user - имя пользователя в базе MySQL
    2.  
    3. -------------------
    4.  
    5. void kio_kaboutmeProtocol::get(const KURL& url )
    6. {
    7.    
    8. // Вычленим имя user из адреса
    9. QString ur= url.prettyURL();
    10. QString UserName = ur.section (":",-1);
    11.    
    12. // Выведем информацию в статусную строку (это внизу окна)
    13.     infoMessage(i18n("Привет. Ты запросил информацию --> %1 Щас посмотрим...").arg( UserName.latin1() ) );
    14.    
    15. // Работаем с HTML
    16. // Кстати, обрабатывать и выводить можно ЛЮБЫЕ данные, даже графику и видео!
    17.     mimeType("text/html");
    18.    
    19. // Обычный заголовок
    20.     QString theData = QString("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf8\" /><title>Фингер слэйв!</head></head><h1>Вы запросили информацию о %1</h1><hr />").arg(UserName.latin1());
    21.  
    22. //Выводим пользователю
    23.   data(QCString(theData.latin1()));
    24.  
    25. // Коннектимся к базе
    26.  
    27. MYSQL mysql;
    28. mysql_init(&mysql);
    29. mysql_real_connect(&mysql,"localhost","root","","wasmfinger",0,NULL,0);
    30.  
    31. mysql_select_db (&mysql, "wasmfinger");
    32.  
    33. QString QQuery = QString ("SELECT * FROM users where CN=\"%1\";").arg(UserName.latin1());
    34.  
    35. const char* Query = QQuery.latin1();
    36. // Я не писал тут ни циклов, ни каких-либо проверок. Все работает в "Учебном режиме"
    37. mysql_query (&mysql,Query);
    38. MYSQL_RES* result;
    39. result = mysql_store_result(&mysql);
    40. MYSQL_ROW  ok;
    41. ok = mysql_fetch_row (result);
    42.  
    43. // Выводим инфо о юзере на экран
    44. QString info = QString ("<b>Полное имя:</b> %1<br /><b>e-mail:</b> %2<hr /> ").arg(ok[1]).arg(ok[2]);
    45.  data (QCString (info.latin1()));
    46. mysql_close(&mysql);
    47.  
    48. // Пустая строка закрывает поток
    49.     data(QByteArray());
    50.     finished();
    51. }
    Думаю, разобраться будет не трудно
     
  2. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Так выглядит работа протокола aboutme на моем компе
    [​IMG]
     
  3. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Может я форумом ошибся?
    Кому-нибудь может быть полезной эта информация?
     
  4. nds

    nds Member

    Публикаций:
    0
    Регистрация:
    16 июл 2007
    Сообщения:
    157
    В wasm.unix былобы наверно умеснее
    а в целом информация довольно интересная:)
     
  5. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Инсталяшка для тех кому просто охота запустить прогу
     
  6. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Немного добавлю.
    Если кто-то желает работать с каталогами --- inode/directory ему в помощь.
    Это такой MIME тип
    Да да! Каталог можно скачать с Интернета. Только размер у него будет... 4 килобайта + длина его имени.


    С помощью слэйва можно даже диск создать. Только операции затрахаешься описывать (чтение, просмотр, запись) :)
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    device
    пиши статью ;)
     
  8. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    wsd
    Нет