# HG changeset patch # User hgs # Date 1272059006 -10800 # Node ID 3b92f7acdc913c7e61ddcd1e515d3ebe1ba5e61d # Parent 64b3172ba34724289ea20ab1fccd46f5bd368ec3 201015 diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/atext/group/dunatext.mmp --- a/localconnectivityservice/dun/atext/group/dunatext.mmp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/atext/group/dunatext.mmp Sat Apr 24 00:43:26 2010 +0300 @@ -33,6 +33,7 @@ SOURCE DunAtModeListen.cpp SOURCE DunAtEcomListen.cpp SOURCE DunAtNvramListen.cpp +SOURCE DunAtSpecialCmdHandler.cpp USERINCLUDE ../inc ../../utils/inc @@ -48,4 +49,5 @@ LIBRARY atextclient.lib LIBRARY atextcommon.lib LIBRARY euser.lib +LIBRARY bafl.lib DEBUGLIBRARY flogger.lib diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/atext/inc/DunAtCmdHandler.h --- a/localconnectivityservice/dun/atext/inc/DunAtCmdHandler.h Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/atext/inc/DunAtCmdHandler.h Sat Apr 24 00:43:26 2010 +0300 @@ -26,6 +26,7 @@ #include "DunAtEcomListen.h" #include "DunAtModeListen.h" #include "DunAtNvramListen.h" +#include "DunAtSpecialCmdHandler.h" const TInt KDunChSetMaxCharLen = 1; // Only ASCII supported for now const TInt KDunOkBufLength = 1+1+2+1+1; // ++"OK"++ @@ -839,6 +840,10 @@ */ RATExtCommon iAtCmdExtCommon; + /** + * Special AT command handler for handling commands like AT&FE0Q0V1&C1&D2+IFC=3,1. + */ + CDunAtSpecialCmdHandler* iAtSpecialCmdHandler; }; #endif // C_CDUNATCMDHANDLER_H diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/atext/inc/DunAtSpecialCmdHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localconnectivityservice/dun/atext/inc/DunAtSpecialCmdHandler.h Sat Apr 24 00:43:26 2010 +0300 @@ -0,0 +1,76 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Special AT command handler +* +*/ + +#ifndef C_CDUNATSPECIALCMDHANDLER_H +#define C_CDUNATSPECIALCMDHANDLER_H + +#include +#include + +const TInt KInputBufLength = (512 + 1); // 512 chars for command + + +/** + * Class for special AT command handler + * + * @lib dunatext.lib + * @since S60 v5.0 + */ +NONSHARABLE_CLASS( CDunAtSpecialCmdHandler ) : public CBase + { + +public: + + /** + * Two-phased constructor. + * @param None + * @return Instance of self + */ + static CDunAtSpecialCmdHandler* NewL(); + + /** + * Destructor. + */ + ~CDunAtSpecialCmdHandler(); + +public: + + TBool IsCompleteSubCommand(TChar aCharacter); + TBool IsCompleteSubCommand(TDesC8& aDes, TInt aStartIndex, TInt& aEndIndex); + +private: + + CDunAtSpecialCmdHandler(); + + void ConstructL(); + + TBool IsDataReadyForComparison(TInt aLength); + TInt MinimumLength(); + + +private: // data + /** + * Buffer for temporary AT command input + */ + TBuf8 iBuffer; + + /** + * Special commands for parsing + */ + CDesC8Array *iSpecialCmds; + }; + +#endif // C_CDUNATSPECIALCMDHANDLER_H diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/atext/src/DunAtCmdHandler.cpp --- a/localconnectivityservice/dun/atext/src/DunAtCmdHandler.cpp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/atext/src/DunAtCmdHandler.cpp Sat Apr 24 00:43:26 2010 +0300 @@ -85,6 +85,8 @@ iModeListen = NULL; delete iEcomListen; iEcomListen = NULL; + delete iAtSpecialCmdHandler; + iAtSpecialCmdHandler = NULL; if ( iAtCmdExtCommon.Handle() ) { iAtCmdExtCommon.SynchronousClose(); @@ -331,6 +333,8 @@ iEcomListen = ecomListen; iModeListen = modeListen; iNvramListen = nvramListen; + + iAtSpecialCmdHandler = CDunAtSpecialCmdHandler::NewL(); FTRACE(FPrint( _L("CDunAtCmdHandler::ConstructL() complete") )); } @@ -860,7 +864,10 @@ TInt endIndex = KErrNotFound; if ( extendedCmd ) { - extendedEnd = CheckExtendedCommand( startIndex, endIndex ); + if( iAtSpecialCmdHandler->IsCompleteSubCommand(iInputBuffer, startIndex, endIndex) == EFalse ) + { + extendedEnd = CheckExtendedCommand( startIndex, endIndex ); + } } else { @@ -1007,7 +1014,7 @@ FTRACE(FPrint( _L("CDunAtCmdHandler::IsDelimiterCharacter()") )); if ( aCharacter.IsSpace() || aCharacter==';' || aCharacter==0x00 ) { - FTRACE(FPrint( _L("CDunAtCmdHandler::IsExtendedCharacter() complete") )); + FTRACE(FPrint( _L("CDunAtCmdHandler::IsDelimiterCharacter() complete") )); return ETrue; } FTRACE(FPrint( _L("CDunAtCmdHandler::IsDelimiterCharacter() (not delimiter) complete") )); @@ -1071,6 +1078,16 @@ endFound = ETrue; break; } + if( IsExtendedCharacter(character) && (aEndIndex != aStartIndex) && iDecodeInfo.iPrevExists ) + { + if( iDecodeInfo.iPrevChar.IsAlphaDigit() ) + { + aEndIndex--; + // End found but return EFalse in order to calling function can proceed correct way, + // no extended end. + return EFalse; + } + } iDecodeInfo.iPrevExists = ETrue; iDecodeInfo.iPrevChar = character; } diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/atext/src/DunAtSpecialCmdHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localconnectivityservice/dun/atext/src/DunAtSpecialCmdHandler.cpp Sat Apr 24 00:43:26 2010 +0300 @@ -0,0 +1,181 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Special AT command handler +* +*/ + +#include "DunAtSpecialCmdHandler.h" +#include "DunDebug.h" + +// AT command(s) below is part of the AT&FE0Q0V1&C1&D2+IFC=3,1. command which +// is sent by MAC +_LIT8(KSpecialATCmd1, "AT&F"); +// Number of special commands +const TInt KDefaultGranularity = 1; + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CDunAtSpecialCmdHandler* CDunAtSpecialCmdHandler::NewL() + { + CDunAtSpecialCmdHandler* self = new (ELeave) CDunAtSpecialCmdHandler(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CDunAtSpecialCmdHandler::CDunAtSpecialCmdHandler +// --------------------------------------------------------------------------- +// +CDunAtSpecialCmdHandler::CDunAtSpecialCmdHandler() + { + } + +// --------------------------------------------------------------------------- +// CDunAtSpecialCmdHandler::ConstructL +// --------------------------------------------------------------------------- +// +void CDunAtSpecialCmdHandler::ConstructL() + { + iSpecialCmds = new (ELeave) CDesC8ArrayFlat(KDefaultGranularity); + // Add here all special commands which need to be handled + iSpecialCmds->AppendL(KSpecialATCmd1); + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CDunAtSpecialCmdHandler::~CDunAtSpecialCmdHandler() + { + FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::~CDunAtSpecialCmdHandler()") )); + delete iSpecialCmds; + FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::~CDunAtSpecialCmdHandler() complete") )); + } + +// --------------------------------------------------------------------------- +// Checks if the command has to be treated special way +// For example in case of MAC, it sends command AT&FE0Q0V1&C1&D2+IFC=3,1. +// meaning there is no delimiters in the command. +// In case of MAC we try to search AT&F (sub command) string from the beginning +// of the command. +// Search is done character by character basis. +// --------------------------------------------------------------------------- +// +TBool CDunAtSpecialCmdHandler::IsCompleteSubCommand (TChar aCharacter) + { + FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsCompleteSubCommand()") )); + iBuffer.Append(aCharacter); + TBool completeSubCmd = EFalse; + + if( !IsDataReadyForComparison( iBuffer.Length()) ) + { + // No need to do comparison because we don't have correct amount of data + FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsCompleteSubCommand(), no need to compare") )); + return completeSubCmd; + } + + TInt count = iSpecialCmds->Count(); + for( TInt i = 0 ; i < count ; i++ ) + { + if( iSpecialCmds->MdcaPoint(i).Compare(iBuffer) == 0 ) + { + FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsCompleteSubCommand(), match found, cmd index %d"), i )); + // Reset internal buffer for next comparison. + iBuffer.FillZ(); + iBuffer.Zero(); + completeSubCmd = ETrue; + break; + } + } + FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsCompleteSubCommand() complete") )); + return completeSubCmd; + } + +// --------------------------------------------------------------------------- +// Checks if the command has to be treated special way +// For example in case of MAC, it sends command AT&FE0Q0V1&C1&D2+IFC=3,1. +// meaning there is no delimiters in the command. +// In case of MAC we try to search AT&F (sub command) string from the beginning +// of the command. +// Search is done string basis. +// --------------------------------------------------------------------------- +// +TBool CDunAtSpecialCmdHandler::IsCompleteSubCommand(TDesC8& aDes, TInt aStartIndex, TInt& aEndIndex) + { + FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsCompleteSubCommand()") )); + TBool completeSubCmd = EFalse; + if( aDes.Length() < MinimumLength() || aStartIndex != 0 ) + { + // No need to do comparison because we don't have correct amount of data or + // we are not at the beginning of the input buffer (non decoded buffer) + FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsCompleteSubCommand(), no need to compare") )); + return completeSubCmd; + } + + TInt count = iSpecialCmds->Count(); + for( TInt i = 0 ; i < count ; i++ ) + { + TInt length = iSpecialCmds->MdcaPoint(i).Length(); + TPtrC8 cmd = aDes.Mid(0, length); + if( iSpecialCmds->MdcaPoint(i).Compare(cmd) == 0 ) + { + FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsCompleteSubCommand(), match found, cmd index %d"), i )); + aEndIndex = length - 1; + completeSubCmd = ETrue; + break; + } + } + FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsCompleteSubCommand() complete") )); + return completeSubCmd; + } + +// --------------------------------------------------------------------------- +// Defines when comparison is excecuted, checks if the data lengths are equal. +// --------------------------------------------------------------------------- +// +TBool CDunAtSpecialCmdHandler::IsDataReadyForComparison(TInt aLength) + { + TInt count = iSpecialCmds->Count(); + for( TInt i = 0 ; i < count ; i++ ) + { + if( iSpecialCmds->MdcaPoint(i).Length() == aLength ) + { + return ETrue; + } + } + return EFalse; + } + +// --------------------------------------------------------------------------- +// Defines minimum length of the special commands. +// --------------------------------------------------------------------------- +// +TInt CDunAtSpecialCmdHandler::MinimumLength() + { + TInt length = iSpecialCmds->MdcaPoint(0).Length(); + TInt count = iSpecialCmds->Count(); + for( TInt i = 1 ; i < count ; i++ ) + { + if( iSpecialCmds->MdcaPoint(i).Length() < length ) + { + length = iSpecialCmds->MdcaPoint(i).Length(); + break; + } + } + return length; + } diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/plugins/src/bt/DunBtListen.cpp --- a/localconnectivityservice/dun/plugins/src/bt/DunBtListen.cpp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/plugins/src/bt/DunBtListen.cpp Sat Apr 24 00:43:26 2010 +0300 @@ -28,6 +28,9 @@ const TInt KListenQueSize = 1; const TInt KDunFixedChannel = 22; // Hack/kludge for Apple Bug ID 6527598 +//Service Class Bits supported by DUN +static const TUint16 KCoDDunServiceClass = EMajorServiceTelephony | EMajorServiceNetworking; + // ======== MEMBER FUNCTIONS ======== // --------------------------------------------------------------------------- @@ -340,6 +343,11 @@ return KErrInUse; } aChannelNum = aListenSocket.LocalPort(); + + // We try to set the Telephony and Networking bits in our service class. If this fails we + // ignore it, as it's better to carry on without it than to fail to start listening. + (void)aListenSocket.SetOpt(KBTRegisterCodService, KSolBtRFCOMM, KCoDDunServiceClass); + retTemp = aListenSocket.Listen( KListenQueSize ); if ( retTemp != KErrNone ) { diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/utils/inc/DunDataPusher.h --- a/localconnectivityservice/dun/utils/inc/DunDataPusher.h Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/utils/inc/DunDataPusher.h Sat Apr 24 00:43:26 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -78,8 +78,7 @@ * @lib dunutils.lib * @since S60 v3.2 */ -NONSHARABLE_CLASS( CDunDataPusher ) : public CActive, - public MDunEndpointReady +NONSHARABLE_CLASS( CDunDataPusher ) : public CActive { public: @@ -238,24 +237,6 @@ */ void DoCancel(); -// from base class MDunEndpointReady - - /** - * Gets called when endpoint is ready - * - * @since S60 5.0 - * @return None - */ - void NotifyEndpointReady(); - - /** - * Gets called when endpoint is not ready - * - * @since S60 5.0 - * @return None - */ - void NotifyEndpointNotReady(); - private: // data /** @@ -285,11 +266,6 @@ TInt iEventIndex; /** - * Flag to be set when endpoint is ready or not - */ - TBool iEPReady; - - /** * RSocket object of local media side * If this is set then iComm is not used * Not own. diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/utils/inc/DunDownstream.h --- a/localconnectivityservice/dun/utils/inc/DunDownstream.h Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/utils/inc/DunDownstream.h Sat Apr 24 00:43:26 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -156,14 +156,6 @@ TInt AddToQueueAndSend( const TDesC8 *aPushedData, MDunCompletionReporter* aCallback ); - /** - * Gets the endpoint readiness handler - * - * @since S60 5.0 - * @return Endpoint readiness handler - */ - MDunEndpointReady* EndpointReadyHandler(); - private: CDunDownstream( MDunTransporterUtilityAux* aUtility ); diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/utils/inc/DunSignalCopy.h --- a/localconnectivityservice/dun/utils/inc/DunSignalCopy.h Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/utils/inc/DunSignalCopy.h Sat Apr 24 00:43:26 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -64,16 +64,6 @@ TInt AddCallback( MDunConnMon* aCallback ); /** - * Adds callback for endpoint readiness - * The callback will be called when the endpoint is ready or not ready - * - * @since S60 5.0 - * @param aEPCallback Callback to call when writes can/can't be done - * @return Symbian error code on error, KErrNone otherwise - */ - TInt AddEndpointReadyCallback( MDunEndpointReady* aEPCallback ); - - /** * Sets media to use for this endpoint monitor * * @since S60 3.2 @@ -160,15 +150,6 @@ */ void ChangeDownstreamSignal( TUint aSetMask, TUint aClearMask ); - /** - * Reports endpoint ready or not ready - * - * @since S60 5.0 - * @param aReady ETrue if endpoint ready, EFalse otherwise - * @return None - */ - void ReportEndpointReady( TBool aReady ); - // from base class CActive /* @@ -198,12 +179,6 @@ RPointerArray iCallbacks; /** - * Callback(s) to call when notification(s) via MDunEndpointReady to be made - * Normally contains only one callback for upstream - */ - RPointerArray iERCallbacks; - - /** * Callback(s) to call when command mode starts or ends * Usually two needed: one for upstream and second for downstream */ diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/utils/inc/DunSignalNotify.h --- a/localconnectivityservice/dun/utils/inc/DunSignalNotify.h Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/utils/inc/DunSignalNotify.h Sat Apr 24 00:43:26 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -65,16 +65,6 @@ TInt AddCallback( MDunConnMon* aCallback ); /** - * Adds callback for endpoint readiness - * The callback will be called when the endpoint is ready or not ready - * - * @since S60 5.0 - * @param aERCallback Callback to call when writes can/can't be done - * @return Symbian error code on error, KErrNone otherwise - */ - TInt AddEndpointReadyCallback( MDunEndpointReady* aERCallback ); - - /** * Sets media to use for this endpoint monitor (network side) * * @since S60 3.2 @@ -131,15 +121,6 @@ */ void ReportSignalChange( TUint aSetMask, TUint aClearMask ); - /** - * Reports endpoint ready or not ready - * - * @since S60 5.0 - * @param aReady ETrue if endpoint ready, EFalse otherwise - * @return None - */ - void ReportEndpointReady( TBool aReady ); - // from base class CActive /* @@ -169,12 +150,6 @@ RPointerArray iCallbacks; /** - * Callback(s) to call when notification(s) via MDunEndpointReady to be made - * Normally contains only one callback for upstream - */ - RPointerArray iERCallbacks; - - /** * Pointer to common utility class * Not own. */ diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/utils/inc/DunTransporter.h --- a/localconnectivityservice/dun/utils/inc/DunTransporter.h Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/utils/inc/DunTransporter.h Sat Apr 24 00:43:26 2010 +0300 @@ -188,35 +188,6 @@ }; /** - * Notification interface class to report endpoint readiness - * - * @lib dunutils.lib - * @since S60 v5.0 - */ -NONSHARABLE_CLASS( MDunEndpointReady ) - { - -public: - - /** - * Gets called when endpoint is ready - * - * @since S60 5.0 - * @return None - */ - virtual void NotifyEndpointReady() = 0; - - /** - * Gets called when endpoint is not ready - * - * @since S60 5.0 - * @return None - */ - virtual void NotifyEndpointNotReady() = 0; - - }; - -/** * Notification interface class to report service advertisement status changes * * @lib dunutils.lib diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/utils/src/DunDataPusher.cpp --- a/localconnectivityservice/dun/utils/src/DunDataPusher.cpp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/utils/src/DunDataPusher.cpp Sat Apr 24 00:43:26 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -312,7 +312,6 @@ // Don't initialize iStreamCallback here (it is set through NewL) iPushState = EDunStateIdle; iEventIndex = 0; - iEPReady = EFalse; iSocket = NULL; iComm = NULL; } @@ -336,13 +335,6 @@ return KErrGeneral; } iStatus = KRequestPending; - if ( !iEPReady ) - { - SetActive(); - TRequestStatus* requestStatus = &iStatus; - User::RequestComplete( requestStatus, KErrNone ); - return KErrNone; - } const TDesC8 *pushedData = iEventQueue[iEventIndex].iPushedData; if ( iComm ) { @@ -455,27 +447,3 @@ } FTRACE(FPrint( _L("CDunDataPusher::DoCancel() complete" ))); } - -// --------------------------------------------------------------------------- -// From class MDunEndpointReady. -// Gets called when endpoint is ready -// --------------------------------------------------------------------------- -// -void CDunDataPusher::NotifyEndpointReady() - { - FTRACE(FPrint( _L("CDunDataPusher::NotifyEndpointReady()" ))); - iEPReady = ETrue; - FTRACE(FPrint( _L("CDunDataPusher::NotifyEndpointReady() complete" ))); - } - -// --------------------------------------------------------------------------- -// From class MDunEndpointReady. -// Gets called when endpoint is not ready -// --------------------------------------------------------------------------- -// -void CDunDataPusher::NotifyEndpointNotReady() - { - FTRACE(FPrint( _L("CDunDataPusher::NotifyEndpointNotReady()" ))); - iEPReady = EFalse; - FTRACE(FPrint( _L("CDunDataPusher::NotifyEndpointNotReady() complete" ))); - } diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/utils/src/DunDownstream.cpp --- a/localconnectivityservice/dun/utils/src/DunDownstream.cpp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/utils/src/DunDownstream.cpp Sat Apr 24 00:43:26 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -143,17 +143,6 @@ } // --------------------------------------------------------------------------- -// Gets the endpoint readiness handler -// --------------------------------------------------------------------------- -// -MDunEndpointReady* CDunDownstream::EndpointReadyHandler() - { - FTRACE(FPrint( _L("CDunDownstream::EndpointReadyHandler()" ) )); - FTRACE(FPrint( _L("CDunDownstream::EndpointReadyHandler() complete" ) )); - return iPushData.iDataPusher; - } - -// --------------------------------------------------------------------------- // Starts downstream by issuing read request // --------------------------------------------------------------------------- // diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/utils/src/DunSignalCopy.cpp --- a/localconnectivityservice/dun/utils/src/DunSignalCopy.cpp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/utils/src/DunSignalCopy.cpp Sat Apr 24 00:43:26 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -65,8 +65,6 @@ Stop(); // AddCallback() iCallbacks.Close(); - // AddWriteReadyCallback() - iERCallbacks.Close(); // Internal Initialize(); FTRACE(FPrint( _L("CDunSignalCopy::ResetData() complete") )); @@ -102,35 +100,6 @@ } // --------------------------------------------------------------------------- -// Adds callback for endpoint readiness -// The callback will be called when the endpoint is ready or not ready -// --------------------------------------------------------------------------- -// -TInt CDunSignalCopy::AddEndpointReadyCallback( MDunEndpointReady* aERCallback ) - { - FTRACE(FPrint( _L("CDunSignalCopy::AddEndpointReadyCallback()" ) )); - if ( !aERCallback ) - { - FTRACE(FPrint( _L("CDunSignalCopy::AddEndpointReadyCallback() (aERCallback) not initialized!" ) )); - return KErrGeneral; - } - TInt retTemp = iERCallbacks.Find( aERCallback ); - if ( retTemp != KErrNotFound ) - { - FTRACE(FPrint( _L("CDunSignalCopy::AddEndpointReadyCallback() (already exists) complete" ) )); - return KErrAlreadyExists; - } - retTemp = iERCallbacks.Append( aERCallback ); - if ( retTemp != KErrNone ) - { - FTRACE(FPrint( _L("CDunSignalCopy::AddEndpointReadyCallback() (append failed!) complete" ) )); - return retTemp; - } - FTRACE(FPrint( _L("CDunSignalCopy::AddEndpointReadyCallback() complete" ) )); - return KErrNone; - } - -// --------------------------------------------------------------------------- // Sets media to use for this endpoint monitor // --------------------------------------------------------------------------- // @@ -336,13 +305,11 @@ FTRACE(FPrint( _L("CDunSignalCopy::ManageSignalChangeUpstream() checking RTS..." ) )); if ( iSignals & KSignalRTS ) // RTS changed to high { - ReportEndpointReady( ETrue ); ChangeUpstreamSignal( KSignalRTS, 0 ); FTRACE(FPrint( _L("CDunSignalCopy::ManageSignalChangeUpstream() RTS changed high" ) )); } else // RTS changed to low { - ReportEndpointReady( EFalse ); ChangeUpstreamSignal( 0, KSignalRTS ); FTRACE(FPrint( _L("CDunSignalCopy::ManageSignalChangeUpstream() RTS changed low" ) )); } @@ -465,28 +432,6 @@ } // --------------------------------------------------------------------------- -// Reports endpoint ready or not ready -// --------------------------------------------------------------------------- -// -void CDunSignalCopy::ReportEndpointReady( TBool aReady ) - { - FTRACE(FPrint( _L("CDunSignalCopy::ReportEndpointReady()" ) )); - TInt count = iERCallbacks.Count(); - for ( TInt i=0; iNotifyEndpointReady(); - } - else // not ready - { - iERCallbacks[i]->NotifyEndpointNotReady(); - } - } - FTRACE(FPrint( _L("CDunSignalCopy::ReportEndpointReady() complete" ) )); - } - -// --------------------------------------------------------------------------- // From class CActive. // Gets called when line status changes // --------------------------------------------------------------------------- diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/utils/src/DunSignalNotify.cpp --- a/localconnectivityservice/dun/utils/src/DunSignalNotify.cpp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/utils/src/DunSignalNotify.cpp Sat Apr 24 00:43:26 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -65,8 +65,6 @@ Stop(); // AddCallback() iCallbacks.Close(); - // AddEndpointReadyCallback() - iERCallbacks.Close(); // Internal Initialize(); FTRACE(FPrint( _L("CDunSignalNotify::ResetData() complete") )); @@ -103,37 +101,6 @@ } // --------------------------------------------------------------------------- -// Adds callback for endpoint readiness -// The callback will be called when the endpoint is ready or not ready -// --------------------------------------------------------------------------- -// -TInt CDunSignalNotify::AddEndpointReadyCallback( - MDunEndpointReady* aERCallback ) - { - FTRACE(FPrint( _L("CDunSignalNotify::AddEndpointReadyCallback()" ) )); - if ( !aERCallback ) - { - FTRACE(FPrint( _L("CDunSignalNotify::AddEndpointReadyCallback() (aERCallback) not initialized!" ) )); - return KErrGeneral; - } - TInt retTemp = iERCallbacks.Find( aERCallback ); - if ( retTemp != KErrNotFound ) - { - FTRACE(FPrint( _L("CDunSignalNotify::AddEndpointReadyCallback() (already exists) complete" ) )); - return KErrAlreadyExists; - } - retTemp = iERCallbacks.Append( aERCallback ); - if ( retTemp != KErrNone ) - { - FTRACE(FPrint( _L("CDunSignalNotify::AddEndpointReadyCallback() (append failed!) complete" ) )); - return retTemp; - } - ReportEndpointReady( ETrue ); // report immediately as this is a hack - FTRACE(FPrint( _L("CDunSignalNotify::AddEndpointReadyCallback() complete" ) )); - return KErrNone; - } - -// --------------------------------------------------------------------------- // Sets media to use for this endpoint monitor // --------------------------------------------------------------------------- // @@ -375,28 +342,6 @@ } // --------------------------------------------------------------------------- -// Reports endpoint ready or not ready -// --------------------------------------------------------------------------- -// -void CDunSignalNotify::ReportEndpointReady( TBool aReady ) - { - FTRACE(FPrint( _L("CDunSignalNotify::ReportEndpointReady()" ) )); - TInt count = iERCallbacks.Count(); - for ( TInt i=0; iNotifyEndpointReady(); - } - else // not ready - { - iERCallbacks[i]->NotifyEndpointNotReady(); - } - } - FTRACE(FPrint( _L("CDunSignalNotify::ReportEndpointReady() complete" ) )); - } - -// --------------------------------------------------------------------------- // From class CActive. // Gets called when line status changes // --------------------------------------------------------------------------- diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/dun/utils/src/DunTransUtils.cpp --- a/localconnectivityservice/dun/utils/src/DunTransUtils.cpp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/dun/utils/src/DunTransUtils.cpp Sat Apr 24 00:43:26 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -651,7 +651,6 @@ CDunUpstream* upstream = channelData.iUpstreamRW; CDunDownstream* downstream = channelData.iDownstreamRW; - // Set command notify endpoint readiness callbacks if ( aDirection == EDunReaderUpstream ) { // Initialize stream for AT parsing (ignore errors) @@ -676,9 +675,6 @@ { // Add callback (ignore errors) channelData.iUpstreamSignalCopy->AddCallback( aCallback ); - // Add endpoint readiness callback (ignore errors ) - MDunEndpointReady* erHandler = downstream->EndpointReadyHandler(); - channelData.iUpstreamSignalCopy->AddEndpointReadyCallback( erHandler ); } } else if ( streamType == EDunStreamTypeDownstream ) @@ -688,8 +684,6 @@ { // Add callback (ignore errors) channelData.iDownstreamSignalCopy->AddCallback( aCallback ); - // Note: Nokia's adaptation doesn't support full signals so don't - // add the endpoint readiness callback here } } else @@ -709,9 +703,6 @@ } // Add callback (ignore errors) channelData.iSignalNotify->AddCallback( aCallback ); - // Add endpoint readiness callback (ignore errors ) - MDunEndpointReady* erHandler = downstream->EndpointReadyHandler(); - channelData.iSignalNotify->AddEndpointReadyCallback( erHandler ); } // Add callback (ignore errors) diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/obexreceiveservices/mtmuibluetooth/src/btmtmuidata.cpp --- a/localconnectivityservice/obexreceiveservices/mtmuibluetooth/src/btmtmuidata.cpp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/obexreceiveservices/mtmuibluetooth/src/btmtmuidata.cpp Sat Apr 24 00:43:26 2010 +0300 @@ -31,6 +31,8 @@ #include +const TInt KBtMtmUiNfcContext = 2; + // ================= MEMBER FUNCTIONS ======================= // Two-phased constructor. @@ -129,7 +131,16 @@ const CBaseMtmUiData::CBitmapArray& CBtMtmUiData::ContextIcon( const TMsvEntry& aContext, TInt /*aStateFlags*/) const { - TInt icon = TObexUtilsUiLayer::ContextIcon( aContext, EBluetooth ); + // Check if NFC context + TInt icon = 0; + if ( aContext.MtmData1() == KBtMtmUiNfcContext ) + { + icon = TObexUtilsUiLayer::ContextIcon( aContext, ENfc ); + } + else + { + icon = TObexUtilsUiLayer::ContextIcon( aContext, EBluetooth ); + } return *iIconArrays->At( icon/2 ); } diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/obexserviceman/group/obexserviceman.mmp --- a/localconnectivityservice/obexserviceman/group/obexserviceman.mmp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/obexserviceman/group/obexserviceman.mmp Sat Apr 24 00:43:26 2010 +0300 @@ -28,7 +28,7 @@ CAPABILITY CAP_SERVER CommDD NetworkControl LocalServices VENDORID VID_DEFAULT -EPOCHEAPSIZE 0x500 0x400000 +EPOCHEAPSIZE 0x500 0x800000 EPOCSTACKSIZE 0x4000 diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/obexserviceman/utils/inc/obexutilsuilayer.h --- a/localconnectivityservice/obexserviceman/utils/inc/obexutilsuilayer.h Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/obexserviceman/utils/inc/obexutilsuilayer.h Sat Apr 24 00:43:26 2010 +0300 @@ -52,7 +52,8 @@ enum TContextMedia { EBluetooth, - EInfrared + EInfrared, + ENfc }; /** diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/obexserviceman/utils/src/obexutilsglobalprogressdialog.cpp --- a/localconnectivityservice/obexserviceman/utils/src/obexutilsglobalprogressdialog.cpp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/obexserviceman/utils/src/obexutilsglobalprogressdialog.cpp Sat Apr 24 00:43:26 2010 +0300 @@ -28,7 +28,7 @@ #include #include #include -#include // Compiled resource ids +//#include // Compiled resource ids #include #include // Localisation stringloader diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/obexserviceman/utils/src/obexutilslaunchwaiter.cpp --- a/localconnectivityservice/obexserviceman/utils/src/obexutilslaunchwaiter.cpp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/obexserviceman/utils/src/obexutilslaunchwaiter.cpp Sat Apr 24 00:43:26 2010 +0300 @@ -90,7 +90,7 @@ TDataType dataType = attachInfo->MimeType(); TFileName filePath; filePath = attachInfo->FilePath(); - + TInt error = KErrNone; TBool isCompleteSelf = EFalse; CEikonEnv* eikEnv = CEikonEnv::Static(); @@ -123,18 +123,35 @@ paramList->AppendL( paramSave ); if ( eikEnv ) - { - + { iDocumentHandler = CDocumentHandler::NewL( eikEnv->Process() ); iDocumentHandler->SetExitObserver( this ); - RFile64 shareableFile; - TRAP( error, iDocumentHandler->OpenTempFileL(filePath,shareableFile)); - if ( error == KErrNone) + RFs rfs; + User::LeaveIfError( rfs.Connect() ); + if ( BaflUtils::FileExists( rfs, filePath ) ) { - TRAP( error, iDocumentHandler->OpenFileEmbeddedL( shareableFile, dataType, *paramList)); - } - shareableFile.Close(); - if ( error == KErrNotFound ) + RFile64 shareableFile; + TRAP( error, iDocumentHandler->OpenTempFileL(filePath,shareableFile)); + if ( error == KErrNone) + { + TRAP( error, iDocumentHandler->OpenFileEmbeddedL( shareableFile, dataType, *paramList)); + } + shareableFile.Close(); + + if ( error == KErrNotSupported ) + { + delete iDocumentHandler; + iDocumentHandler = NULL; + + const TInt sortMethod = 2; // 0 = 'By name', 1 = 'By type', + // 2 = 'Most recent first' and 3 = 'Largest first' + TRAP (error, TObexUtilsUiLayer::LaunchFileManagerL( filePath, + sortMethod, + ETrue )); // ETrue -> launch file manager in embedded mode. + isCompleteSelf = ETrue; + } // KErrNotSupported + } + else { error = KErrNone; TFileName fileName; @@ -152,25 +169,14 @@ } } isCompleteSelf = ETrue; - } // KErrNotFound + } + + rfs.Close(); } // eikEnv - - else if ( error == KErrNotSupported ) - { - delete iDocumentHandler; - iDocumentHandler = NULL; - - const TInt sortMethod = 2; // 0 = 'By name', 1 = 'By type', - // 2 = 'Most recent first' and 3 = 'Largest first' - TRAP (error, TObexUtilsUiLayer::LaunchFileManagerL( filePath, - sortMethod, - ETrue )); // ETrue -> launch file manager in embedded mode. - isCompleteSelf = ETrue; - } // KErrNotSupported - + CleanupStack::PopAndDestroy(); // paramList } // EMsvLinkedFile - + // Set message to READ TMsvEntry entry = aMessage->Entry(); @@ -178,9 +184,7 @@ aMessage->ChangeL( entry ); User::LeaveIfError ( error ); - CleanupStack::PopAndDestroy(3); // attachInfo, store, attachEntry - - + CleanupStack::PopAndDestroy(3); // attachInfo, store, attachEntry iObserverRequestStatus = KRequestPending; // CMsvOperation (observer) iStatus = KRequestPending; // CMsvOperation diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/obexserviceman/utils/src/obexutilsmessagehandler.cpp --- a/localconnectivityservice/obexserviceman/utils/src/obexutilsmessagehandler.cpp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/obexserviceman/utils/src/obexutilsmessagehandler.cpp Sat Apr 24 00:43:26 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002,2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -137,40 +137,51 @@ { FLOG(_L("[OBEXUTILS]\t StoreAsRichTextL()")); - // Read the file into buffer - - CBufFlat* buffer = CBufFlat::NewL( 16 ); - CleanupStack::PushL(buffer); // 1st push - TInt fileLength = 0; User::LeaveIfError( aFile.Size( fileLength ) ); - - buffer->ResizeL( fileLength ); - TPtr8 bufferPtr = buffer->Ptr(0); - - User::LeaveIfError( aFile.Read( bufferPtr ) ); + + // Calculate the number of blocks to read + const TInt blockSize = 128 * 1024; + TInt fullBlockCnt = fileLength / blockSize; + if (fileLength % blockSize > 0) + { + fullBlockCnt++; + } + + CRichText* richText = ConstructRichTextLC(); // 1st, 2nd, 3rd push + + RBuf8 buffer8; + CleanupClosePushL(buffer8); // 4th push + buffer8.CreateL( blockSize ); + RBuf buffer16; + CleanupClosePushL(buffer16); // 5th push + buffer16.CreateL(blockSize); - // In order for Bio to understand 8-bit binary data, - // it needs to be stored in wide rich text object - // in the low byte of each word with the upper byte as 0. - // Do not use UTF8, just convert 8-bit to 16-bit. - - CRichText* richText = ConstructRichTextLC(); // 2nd, 3rd, 4th push - HBufC* convert8BitTo16Bit = HBufC::NewLC(fileLength); // 5th push - convert8BitTo16Bit->Des().Copy( bufferPtr ); - buffer->Reset(); // free unused memory before InsertL() + // Read the file into buffer in small chunks + TInt readBytes = 0; + for (TInt i = 0; i < fullBlockCnt; ++i) + { + User::LeaveIfError( aFile.Read( buffer8 ) ); - richText->InsertL(0, *convert8BitTo16Bit); - CleanupStack::PopAndDestroy(convert8BitTo16Bit); - // -1 pop: free unused memory before StoreBodyTextL() + // In order for Bio to understand 8-bit binary data, + // it needs to be stored in wide rich text object + // in the low byte of each word with the upper byte as 0. + // Do not use UTF8, just convert 8-bit to 16-bit. + buffer16.Copy( buffer8 ); + + richText->InsertL(readBytes, buffer16); + readBytes += buffer8.Length(); + } + CleanupStack::PopAndDestroy(2, &buffer8); + // -2 pop: free unused memory before StoreBodyTextL() CMsvStore* parentStore = aParentEntry->EditStoreL(); - CleanupStack::PushL(parentStore); // 5th push + CleanupStack::PushL(parentStore); // 4th push parentStore->StoreBodyTextL(*richText); parentStore->CommitL(); - CleanupStack::PopAndDestroy(5); // parentStore, richText, richParaFormatLayer, - // richCharFormatLayer, buffer + CleanupStack::PopAndDestroy(4); // parentStore, richText, richParaFormatLayer, + // richCharFormatLayer FLOG(_L("[OBEXUTILS]\t StoreAsRichTextL() completed")); } @@ -327,10 +338,10 @@ TPtrC mimeType16(buf16->Des()); CleanupStack::PopAndDestroy(); // buf16 - CUpdateMusicCollection* updateMusiccollection =CUpdateMusicCollection::NewL() ; - if (updateMusiccollection->isSupported(mimeType16)) + CUpdateMusicCollection* updateMusicCollection = CUpdateMusicCollection::NewL() ; + if (updateMusicCollection->isSupported(mimeType16)) { - updateMusiccollection->addToCollectionL(aFileName); + updateMusicCollection->addToCollectionL(aFileName); } aAttachInfo->SetMimeTypeL( mimeType ); diff -r 64b3172ba347 -r 3b92f7acdc91 localconnectivityservice/obexserviceman/utils/src/obexutilsuilayer.cpp --- a/localconnectivityservice/obexserviceman/utils/src/obexutilsuilayer.cpp Sat Apr 24 00:27:31 2010 +0300 +++ b/localconnectivityservice/obexserviceman/utils/src/obexutilsuilayer.cpp Sat Apr 24 00:43:26 2010 +0300 @@ -59,6 +59,9 @@ const TInt KFileManagerUID3 = 0x101F84EB; /// File Manager application UID3 const TInt KUiNumberOfZoomStates = 2; // second for the mask const TInt KSortNumMax = 2; +const TInt KNfcUnreadIconIndex = 10; +const TInt KNfcReadIconIndex = 8; + // ============================ MEMBER FUNCTIONS =============================== @@ -389,6 +392,17 @@ icon = EMbmMuiuQgn_prop_mce_ir_read - EMbmMuiuQgn_prop_mce_ir_unread; } } + else if( aMedia == ENfc ) + { + if( aContext.Unread() ) + { + icon = KNfcUnreadIconIndex; + } + else + { + icon = KNfcReadIconIndex; + } + } FLOG(_L("[OBEXUTILS]\t TObexUtilsUiLayer::ContextIcon() completed")); @@ -505,6 +519,14 @@ KAknsIIDQgnPropMceBtRead, EMbmMuiuQgn_prop_mce_bt_read, aIconArrays); + CreateAndAppendBitmapL( + KAknsIIDQgnPropMceNfcRead, + 0, + aIconArrays); + CreateAndAppendBitmapL( + KAknsIIDQgnPropMceNfcUnread, + 0, + aIconArrays); } else //Infrared { diff -r 64b3172ba347 -r 3b92f7acdc91 shortlinkconn_plat/dun_secondary_display_notification_api/group/bld.inf --- a/shortlinkconn_plat/dun_secondary_display_notification_api/group/bld.inf Sat Apr 24 00:27:31 2010 +0300 +++ b/shortlinkconn_plat/dun_secondary_display_notification_api/group/bld.inf Sat Apr 24 00:43:26 2010 +0300 @@ -23,4 +23,4 @@ DEFAULT PRJ_EXPORTS -../inc/secondarydisplay/dunsecondarydisplayapi.h MW_LAYER_PLATFORM_EXPORT_PATH(secondarydisplay/dunsecondarydisplayapi.h) +../inc/secondarydisplay/dunsecondarydisplayapi.h MW_LAYER_PLATFORM_EXPORT_PATH(SecondaryDisplay/dunsecondarydisplayapi.h) diff -r 64b3172ba347 -r 3b92f7acdc91 shortlinkconn_plat/obex_secondary_display_notification_api/group/bld.inf --- a/shortlinkconn_plat/obex_secondary_display_notification_api/group/bld.inf Sat Apr 24 00:27:31 2010 +0300 +++ b/shortlinkconn_plat/obex_secondary_display_notification_api/group/bld.inf Sat Apr 24 00:43:26 2010 +0300 @@ -24,4 +24,4 @@ PRJ_EXPORTS -../inc/secondarydisplay/obexutilssecondarydisplayapi.h MW_LAYER_PLATFORM_EXPORT_PATH(secondarydisplay/obexutilssecondarydisplayapi.h) +../inc/secondarydisplay/obexutilssecondarydisplayapi.h MW_LAYER_PLATFORM_EXPORT_PATH(SecondaryDisplay/obexutilssecondarydisplayapi.h)