sensorsupport/testsensor/src/ssyreferencecmdhandler.cpp
branchRCL_3
changeset 19 924385140d98
equal deleted inserted replaced
18:0818dd463d41 19:924385140d98
       
     1 // ssyreferencecmdhandler.cpp
       
     2 
       
     3 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 // All rights reserved.
       
     5 // This component and the accompanying materials are made available
       
     6 // under the terms of "Eclipse Public License v1.0"
       
     7 // which accompanies this distribution, and is available
       
     8 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     9 //
       
    10 // Initial Contributors:
       
    11 // Nokia Corporation - initial contribution.
       
    12 //
       
    13 // Contributors:
       
    14 //
       
    15 // Description:
       
    16 //
       
    17 
       
    18 
       
    19 
       
    20 #include <e32property.h>
       
    21 #include "ssyreferencecmdhandler.h"
       
    22 #include "ssyreferencecontrol.h"
       
    23 #include "ssyreferencechannel.h"
       
    24 #include "ssyreferencetrace.h"
       
    25 
       
    26 // ======== CONSTANTS ========
       
    27 const TInt KSsyRefShortDelay = 100; 
       
    28 
       
    29 // ======== MEMBER FUNCTIONS ========
       
    30 
       
    31 // ---------------------------------------------------------------------------
       
    32 // CSsyReferenceCmdHandler C++ constructor
       
    33 // ---------------------------------------------------------------------------
       
    34 //
       
    35 CSsyReferenceCmdHandler::CSsyReferenceCmdHandler( CSsyReferenceChannel& aSsyChannel ) :
       
    36     CActive( EPriorityNormal ),
       
    37     iSsyChannel( aSsyChannel )
       
    38     {
       
    39     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::CSsyReferenceCmdHandler()" ) ) );
       
    40     CActiveScheduler::Add( this );
       
    41     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::CSsyReferenceCmdHandler() - return" ) ) );
       
    42     }
       
    43 
       
    44 
       
    45 // ---------------------------------------------------------------------------
       
    46 // Symbian 2nd phase constructor
       
    47 // ---------------------------------------------------------------------------
       
    48 //
       
    49 void CSsyReferenceCmdHandler::ConstructL()
       
    50     {
       
    51     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::ConstructL()" ) ) );
       
    52     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::ConstructL() - return" ) ) );
       
    53     }
       
    54 
       
    55 
       
    56 // ---------------------------------------------------------------------------
       
    57 // CSsyReferenceCmdHandler::NewL
       
    58 // ---------------------------------------------------------------------------
       
    59 //
       
    60 CSsyReferenceCmdHandler* CSsyReferenceCmdHandler::NewL( CSsyReferenceChannel& aSsyChannel )
       
    61     {
       
    62     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::NewL()" ) ) );
       
    63     CSsyReferenceCmdHandler* self = new ( ELeave ) CSsyReferenceCmdHandler( aSsyChannel );
       
    64     CleanupStack::PushL( self );
       
    65     self->ConstructL();
       
    66     CleanupStack::Pop( self );
       
    67     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::NewL() - return" ) ) );
       
    68     return self;
       
    69     }
       
    70 
       
    71 // ---------------------------------------------------------------------------
       
    72 // Destructor
       
    73 // ---------------------------------------------------------------------------
       
    74 //
       
    75 CSsyReferenceCmdHandler::~CSsyReferenceCmdHandler()
       
    76     {
       
    77     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::~CSsyReferenceCmdHandler()" ) ) );
       
    78 
       
    79     if ( iMessage )
       
    80         {
       
    81         // Send ProcessResponse
       
    82         iMessage->SetError( KErrCancel );
       
    83         iSsyChannel.ProcessResponse( iMessage );
       
    84         delete iMessage;
       
    85         iMessage = NULL;
       
    86         }
       
    87 
       
    88     if ( iTimer )
       
    89         {
       
    90         iTimer->Cancel();
       
    91         delete iTimer;
       
    92         }
       
    93 
       
    94     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::~CSsyReferenceCmdHandler() - return" ) ) );
       
    95     }
       
    96 
       
    97 // ---------------------------------------------------------------------------
       
    98 // CSsyReferenceCmdHandler::ProcessCommand
       
    99 // ---------------------------------------------------------------------------
       
   100 //
       
   101 TInt CSsyReferenceCmdHandler::ProcessCommand( TSsyReferenceMsg aMessage )
       
   102     {
       
   103     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::ProcessCommand()" ) ) );
       
   104     TInt err( KErrAlreadyExists );
       
   105     
       
   106     // Special case, when channel is reciving, iMessage is not deleted after ProcessCommand
       
   107     if ( aMessage.Function() == ESsyReferenceStopChannelData )
       
   108         {
       
   109         // Stop 'receiving'. No need to handle this asynchronously
       
   110         if ( iTimer )
       
   111             {
       
   112             iTimer->Cancel();
       
   113             delete iTimer;
       
   114             iTimer = NULL;
       
   115             }
       
   116         
       
   117         iDataItemArray.Reset();
       
   118         iDataItemPtr = 0;
       
   119         err = KErrNone;
       
   120         // No need to send ProcessResponse either
       
   121         delete iMessage;
       
   122         iMessage = NULL;
       
   123         }
       
   124     else if ( !iMessage )
       
   125         {
       
   126         iMessage = new TSsyReferenceMsg( aMessage );
       
   127         if(iMessage)
       
   128             {
       
   129             switch( aMessage.Function() )
       
   130                 {
       
   131                 case ESsyReferenceStartChannelData:
       
   132                     {
       
   133                     // Get channel data items and start 'receiving'
       
   134                     IssueRequest();
       
   135                     err = KErrNone;
       
   136                     break;
       
   137                     }
       
   138                 case ESsyReferenceOpenChannel:
       
   139                     {
       
   140                     // Open channel specific handling here
       
   141                     IssueRequest();
       
   142                     err = KErrNone;
       
   143                     break;
       
   144                     }
       
   145                 case ESsyReferenceCloseChannel:
       
   146                     {
       
   147                     // Close channel specific handling here
       
   148                     IssueRequest();
       
   149                     err = KErrNone;
       
   150                     break;  
       
   151                     }
       
   152                 default:
       
   153                     {
       
   154                     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::ProcessCommand() - Unknown function" ) ) );
       
   155                     err = KErrNotFound;
       
   156                     }
       
   157                 }
       
   158             }
       
   159             else
       
   160             {
       
   161             err = KErrNoMemory;
       
   162             }
       
   163         }
       
   164     else
       
   165         {
       
   166         err = KErrUnknown;
       
   167         }
       
   168     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::ProcessCommand() - return" ) ) );
       
   169     return err;
       
   170     }
       
   171 
       
   172 // ---------------------------------------------------------------------------
       
   173 // CSsyReferenceCmdHandler::IssueRequest
       
   174 // ---------------------------------------------------------------------------
       
   175 //
       
   176 void CSsyReferenceCmdHandler::IssueRequest( TInt aError )
       
   177     {
       
   178     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::IssueRequest()" ) ) );
       
   179     // Provides synchronous function calls to be handled as asynchronous
       
   180     if ( !IsActive() )
       
   181         {
       
   182         TRequestStatus *s = &iStatus;
       
   183 	    User::RequestComplete( s, aError );
       
   184 	    SetActive();
       
   185         }
       
   186     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::IssueRequest() - return" ) ) );
       
   187     }
       
   188 
       
   189 // ---------------------------------------------------------------------------
       
   190 // CSsyReferenceCmdHandler::SendResponse
       
   191 // ---------------------------------------------------------------------------
       
   192 //
       
   193 void CSsyReferenceCmdHandler::SendResponse( TInt aError )
       
   194     {
       
   195     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::SendResponse()" ) ) );
       
   196     // Send response to channel
       
   197     if ( iMessage )
       
   198         {
       
   199         iMessage->SetError( aError );
       
   200         iSsyChannel.ProcessResponse( iMessage );
       
   201         delete iMessage;
       
   202         iMessage = NULL;
       
   203         }
       
   204     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::SendResponse() - return" ) ) );
       
   205     }
       
   206 
       
   207 // ---------------------------------------------------------------------------
       
   208 // CSsyReferenceCmdHandler::RunL
       
   209 // ---------------------------------------------------------------------------
       
   210 //
       
   211 void CSsyReferenceCmdHandler::RunL()
       
   212     {
       
   213     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::RunL() - %i" ), iStatus.Int() ) );
       
   214     
       
   215     TInt err( iStatus.Int() );
       
   216 
       
   217     if ( iMessage )
       
   218         {
       
   219         switch( iMessage->Function() )
       
   220             {
       
   221             case ESsyReferenceStartChannelData:
       
   222                 {
       
   223                 TInt startInterval( 0 );
       
   224                 
       
   225                 // Get all Channel data information from config file
       
   226                 iSsyChannel.SsyControl().SsyConfig().
       
   227                     GetChannelDataInformationL( iMessage->ChannelId(), iDataItemArray, startInterval );
       
   228 
       
   229                 // Check that channel data items were found
       
   230                 if ( iDataItemArray.Count() )
       
   231                     {
       
   232                     // If interval is zero, set small interval
       
   233                     if ( startInterval == 0 )
       
   234                         {
       
   235                         startInterval = KSsyRefShortDelay;
       
   236                         }
       
   237 
       
   238                     // wait that interval
       
   239                     if ( iTimer )
       
   240                         {
       
   241                         iTimer->Cancel();
       
   242                         delete iTimer;
       
   243                         iTimer = NULL;
       
   244                         }
       
   245 
       
   246                     // Reset pointer
       
   247                     iDataItemPtr = 0;
       
   248 
       
   249                     // Start timer and continue processing in callback function
       
   250                     iTimer = CPeriodic::NewL( EPriorityNormal );
       
   251                     iTimer->Start( startInterval * 1000, 0, TCallBack( DataItemCallback, this ) );
       
   252                     }
       
   253                 break;
       
   254                 }
       
   255             case ESsyReferenceOpenChannel:
       
   256                 {
       
   257                 // Open channel response specific handling here
       
   258                 iMessage->SetFunction( ESsyReferenceOpenChannelResp );
       
   259                 SendResponse();
       
   260                 break;
       
   261                 }
       
   262             case ESsyReferenceCloseChannel:
       
   263                 {
       
   264                 // Close channel response specific handling here
       
   265                 iMessage->SetFunction( ESsyReferenceCloseChannelResp );
       
   266                 SendResponse();
       
   267                 break;  
       
   268                 }
       
   269             default:
       
   270                 {
       
   271                 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::ProcessCommand() - Unknown function" ) ) );
       
   272                 err = KErrNotFound;
       
   273                 }
       
   274             }
       
   275         }
       
   276 
       
   277     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::RunL() - return" ) ) );
       
   278     }
       
   279 
       
   280 // ---------------------------------------------------------------------------
       
   281 // CSsyReferenceCmdHandler::DoCancel
       
   282 // ---------------------------------------------------------------------------
       
   283 //
       
   284 void CSsyReferenceCmdHandler::DoCancel()
       
   285     {
       
   286     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::DoCancel()" ) ) );
       
   287 
       
   288     // Handle cancel for this channel. Cancel any ongoing requests
       
   289     
       
   290     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::DoCancel() - return" ) ) );
       
   291     }
       
   292 
       
   293 // ---------------------------------------------------------------------------
       
   294 // CSsyReferenceCmdHandler::RunError
       
   295 // ---------------------------------------------------------------------------
       
   296 //
       
   297 TInt CSsyReferenceCmdHandler::RunError( TInt /*aError*/ )
       
   298     {
       
   299     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::RunError()" ) ) );
       
   300 
       
   301     // Handle possible errors here and return KErrNone to prevent SSY from panic
       
   302     
       
   303     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::RunError() - return" ) ) );
       
   304     return KErrNone;
       
   305     }
       
   306 
       
   307 // ---------------------------------------------------------------------------
       
   308 // CSsyReferenceCmdHandler::DataItemCallback
       
   309 // ---------------------------------------------------------------------------
       
   310 //
       
   311 TInt CSsyReferenceCmdHandler::DataItemCallback( TAny* aThis )
       
   312     {
       
   313     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::DataItemCallback()" ) ) );
       
   314     return static_cast<CSsyReferenceCmdHandler*>( aThis )->GenerateChannelDataItem();
       
   315     }
       
   316 
       
   317 // ---------------------------------------------------------------------------
       
   318 // CSsyReferenceCmdHandler::GenerateChannelDataItem
       
   319 // ---------------------------------------------------------------------------
       
   320 //
       
   321 TInt CSsyReferenceCmdHandler::GenerateChannelDataItem()
       
   322     {
       
   323     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::GenerateChannelDataItem()" ) ) );
       
   324 
       
   325     // Get next item from list and set pointer to next item
       
   326     TSsyRefChannelDataBase dataItem = iDataItemArray[iDataItemPtr++];
       
   327 
       
   328     // Get next item interval from data item
       
   329     TInt nextInterval( dataItem.Interval() );
       
   330 
       
   331     // Set timestamp to data item
       
   332     TTime time;
       
   333     time.HomeTime();
       
   334     dataItem.SetTimestamp( time );
       
   335 
       
   336     // If interval is zero, set small interval
       
   337     if ( nextInterval == 0 )
       
   338         {
       
   339         nextInterval = KSsyRefShortDelay;
       
   340         }
       
   341 
       
   342     // Add data item to message
       
   343     iMessage->SetDataItem( &dataItem );
       
   344 
       
   345     // If in last data item, set pointer back to first item
       
   346     if ( iDataItemArray.Count() == iDataItemPtr )
       
   347         {
       
   348         iDataItemPtr = 0;
       
   349         }
       
   350 
       
   351     // Send response and start new timer
       
   352     iMessage->SetFunction( ESsyReferenceDataItemReceived );
       
   353     iSsyChannel.ProcessResponse( iMessage );
       
   354 
       
   355     if ( iTimer )
       
   356         {
       
   357         delete iTimer;
       
   358         iTimer = NULL;
       
   359         }
       
   360 
       
   361     TRAP_IGNORE( iTimer = CPeriodic::NewL( EPriorityNormal );
       
   362                  iTimer->Start( nextInterval * 1000, 0, TCallBack( DataItemCallback, this ) ); )
       
   363 
       
   364     COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::GenerateChannelDataItem() - return" ) ) );
       
   365     return KErrNone;
       
   366     }
       
   367