bluetoothengine/btxqservice/src/btxqpowerservice.cpp
author hgs
Wed, 13 Oct 2010 13:15:31 +0300
changeset 67 16e4b9007960
parent 57 5ebadcda06cb
permissions -rw-r--r--
201039_4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
     1
/*
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
     2
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
     3
 * All rights reserved.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0""
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
     8
 *
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
     9
 * Initial Contributors:
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    11
 *
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    12
 * Contributors:
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    13
 *
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    14
 * Description:  
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    15
 *
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    16
 */
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    17
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    18
#include "btxqpowerservice.h"
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    19
#include <btxqserviceapi.h>
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    20
#include <bluetoothdevicedialogs.h>
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    21
#include <hbapplication.h>
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    22
#include <hbdevicedialog.h>
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    23
#include <btnotif.h>
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    24
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    25
const QString deviceDialogType = "com.nokia.hb.btdevicedialog/1.0";
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    26
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    27
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    28
BtxqPowerService::BtxqPowerService(QObject *parent)
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    29
: XQServiceProvider(BluetoothServiceTogglePower, parent),
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    30
mSettings(0), mCurrentRequestIndex(0), mNotificationDialog(0), 
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    31
mOfflineDialog(0), mOfflineQueryShown(false)
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    32
{
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    33
    publishAll();
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    34
    connect(this, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    35
}
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    36
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    37
BtxqPowerService::~BtxqPowerService()
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    38
{
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    39
    delete mSettings;
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    40
    delete mNotificationDialog;
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    41
    delete mOfflineDialog;
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    42
}
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    43
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    44
void BtxqPowerService::togglePower()
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    45
{
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    46
    mCurrentRequestIndex = setCurrentRequestAsync();
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    47
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    48
    TRAPD(err, mSettings = CBTEngSettings::NewL(this));
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    49
    if(err < 0)
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    50
        {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    51
        // Error creating CBTEngSettings. Complete the service request with error.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    52
        QVariant retVal(err);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    53
        completeRequest(mCurrentRequestIndex, retVal);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    54
        return;
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    55
        }
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    56
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    57
    // Get the current power state.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    58
    TBTPowerStateValue state; 
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    59
    err = mSettings->GetPowerState(state);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    60
    if(err < 0)
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    61
        {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    62
        // Error getting the current power state. Complete the service request with error.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    63
        QVariant retVal(err);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    64
        completeRequest(mCurrentRequestIndex, retVal);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    65
        return;
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    66
        }
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    67
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    68
    if (EBTPowerOff == state)
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    69
        {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    70
        // Bluetooth is currently turned off.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    71
        bool isInOffline = checkOfflineMode(); 
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    72
        
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    73
        if (isInOffline) 
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    74
            {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    75
            // Device is in offline mode.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    76
            // Ask user if he/she wants Bluetooth to be turned on in offline mode.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    77
            showOfflineDialog();
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    78
            }
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    79
        
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    80
        else 
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    81
            {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    82
            // Device is not in offline mode.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    83
            // Turn Bluetooth on.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    84
            changeBtPowerMode(EBTPowerOn);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    85
            }               
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    86
        }         
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    87
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    88
    else 
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    89
        {  
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    90
        // Bluetooth is currently turned on.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    91
        // Switch Bluetooth on.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    92
        changeBtPowerMode(EBTPowerOff);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    93
        }
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    94
}
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    95
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    96
void BtxqPowerService::changeBtPowerMode(TBTPowerStateValue aNewPowerState)
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    97
{   
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    98
    // Set the new Bluetooth power state.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
    99
    TInt error = mSettings->SetPowerState(aNewPowerState);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   100
    if(error != KErrNone)
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   101
        {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   102
        // Error setting the new Bluetooth power state.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   103
        // Complete the service request with error.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   104
        QVariant retVal(error);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   105
        completeRequest(mCurrentRequestIndex, retVal);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   106
        }
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   107
}
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   108
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   109
bool BtxqPowerService::checkOfflineMode()
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   110
{
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   111
    // Check if the device is in offline mode.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   112
    TCoreAppUIsNetworkConnectionAllowed offline = ECoreAppUIsNetworkConnectionAllowed;  
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   113
    TBTEnabledInOfflineMode enabledInOffline; 
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   114
    mSettings->GetOfflineModeSettings(offline, enabledInOffline); 
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   115
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   116
    //todo: Check if activation of Bluetooth is allowed in offline mode.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   117
    return !offline;  
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   118
}
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   119
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   120
void BtxqPowerService::showBTStatusNotification(TBool powerState)
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   121
{
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   122
    // Prepare new power state notification dialog.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   123
    if(!mNotificationDialog)
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   124
        {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   125
        mNotificationDialog = new HbDeviceDialog();
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   126
        }
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   127
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   128
    connect(mNotificationDialog, SIGNAL(deviceDialogClosed()), this, SLOT(handleDialogClosed()));
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   129
    QVariantMap parameters;
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   130
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   131
    parameters.insert(QString::number(TBluetoothDialogParams::EDialogType), 
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   132
          QString::number(TBluetoothDialogParams::EGlobalNotif));
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   133
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   134
    parameters.insert(QString::number(TBluetoothDialogParams::EResource),
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   135
            QString::number(EGenericInfo));
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   136
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   137
    if(powerState)
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   138
        {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   139
        // Show dialog with power on notification.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   140
        parameters.insert(QString::number(TBluetoothDeviceDialog::EAdditionalInt),
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   141
              QString::number(EBTSwitchedOn));
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   142
        }
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   143
    else
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   144
        {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   145
        // Show dialog with power off notification.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   146
        parameters.insert(QString::number(TBluetoothDeviceDialog::EAdditionalInt),
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   147
              QString::number(EBTSwitchedOff));
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   148
        }
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   149
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   150
    mNotificationDialog->show(deviceDialogType, parameters);    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   151
}
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   152
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   153
void BtxqPowerService::showOfflineDialog()
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   154
{
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   155
    // Prepare and show the offline query dialog.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   156
    if(!mOfflineDialog)
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   157
        {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   158
        mOfflineDialog = new HbDeviceDialog();
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   159
        }
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   160
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   161
    connect(mOfflineDialog, SIGNAL(dataReceived(QVariantMap)), 
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   162
          this, SLOT(handleDataReceived(QVariantMap)));
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   163
    connect(mOfflineDialog, SIGNAL(deviceDialogClosed()), 
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   164
          this, SLOT(handleDialogClosed()));
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   165
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   166
    QVariantMap parameters;
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   167
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   168
    parameters.insert(QString::number(TBluetoothDialogParams::EDialogType), 
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   169
          QString::number(TBluetoothDialogParams::EInformationDialog));
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   170
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   171
    parameters.insert(QString::number(TBluetoothDialogParams::EDialogTitle),
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   172
          QString::number(TBluetoothDialogParams::EOfflineQuery));
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   173
    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   174
    mOfflineQueryShown = true;
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   175
    mOfflineDialog->show(deviceDialogType, parameters);    
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   176
}
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   177
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   178
void BtxqPowerService::handleDialogClosed()
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   179
{
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   180
    // Handle the dialog closed.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   181
    if(mOfflineQueryShown)
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   182
        {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   183
        mOfflineDialog->cancel();
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   184
        mOfflineQueryShown = false;
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   185
        changeBtPowerMode(EBTPowerOn);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   186
        }
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   187
    else
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   188
        {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   189
        QVariant retVal(0);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   190
        completeRequest(mCurrentRequestIndex, retVal);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   191
        }
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   192
}
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   193
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   194
void BtxqPowerService::handleDataReceived(QVariantMap data)
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   195
{
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   196
    // Handle the user selection in the dialog.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   197
    mOfflineDialog->cancel();
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   198
    if(data.value(QString("actionResult")).toBool())
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   199
        {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   200
        changeBtPowerMode(EBTPowerOn);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   201
        }
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   202
    else
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   203
        {
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   204
        QVariant retVal(0);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   205
        completeRequest(mCurrentRequestIndex, retVal);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   206
        }
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   207
}
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   208
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   209
void BtxqPowerService::PowerStateChanged( TBTPowerStateValue aState )
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   210
{
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   211
    // Call-back from CBTEngSettings confirming the power change to the new power state.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   212
    (aState == EBTPowerOn) ? showBTStatusNotification(true) : showBTStatusNotification(false);
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   213
}
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   214
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   215
void BtxqPowerService::VisibilityModeChanged( TBTVisibilityMode aState )
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   216
{
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   217
    // This call-back is not used.
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   218
    (void) aState;
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   219
}
5ebadcda06cb 201035_7
hgs
parents:
diff changeset
   220