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