camerauis/cameraxui/cxengine/src/cxegeotaggingtrail_symbian_p.cpp
author hgs
Fri, 23 Jul 2010 11:35:41 +0300
changeset 45 24fd82631616
child 51 ccc0e7e3344f
permissions -rw-r--r--
201029
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45
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
    // stop trail and close location utility session
hgs
parents:
diff changeset
    78
    stop(true);
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
            stop(true);
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
* @ param closeSession, indicates if we are willing to close the location utility session.
hgs
parents:
diff changeset
   129
*/
hgs
parents:
diff changeset
   130
void CxeGeoTaggingTrailPrivate::stop(bool closeSession)
hgs
parents:
diff changeset
   131
{
hgs
parents:
diff changeset
   132
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
    bool ok2StopTrail = canStopTrail();
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
    if (ok2StopTrail) {
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
        if (state() == CxeGeoTaggingTrail::TrailStarted ||
hgs
parents:
diff changeset
   139
            state() == CxeGeoTaggingTrail::DataAvailable) {
hgs
parents:
diff changeset
   140
            CX_DEBUG(("CxeGeoTaggingTrailPrivate::StopLocationTrail"));
hgs
parents:
diff changeset
   141
            // stop location trail timer.
hgs
parents:
diff changeset
   142
            mStopLocationTrailTimer.stop();
hgs
parents:
diff changeset
   143
            mLocationTrail.StopLocationTrail();
hgs
parents:
diff changeset
   144
            setState(CxeGeoTaggingTrail::Connected);
hgs
parents:
diff changeset
   145
        }
hgs
parents:
diff changeset
   146
        
hgs
parents:
diff changeset
   147
        if (closeSession && state() == CxeGeoTaggingTrail::Connected) {
hgs
parents:
diff changeset
   148
            CX_DEBUG(("CxeGeoTaggingTrailPrivate <> disconnect location trail utility"));
hgs
parents:
diff changeset
   149
            mLocationTrail.Close();
hgs
parents:
diff changeset
   150
            setState(CxeGeoTaggingTrail::NotConnected);
hgs
parents:
diff changeset
   151
        }
hgs
parents:
diff changeset
   152
    } else {
hgs
parents:
diff changeset
   153
        // not ready to stop the location trail, TrailStarted the timer.
hgs
parents:
diff changeset
   154
        if (!mPendingStopTrailSession) {
hgs
parents:
diff changeset
   155
            mPendingStopTrailSession = closeSession;
hgs
parents:
diff changeset
   156
        }
hgs
parents:
diff changeset
   157
        mStopLocationTrailTimer.start(STOP_TRAIL_INTERVAL);
hgs
parents:
diff changeset
   158
    }
hgs
parents:
diff changeset
   159
    
hgs
parents:
diff changeset
   160
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   161
}
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
/*!
hgs
parents:
diff changeset
   164
* Checking possible stillcapturecontrol/videocapturecontrol states for stopping
hgs
parents:
diff changeset
   165
* location trail.
hgs
parents:
diff changeset
   166
*/
hgs
parents:
diff changeset
   167
bool CxeGeoTaggingTrailPrivate::canStopTrail() const
hgs
parents:
diff changeset
   168
{
hgs
parents:
diff changeset
   169
    // checking still capture control states
hgs
parents:
diff changeset
   170
    bool ok = mStillCaptureControl.state() != CxeStillCaptureControl::Capturing;
hgs
parents:
diff changeset
   171
    
hgs
parents:
diff changeset
   172
    // Still side OK, checking video capture control states
hgs
parents:
diff changeset
   173
    if (ok) {
hgs
parents:
diff changeset
   174
        ok = (mVideoCaptureControl.state() != CxeVideoCaptureControl::Recording &&
hgs
parents:
diff changeset
   175
              mVideoCaptureControl.state() != CxeVideoCaptureControl::Paused &&
hgs
parents:
diff changeset
   176
              mVideoCaptureControl.state() != CxeVideoCaptureControl::Stopping);
hgs
parents:
diff changeset
   177
    }
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
    return ok;
hgs
parents:
diff changeset
   180
}
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
/*!
hgs
parents:
diff changeset
   183
* Slot that is called when timer timeout signal is triggered. We track this to do pending
hgs
parents:
diff changeset
   184
* stopping of location trail.
hgs
parents:
diff changeset
   185
*/
hgs
parents:
diff changeset
   186
void CxeGeoTaggingTrailPrivate::timeout()
hgs
parents:
diff changeset
   187
{
hgs
parents:
diff changeset
   188
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   189
    
hgs
parents:
diff changeset
   190
    // stop the pending location trail utility
hgs
parents:
diff changeset
   191
    stop(mPendingStopTrailSession);
hgs
parents:
diff changeset
   192
    
hgs
parents:
diff changeset
   193
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   194
}
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
/*!
hgs
parents:
diff changeset
   197
* Handle new setting value.
hgs
parents:
diff changeset
   198
* Check if the geotagging setting has changed.
hgs
parents:
diff changeset
   199
*/
hgs
parents:
diff changeset
   200
void CxeGeoTaggingTrailPrivate::handleSettingValueChanged(const QString& settingId, QVariant newValue)
hgs
parents:
diff changeset
   201
{
hgs
parents:
diff changeset
   202
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   203
    
hgs
parents:
diff changeset
   204
    if (settingId == CxeSettingIds::GEOTAGGING) {
hgs
parents:
diff changeset
   205
        if (newValue.toInt() == Cxe::GeoTaggingOn) {
hgs
parents:
diff changeset
   206
            // setting is turned ON, start location trail
hgs
parents:
diff changeset
   207
            start();
hgs
parents:
diff changeset
   208
        } else {
hgs
parents:
diff changeset
   209
            // setting is turned OFF, stopping location trail
hgs
parents:
diff changeset
   210
            stop();
hgs
parents:
diff changeset
   211
        }
hgs
parents:
diff changeset
   212
    } else if (settingId == CxeSettingIds::GEOTAGGING_DISCLAIMER) {
hgs
parents:
diff changeset
   213
        if (newValue.toInt() == Cxe::GeoTaggingDisclaimerDisabled) {
hgs
parents:
diff changeset
   214
            // geotagging disclaimer is diabled, we can start location trail.
hgs
parents:
diff changeset
   215
            start();
hgs
parents:
diff changeset
   216
        }
hgs
parents:
diff changeset
   217
    }
hgs
parents:
diff changeset
   218
    
hgs
parents:
diff changeset
   219
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   220
}
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
/*!
hgs
parents:
diff changeset
   223
* Handle new setting value.
hgs
parents:
diff changeset
   224
* Check if the geotagging setting has changed.
hgs
parents:
diff changeset
   225
*/
hgs
parents:
diff changeset
   226
void CxeGeoTaggingTrailPrivate::handleGeoTaggingPropertyEvent(long int uid,
hgs
parents:
diff changeset
   227
                                                              unsigned long int key,
hgs
parents:
diff changeset
   228
                                                              QVariant value)
hgs
parents:
diff changeset
   229
{
hgs
parents:
diff changeset
   230
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
    if (uid == KPSUidLocationTrail.iUid && key == KLocationTrailState) {
hgs
parents:
diff changeset
   233
        CX_DEBUG(("Location trail: new state = %d ", value.toInt()));
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
        RLocationTrail::TTrailState newState = 
hgs
parents:
diff changeset
   236
                static_cast<RLocationTrail::TTrailState>(value.toInt());
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
        if (newState == RLocationTrail::ETrailStarted) {
hgs
parents:
diff changeset
   239
            CX_DEBUG(("CxeGeoTaggingTrail <> location trail started, data available."));
hgs
parents:
diff changeset
   240
            setState(CxeGeoTaggingTrail::DataAvailable);
hgs
parents:
diff changeset
   241
        } else {
hgs
parents:
diff changeset
   242
           // ignoring all other state changes.
hgs
parents:
diff changeset
   243
        }
hgs
parents:
diff changeset
   244
    }
hgs
parents:
diff changeset
   245
hgs
parents:
diff changeset
   246
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   247
}
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
/*!
hgs
parents:
diff changeset
   250
Returns current state of Location trail
hgs
parents:
diff changeset
   251
*/
hgs
parents:
diff changeset
   252
CxeGeoTaggingTrail::State CxeGeoTaggingTrailPrivate::state() const
hgs
parents:
diff changeset
   253
{
hgs
parents:
diff changeset
   254
    return static_cast<CxeGeoTaggingTrail::State> (stateId());
hgs
parents:
diff changeset
   255
}
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
/*!
hgs
parents:
diff changeset
   258
* slot called when state is changed.
hgs
parents:
diff changeset
   259
*/
hgs
parents:
diff changeset
   260
void CxeGeoTaggingTrailPrivate::handleStateChanged(int newStateId, CxeError::Id error)
hgs
parents:
diff changeset
   261
{
hgs
parents:
diff changeset
   262
    emit stateChanged(static_cast<CxeGeoTaggingTrail::State> (newStateId), error);
hgs
parents:
diff changeset
   263
    
hgs
parents:
diff changeset
   264
}
hgs
parents:
diff changeset
   265
hgs
parents:
diff changeset
   266
/*!
hgs
parents:
diff changeset
   267
* Initialize states for geotaggingtrail
hgs
parents:
diff changeset
   268
*/
hgs
parents:
diff changeset
   269
void CxeGeoTaggingTrailPrivate::initializeStates()
hgs
parents:
diff changeset
   270
{
hgs
parents:
diff changeset
   271
    // addState( id, name, allowed next states )
hgs
parents:
diff changeset
   272
    addState(new CxeState(CxeGeoTaggingTrail::NotConnected, "NotConnected", CxeGeoTaggingTrail::Connected));
hgs
parents:
diff changeset
   273
    
hgs
parents:
diff changeset
   274
    addState(new CxeState(CxeGeoTaggingTrail::Connected, "Connected", CxeGeoTaggingTrail::TrailStarted | 
hgs
parents:
diff changeset
   275
                                                                      CxeGeoTaggingTrail::NotConnected));
hgs
parents:
diff changeset
   276
    
hgs
parents:
diff changeset
   277
    addState(new CxeState(CxeGeoTaggingTrail::TrailStarted, "TrailStarted", CxeGeoTaggingTrail::DataAvailable |
hgs
parents:
diff changeset
   278
                                                                            CxeGeoTaggingTrail::Connected |
hgs
parents:
diff changeset
   279
                                                                            CxeGeoTaggingTrail::NotConnected));
hgs
parents:
diff changeset
   280
    
hgs
parents:
diff changeset
   281
    addState(new CxeState(CxeGeoTaggingTrail::DataAvailable, "DataAvailable", CxeGeoTaggingTrail::Connected | 
hgs
parents:
diff changeset
   282
                                                                              CxeGeoTaggingTrail::NotConnected));
hgs
parents:
diff changeset
   283
    
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
    setInitialState(CxeGeoTaggingTrail::NotConnected);
hgs
parents:
diff changeset
   286
}
hgs
parents:
diff changeset
   287
hgs
parents:
diff changeset
   288
// end of file