camerauis/cameraxui/cxengine/src/cxegeotaggingtrail_symbian_p.cpp
author hgs
Fri, 03 Sep 2010 11:00:58 +0300
changeset 55 0da2a5b56583
parent 46 c826656d6714
permissions -rw-r--r--
201035_1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 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
hgs
parents:
diff changeset
    18
#include "cxutils.h"
hgs
parents:
diff changeset
    19
#include "cxestate.h"
hgs
parents:
diff changeset
    20
#include "cxesettings.h"
hgs
parents:
diff changeset
    21
#include "cxenamespace.h"
hgs
parents:
diff changeset
    22
#include "cxestillcapturecontrol.h"
hgs
parents:
diff changeset
    23
#include "cxevideocapturecontrol.h"
hgs
parents:
diff changeset
    24
#include "cxegeotaggingtrail_symbian_p.h"
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#include <locationtrailpskeys.h>
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
namespace
hgs
parents:
diff changeset
    29
{
hgs
parents:
diff changeset
    30
    // in milliseconds
hgs
parents:
diff changeset
    31
    const int STOP_TRAIL_INTERVAL = 10*1000;
55
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
    32
    const int START_TRAIL_ATTEMPTS = 5;
46
hgs
parents:
diff changeset
    33
}
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
/*!
hgs
parents:
diff changeset
    36
* Constructor
hgs
parents:
diff changeset
    37
*/
hgs
parents:
diff changeset
    38
CxeGeoTaggingTrailPrivate::CxeGeoTaggingTrailPrivate(CxeStillCaptureControl &stillControl, 
hgs
parents:
diff changeset
    39
                                                     CxeVideoCaptureControl &videoControl,
hgs
parents:
diff changeset
    40
                                                     CxeSettings &settings)
hgs
parents:
diff changeset
    41
    : CxeStateMachine("CxeGeoTaggingTrailPrivate"),
hgs
parents:
diff changeset
    42
      mStillCaptureControl(stillControl),
hgs
parents:
diff changeset
    43
      mVideoCaptureControl(videoControl),
hgs
parents:
diff changeset
    44
      mSettings(settings),
hgs
parents:
diff changeset
    45
      mStopLocationTrailTimer(),
hgs
parents:
diff changeset
    46
      mPendingStopTrailSession(false)
hgs
parents:
diff changeset
    47
{
hgs
parents:
diff changeset
    48
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
    qRegisterMetaType<CxeGeoTaggingTrail::State>();
hgs
parents:
diff changeset
    51
    initializeStates();
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
    QVariant locationTrailState;
hgs
parents:
diff changeset
    54
    // Get initial location trail state.
hgs
parents:
diff changeset
    55
    mSettings.get(KPSUidLocationTrail.iUid, KLocationTrailState, 
hgs
parents:
diff changeset
    56
                  Cxe::PublishAndSubscribe, locationTrailState);
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
    connect(&mSettings, SIGNAL(settingValueChanged(long int, unsigned long int, QVariant)),
hgs
parents:
diff changeset
    59
            this, SLOT(handleGeoTaggingPropertyEvent(long int, unsigned long int, QVariant)));
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
    connect(&mSettings, SIGNAL(settingValueChanged(const QString&,QVariant)),
hgs
parents:
diff changeset
    63
            this, SLOT(handleSettingValueChanged(const QString&,QVariant)));
hgs
parents:
diff changeset
    64
    
hgs
parents:
diff changeset
    65
    connect(&mStopLocationTrailTimer, SIGNAL(timeout()),
hgs
parents:
diff changeset
    66
            this, SLOT(timeout()), Qt::UniqueConnection);    
hgs
parents:
diff changeset
    67
   
hgs
parents:
diff changeset
    68
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
    69
}
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
/*!
hgs
parents:
diff changeset
    72
* Destructor
hgs
parents:
diff changeset
    73
*/
hgs
parents:
diff changeset
    74
CxeGeoTaggingTrailPrivate::~CxeGeoTaggingTrailPrivate()
hgs
parents:
diff changeset
    75
{
hgs
parents:
diff changeset
    76
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
    // close the location utility session
hgs
parents:
diff changeset
    79
    mLocationTrail.Close();
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
    82
}
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
/*!
hgs
parents:
diff changeset
    86
* Start location trail.
hgs
parents:
diff changeset
    87
*/
hgs
parents:
diff changeset
    88
void CxeGeoTaggingTrailPrivate::start()
hgs
parents:
diff changeset
    89
{
hgs
parents:
diff changeset
    90
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
    int err = KErrNone;
55
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
    93
    int retryTrail = START_TRAIL_ATTEMPTS; // In case RLocationTrail::StartLocationTrail() fail, we will retry
46
hgs
parents:
diff changeset
    94
    int settingValue = Cxe::GeoTaggingOff;
hgs
parents:
diff changeset
    95
    settingValue = mSettings.get(CxeSettingIds::GEOTAGGING, settingValue);
hgs
parents:
diff changeset
    96
    
hgs
parents:
diff changeset
    97
    if (settingValue == Cxe::GeoTaggingOn) {
55
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
    98
        while(retryTrail) {
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
    99
            // geotagging setting is ON, trying to start location trail
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   100
            if (state() == CxeGeoTaggingTrail::NotConnected) {
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   101
                err = mLocationTrail.Connect();
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   102
                if (!err) {
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   103
                    CX_DEBUG(("CxeGeoTaggingTrail <> location trail connected"));
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   104
                    setState(CxeGeoTaggingTrail::Connected);
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   105
                }
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   106
            }
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   107
            // KErrAlreadyExists error means no harm to us
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   108
            if (state() == CxeGeoTaggingTrail::Connected &&
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   109
                (!err || err == KErrAlreadyExists)) {
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   110
                err = mLocationTrail.StartLocationTrail(RLocationTrail::ECaptureAll);
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   111
                if (!err || err == KErrAlreadyExists) {
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   112
                    CX_DEBUG(("CxeGeoTaggingTrail <> starting location trail"));
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   113
                    mStopLocationTrailTimer.stop(); // stop location timer.
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   114
                    setState(CxeGeoTaggingTrail::TrailStarted);
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   115
                }
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   116
            }
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   117
            if (err && err != KErrAlreadyExists) {
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   118
                CX_DEBUG(("CxeGeoTaggingTrailPrivate::start <> FAILED: error = %d . Retries left = %d", err, retryTrail));
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   119
                mLocationTrail.Close();
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   120
                retryTrail--;
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   121
            }
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   122
            else {
0da2a5b56583 201035_1
hgs
parents: 46
diff changeset
   123
                retryTrail = 0;
46
hgs
parents:
diff changeset
   124
            }
hgs
parents:
diff changeset
   125
        }
hgs
parents:
diff changeset
   126
    } else {
hgs
parents:
diff changeset
   127
        // geotagging setting off, do nothing.
hgs
parents:
diff changeset
   128
        CX_DEBUG(("CxeGeoTaggingTrail <> start -- Geotagging setting OFF, do nothing.."));
hgs
parents:
diff changeset
   129
    }
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   132
}
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
/*!
hgs
parents:
diff changeset
   135
* Stop location trail.
hgs
parents:
diff changeset
   136
*/
hgs
parents:
diff changeset
   137
void CxeGeoTaggingTrailPrivate::stop()
hgs
parents:
diff changeset
   138
{
hgs
parents:
diff changeset
   139
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
    bool ok2StopTrail = canStopTrail();
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
    if (ok2StopTrail) {
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
        if (state() == CxeGeoTaggingTrail::TrailStarted ||
hgs
parents:
diff changeset
   146
            state() == CxeGeoTaggingTrail::DataAvailable) {
hgs
parents:
diff changeset
   147
            CX_DEBUG(("CxeGeoTaggingTrailPrivate::StopLocationTrail"));
hgs
parents:
diff changeset
   148
            // stop location trail timer.
hgs
parents:
diff changeset
   149
            mStopLocationTrailTimer.stop();
hgs
parents:
diff changeset
   150
            mLocationTrail.StopLocationTrail();
hgs
parents:
diff changeset
   151
            setState(CxeGeoTaggingTrail::Connected);
hgs
parents:
diff changeset
   152
        }
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
    } else {
hgs
parents:
diff changeset
   155
        // not ready to stop the location trail, TrailStarted the timer.
hgs
parents:
diff changeset
   156
        mStopLocationTrailTimer.start(STOP_TRAIL_INTERVAL);
hgs
parents:
diff changeset
   157
    }
hgs
parents:
diff changeset
   158
    
hgs
parents:
diff changeset
   159
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   160
}
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
/*!
hgs
parents:
diff changeset
   163
* Checking possible stillcapturecontrol/videocapturecontrol states for stopping
hgs
parents:
diff changeset
   164
* location trail.
hgs
parents:
diff changeset
   165
*/
hgs
parents:
diff changeset
   166
bool CxeGeoTaggingTrailPrivate::canStopTrail() const
hgs
parents:
diff changeset
   167
{
hgs
parents:
diff changeset
   168
    // checking still capture control states
hgs
parents:
diff changeset
   169
    bool ok = mStillCaptureControl.state() != CxeStillCaptureControl::Capturing;
hgs
parents:
diff changeset
   170
    
hgs
parents:
diff changeset
   171
    // Still side OK, checking video capture control states
hgs
parents:
diff changeset
   172
    if (ok) {
hgs
parents:
diff changeset
   173
        ok = (mVideoCaptureControl.state() != CxeVideoCaptureControl::Recording &&
hgs
parents:
diff changeset
   174
              mVideoCaptureControl.state() != CxeVideoCaptureControl::Paused &&
hgs
parents:
diff changeset
   175
              mVideoCaptureControl.state() != CxeVideoCaptureControl::Stopping);
hgs
parents:
diff changeset
   176
    }
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
    return ok;
hgs
parents:
diff changeset
   179
}
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
/*!
hgs
parents:
diff changeset
   182
* Slot that is called when timer timeout signal is triggered. We track this to do pending
hgs
parents:
diff changeset
   183
* stopping of location trail.
hgs
parents:
diff changeset
   184
*/
hgs
parents:
diff changeset
   185
void CxeGeoTaggingTrailPrivate::timeout()
hgs
parents:
diff changeset
   186
{
hgs
parents:
diff changeset
   187
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   188
    
hgs
parents:
diff changeset
   189
    // stop the pending location trail utility
hgs
parents:
diff changeset
   190
    stop();
hgs
parents:
diff changeset
   191
    
hgs
parents:
diff changeset
   192
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   193
}
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
/*!
hgs
parents:
diff changeset
   196
* Handle new setting value.
hgs
parents:
diff changeset
   197
* Check if the geotagging setting has changed.
hgs
parents:
diff changeset
   198
*/
hgs
parents:
diff changeset
   199
void CxeGeoTaggingTrailPrivate::handleSettingValueChanged(const QString& settingId, QVariant newValue)
hgs
parents:
diff changeset
   200
{
hgs
parents:
diff changeset
   201
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   202
    
hgs
parents:
diff changeset
   203
    if (settingId == CxeSettingIds::GEOTAGGING) {
hgs
parents:
diff changeset
   204
        if (newValue.toInt() == Cxe::GeoTaggingOn) {
hgs
parents:
diff changeset
   205
            // setting is turned ON, start location trail
hgs
parents:
diff changeset
   206
            start();
hgs
parents:
diff changeset
   207
        } else {
hgs
parents:
diff changeset
   208
            // setting is turned OFF, stopping location trail
hgs
parents:
diff changeset
   209
            stop();
hgs
parents:
diff changeset
   210
        }
hgs
parents:
diff changeset
   211
    } else if (settingId == CxeSettingIds::GEOTAGGING_DISCLAIMER) {
hgs
parents:
diff changeset
   212
        if (newValue.toInt() == Cxe::GeoTaggingDisclaimerDisabled) {
hgs
parents:
diff changeset
   213
            // geotagging disclaimer is diabled, we can start location trail.
hgs
parents:
diff changeset
   214
            start();
hgs
parents:
diff changeset
   215
        }
hgs
parents:
diff changeset
   216
    }
hgs
parents:
diff changeset
   217
    
hgs
parents:
diff changeset
   218
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   219
}
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
/*!
hgs
parents:
diff changeset
   222
* Handle new setting value.
hgs
parents:
diff changeset
   223
* Check if the geotagging setting has changed.
hgs
parents:
diff changeset
   224
*/
hgs
parents:
diff changeset
   225
void CxeGeoTaggingTrailPrivate::handleGeoTaggingPropertyEvent(long int uid,
hgs
parents:
diff changeset
   226
                                                              unsigned long int key,
hgs
parents:
diff changeset
   227
                                                              QVariant value)
hgs
parents:
diff changeset
   228
{
hgs
parents:
diff changeset
   229
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   230
    bool stateOk = (state() == CxeGeoTaggingTrail::DataAvailable || state() == CxeGeoTaggingTrail::TrailStarted);
hgs
parents:
diff changeset
   231
    if (uid == KPSUidLocationTrail.iUid && key == KLocationTrailState && stateOk) {
hgs
parents:
diff changeset
   232
        CX_DEBUG(("Location trail: new state = %d ", value.toInt()));
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
        RLocationTrail::TTrailState newState = 
hgs
parents:
diff changeset
   235
                static_cast<RLocationTrail::TTrailState>(value.toInt());
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
        if (newState == RLocationTrail::ETrailStarted) {
hgs
parents:
diff changeset
   238
            CX_DEBUG(("CxeGeoTaggingTrail <> location trail started, data available."));
hgs
parents:
diff changeset
   239
            setState(CxeGeoTaggingTrail::DataAvailable);
hgs
parents:
diff changeset
   240
        } else {
hgs
parents:
diff changeset
   241
           // ignoring all other state changes.
hgs
parents:
diff changeset
   242
        }
hgs
parents:
diff changeset
   243
    }
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   246
}
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
/*!
hgs
parents:
diff changeset
   249
Returns current state of Location trail
hgs
parents:
diff changeset
   250
*/
hgs
parents:
diff changeset
   251
CxeGeoTaggingTrail::State CxeGeoTaggingTrailPrivate::state() const
hgs
parents:
diff changeset
   252
{
hgs
parents:
diff changeset
   253
    return static_cast<CxeGeoTaggingTrail::State> (stateId());
hgs
parents:
diff changeset
   254
}
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
/*!
hgs
parents:
diff changeset
   257
* slot called when state is changed.
hgs
parents:
diff changeset
   258
*/
hgs
parents:
diff changeset
   259
void CxeGeoTaggingTrailPrivate::handleStateChanged(int newStateId, CxeError::Id error)
hgs
parents:
diff changeset
   260
{
hgs
parents:
diff changeset
   261
    emit stateChanged(static_cast<CxeGeoTaggingTrail::State> (newStateId), error);
hgs
parents:
diff changeset
   262
    
hgs
parents:
diff changeset
   263
}
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
/*!
hgs
parents:
diff changeset
   266
* Initialize states for geotaggingtrail
hgs
parents:
diff changeset
   267
*/
hgs
parents:
diff changeset
   268
void CxeGeoTaggingTrailPrivate::initializeStates()
hgs
parents:
diff changeset
   269
{
hgs
parents:
diff changeset
   270
    // addState( id, name, allowed next states )
hgs
parents:
diff changeset
   271
    addState(new CxeState(CxeGeoTaggingTrail::NotConnected, "NotConnected", CxeGeoTaggingTrail::Connected));
hgs
parents:
diff changeset
   272
    
hgs
parents:
diff changeset
   273
    addState(new CxeState(CxeGeoTaggingTrail::Connected, "Connected", CxeGeoTaggingTrail::TrailStarted | 
hgs
parents:
diff changeset
   274
                                                                      CxeGeoTaggingTrail::NotConnected));
hgs
parents:
diff changeset
   275
    
hgs
parents:
diff changeset
   276
    addState(new CxeState(CxeGeoTaggingTrail::TrailStarted, "TrailStarted", CxeGeoTaggingTrail::DataAvailable |
hgs
parents:
diff changeset
   277
                                                                            CxeGeoTaggingTrail::Connected |
hgs
parents:
diff changeset
   278
                                                                            CxeGeoTaggingTrail::NotConnected));
hgs
parents:
diff changeset
   279
    
hgs
parents:
diff changeset
   280
    addState(new CxeState(CxeGeoTaggingTrail::DataAvailable, "DataAvailable", CxeGeoTaggingTrail::Connected | 
hgs
parents:
diff changeset
   281
                                                                              CxeGeoTaggingTrail::NotConnected));
hgs
parents:
diff changeset
   282
    
hgs
parents:
diff changeset
   283
hgs
parents:
diff changeset
   284
    setInitialState(CxeGeoTaggingTrail::NotConnected);
hgs
parents:
diff changeset
   285
}
hgs
parents:
diff changeset
   286
hgs
parents:
diff changeset
   287
// end of file