Development/Tutorials/KWallet

    From KDE TechBase
    Revision as of 20:32, 29 June 2011 by Neverendingo (talk | contribs) (Text replace - "<code cppqt n>" to "<syntaxhighlight lang="cpp-qt" line>")
    The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


    Development/Tutorials/KWallet


    Abstract

    A simple introduction for using the KWallet API, a secure storage framework.

    Prerequisites: Basic KDE knowledge, C++.

    Example

    The API is fun and easy to use, and will guarantee you a long and stable life.

    In KWallet, entries are organized in Folders (or think of it as categories), and in them there are binary data, maps, passwords and a catch-all unknown. Binary entries are application-specific arrays of bytes, maps should be known from QMaps, where a series of values are accessed by keys. Passwords are simply strings, and Unknown is for everything else.

    dialog.cpp

    <syntaxhighlight lang="cpp-qt" line>

    1. include "dialog.h"
    1. include <QLayout>
    2. include <QLabel>
    3. include <QPushButton>
    4. include <QMap>
    5. include <QVBoxLayout>
    6. include <QSpacerItem>

    Dialog::Dialog(QWidget *parent) :

       QDialog(parent)
    

    {

       setLayout(new QVBoxLayout);
       m_wallet = Wallet::openWallet(Wallet::NetworkWallet(),
                                     winId(),
                                     Wallet::Asynchronous);
    
       QLabel *explanation = new QLabel("HELLO!
    " "Please type in something to save in the wallet!
    " "It will be saved in the form data folder, under
    " "the entry http://test.com/#form."); m_statusLabel = new QLabel("Opening wallet...", this); m_statusLabel->setAlignment(Qt::AlignCenter); m_keyInput = new QLineEdit(this); m_valueInput = new QLineEdit(this); m_launchButton = new QPushButton("Save!", this); m_launchButton->setDisabled(true);
       layout()->addWidget(explanation);
       qobject_cast<QVBoxLayout*>(layout())->addStretch();
       layout()->addWidget(m_statusLabel);
       layout()->addWidget(new QLabel("Key:", this));
       layout()->addWidget(m_keyInput);
       layout()->addWidget(new QLabel("Value:", this));
       layout()->addWidget(m_valueInput);
       layout()->addWidget(m_launchButton);
    
       connect(m_launchButton, SIGNAL(clicked()), SLOT(doSave()));
       connect(m_wallet, SIGNAL(walletOpened(bool)), SLOT(walletOpened(bool)));
       setMinimumSize(500, 200);
    

    }

    void Dialog::walletOpened(bool ok) {

       if (ok &&
           (m_wallet->hasFolder(KWallet::Wallet::FormDataFolder()) ||
           m_wallet->createFolder(KWallet::Wallet::FormDataFolder())) &&
           m_wallet->setFolder(KWallet::Wallet::FormDataFolder())) {
           m_launchButton->setDisabled(false);
           m_statusLabel->setText("Idle.");
       } else
           m_statusLabel->setText("Error opening wallet!");
    

    }

    void Dialog::doSave() {

       if (m_keyInput->text().isEmpty() || m_valueInput->text().isEmpty()) {
           m_statusLabel->setText("Empty field!");
           return;
       }
    
       m_launchButton->setDisabled(true);
    
       m_statusLabel->setText("Saving ...");
    
       QMap<QString, QString> map;
       map[m_keyInput->text()] = m_valueInput->text();
       if (m_wallet->writeMap("http://test.com/#form", map)) m_statusLabel->setText("Something went wrong!");
       else {
           m_statusLabel->setText("Saved!");
           m_keyInput->clear();
           m_valueInput->clear();
       }
       m_launchButton->setDisabled(false);
    

    }

    dialog.h

    <syntaxhighlight lang="cpp-qt" line>

    1. ifndef DIALOG_H
    2. define DIALOG_H
    1. include <QDialog>
    2. include <QLabel>
    3. include <QLineEdit>
    4. include <KWallet/Wallet>

    using KWallet::Wallet;

    class Dialog : public QDialog { Q_OBJECT public:

       Dialog(QWidget *parent = 0);
    

    private slots:

       void doSave();
       void walletOpened(bool ok);
    

    private:

       Wallet *m_wallet;
       QLineEdit *m_keyInput;
       QLineEdit *m_valueInput;
       QLabel *m_statusLabel;
       QPushButton *m_launchButton;
    

    };

    1. endif // DIALOG_H

    main.cpp

    <syntaxhighlight lang="cpp-qt" line>

    1. include "dialog.h"
    1. include <KAboutData>
    2. include <KApplication>
    3. include <KCmdLineArgs>

    static KAboutData about(

       "KWalletDemoApplication",
       "",
       ki18n("KWalletDemoApplication"),
       "1.0",
       ki18n("Demonstrates basic KWallet usage."),
       KAboutData::License_LGPL,
       ki18n("(C) 2010 Martin Sandsmark"),
       KLocalizedString(),
       "http://www.mts.ms/");
    

    int main(int argc, char *argv[]) {

       about.addAuthor(ki18n("Martin Sandsmark"), ki18n("Maintainer"), "[email protected]", "http://iskrembilen.com/");
    
       KCmdLineArgs::init(argc, argv, &about);
       KApplication app;
    
       Dialog dialog;
       dialog.show();
       return app.exec();
    

    }

    CMakeLists.txt

    project(Importer)

    find_package(KDE4 REQUIRED) add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) include(KDE4Defaults) include(MacroLibrary) include_directories(${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES})

    set(SRCS main.cpp dialog.cpp)

    kde4_add_executable(kwallet-demo ${SRCS}) target_link_libraries(kwallet-demo ${KDE4_KDECORE_LIBS} ${KDE4_KPARTS_LIBS} ${KDE4_KDEUI_LIBS}) install(TARGETS kwallet-demo ${INSTALL_TARGETS_DEFAULT_ARGS})