remotecontrol/remotecontrolfw/reference/serialbearer/src/remconserialbearer.cpp
author hgs
Wed, 13 Oct 2010 16:20:29 +0300
changeset 51 20ac952a623c
permissions -rw-r--r--
201040_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
20ac952a623c 201040_02
hgs
parents:
diff changeset
     1
// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
20ac952a623c 201040_02
hgs
parents:
diff changeset
     2
// All rights reserved.
20ac952a623c 201040_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
20ac952a623c 201040_02
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
20ac952a623c 201040_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
20ac952a623c 201040_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
20ac952a623c 201040_02
hgs
parents:
diff changeset
     7
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
20ac952a623c 201040_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    10
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    11
// Contributors:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    12
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    13
// Description:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    14
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    15
20ac952a623c 201040_02
hgs
parents:
diff changeset
    16
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    17
 @file
20ac952a623c 201040_02
hgs
parents:
diff changeset
    18
 @internalComponent
20ac952a623c 201040_02
hgs
parents:
diff changeset
    19
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    20
20ac952a623c 201040_02
hgs
parents:
diff changeset
    21
#include <bluetooth/logger.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    22
#include <remcon/remconbearerobserver.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    23
#include <remcon/remconconverterplugin.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    24
#include <remconaddress.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    25
#include "remconserialbearer.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    26
#include "sender.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    27
#include "receiver.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    28
#include "utils.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    29
20ac952a623c 201040_02
hgs
parents:
diff changeset
    30
#ifdef __FLOG_ACTIVE
20ac952a623c 201040_02
hgs
parents:
diff changeset
    31
_LIT8(KLogComponent, LOG_COMPONENT_REMCON_REF_SER_BEARER);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    32
#endif
20ac952a623c 201040_02
hgs
parents:
diff changeset
    33
20ac952a623c 201040_02
hgs
parents:
diff changeset
    34
PANICCATEGORY("SerialBear");
20ac952a623c 201040_02
hgs
parents:
diff changeset
    35
20ac952a623c 201040_02
hgs
parents:
diff changeset
    36
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    37
Factory function.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    38
@return Ownership of a new CRemConSerialBearer.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    39
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    40
CRemConSerialBearer* CRemConSerialBearer::NewL(TBearerParams& aParams)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    41
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    42
	LOG_STATIC_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
    43
	CRemConSerialBearer* self = new(ELeave) CRemConSerialBearer(aParams);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    44
	CleanupStack::PushL(self);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    45
	self->ConstructL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    46
	CLEANUPSTACK_POP1(self);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    47
	return self;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    48
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    49
20ac952a623c 201040_02
hgs
parents:
diff changeset
    50
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    51
Destructor.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    52
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    53
CRemConSerialBearer::~CRemConSerialBearer()
20ac952a623c 201040_02
hgs
parents:
diff changeset
    54
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    55
	LOG_LINE
20ac952a623c 201040_02
hgs
parents:
diff changeset
    56
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
    57
20ac952a623c 201040_02
hgs
parents:
diff changeset
    58
	delete iSender;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    59
	delete iReceiver;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    60
20ac952a623c 201040_02
hgs
parents:
diff changeset
    61
	iComm.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    62
	iCommServ.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    63
20ac952a623c 201040_02
hgs
parents:
diff changeset
    64
/*#ifndef __WINS__
20ac952a623c 201040_02
hgs
parents:
diff changeset
    65
	if ( iUsb.Handle() )
20ac952a623c 201040_02
hgs
parents:
diff changeset
    66
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    67
		// Can't do anything with error here.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    68
		(void)iUsb.Stop();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    69
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    70
	iUsb.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    71
#endif
20ac952a623c 201040_02
hgs
parents:
diff changeset
    72
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    73
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    74
20ac952a623c 201040_02
hgs
parents:
diff changeset
    75
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    76
Constructor.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    77
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    78
CRemConSerialBearer::CRemConSerialBearer(TBearerParams& aParams)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    79
:	CRemConBearerPlugin(aParams)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    80
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    81
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
    82
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    83
20ac952a623c 201040_02
hgs
parents:
diff changeset
    84
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    85
2nd-phase construction.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    86
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    87
void CRemConSerialBearer::ConstructL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
    88
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    89
	// NB The sender and receiver have references to our RComm. We protect our 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    90
	// down-calls in case the port subsession is not open.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    91
	iSender = CSender::NewL(iComm, *this);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    92
	iReceiver = CReceiver::NewL(iComm, *this);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    93
20ac952a623c 201040_02
hgs
parents:
diff changeset
    94
/*#ifndef __WINS__
20ac952a623c 201040_02
hgs
parents:
diff changeset
    95
	// Connect and Start USB to begin with. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    96
	LEAVEIFERRORL(iUsb.Connect());
20ac952a623c 201040_02
hgs
parents:
diff changeset
    97
	TRequestStatus stat;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    98
	iUsb.Start(stat);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    99
	User::WaitForRequest(stat);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   100
	LEAVEIFERRORL(stat.Int());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   101
#endif
20ac952a623c 201040_02
hgs
parents:
diff changeset
   102
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   103
	// We trap and discard errors from this 'connection' attempt. We don't 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   104
	// want to fail RemCon server initialisation because the port is being 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   105
	// used by someone else. When RemCon wants to send a command, it will 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   106
	// expect the bearer to reconnect.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   107
	// In any case a controller client is allowed to request a 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   108
	// connection-oriented channel over this bearer- this will result in 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   109
	// another 'connection' attempt.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   110
	TRAPD(err, ConnectL());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   111
	// If we 'connected' OK, throw an indication up to RemCon.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   112
	if ( err == KErrNone )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   113
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   114
		TRemConAddress addr;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   115
		addr.BearerUid() = Uid();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   116
		err = Observer().ConnectIndicate(addr);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   117
		if ( err != KErrNone )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   118
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   119
			// We couldn't successfully tell RemCon about our connection, so 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   120
			// tear it down.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   121
			ClosePort();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   122
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   123
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   124
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   125
	if ( iComm.SubSessionHandle() )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   126
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   127
		Receive();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   128
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   129
20ac952a623c 201040_02
hgs
parents:
diff changeset
   130
//	TRemConAddress addr;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   131
//	addr.BearerUid() = Uid();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   132
//	addr.Addr() = _L8("different");
20ac952a623c 201040_02
hgs
parents:
diff changeset
   133
//	Observer().ConnectIndicate(addr);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   134
20ac952a623c 201040_02
hgs
parents:
diff changeset
   135
	LOG(_L("<<CRemConSerialBearer::ConstructL"));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   136
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   137
20ac952a623c 201040_02
hgs
parents:
diff changeset
   138
TAny* CRemConSerialBearer::GetInterface(TUid aUid)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   139
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   140
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   141
	LOG1(_L("\taUid = 0x%08x"), aUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   142
20ac952a623c 201040_02
hgs
parents:
diff changeset
   143
	TAny* ret = NULL;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   144
	if ( aUid == TUid::Uid(KRemConBearerInterface1) )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   145
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   146
		ret = reinterpret_cast<TAny*>(
20ac952a623c 201040_02
hgs
parents:
diff changeset
   147
			static_cast<MRemConBearerInterface*>(this)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   148
			);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   149
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   150
20ac952a623c 201040_02
hgs
parents:
diff changeset
   151
	LOG1(_L("\tret = [0x%08x]"), ret);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   152
	return ret;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   153
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   154
20ac952a623c 201040_02
hgs
parents:
diff changeset
   155
void CRemConSerialBearer::ConnectRequest(const TRemConAddress& aAddr)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   156
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   157
	LOG(KNullDesC8);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   158
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   159
	// This bearer does not use client-specified connection data. The 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   160
	// connection data gives the *remote* address to connect to. This is not a 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   161
	// valid concept in the wired case. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   162
20ac952a623c 201040_02
hgs
parents:
diff changeset
   163
	// This ASSERTS if we already have the port open!!!!
20ac952a623c 201040_02
hgs
parents:
diff changeset
   164
	TRAPD(connectErr, ConnectL());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   165
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   166
	TInt err = Observer().ConnectConfirm(aAddr, connectErr);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   167
	// If there was an error in RemCon we should drop the connection otherwise 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   168
	// RemCon might get surprised by later incoming messages on a connection 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   169
	// it doesn't know exists. Otherwise, start listening for incoming data.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   170
	// Of course, don't start listening unless the port opened OK 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   171
	// (connectErr).
20ac952a623c 201040_02
hgs
parents:
diff changeset
   172
	if ( err != KErrNone || connectErr != KErrNone )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   173
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   174
		ClosePort();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   175
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   176
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   177
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   178
		Receive();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   179
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   180
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   181
20ac952a623c 201040_02
hgs
parents:
diff changeset
   182
void CRemConSerialBearer::DisconnectRequest(const TRemConAddress& aAddr)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   183
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   184
	LOG(KNullDesC8);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   185
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   186
20ac952a623c 201040_02
hgs
parents:
diff changeset
   187
	// make sure we are connected before disconnect
20ac952a623c 201040_02
hgs
parents:
diff changeset
   188
	ASSERT_ALWAYS(iCommServ.Handle());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   189
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   190
	// Undo everything done in Connect (without assuming that Connect 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   191
	// completed successfully). Must cancel any outstanding requests for this 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   192
	// to be safe.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   193
	ClosePort();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   194
	Observer().DisconnectConfirm(aAddr, KErrNone);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   195
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   196
20ac952a623c 201040_02
hgs
parents:
diff changeset
   197
void CRemConSerialBearer::ConnectL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   198
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   199
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   200
20ac952a623c 201040_02
hgs
parents:
diff changeset
   201
#if defined (__WINS__)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   202
#define PDD_NAME _L("ECDRV")
20ac952a623c 201040_02
hgs
parents:
diff changeset
   203
#define LDD_NAME _L("ECOMM")
20ac952a623c 201040_02
hgs
parents:
diff changeset
   204
#else  // __GCC32__
20ac952a623c 201040_02
hgs
parents:
diff changeset
   205
#define PDD_NAME _L("EUART1")
20ac952a623c 201040_02
hgs
parents:
diff changeset
   206
#define LDD_NAME _L("ECOMM")
20ac952a623c 201040_02
hgs
parents:
diff changeset
   207
#endif
20ac952a623c 201040_02
hgs
parents:
diff changeset
   208
20ac952a623c 201040_02
hgs
parents:
diff changeset
   209
	// make sure we aren't connected
20ac952a623c 201040_02
hgs
parents:
diff changeset
   210
	ASSERT_ALWAYS(!iCommServ.Handle());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   211
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   212
	TInt r=User::LoadPhysicalDevice(PDD_NAME);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   213
	if (r!=KErrNone && r!=KErrAlreadyExists)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   214
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   215
		LEAVEIFERRORL(r);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   216
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   217
	r=User::LoadLogicalDevice(LDD_NAME);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   218
	if (r!=KErrNone && r!=KErrAlreadyExists)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   219
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   220
		LEAVEIFERRORL(r);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   221
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   222
20ac952a623c 201040_02
hgs
parents:
diff changeset
   223
	_LIT(KModule, "ECUART");
20ac952a623c 201040_02
hgs
parents:
diff changeset
   224
#if defined (__WINS__)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   225
	_LIT(KPort, "COMM::1");
20ac952a623c 201040_02
hgs
parents:
diff changeset
   226
#else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   227
//	_LIT(KPort, "COMM::2");  // On H2 and H4 this is the IR port
20ac952a623c 201040_02
hgs
parents:
diff changeset
   228
							 // use COMM::2 for Lubbock.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   229
	_LIT(KPort, "COMM::3");  // need this for H2 and H4 board
20ac952a623c 201040_02
hgs
parents:
diff changeset
   230
#endif
20ac952a623c 201040_02
hgs
parents:
diff changeset
   231
20ac952a623c 201040_02
hgs
parents:
diff changeset
   232
	LEAVEIFERRORL(iCommServ.Connect());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   233
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   234
 	// if appropriate close will unloadcommmodule internally
20ac952a623c 201040_02
hgs
parents:
diff changeset
   235
 	CleanupClosePushL(iCommServ);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   236
20ac952a623c 201040_02
hgs
parents:
diff changeset
   237
	LEAVEIFERRORL(iCommServ.LoadCommModule(KModule));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   238
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   239
	// as above if not connected this should be NULL
20ac952a623c 201040_02
hgs
parents:
diff changeset
   240
	ASSERT_ALWAYS(!iComm.SubSessionHandle());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   241
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   242
	LEAVEIFERRORL(iComm.Open(iCommServ, KPort, ECommExclusive));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   243
20ac952a623c 201040_02
hgs
parents:
diff changeset
   244
	// put these on clean up stack - will call close if we leave
20ac952a623c 201040_02
hgs
parents:
diff changeset
   245
	CleanupClosePushL(iComm);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   246
20ac952a623c 201040_02
hgs
parents:
diff changeset
   247
	// Put the port's config into a known state.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   248
	TCommConfig portSettings;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   249
	LEAVEIFERRORL(iComm.Config(portSettings));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   250
	portSettings().iRate = EBps115200;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   251
	portSettings().iDataBits = EData8;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   252
	portSettings().iStopBits = EStop1;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   253
	LEAVEIFERRORL(iComm.SetConfig(portSettings));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   254
20ac952a623c 201040_02
hgs
parents:
diff changeset
   255
	CleanupStack::Pop(2,&iCommServ);// pop iComm then iCommServ
20ac952a623c 201040_02
hgs
parents:
diff changeset
   256
20ac952a623c 201040_02
hgs
parents:
diff changeset
   257
	/* clear out the serial port so we know we start from fresh...
20ac952a623c 201040_02
hgs
parents:
diff changeset
   258
	 simple expedient (that hopefully will work), try and receive 20 bytes,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   259
	 then cancel the receive. Given the current behaviour of the read cancel this
20ac952a623c 201040_02
hgs
parents:
diff changeset
   260
	 will return any characters that are currently in the serial port buffers 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   261
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   262
	ASSERT_DEBUG(iReceiver);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   263
	Receive();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   264
	iReceiver->Cancel();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   265
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   266
20ac952a623c 201040_02
hgs
parents:
diff changeset
   267
void CRemConSerialBearer::ClosePort()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   268
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   269
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   270
20ac952a623c 201040_02
hgs
parents:
diff changeset
   271
	ASSERT_DEBUG(iSender);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   272
	iSender->Cancel();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   273
	ASSERT_DEBUG(iReceiver);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   274
	iReceiver->Cancel();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   275
	iComm.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   276
	iCommServ.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   277
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   278
20ac952a623c 201040_02
hgs
parents:
diff changeset
   279
TInt CRemConSerialBearer::SendResponse(TUid aInterfaceUid, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   280
		TUint aOperationId, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   281
		TUint /*aTransactionId*/, // we don't care about this transaction ID
20ac952a623c 201040_02
hgs
parents:
diff changeset
   282
		RBuf8& aData, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   283
		const TRemConAddress& /*aAddr*/)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   284
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   285
	LOG(KNullDesC8);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   286
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   287
	LOG1(_L("\taOperationId = 0x%02x"), aOperationId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   288
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   289
	TInt ret = DoSend(aInterfaceUid, aOperationId, aData, ERemConResponse);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   290
20ac952a623c 201040_02
hgs
parents:
diff changeset
   291
	LOG1(_L("\tret = %d"), ret);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   292
	return ret;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   293
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   294
20ac952a623c 201040_02
hgs
parents:
diff changeset
   295
TInt CRemConSerialBearer::SendCommand(TUid aInterfaceUid, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   296
		TUint aOperationId, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   297
		TUint aTransactionId,  
20ac952a623c 201040_02
hgs
parents:
diff changeset
   298
		RBuf8& aData, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   299
		const TRemConAddress& /*aAddr*/)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   300
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   301
	LOG(KNullDesC8());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   302
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   303
	LOG1(_L("\taOperationId = 0x%02x"), aOperationId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   304
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   305
	iTransactionId = aTransactionId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   306
	TInt ret = DoSend(aInterfaceUid, aOperationId, aData, ERemConCommand);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   307
20ac952a623c 201040_02
hgs
parents:
diff changeset
   308
	LOG1(_L("\tret = %d"), ret);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   309
	return ret;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   310
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   311
20ac952a623c 201040_02
hgs
parents:
diff changeset
   312
TInt CRemConSerialBearer::DoSend(TUid aInterfaceUid, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   313
		TUint aOperationId, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   314
		RBuf8& aData, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   315
		TRemConMessageType aMsgType)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   316
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   317
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   318
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   319
	TInt ret = KErrInUse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   320
20ac952a623c 201040_02
hgs
parents:
diff changeset
   321
	// make sure we are connected
20ac952a623c 201040_02
hgs
parents:
diff changeset
   322
	ASSERT_ALWAYS(iComm.SubSessionHandle());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   323
20ac952a623c 201040_02
hgs
parents:
diff changeset
   324
	// Check we're not already busy sending.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   325
	ASSERT_DEBUG(iSender);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   326
	if ( iSender->IsActive() )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   327
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   328
		ret = KErrInUse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   329
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   330
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   331
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   332
		ret = Observer().InterfaceToBearer(Uid(), aInterfaceUid, aOperationId, aData, aMsgType, iOutMsg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   333
		if ( ret == KErrNone )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   334
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   335
			LOG1(_L("\tsending text \"%S\""), &iOutMsg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   336
			iSender->Send(iOutMsg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   337
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   338
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   339
20ac952a623c 201040_02
hgs
parents:
diff changeset
   340
	// If no error, we took ownership of aData- we've finished with it now.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   341
	if ( ret == KErrNone )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   342
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   343
		aData.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   344
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   345
20ac952a623c 201040_02
hgs
parents:
diff changeset
   346
	LOG1(_L("\tret = %d"), ret);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   347
	return ret;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   348
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   349
20ac952a623c 201040_02
hgs
parents:
diff changeset
   350
void CRemConSerialBearer::MsoSendComplete(TInt aError)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   351
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   352
	LOG(KNullDesC8);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   353
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   354
	LOG1(_L("\taError = %d"), aError);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   355
	(void)aError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   356
20ac952a623c 201040_02
hgs
parents:
diff changeset
   357
	// We don't do anything. How does RemCon get to know of this? Does it 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   358
	// care? No. A command which never gets a response is standard remote 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   359
	// control behaviour. The user will retry, and doesn't need an InfoMsg to 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   360
	// tell them anything about it.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   361
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   362
20ac952a623c 201040_02
hgs
parents:
diff changeset
   363
TInt CRemConSerialBearer::GetResponse(TUid& aInterfaceUid, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   364
		TUint& aTransactionId, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   365
		TUint& aOperationId, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   366
		RBuf8& aData, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   367
		TRemConAddress& aAddr)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   368
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   369
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   370
20ac952a623c 201040_02
hgs
parents:
diff changeset
   371
	ASSERT_DEBUG(iReceiver);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   372
	// RemCon shouldn't call use unless we prompted them to with NewResponse.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   373
	ASSERT_DEBUG(!iReceiver->IsActive()); 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   374
	// The message should be a response, unless RemCon is being buggy and 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   375
	// calling GetResponse at bad times.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   376
	ASSERT_DEBUG(iMsgType == ERemConResponse);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   377
20ac952a623c 201040_02
hgs
parents:
diff changeset
   378
	TRAPD(err, DoGetResponseL(aInterfaceUid, aOperationId, aData, aAddr));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   379
	LOG3(_L("\taInterfaceUid = 0x%08x, aOperationId = 0x%02x, msgType = %d"), 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   380
		aInterfaceUid, aOperationId, iMsgType);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   381
20ac952a623c 201040_02
hgs
parents:
diff changeset
   382
	// The serial bearer only has one incoming message in it at once, so we 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   383
	// don't need any queueing or anything fancy to get the transaction ID- 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   384
	// it's just the last one RemCon told us.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   385
	aTransactionId = iTransactionId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   386
20ac952a623c 201040_02
hgs
parents:
diff changeset
   387
	// Repost read request on port.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   388
	Receive();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   389
20ac952a623c 201040_02
hgs
parents:
diff changeset
   390
	LOG1(_L("\terr = %d"), err);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   391
	return err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   392
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   393
20ac952a623c 201040_02
hgs
parents:
diff changeset
   394
void CRemConSerialBearer::DoGetResponseL(TUid& aInterfaceUid, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   395
		TUint& aOperationId, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   396
		RBuf8& aData, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   397
		TRemConAddress& aAddr)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   398
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   399
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   400
20ac952a623c 201040_02
hgs
parents:
diff changeset
   401
	aInterfaceUid = iInterfaceUid;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   402
	aOperationId = iOperationId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   403
	ASSERT_DEBUG(aData.MaxLength() == 0);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   404
	// Pass ownership of this to RemCon.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   405
	aData.CreateL(iData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   406
20ac952a623c 201040_02
hgs
parents:
diff changeset
   407
	aAddr.BearerUid() = Uid();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   408
	aAddr.Addr() = KNullDesC8();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   409
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   410
20ac952a623c 201040_02
hgs
parents:
diff changeset
   411
TInt CRemConSerialBearer::GetCommand(TUid& aInterfaceUid, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   412
		TUint& aTransactionId, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   413
		TUint& aOperationId, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   414
		RBuf8& aData, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   415
		TRemConAddress& aAddr)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   416
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   417
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   418
20ac952a623c 201040_02
hgs
parents:
diff changeset
   419
	ASSERT_DEBUG(iReceiver);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   420
	// RemCon shouldn't call use unless we prompted them to with NewCommand.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   421
	ASSERT_DEBUG(!iReceiver->IsActive()); 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   422
	// The message should be a command, unless RemCon is being buggy and 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   423
	// calling GetCommand at bad times.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   424
	ASSERT_DEBUG(iMsgType == ERemConCommand);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   425
20ac952a623c 201040_02
hgs
parents:
diff changeset
   426
	TRAPD(err, DoGetCommandL(aInterfaceUid, aOperationId, aData, aAddr));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   427
	LOG3(_L("\taInterfaceUid = 0x%08x, aOperationId = 0x%02x, msgType = %d"), 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   428
		aInterfaceUid, aOperationId, iMsgType);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   429
20ac952a623c 201040_02
hgs
parents:
diff changeset
   430
	// The serial bearer only has one incoming message in it at once, so we 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   431
	// don't need any queueing or anything fancy to get the transaction ID- 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   432
	// it's just the last one RemCon told us.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   433
	aTransactionId = iTransactionId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   434
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   435
	// Repost read request on port.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   436
	Receive();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   437
20ac952a623c 201040_02
hgs
parents:
diff changeset
   438
	LOG1(_L("\terr = %d"), err);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   439
	return err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   440
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   441
20ac952a623c 201040_02
hgs
parents:
diff changeset
   442
void CRemConSerialBearer::DoGetCommandL(TUid& aInterfaceUid,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   443
		TUint& aOperationId, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   444
		RBuf8& aData, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   445
		TRemConAddress& aAddr)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   446
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   447
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   448
20ac952a623c 201040_02
hgs
parents:
diff changeset
   449
	aInterfaceUid = iInterfaceUid;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   450
	aOperationId = iOperationId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   451
	// Pass ownership of this to RemCon.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   452
	aData.CreateL(iData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   453
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   454
	aAddr.BearerUid() = Uid();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   455
	aAddr.Addr() = KNullDesC8();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   456
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   457
20ac952a623c 201040_02
hgs
parents:
diff changeset
   458
// Utility to repost a read on the port.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   459
void CRemConSerialBearer::Receive()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   460
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   461
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   462
20ac952a623c 201040_02
hgs
parents:
diff changeset
   463
	ASSERT_DEBUG(iComm.SubSessionHandle());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   464
	ASSERT_DEBUG(iReceiver);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   465
	/* we should check we aren't currently trying to receive. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   466
	   In this design we only kick off a receive when we aren't already trying to read something already.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   467
	   If we get this wrong the SetActive in iReceiver->Receive will blow up, so we'll assert here so we know.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   468
	   This configuration is for test code not real life so there is no 'real' problem anyway.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   469
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   470
	ASSERT_DEBUG(!iReceiver->IsActive());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   471
	/* you might expect to see an iReceiver->Cancel() here BUT there are problems with doing this
20ac952a623c 201040_02
hgs
parents:
diff changeset
   472
	   a) The underlying RComm::Read may just decide to put the 5 bytes of message it currently has in 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   473
	       the buffer (if we happen to call this half way through an incoming message). In this case this
20ac952a623c 201040_02
hgs
parents:
diff changeset
   474
	       bearer will NEVER recover as it assumes it will only receive the proper complete 30 byte message
20ac952a623c 201040_02
hgs
parents:
diff changeset
   475
	       and makes no attempt to get back in step (it will have 5 bytes from one message + 25 from another for ever).
20ac952a623c 201040_02
hgs
parents:
diff changeset
   476
	   b) We are pretty confident we don't need to (see above).
20ac952a623c 201040_02
hgs
parents:
diff changeset
   477
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   478
	iReceiver->Receive(iInMsg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   479
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   480
20ac952a623c 201040_02
hgs
parents:
diff changeset
   481
void CRemConSerialBearer::MroReceiveComplete(TInt aError)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   482
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   483
	LOG(KNullDesC8);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   484
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   485
	LOG2(_L("\taError = %d, iInMsg = \"%S\""), aError, &iInMsg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   486
20ac952a623c 201040_02
hgs
parents:
diff changeset
   487
	// If any error occurred either getting or decoding the message, we need 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   488
	// to re-post now. Otherwise, we wait until after RemCon has picked up the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   489
	// message until we re-post a read. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   490
	if ( aError == KErrNone )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   491
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   492
		TRemConAddress addr;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   493
		addr.BearerUid() = Uid();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   494
		addr.Addr() = KNullDesC8();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   495
20ac952a623c 201040_02
hgs
parents:
diff changeset
   496
		aError = Observer().BearerToInterface(Uid(), 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   497
			iInMsg,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   498
			iInMsg, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   499
			iInterfaceUid, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   500
			iOperationId,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   501
			iMsgType, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   502
			iData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   503
20ac952a623c 201040_02
hgs
parents:
diff changeset
   504
		if ( aError == KErrNone )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   505
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   506
			if ( iMsgType == ERemConCommand )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   507
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   508
				iTransactionId = Observer().NewTransactionId();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   509
				aError = Observer().NewCommand(addr);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   510
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   511
			else if ( iMsgType == ERemConResponse )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   512
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   513
				aError = Observer().NewResponse(addr);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   514
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   515
			else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   516
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   517
				// drop the message (malformed- not apparently a command or response)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   518
				aError = KErrNotSupported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   519
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   520
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   521
		// else drop the message (either no converter for that interface UID or it couldn't convert the message)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   522
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   523
	// else just drop the message (error receiving it)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   524
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   525
	// If we successfully told RemCon there was a new message to pick up, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   526
	// don't repost our port read until RemCon has come back and picked up the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   527
	// message. If there was any error, then RemCon isn't going to come back 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   528
	// for this message- it's effectively dropped- and we should re-post our 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   529
	// request now.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   530
	if ( aError != KErrNone )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   531
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   532
		Receive();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   533
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   534
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   535
20ac952a623c 201040_02
hgs
parents:
diff changeset
   536
TSecurityPolicy CRemConSerialBearer::SecurityPolicy() const
20ac952a623c 201040_02
hgs
parents:
diff changeset
   537
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   538
	return TSecurityPolicy(ECapabilityLocalServices);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   539
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   540
20ac952a623c 201040_02
hgs
parents:
diff changeset
   541
void CRemConSerialBearer::ClientStatus(TBool aControllerPresent, TBool aTargetPresent)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   542
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   543
	LOG2(_L("CRemConSerialBearer::ClientStatus aControllerPresent = %d, aTargetPresent = %d"), 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   544
		aControllerPresent, aTargetPresent);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   545
	(void)aControllerPresent;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   546
	(void)aTargetPresent;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   547
20ac952a623c 201040_02
hgs
parents:
diff changeset
   548
	// I don't care.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   549
	}