bluetoothengine/btnotif/btdevicedialogplugin/src/btdevicedialogplugin.cpp
changeset 29 48ae3789ce00
child 31 a0ea99b6fa53
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btnotif/btdevicedialogplugin/src/btdevicedialogplugin.cpp	Mon May 03 14:36:07 2010 +0300
@@ -0,0 +1,217 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  BtDeviceDialogPlugin class implementation.
+*
+*/
+
+
+#include "btdevicedialogplugin.h"
+#include "btdevicedialogplugintrace.h"
+#include <bluetoothdevicedialogs.h>
+#include <QtPlugin>
+#include <hbdevicedialog.h>
+#include "btdevicedialoginputwidget.h"
+#include "btdevicedialogquerywidget.h"
+#include "btdevicedialognotifwidget.h"
+
+#include "btdevicedialogpluginerrors.h"
+#include "btdevicesearchdialogwidget.h"
+
+Q_EXPORT_PLUGIN2(btdevicedialogplugin, BtDeviceDialogPlugin)
+
+// This plugin implements one device dialog type
+static const struct {
+    const char *mTypeString;
+} noteInfos[] = {
+    {"com.nokia.hb.btdevicedialog/1.0"}
+};
+
+class BtDeviceDialogPluginPrivate
+{
+public:
+    BtDeviceDialogPluginPrivate();
+public:
+    int mError;
+};
+/*! 
+    BtDeviceDialogPluginPrivate Constructor
+ */
+BtDeviceDialogPluginPrivate::BtDeviceDialogPluginPrivate()
+{
+    mError = NoError;
+}
+
+/*! 
+    BtDeviceDialogPlugin Constructor
+ */
+BtDeviceDialogPlugin::BtDeviceDialogPlugin()
+{
+    d = new BtDeviceDialogPluginPrivate;
+}
+
+/*!
+    Destructor
+ */
+BtDeviceDialogPlugin::~BtDeviceDialogPlugin()
+{
+    delete d;
+}
+
+/*! 
+    Check if client is allowed to use device dialog widget
+ */
+bool BtDeviceDialogPlugin::accessAllowed(const QString &deviceDialogType,
+    const QVariantMap &parameters, const QVariantMap &securityInfo) const
+{
+    Q_UNUSED(deviceDialogType)
+    Q_UNUSED(parameters)
+    Q_UNUSED(securityInfo)
+
+    // This plugin doesn't perform operations that may compromise security.
+    // All clients are allowed to use.
+    return true;
+}
+
+/*! 
+    From interface class.
+    Use the dialog type in the parameter to create widget.    
+ */
+HbDeviceDialogInterface *BtDeviceDialogPlugin::createDeviceDialog(
+    const QString &deviceDialogType, const QVariantMap &parameters)
+{
+    d->mError = NoError;
+
+    int i;
+    // verify that requested dialog type is supported
+    const int numTypes = sizeof(noteInfos) / sizeof(noteInfos[0]);
+    for(i = 0; i < numTypes; i++) {
+        if (noteInfos[i].mTypeString == deviceDialogType) {
+            break;
+        }
+    }
+    // dialog type was found
+    if (i < numTypes) {
+        return checkDialogType( parameters );
+    } 
+    else {
+        // unknown dialog type, return error
+        d->mError = UnknownDeviceDialogError;
+        return 0;
+    }
+}
+
+/*! 
+    Return information of device dialog the plugin creates
+    Currently only supporting 1 device dialog type, so no need to check the type.
+ */
+bool BtDeviceDialogPlugin::deviceDialogInfo(const QString &deviceDialogType,
+    const QVariantMap &parameters, DeviceDialogInfo *info) const
+{
+    Q_UNUSED(parameters)
+    Q_UNUSED(deviceDialogType)
+    // set return values
+    info->group = GenericDeviceDialogGroup;
+    info->flags = NoDeviceDialogFlags;
+    info->priority = DefaultPriority;
+    return true;
+}
+
+/*! 
+    Return device dialog types this plugin implements
+    Function will work fine (unchanged) when new dialogs are added.
+ */
+QStringList BtDeviceDialogPlugin::deviceDialogTypes() const
+{
+    QStringList types;
+    // read supported types from noteInfos
+    const int numTypes = sizeof(noteInfos) / sizeof(noteInfos[0]);
+    for(int i = 0; i < numTypes; i++) {
+        types.append(noteInfos[i].mTypeString);
+    }
+    return types;
+}
+
+/*! 
+    Return plugin flags
+ */
+HbDeviceDialogPlugin::PluginFlags BtDeviceDialogPlugin::pluginFlags() const
+{
+    return NoPluginFlags;
+}
+
+/*! 
+    Return last error
+ */
+int BtDeviceDialogPlugin::error() const
+{
+    return d->mError;
+}
+
+/*!
+    Check the device dialog type to decide which widget to be used. 
+    And create the specified widget.
+ */
+HbDeviceDialogInterface *BtDeviceDialogPlugin::checkDialogType( const QVariantMap &parameters )
+{
+    // Construct the key of EDialogType
+    QString keyStr;
+    keyStr.setNum( TBluetoothDialogParams::EDialogType );
+    // Find the const iterator with key EDialogType
+    QVariantMap::const_iterator i = parameters.constFind( keyStr );
+
+    // item with key EDialogType is not found
+    if ( i == parameters.constEnd() ) {
+        d->mError = UnknownDeviceDialogError;
+        return NULL;
+    }
+    
+    // item with key EDialogType is found
+    // generate specified widget based on the dialog type value.
+    HbDeviceDialogInterface *deviceDialog = NULL;
+    switch ( i.value().toInt() ) {
+        case TBluetoothDialogParams::ENote:
+            deviceDialog =
+                new BtDeviceDialogQueryWidget(HbMessageBox::MessageTypeInformation, parameters);
+            break;
+        case TBluetoothDialogParams::EQuery:
+            deviceDialog =
+                new BtDeviceDialogQueryWidget(HbMessageBox::MessageTypeQuestion, parameters);
+            break;
+        case TBluetoothDialogParams::EInput:
+            deviceDialog = new BtDeviceDialogInputWidget(parameters);
+            break;
+        case TBluetoothDialogParams::EDeviceSearch:
+            deviceDialog = new BTDeviceSearchDialogWidget(parameters);
+            break;
+        case TBluetoothDialogParams::EGlobalNotif:
+            deviceDialog = new BtDeviceDialogNotifWidget(parameters);
+            break;
+        default:
+            d->mError = UnknownDeviceDialogError;
+            break;
+    }
+    if ( deviceDialog ) {
+        // verify no error has occurred
+        d->mError = deviceDialog->deviceDialogError();
+        if ( d->mError ) {
+            // Do not continue if an error occurred
+            delete deviceDialog;
+            deviceDialog = NULL;
+        }
+        else {
+            d->mError = UnknownDeviceDialogError;
+        }
+    }
+    return deviceDialog;
+}