diff -r 7fdc9a71d314 -r 8ad140f3dd41 hti/HtiCommPlugins/HtiBtCommPlugin/HtiBtCommEcomPlugin/src/HtiBtCommEcomPlugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hti/HtiCommPlugins/HtiBtCommPlugin/HtiBtCommEcomPlugin/src/HtiBtCommEcomPlugin.cpp Wed Oct 13 16:17:58 2010 +0300 @@ -0,0 +1,277 @@ +/* +* 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: ECOM plugin for communication over serial port +* +*/ + + +// INCLUDE FILES +#include +#include + +#include "HtiBtCommEcomPlugin.h" +#include "BtSerialClient.h" +#include +#include + +// CONSTANTS +_LIT( KHtiCfgPath, "\\" ); // root of drive +_LIT( KHtiBtCommCfg, "HTIBtComm.cfg" ); +_LIT8( KBtDeviceAddress, "BtDeviceAddress" ); +_LIT8( KBtDeviceName, "BtDeviceName" ); + + +const TInt KBtAddressHexStringLength = 12; // 6 bytes +const TUint KPortSeparatorChar = 30; // ASCII control char "record separator" + +// ---------------------------------------------------------------------------- +CHtiBtCommEcomPlugin* CHtiBtCommEcomPlugin::NewL() + { + HTI_LOG_FUNC_IN( "CHtiBtCommEcomPlugin::NewL" ); + CHtiBtCommEcomPlugin* plugin = new (ELeave) CHtiBtCommEcomPlugin(); + CleanupStack::PushL( plugin ); + plugin->ConstructL(); + CleanupStack::Pop( plugin ); + HTI_LOG_FUNC_OUT( "CHtiBtCommEcomPlugin::NewL" ); + return plugin; + } + +// ---------------------------------------------------------------------------- +CHtiBtCommEcomPlugin::~CHtiBtCommEcomPlugin() + { + HTI_LOG_FUNC_IN( "CHtiBtCommEcomPlugin::~CHtiBtCommEcomPlugin" ); + iBtCommInterface.CancelReceive(); + iBtCommInterface.CancelSend(); + iBtCommInterface.Close(); + delete iBtDeviceNameOrAddress; + delete iCfg; + HTI_LOG_FUNC_OUT( "CHtiBtCommEcomPlugin::~CHtiBtCommEcomPlugin" ); + } + +// ---------------------------------------------------------------------------- +CHtiBtCommEcomPlugin::CHtiBtCommEcomPlugin():iPort( -1 ) + { + } + +// ---------------------------------------------------------------------------- +void CHtiBtCommEcomPlugin::ConstructL() + { + TRAPD( err, LoadConfigL() ); + if ( err == KErrNone ) + { + ReadConfig(); + } + else + { + TBufC8<1> emptyBuf( KNullDesC8 ); + iBtDeviceNameOrAddress = emptyBuf.AllocL(); + iPort = KErrNotFound; + } + // May take long! + User::LeaveIfError( iBtCommInterface.Connect( + *iBtDeviceNameOrAddress, iPort ) ); + + // Get the connected service port number (channel) and store it if needed + TInt connectedPort = iBtCommInterface.GetPortNumber(); + HTI_LOG_FORMAT( "Connected port number = %d", connectedPort ); + if ( connectedPort != iPort && connectedPort >= 0 ) + { + TRAP( err, StorePortNumberL( connectedPort ) ); // ignore error + } + } + +// ---------------------------------------------------------------------------- +void CHtiBtCommEcomPlugin::Receive( TDes8& aRawdataBuf, + TRequestStatus& aStatus ) + { + iBtCommInterface.Receive( aRawdataBuf, aStatus ); + } + +// ---------------------------------------------------------------------------- +void CHtiBtCommEcomPlugin::Send( const TDesC8& aRawdataBuf, + TRequestStatus& aStatus ) + { + iBtCommInterface.Send( aRawdataBuf, aStatus ); + } + +// ---------------------------------------------------------------------------- +void CHtiBtCommEcomPlugin::CancelReceive() + { + iBtCommInterface.CancelReceive(); + } + +// ---------------------------------------------------------------------------- +void CHtiBtCommEcomPlugin::CancelSend() + { + iBtCommInterface.CancelSend(); + } + +// ---------------------------------------------------------------------------- +TInt CHtiBtCommEcomPlugin::GetSendBufferSize() + { + return iBtCommInterface.GetSendBufferSize(); + } + +// ---------------------------------------------------------------------------- +TInt CHtiBtCommEcomPlugin::GetReceiveBufferSize() + { + return iBtCommInterface.GetReceiveBufferSize(); + } + +// ---------------------------------------------------------------------------- +void CHtiBtCommEcomPlugin::LoadConfigL() + { + HTI_LOG_FUNC_IN( "CHtiBtCommEcomPlugin::LoadConfigL" ); + iCfg = CHtiCfg::NewL(); + iCfg->LoadCfgL( KHtiCfgPath, KHtiBtCommCfg ); + HTI_LOG_TEXT( "cfg file loaded" ); + HTI_LOG_FUNC_OUT( "CHtiBtCommEcomPlugin::LoadConfigL" ); + } + +// ---------------------------------------------------------------------------- +void CHtiBtCommEcomPlugin::ReadConfig() + { + HTI_LOG_FUNC_IN( "CHtiBtCommEcomPlugin::ReadConfig" ); + // First try to get address - if found and length is correct it is used + TRAPD( paramErr, iBtDeviceNameOrAddress = iCfg->GetParameterL( + KBtDeviceAddress ).AllocL() ); + + if ( paramErr == KErrNone ) + { + TInt port = ParsePortNumber(); + if ( port >= 0 ) iPort = port; + else iPort = KErrNotFound; + } + + if ( paramErr || + iBtDeviceNameOrAddress->Length() != KBtAddressHexStringLength ) + { + HTI_LOG_TEXT( "BT address not defined or not valid - getting name" ); + delete iBtDeviceNameOrAddress; + iBtDeviceNameOrAddress = NULL; + // Address was not found - try to get name. + TRAP( paramErr, iBtDeviceNameOrAddress = iCfg->GetParameterL( + KBtDeviceName ).AllocL() ); + if ( paramErr ) + { + HTI_LOG_TEXT( "BT name not defined either" ); + TBufC8<1> emptyBuf( KNullDesC8 ); + iBtDeviceNameOrAddress = emptyBuf.AllocL(); + iPort = KErrNotFound; + } + else + { + TInt port = ParsePortNumber(); + if ( port >= 0 ) iPort = port; + else iPort = KErrNotFound; + } + } + HTI_LOG_TEXT( "BT device name or address:" ); + HTI_LOG_DES( *iBtDeviceNameOrAddress ); + HTI_LOG_FORMAT( "Port number: %d", iPort ); + HTI_LOG_FUNC_OUT( "CHtiBtCommEcomPlugin::ReadConfig" ); + } + +// ---------------------------------------------------------------------------- +TInt CHtiBtCommEcomPlugin::ParsePortNumber() + { + HTI_LOG_FUNC_IN( "CHtiBtCommEcomPlugin::ParsePortNumber" ); + TInt port = KErrNotFound; + TInt separatorIndex = iBtDeviceNameOrAddress->LocateReverse( + TChar( KPortSeparatorChar ) ); + if ( separatorIndex != KErrNotFound ) + { + TPtrC8 value = iBtDeviceNameOrAddress->Right( + iBtDeviceNameOrAddress->Length() - ( separatorIndex + 1 ) ); + TLex8 lex( value ); + lex.Val( port ); + // Strip away the port number + iBtDeviceNameOrAddress->Des().SetLength( separatorIndex ); + } + HTI_LOG_FORMAT( "ParsePortNumber returning %d", port ); + HTI_LOG_FUNC_OUT( "CHtiBtCommEcomPlugin::ParsePortNumber" ); + return port; + } + +// ---------------------------------------------------------------------------- +void CHtiBtCommEcomPlugin::StorePortNumberL( TInt aPortNumber ) + { + HTI_LOG_FUNC_IN( "CHtiBtCommEcomPlugin::StorePortNumberL" ); + if ( !iCfg ) + { + iCfg = CHtiCfg::NewL(); + } + iCfg->LoadCfgL( KHtiCfgPath, KHtiBtCommCfg ); + + TBool changesMade = EFalse; + + // Add or replace port number to address parameter if it exists + HBufC8* value = NULL; + TRAPD( err, value = iCfg->GetParameterL( KBtDeviceAddress ).AllocL() ); + if ( !err ) + { + HTI_LOG_FORMAT( "Found address param (length = %d)", value->Length() ); + CleanupStack::PushL( value ); + TInt separatorIndex = value->Locate( TChar( KPortSeparatorChar ) ); + if ( separatorIndex != KErrNotFound ) + { + HTI_LOG_FORMAT( "Separator char found from index %d", separatorIndex ); + value->Des().SetLength( separatorIndex ); + } + value = value->ReAllocL( value->Length() + 5 ); + // The old value has been deleted by ReAllocL and new allocated, + // so update cleanup stack. + CleanupStack::Pop(); + CleanupStack::PushL( value ); + TPtr8 ptr = value->Des(); + ptr.Append( TChar( KPortSeparatorChar ) ); + ptr.AppendNum( aPortNumber ); + TRAP( err, iCfg->SetParameterL( KBtDeviceAddress, *value ) ); + if ( !err ) changesMade = ETrue; + CleanupStack::PopAndDestroy(); // value + } + + // Add or replace port number to name parameter if it exists + TRAP( err, value = iCfg->GetParameterL( KBtDeviceName ).AllocL() ); + if ( !err ) + { + HTI_LOG_FORMAT( "Found name param (length = %d)", value->Length() ); + CleanupStack::PushL( value ); + TInt separatorIndex = value->Locate( TChar( KPortSeparatorChar ) ); + if ( separatorIndex != KErrNotFound ) + { + HTI_LOG_FORMAT( "Separator char found from index %d", separatorIndex ); + value->Des().SetLength( separatorIndex ); + } + value = value->ReAllocL( value->Length() + 5 ); + // The old value has been deleted by ReAllocL and new allocated, + // so update cleanup stack. + CleanupStack::Pop(); + CleanupStack::PushL( value ); + TPtr8 ptr = value->Des(); + ptr.Append( TChar( KPortSeparatorChar ) ); + ptr.AppendNum( aPortNumber ); + TRAP( err, iCfg->SetParameterL( KBtDeviceName, *value ) ); + if ( !err ) changesMade = ETrue; + CleanupStack::PopAndDestroy(); // value + } + + if ( changesMade ) + { + iCfg->SaveCfgL( KHtiCfgPath, KHtiBtCommCfg ); + } + HTI_LOG_FUNC_OUT( "CHtiBtCommEcomPlugin::StorePortNumberL" ); + } + +// End of file