taskswitcher/screenshotplugin/src/tsorientationmonitor.cpp
author hgs
Mon, 13 Sep 2010 13:26:33 +0300
changeset 116 305818acdca4
permissions -rw-r--r--
201036
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
116
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: 
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
#include <centralrepository.h>
hgs
parents:
diff changeset
    18
#include <sensrvchannelfinder.h>
hgs
parents:
diff changeset
    19
#include <sensrvchannel.h>
hgs
parents:
diff changeset
    20
#include <sensrvorientationsensor.h>
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include "tsorientationmonitor.h"
hgs
parents:
diff changeset
    23
const TUid KSensorCenrepUid  = {0x2002C384};
hgs
parents:
diff changeset
    24
const TUint32 KSensorCenrepKey  = 0x1;
hgs
parents:
diff changeset
    25
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
    26
CTsOrientationMonitor* CTsOrientationMonitor::NewL( MTsOrientationObserver& aObserver )
hgs
parents:
diff changeset
    27
    {
hgs
parents:
diff changeset
    28
    CTsOrientationMonitor* self = new (ELeave) CTsOrientationMonitor(aObserver);
hgs
parents:
diff changeset
    29
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    30
    self->ConstructL();
hgs
parents:
diff changeset
    31
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    32
    return self;
hgs
parents:
diff changeset
    33
    }
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
    36
CTsOrientationMonitor::CTsOrientationMonitor( MTsOrientationObserver& aObserver )
hgs
parents:
diff changeset
    37
:
hgs
parents:
diff changeset
    38
    CActive(EPriorityStandard),
hgs
parents:
diff changeset
    39
    iObserver(aObserver)
hgs
parents:
diff changeset
    40
    {
hgs
parents:
diff changeset
    41
    CActiveScheduler::Add(this);
hgs
parents:
diff changeset
    42
    }
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
    45
void CTsOrientationMonitor::ConstructL()
hgs
parents:
diff changeset
    46
    {
hgs
parents:
diff changeset
    47
    iRepository = CRepository::NewL( KSensorCenrepUid );
hgs
parents:
diff changeset
    48
    SetActive();
hgs
parents:
diff changeset
    49
    TRequestStatus* status( &iStatus );
hgs
parents:
diff changeset
    50
    User::RequestComplete( status, KErrNone );
hgs
parents:
diff changeset
    51
    }
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
    54
CTsOrientationMonitor::~CTsOrientationMonitor()
hgs
parents:
diff changeset
    55
    {
hgs
parents:
diff changeset
    56
    Cancel();
hgs
parents:
diff changeset
    57
    delete iChannel;
hgs
parents:
diff changeset
    58
    delete iRepository;
hgs
parents:
diff changeset
    59
    }
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
    62
void CTsOrientationMonitor::SubscribeL()
hgs
parents:
diff changeset
    63
    {
hgs
parents:
diff changeset
    64
    User::LeaveIfError( iRepository->NotifyRequest(KSensorCenrepKey, iStatus) );
hgs
parents:
diff changeset
    65
    SetActive();
hgs
parents:
diff changeset
    66
    }
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
    69
void CTsOrientationMonitor::StartSensorMonitoringL()
hgs
parents:
diff changeset
    70
    {
hgs
parents:
diff changeset
    71
    CSensrvChannelFinder *sensrvChannelFinder = CSensrvChannelFinder::NewLC();
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
    RSensrvChannelInfoList channelInfoList;
hgs
parents:
diff changeset
    74
    CleanupClosePushL(channelInfoList);
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
    TSensrvChannelInfo mySearchConditions;
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
    //Search only Orientation events.
hgs
parents:
diff changeset
    79
    mySearchConditions.iChannelType = KSensrvChannelTypeIdOrientationData;
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
    sensrvChannelFinder->FindChannelsL(channelInfoList, mySearchConditions);
hgs
parents:
diff changeset
    82
    
hgs
parents:
diff changeset
    83
    if( channelInfoList.Count() )
hgs
parents:
diff changeset
    84
        {
hgs
parents:
diff changeset
    85
        iChannel = CSensrvChannel::NewL(channelInfoList[0]);
hgs
parents:
diff changeset
    86
        iChannel->OpenChannelL();
hgs
parents:
diff changeset
    87
        iChannel->StartDataListeningL(this, 1, 1, 0);
hgs
parents:
diff changeset
    88
        }
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
    CleanupStack::Pop(&channelInfoList);
hgs
parents:
diff changeset
    91
    CleanupStack::PopAndDestroy(sensrvChannelFinder);
hgs
parents:
diff changeset
    92
    }
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
    95
void CTsOrientationMonitor::StopSensorMonitoring()
hgs
parents:
diff changeset
    96
    {
hgs
parents:
diff changeset
    97
    if(0 != iChannel)
hgs
parents:
diff changeset
    98
        {
hgs
parents:
diff changeset
    99
        iChannel->StopDataListening();
hgs
parents:
diff changeset
   100
        }
hgs
parents:
diff changeset
   101
    delete iChannel;
hgs
parents:
diff changeset
   102
    iChannel = 0;
hgs
parents:
diff changeset
   103
    }
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
   106
void CTsOrientationMonitor::DoCancel()
hgs
parents:
diff changeset
   107
    {
hgs
parents:
diff changeset
   108
    iRepository->NotifyCancel(KSensorCenrepKey);
hgs
parents:
diff changeset
   109
    }
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
   112
void CTsOrientationMonitor::RunL()
hgs
parents:
diff changeset
   113
    {
hgs
parents:
diff changeset
   114
    User::LeaveIfError( iStatus.Int() );
hgs
parents:
diff changeset
   115
    TInt sensorStatus;
hgs
parents:
diff changeset
   116
    User::LeaveIfError(iRepository->Get(KSensorCenrepKey, sensorStatus));
hgs
parents:
diff changeset
   117
    (0 != sensorStatus ) ? StartSensorMonitoringL() : StopSensorMonitoring();
hgs
parents:
diff changeset
   118
    SubscribeL();
hgs
parents:
diff changeset
   119
    }
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
   122
TInt CTsOrientationMonitor::RunError(TInt aError)
hgs
parents:
diff changeset
   123
    {
hgs
parents:
diff changeset
   124
    if( KErrCancel != aError )
hgs
parents:
diff changeset
   125
        {
hgs
parents:
diff changeset
   126
        TRAP_IGNORE(SubscribeL());
hgs
parents:
diff changeset
   127
        }
hgs
parents:
diff changeset
   128
    return KErrNone;
hgs
parents:
diff changeset
   129
    }
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
   132
void CTsOrientationMonitor::DataReceived( CSensrvChannel& aChannel, 
hgs
parents:
diff changeset
   133
                                          TInt aCount, 
hgs
parents:
diff changeset
   134
                                          TInt /*aDataLost*/ )
hgs
parents:
diff changeset
   135
    {
hgs
parents:
diff changeset
   136
    if (aChannel.GetChannelInfo().iChannelType == KSensrvChannelTypeIdOrientationData)
hgs
parents:
diff changeset
   137
        {
hgs
parents:
diff changeset
   138
        TPckgBuf<TSensrvOrientationData> dataBuf;
hgs
parents:
diff changeset
   139
        for(TInt i = 0; i < aCount; ++i) 
hgs
parents:
diff changeset
   140
            {
hgs
parents:
diff changeset
   141
            aChannel.GetData(dataBuf);
hgs
parents:
diff changeset
   142
            iObserver.OrientationChanged( TSensrvOrientationData::EOrientationDisplayRightUp == dataBuf().iDeviceOrientation ? 270 : 0);
hgs
parents:
diff changeset
   143
            }
hgs
parents:
diff changeset
   144
        }
hgs
parents:
diff changeset
   145
    }
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
   148
void CTsOrientationMonitor::DataError( CSensrvChannel& /*aChannel*/, 
hgs
parents:
diff changeset
   149
                                       TSensrvErrorSeverity /*aError*/ )
hgs
parents:
diff changeset
   150
    {
hgs
parents:
diff changeset
   151
    //No implementation required
hgs
parents:
diff changeset
   152
    }
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
   155
void CTsOrientationMonitor::GetDataListenerInterfaceL( TUid /*aInterfaceUid*/, 
hgs
parents:
diff changeset
   156
                                                       TAny*& /*aInterface*/ )
hgs
parents:
diff changeset
   157
    {
hgs
parents:
diff changeset
   158
    //No implementation required
hgs
parents:
diff changeset
   159
    }