htiui/HtiCommPlugins/HtiBtCommPlugin/HtiBtCommEcomPlugin/src/HtiBtCommEcomPlugin.cpp
changeset 0 d6fe6244b863
child 3 2703485a934c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiui/HtiCommPlugins/HtiBtCommPlugin/HtiBtCommEcomPlugin/src/HtiBtCommEcomPlugin.cpp	Tue Feb 02 00:17:27 2010 +0200
@@ -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 <badesca.h>
+#include <f32file.h>
+
+#include "HtiBtCommEcomPlugin.h"
+#include "BtSerialClient.h"
+#include <hticfg.h>
+#include <htilogging.h>
+
+// 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