
/*
 *	This file was automatically generated by dbusxx-xml2cpp; DO NOT EDIT!
 */

#ifndef __dbusxx__configurationmanager_glue_h__ADAPTOR_MARSHAL_H
#define __dbusxx__configurationmanager_glue_h__ADAPTOR_MARSHAL_H

#include <dbus-c++/dbus.h>
#include <cassert>

namespace org {
namespace sflphone {
namespace SFLphone {

class ConfigurationManager_adaptor
: public ::DBus::InterfaceAdaptor
{
public:

    ConfigurationManager_adaptor()
    : ::DBus::InterfaceAdaptor("org.sflphone.SFLphone.ConfigurationManager")
    {
        register_method(ConfigurationManager_adaptor, getAccountDetails, _getAccountDetails_stub);
        register_method(ConfigurationManager_adaptor, setAccountDetails, _setAccountDetails_stub);
        register_method(ConfigurationManager_adaptor, setCredentials, _setCredentials_stub);
        register_method(ConfigurationManager_adaptor, getIp2IpDetails, _getIp2IpDetails_stub);
        register_method(ConfigurationManager_adaptor, getCredentials, _getCredentials_stub);
        register_method(ConfigurationManager_adaptor, addAccount, _addAccount_stub);
        register_method(ConfigurationManager_adaptor, setAccountsOrder, _setAccountsOrder_stub);
        register_method(ConfigurationManager_adaptor, removeAccount, _removeAccount_stub);
        register_method(ConfigurationManager_adaptor, getAccountList, _getAccountList_stub);
        register_method(ConfigurationManager_adaptor, registerAllAccounts, _registerAllAccounts_stub);
        register_method(ConfigurationManager_adaptor, sendRegister, _sendRegister_stub);
        register_method(ConfigurationManager_adaptor, getAudioManager, _getAudioManager_stub);
        register_method(ConfigurationManager_adaptor, setAudioManager, _setAudioManager_stub);
        register_method(ConfigurationManager_adaptor, getRecordPath, _getRecordPath_stub);
        register_method(ConfigurationManager_adaptor, setRecordPath, _setRecordPath_stub);
        register_method(ConfigurationManager_adaptor, getIsAlwaysRecording, _getIsAlwaysRecording_stub);
        register_method(ConfigurationManager_adaptor, setIsAlwaysRecording, _setIsAlwaysRecording_stub);
        register_method(ConfigurationManager_adaptor, getAudioCodecList, _getAudioCodecList_stub);
        register_method(ConfigurationManager_adaptor, getAudioCodecDetails, _getAudioCodecDetails_stub);
        register_method(ConfigurationManager_adaptor, getActiveAudioCodecList, _getActiveAudioCodecList_stub);
        register_method(ConfigurationManager_adaptor, setActiveAudioCodecList, _setActiveAudioCodecList_stub);
        register_method(ConfigurationManager_adaptor, getAudioPluginList, _getAudioPluginList_stub);
        register_method(ConfigurationManager_adaptor, setAudioPlugin, _setAudioPlugin_stub);
        register_method(ConfigurationManager_adaptor, getAudioOutputDeviceList, _getAudioOutputDeviceList_stub);
        register_method(ConfigurationManager_adaptor, setAudioOutputDevice, _setAudioOutputDevice_stub);
        register_method(ConfigurationManager_adaptor, setAudioInputDevice, _setAudioInputDevice_stub);
        register_method(ConfigurationManager_adaptor, setAudioRingtoneDevice, _setAudioRingtoneDevice_stub);
        register_method(ConfigurationManager_adaptor, getAudioInputDeviceList, _getAudioInputDeviceList_stub);
        register_method(ConfigurationManager_adaptor, getCurrentAudioDevicesIndex, _getCurrentAudioDevicesIndex_stub);
        register_method(ConfigurationManager_adaptor, getAudioDeviceIndex, _getAudioDeviceIndex_stub);
        register_method(ConfigurationManager_adaptor, getCurrentAudioOutputPlugin, _getCurrentAudioOutputPlugin_stub);
        register_method(ConfigurationManager_adaptor, getEchoCancelState, _getEchoCancelState_stub);
        register_method(ConfigurationManager_adaptor, getRingtoneList, _getRingtoneList_stub);
        register_method(ConfigurationManager_adaptor, setEchoCancelState, _setEchoCancelState_stub);
        register_method(ConfigurationManager_adaptor, setEchoCancelTailLength, _setEchoCancelTailLength_stub);
        register_method(ConfigurationManager_adaptor, getEchoCancelTailLength, _getEchoCancelTailLength_stub);
        register_method(ConfigurationManager_adaptor, setEchoCancelDelay, _setEchoCancelDelay_stub);
        register_method(ConfigurationManager_adaptor, getEchoCancelDelay, _getEchoCancelDelay_stub);
        register_method(ConfigurationManager_adaptor, getNoiseSuppressState, _getNoiseSuppressState_stub);
        register_method(ConfigurationManager_adaptor, setNoiseSuppressState, _setNoiseSuppressState_stub);
        register_method(ConfigurationManager_adaptor, isIax2Enabled, _isIax2Enabled_stub);
        register_method(ConfigurationManager_adaptor, setMailNotify, _setMailNotify_stub);
        register_method(ConfigurationManager_adaptor, getMailNotify, _getMailNotify_stub);
        register_method(ConfigurationManager_adaptor, getHistoryLimit, _getHistoryLimit_stub);
        register_method(ConfigurationManager_adaptor, setHistoryLimit, _setHistoryLimit_stub);
        register_method(ConfigurationManager_adaptor, getAddressbookSettings, _getAddressbookSettings_stub);
        register_method(ConfigurationManager_adaptor, setAddressbookSettings, _setAddressbookSettings_stub);
        register_method(ConfigurationManager_adaptor, getAddressbookList, _getAddressbookList_stub);
        register_method(ConfigurationManager_adaptor, setAddressbookList, _setAddressbookList_stub);
        register_method(ConfigurationManager_adaptor, getHookSettings, _getHookSettings_stub);
        register_method(ConfigurationManager_adaptor, setHookSettings, _setHookSettings_stub);
        register_method(ConfigurationManager_adaptor, getHistory, _getHistory_stub);
        register_method(ConfigurationManager_adaptor, clearHistory, _clearHistory_stub);
        register_method(ConfigurationManager_adaptor, getSupportedTlsMethod, _getSupportedTlsMethod_stub);
        register_method(ConfigurationManager_adaptor, getTlsSettingsDefault, _getTlsSettingsDefault_stub);
        register_method(ConfigurationManager_adaptor, getTlsSettings, _getTlsSettings_stub);
        register_method(ConfigurationManager_adaptor, setTlsSettings, _setTlsSettings_stub);
        register_method(ConfigurationManager_adaptor, getAddrFromInterfaceName, _getAddrFromInterfaceName_stub);
        register_method(ConfigurationManager_adaptor, getAllIpInterface, _getAllIpInterface_stub);
        register_method(ConfigurationManager_adaptor, getAllIpInterfaceByName, _getAllIpInterfaceByName_stub);
        register_method(ConfigurationManager_adaptor, getShortcuts, _getShortcuts_stub);
        register_method(ConfigurationManager_adaptor, setShortcuts, _setShortcuts_stub);
    }

    ::DBus::IntrospectedInterface *const introspect() const 
    {
        static ::DBus::IntrospectedArgument getAccountDetails_args[] = 
        {
            { "accountID", "s", true },
            { "details", "a{ss}", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setAccountDetails_args[] = 
        {
            { "accountID", "s", true },
            { "details", "a{ss}", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setCredentials_args[] = 
        {
            { "accountID", "s", true },
            { "credentialInformation", "aa{ss}", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getIp2IpDetails_args[] = 
        {
            { "details", "a{ss}", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getCredentials_args[] = 
        {
            { "accountID", "s", true },
            { "credentialInformation", "aa{ss}", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument addAccount_args[] = 
        {
            { "details", "a{ss}", true },
            { "createdAccountId", "s", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setAccountsOrder_args[] = 
        {
            { "order", "s", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument removeAccount_args[] = 
        {
            { "accoundID", "s", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getAccountList_args[] = 
        {
            { "list", "as", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument registerAllAccounts_args[] = 
        {
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument sendRegister_args[] = 
        {
            { "accountID", "s", true },
            { "enable", "b", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getAudioManager_args[] = 
        {
            { "api", "s", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setAudioManager_args[] = 
        {
            { "api", "s", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getRecordPath_args[] = 
        {
            { "rec", "s", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setRecordPath_args[] = 
        {
            { "rec", "s", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getIsAlwaysRecording_args[] = 
        {
            { "res", "b", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setIsAlwaysRecording_args[] = 
        {
            { "enabled", "b", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getAudioCodecList_args[] = 
        {
            { "list", "ai", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getAudioCodecDetails_args[] = 
        {
            { "payload", "i", true },
            { "details", "as", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getActiveAudioCodecList_args[] = 
        {
            { "accountID", "s", true },
            { "list", "ai", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setActiveAudioCodecList_args[] = 
        {
            { "list", "as", true },
            { "accountID", "s", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getAudioPluginList_args[] = 
        {
            { "list", "as", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setAudioPlugin_args[] = 
        {
            { "audioPlugin", "s", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getAudioOutputDeviceList_args[] = 
        {
            { "list", "as", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setAudioOutputDevice_args[] = 
        {
            { "index", "i", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setAudioInputDevice_args[] = 
        {
            { "index", "i", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setAudioRingtoneDevice_args[] = 
        {
            { "index", "i", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getAudioInputDeviceList_args[] = 
        {
            { "list", "as", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getCurrentAudioDevicesIndex_args[] = 
        {
            { "list", "as", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getAudioDeviceIndex_args[] = 
        {
            { "name", "s", true },
            { "index", "i", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getCurrentAudioOutputPlugin_args[] = 
        {
            { "plugin", "s", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getEchoCancelState_args[] = 
        {
            { "state", "s", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getRingtoneList_args[] = 
        {
            { "list", "a{ss}", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setEchoCancelState_args[] = 
        {
            { "state", "s", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setEchoCancelTailLength_args[] = 
        {
            { "index", "i", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getEchoCancelTailLength_args[] = 
        {
            { "index", "i", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setEchoCancelDelay_args[] = 
        {
            { "index", "i", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getEchoCancelDelay_args[] = 
        {
            { "index", "i", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getNoiseSuppressState_args[] = 
        {
            { "state", "s", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setNoiseSuppressState_args[] = 
        {
            { "state", "s", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument isIax2Enabled_args[] = 
        {
            { "res", "i", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setMailNotify_args[] = 
        {
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getMailNotify_args[] = 
        {
            { "level", "i", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getHistoryLimit_args[] = 
        {
            { "days", "i", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setHistoryLimit_args[] = 
        {
            { "days", "i", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getAddressbookSettings_args[] = 
        {
            { "settings", "a{si}", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setAddressbookSettings_args[] = 
        {
            { "settings", "a{si}", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getAddressbookList_args[] = 
        {
            { "settings", "as", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setAddressbookList_args[] = 
        {
            { "settings", "as", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getHookSettings_args[] = 
        {
            { "settings", "a{ss}", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setHookSettings_args[] = 
        {
            { "settings", "a{ss}", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getHistory_args[] = 
        {
            { "entries", "aa{ss}", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument clearHistory_args[] = 
        {
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getSupportedTlsMethod_args[] = 
        {
            { "list", "as", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getTlsSettingsDefault_args[] = 
        {
            { "details", "a{ss}", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getTlsSettings_args[] = 
        {
            { "details", "a{ss}", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setTlsSettings_args[] = 
        {
            { "details", "a{ss}", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getAddrFromInterfaceName_args[] = 
        {
            { "interface", "s", true },
            { "address", "s", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getAllIpInterface_args[] = 
        {
            { "list", "as", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getAllIpInterfaceByName_args[] = 
        {
            { "list", "as", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument getShortcuts_args[] = 
        {
            { "shortcutsMap", "a{ss}", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument setShortcuts_args[] = 
        {
            { "shortcutsMap", "a{ss}", true },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument accountsChanged_args[] = 
        {
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument historyChanged_args[] = 
        {
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument registrationStateChanged_args[] = 
        {
            { "accountID", "s", false },
            { "registration_state", "i", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument stunStatusFailure_args[] = 
        {
            { "reason", "s", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument stunStatusSuccess_args[] = 
        {
            { "message", "s", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedArgument errorAlert_args[] = 
        {
            { "code", "i", false },
            { 0, 0, 0 }
        };
        static ::DBus::IntrospectedMethod ConfigurationManager_adaptor_methods[] = 
        {
            { "getAccountDetails", getAccountDetails_args },
            { "setAccountDetails", setAccountDetails_args },
            { "setCredentials", setCredentials_args },
            { "getIp2IpDetails", getIp2IpDetails_args },
            { "getCredentials", getCredentials_args },
            { "addAccount", addAccount_args },
            { "setAccountsOrder", setAccountsOrder_args },
            { "removeAccount", removeAccount_args },
            { "getAccountList", getAccountList_args },
            { "registerAllAccounts", registerAllAccounts_args },
            { "sendRegister", sendRegister_args },
            { "getAudioManager", getAudioManager_args },
            { "setAudioManager", setAudioManager_args },
            { "getRecordPath", getRecordPath_args },
            { "setRecordPath", setRecordPath_args },
            { "getIsAlwaysRecording", getIsAlwaysRecording_args },
            { "setIsAlwaysRecording", setIsAlwaysRecording_args },
            { "getAudioCodecList", getAudioCodecList_args },
            { "getAudioCodecDetails", getAudioCodecDetails_args },
            { "getActiveAudioCodecList", getActiveAudioCodecList_args },
            { "setActiveAudioCodecList", setActiveAudioCodecList_args },
            { "getAudioPluginList", getAudioPluginList_args },
            { "setAudioPlugin", setAudioPlugin_args },
            { "getAudioOutputDeviceList", getAudioOutputDeviceList_args },
            { "setAudioOutputDevice", setAudioOutputDevice_args },
            { "setAudioInputDevice", setAudioInputDevice_args },
            { "setAudioRingtoneDevice", setAudioRingtoneDevice_args },
            { "getAudioInputDeviceList", getAudioInputDeviceList_args },
            { "getCurrentAudioDevicesIndex", getCurrentAudioDevicesIndex_args },
            { "getAudioDeviceIndex", getAudioDeviceIndex_args },
            { "getCurrentAudioOutputPlugin", getCurrentAudioOutputPlugin_args },
            { "getEchoCancelState", getEchoCancelState_args },
            { "getRingtoneList", getRingtoneList_args },
            { "setEchoCancelState", setEchoCancelState_args },
            { "setEchoCancelTailLength", setEchoCancelTailLength_args },
            { "getEchoCancelTailLength", getEchoCancelTailLength_args },
            { "setEchoCancelDelay", setEchoCancelDelay_args },
            { "getEchoCancelDelay", getEchoCancelDelay_args },
            { "getNoiseSuppressState", getNoiseSuppressState_args },
            { "setNoiseSuppressState", setNoiseSuppressState_args },
            { "isIax2Enabled", isIax2Enabled_args },
            { "setMailNotify", setMailNotify_args },
            { "getMailNotify", getMailNotify_args },
            { "getHistoryLimit", getHistoryLimit_args },
            { "setHistoryLimit", setHistoryLimit_args },
            { "getAddressbookSettings", getAddressbookSettings_args },
            { "setAddressbookSettings", setAddressbookSettings_args },
            { "getAddressbookList", getAddressbookList_args },
            { "setAddressbookList", setAddressbookList_args },
            { "getHookSettings", getHookSettings_args },
            { "setHookSettings", setHookSettings_args },
            { "getHistory", getHistory_args },
            { "clearHistory", clearHistory_args },
            { "getSupportedTlsMethod", getSupportedTlsMethod_args },
            { "getTlsSettingsDefault", getTlsSettingsDefault_args },
            { "getTlsSettings", getTlsSettings_args },
            { "setTlsSettings", setTlsSettings_args },
            { "getAddrFromInterfaceName", getAddrFromInterfaceName_args },
            { "getAllIpInterface", getAllIpInterface_args },
            { "getAllIpInterfaceByName", getAllIpInterfaceByName_args },
            { "getShortcuts", getShortcuts_args },
            { "setShortcuts", setShortcuts_args },
            { 0, 0 }
        };
        static ::DBus::IntrospectedMethod ConfigurationManager_adaptor_signals[] = 
        {
            { "accountsChanged", accountsChanged_args },
            { "historyChanged", historyChanged_args },
            { "registrationStateChanged", registrationStateChanged_args },
            { "stunStatusFailure", stunStatusFailure_args },
            { "stunStatusSuccess", stunStatusSuccess_args },
            { "errorAlert", errorAlert_args },
            { 0, 0 }
        };
        static ::DBus::IntrospectedProperty ConfigurationManager_adaptor_properties[] = 
        {
            { 0, 0, 0, 0 }
        };
        static ::DBus::IntrospectedInterface ConfigurationManager_adaptor_interface = 
        {
            "org.sflphone.SFLphone.ConfigurationManager",
            ConfigurationManager_adaptor_methods,
            ConfigurationManager_adaptor_signals,
            ConfigurationManager_adaptor_properties
        };
        return &ConfigurationManager_adaptor_interface;
    }

public:

    /* properties exposed by this interface, use
     * property() and property(value) to get and set a particular property
     */

public:

    /* methods exported by this interface,
     * you will have to implement them in your ObjectAdaptor
     */
    virtual std::map< std::string, std::string > getAccountDetails(const std::string& accountID) = 0;
    virtual void setAccountDetails(const std::string& accountID, const std::map< std::string, std::string >& details) = 0;
    virtual void setCredentials(const std::string& accountID, const std::vector< std::map< std::string, std::string > >& credentialInformation) = 0;
    virtual std::map< std::string, std::string > getIp2IpDetails() = 0;
    virtual std::vector< std::map< std::string, std::string > > getCredentials(const std::string& accountID) = 0;
    virtual std::string addAccount(const std::map< std::string, std::string >& details) = 0;
    virtual void setAccountsOrder(const std::string& order) = 0;
    virtual void removeAccount(const std::string& accoundID) = 0;
    virtual std::vector< std::string > getAccountList() = 0;
    virtual void registerAllAccounts() = 0;
    virtual void sendRegister(const std::string& accountID, const bool& enable) = 0;
    virtual std::string getAudioManager() = 0;
    virtual void setAudioManager(const std::string& api) = 0;
    virtual std::string getRecordPath() = 0;
    virtual void setRecordPath(const std::string& rec) = 0;
    virtual bool getIsAlwaysRecording() = 0;
    virtual void setIsAlwaysRecording(const bool& enabled) = 0;
    virtual std::vector< int32_t > getAudioCodecList() = 0;
    virtual std::vector< std::string > getAudioCodecDetails(const int32_t& payload) = 0;
    virtual std::vector< int32_t > getActiveAudioCodecList(const std::string& accountID) = 0;
    virtual void setActiveAudioCodecList(const std::vector< std::string >& list, const std::string& accountID) = 0;
    virtual std::vector< std::string > getAudioPluginList() = 0;
    virtual void setAudioPlugin(const std::string& audioPlugin) = 0;
    virtual std::vector< std::string > getAudioOutputDeviceList() = 0;
    virtual void setAudioOutputDevice(const int32_t& index) = 0;
    virtual void setAudioInputDevice(const int32_t& index) = 0;
    virtual void setAudioRingtoneDevice(const int32_t& index) = 0;
    virtual std::vector< std::string > getAudioInputDeviceList() = 0;
    virtual std::vector< std::string > getCurrentAudioDevicesIndex() = 0;
    virtual int32_t getAudioDeviceIndex(const std::string& name) = 0;
    virtual std::string getCurrentAudioOutputPlugin() = 0;
    virtual std::string getEchoCancelState() = 0;
    virtual std::map< std::string, std::string > getRingtoneList() = 0;
    virtual void setEchoCancelState(const std::string& state) = 0;
    virtual void setEchoCancelTailLength(const int32_t& index) = 0;
    virtual int32_t getEchoCancelTailLength() = 0;
    virtual void setEchoCancelDelay(const int32_t& index) = 0;
    virtual int32_t getEchoCancelDelay() = 0;
    virtual std::string getNoiseSuppressState() = 0;
    virtual void setNoiseSuppressState(const std::string& state) = 0;
    virtual int32_t isIax2Enabled() = 0;
    virtual void setMailNotify() = 0;
    virtual int32_t getMailNotify() = 0;
    virtual int32_t getHistoryLimit() = 0;
    virtual void setHistoryLimit(const int32_t& days) = 0;
    virtual std::map< std::string, int32_t > getAddressbookSettings() = 0;
    virtual void setAddressbookSettings(const std::map< std::string, int32_t >& settings) = 0;
    virtual std::vector< std::string > getAddressbookList() = 0;
    virtual void setAddressbookList(const std::vector< std::string >& settings) = 0;
    virtual std::map< std::string, std::string > getHookSettings() = 0;
    virtual void setHookSettings(const std::map< std::string, std::string >& settings) = 0;
    virtual std::vector< std::map< std::string, std::string > > getHistory() = 0;
    virtual void clearHistory() = 0;
    virtual std::vector< std::string > getSupportedTlsMethod() = 0;
    virtual std::map< std::string, std::string > getTlsSettingsDefault() = 0;
    virtual std::map< std::string, std::string > getTlsSettings() = 0;
    virtual void setTlsSettings(const std::map< std::string, std::string >& details) = 0;
    virtual std::string getAddrFromInterfaceName(const std::string& interface) = 0;
    virtual std::vector< std::string > getAllIpInterface() = 0;
    virtual std::vector< std::string > getAllIpInterfaceByName() = 0;
    virtual std::map< std::string, std::string > getShortcuts() = 0;
    virtual void setShortcuts(const std::map< std::string, std::string >& shortcutsMap) = 0;

public:

    /* signal emitters for this interface
     */
    void accountsChanged()
    {
        ::DBus::SignalMessage sig("accountsChanged");
        emit_signal(sig);
    }
    void historyChanged()
    {
        ::DBus::SignalMessage sig("historyChanged");
        emit_signal(sig);
    }
    void registrationStateChanged(const std::string& arg1, const int32_t& arg2)
    {
        ::DBus::SignalMessage sig("registrationStateChanged");
        ::DBus::MessageIter wi = sig.writer();
        wi << arg1;
        wi << arg2;
        emit_signal(sig);
    }
    void stunStatusFailure(const std::string& arg1)
    {
        ::DBus::SignalMessage sig("stunStatusFailure");
        ::DBus::MessageIter wi = sig.writer();
        wi << arg1;
        emit_signal(sig);
    }
    void stunStatusSuccess(const std::string& arg1)
    {
        ::DBus::SignalMessage sig("stunStatusSuccess");
        ::DBus::MessageIter wi = sig.writer();
        wi << arg1;
        emit_signal(sig);
    }
    void errorAlert(const int32_t& arg1)
    {
        ::DBus::SignalMessage sig("errorAlert");
        ::DBus::MessageIter wi = sig.writer();
        wi << arg1;
        emit_signal(sig);
    }

private:

    /* unmarshalers (to unpack the DBus message before calling the actual interface method)
     */
    ::DBus::Message _getAccountDetails_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        std::map< std::string, std::string > argout1 = getAccountDetails(argin1);
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setAccountDetails_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        std::map< std::string, std::string > argin2; ri >> argin2;
        setAccountDetails(argin1, argin2);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _setCredentials_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        std::vector< std::map< std::string, std::string > > argin2; ri >> argin2;
        setCredentials(argin1, argin2);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getIp2IpDetails_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::map< std::string, std::string > argout1 = getIp2IpDetails();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getCredentials_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        std::vector< std::map< std::string, std::string > > argout1 = getCredentials(argin1);
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _addAccount_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::map< std::string, std::string > argin1; ri >> argin1;
        std::string argout1 = addAccount(argin1);
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setAccountsOrder_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        setAccountsOrder(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _removeAccount_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        removeAccount(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getAccountList_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::vector< std::string > argout1 = getAccountList();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _registerAllAccounts_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        registerAllAccounts();
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _sendRegister_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        bool argin2; ri >> argin2;
        sendRegister(argin1, argin2);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getAudioManager_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argout1 = getAudioManager();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setAudioManager_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        setAudioManager(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getRecordPath_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argout1 = getRecordPath();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setRecordPath_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        setRecordPath(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getIsAlwaysRecording_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        bool argout1 = getIsAlwaysRecording();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setIsAlwaysRecording_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        bool argin1; ri >> argin1;
        setIsAlwaysRecording(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getAudioCodecList_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::vector< int32_t > argout1 = getAudioCodecList();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getAudioCodecDetails_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        int32_t argin1; ri >> argin1;
        std::vector< std::string > argout1 = getAudioCodecDetails(argin1);
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getActiveAudioCodecList_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        std::vector< int32_t > argout1 = getActiveAudioCodecList(argin1);
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setActiveAudioCodecList_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::vector< std::string > argin1; ri >> argin1;
        std::string argin2; ri >> argin2;
        setActiveAudioCodecList(argin1, argin2);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getAudioPluginList_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::vector< std::string > argout1 = getAudioPluginList();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setAudioPlugin_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        setAudioPlugin(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getAudioOutputDeviceList_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::vector< std::string > argout1 = getAudioOutputDeviceList();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setAudioOutputDevice_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        int32_t argin1; ri >> argin1;
        setAudioOutputDevice(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _setAudioInputDevice_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        int32_t argin1; ri >> argin1;
        setAudioInputDevice(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _setAudioRingtoneDevice_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        int32_t argin1; ri >> argin1;
        setAudioRingtoneDevice(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getAudioInputDeviceList_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::vector< std::string > argout1 = getAudioInputDeviceList();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getCurrentAudioDevicesIndex_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::vector< std::string > argout1 = getCurrentAudioDevicesIndex();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getAudioDeviceIndex_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        int32_t argout1 = getAudioDeviceIndex(argin1);
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getCurrentAudioOutputPlugin_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argout1 = getCurrentAudioOutputPlugin();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getEchoCancelState_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argout1 = getEchoCancelState();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getRingtoneList_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::map< std::string, std::string > argout1 = getRingtoneList();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setEchoCancelState_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        setEchoCancelState(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _setEchoCancelTailLength_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        int32_t argin1; ri >> argin1;
        setEchoCancelTailLength(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getEchoCancelTailLength_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        int32_t argout1 = getEchoCancelTailLength();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setEchoCancelDelay_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        int32_t argin1; ri >> argin1;
        setEchoCancelDelay(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getEchoCancelDelay_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        int32_t argout1 = getEchoCancelDelay();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getNoiseSuppressState_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argout1 = getNoiseSuppressState();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setNoiseSuppressState_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        setNoiseSuppressState(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _isIax2Enabled_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        int32_t argout1 = isIax2Enabled();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setMailNotify_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        setMailNotify();
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getMailNotify_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        int32_t argout1 = getMailNotify();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getHistoryLimit_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        int32_t argout1 = getHistoryLimit();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setHistoryLimit_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        int32_t argin1; ri >> argin1;
        setHistoryLimit(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getAddressbookSettings_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::map< std::string, int32_t > argout1 = getAddressbookSettings();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setAddressbookSettings_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::map< std::string, int32_t > argin1; ri >> argin1;
        setAddressbookSettings(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getAddressbookList_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::vector< std::string > argout1 = getAddressbookList();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setAddressbookList_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::vector< std::string > argin1; ri >> argin1;
        setAddressbookList(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getHookSettings_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::map< std::string, std::string > argout1 = getHookSettings();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setHookSettings_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::map< std::string, std::string > argin1; ri >> argin1;
        setHookSettings(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getHistory_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::vector< std::map< std::string, std::string > > argout1 = getHistory();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _clearHistory_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        clearHistory();
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getSupportedTlsMethod_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::vector< std::string > argout1 = getSupportedTlsMethod();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getTlsSettingsDefault_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::map< std::string, std::string > argout1 = getTlsSettingsDefault();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getTlsSettings_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::map< std::string, std::string > argout1 = getTlsSettings();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setTlsSettings_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::map< std::string, std::string > argin1; ri >> argin1;
        setTlsSettings(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
    ::DBus::Message _getAddrFromInterfaceName_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::string argin1; ri >> argin1;
        std::string argout1 = getAddrFromInterfaceName(argin1);
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getAllIpInterface_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::vector< std::string > argout1 = getAllIpInterface();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getAllIpInterfaceByName_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::vector< std::string > argout1 = getAllIpInterfaceByName();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _getShortcuts_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::map< std::string, std::string > argout1 = getShortcuts();
        ::DBus::ReturnMessage reply(call);
        ::DBus::MessageIter wi = reply.writer();
        wi << argout1;
        return reply;
    }
    ::DBus::Message _setShortcuts_stub(const ::DBus::CallMessage &call)
    {
        ::DBus::MessageIter ri = call.reader();

        std::map< std::string, std::string > argin1; ri >> argin1;
        setShortcuts(argin1);
        ::DBus::ReturnMessage reply(call);
        return reply;
    }
};

} } } 
#endif //__dbusxx__configurationmanager_glue_h__ADAPTOR_MARSHAL_H
