commsfwutils/commsbufs/mbufgobblerlayer/src/mbufgobblerflow.cpp
author hgs
Thu, 23 Sep 2010 10:22:55 +0100
changeset 78 dd4909eb54cd
permissions -rw-r--r--
201037_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
78
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
     2
// All rights reserved.
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
     7
//
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
     8
// Initial Contributors:
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    10
//
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    11
// Contributors:
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    12
//
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    13
// Description:
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    14
// Flow / Binder
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    15
//  (data plane)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    16
//
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    17
//
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    18
//  This is a 3-plane comms layer implementation example, which has been customised to be a test layer which gobbles and releases ESOCK MBUFs.
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    19
//  The MBuf gobbling functionality can be disabled by undefining the macro SYMBIAN_COMMSFW_MBUF_GOBBLER which is specified in mbufgobblerproviders.mmp.
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    20
//  When SYMBIAN_COMMSFW_MBUF_GOBBLER is undefined, the source code specified by mbufgobblerproviders.mmp becomes a pass through layer i.e. it passes the data
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    21
//  through to the layer above or below without altering it. This makes it useful as a starting point for implementing your own layers / providers;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    22
//  useful documentation on how to customise your own passthrough layer can be found in ..\docs\MbufGobblerLayer.doc
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    23
//
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    24
/**
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    25
 @file
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    26
 @internalComponent
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    27
*/
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    28
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    29
#include <comms-infras/ss_activities.h>
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    30
#include <comms-infras/ss_logext.h>
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    31
#include <es_mbman.h>
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    32
#include <mbufgobblerpubsub.h>
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    33
#include "mbufgobblerflow.h"
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    34
#include "mbufgobblerlog.h"
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    35
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    36
// for panics
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    37
_LIT(KPanicCategory, "MbufGobblerLayer");
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    38
enum
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    39
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    40
	KPanic_DestroyReceivedBeforeUnbind = 2001
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    41
	};
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    42
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    43
_LIT8(KNodeName, "CMbufGobblerFlow");
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    44
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    45
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    46
///////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    47
// class CMbufGobblerFlow  //
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    48
///////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    49
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    50
CMbufGobblerFlow* CMbufGobblerFlow::NewL(ESock::CSubConnectionFlowFactoryBase& aFactory, const Messages::TNodeId& aSubConnId, ESock::CProtocolIntfBase* aProtocolIntf)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    51
    {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    52
    CMbufGobblerFlow* inst = new(ELeave) CMbufGobblerFlow(aFactory, aSubConnId, aProtocolIntf);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    53
    CleanupStack::PushL(inst);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    54
    inst->ConstructL();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    55
    CleanupStack::Pop(inst);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    56
    return inst;    
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    57
    }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    58
    
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    59
CMbufGobblerFlow::CMbufGobblerFlow(ESock::CSubConnectionFlowFactoryBase& aFactory, const Messages::TNodeId& aSubConnId, ESock::CProtocolIntfBase* aProtocolIntf)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    60
/**
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    61
 * Constructor.
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    62
 *
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    63
 * @param aFactory Reference to the factory which created this object.
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    64
 * @param aTheLogger The logging object, ownership is passed to this object
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    65
 */
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    66
	:ESock::CSubConnectionFlowBase(aFactory, aSubConnId, aProtocolIntf)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    67
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    68
	MBUFGOBBLER_LOG_NODE_CREATE(KMbufGobblerFlowSubTag, CMbufGobblerFlow, KNodeName, this->NodeId().Ptr());
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    69
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    70
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    71
void CMbufGobblerFlow::ConstructL()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    72
    {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    73
#ifdef SYMBIAN_COMMSFW_MBUF_GOBBLER
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    74
    iMBufGobbler = CMBufGobbler::NewL();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    75
#endif    
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    76
    }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    77
    
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    78
CMbufGobblerFlow::~CMbufGobblerFlow()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    79
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    80
	MBUFGOBBLER_LOG_NODE_DESTROY(KMbufGobblerFlowSubTag, CMbufGobblerFlow, KNodeName, this->NodeId().Ptr());
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    81
	iBinders.ResetAndDestroy();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    82
#ifdef SYMBIAN_COMMSFW_MBUF_GOBBLER	
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    83
	delete iMBufGobbler;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    84
#endif 
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    85
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    86
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    87
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    88
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    89
///////////////////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    90
// Methods from CSubConnectionFlowBase:  //
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    91
///////////////////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    92
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    93
ESock::MFlowBinderControl* CMbufGobblerFlow::DoGetBinderControlL()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    94
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    95
	return this;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    96
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    97
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    98
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
    99
// Messages::ANode
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   100
void CMbufGobblerFlow::ReceivedL(
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   101
	const Messages::TRuntimeCtxId& aSender,
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   102
	const Messages::TNodeId& aRecipient,
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   103
	Messages::TSignatureBase& aMessage
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   104
	)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   105
/**
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   106
Method called on incoming SCPR messages
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   107
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   108
@param aCFMessage message base
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   109
*/
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   110
    {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   111
   
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   112
    LOGMESSAGE(KMbufGobblerFlowSubTag, KNodeName, this, aSender, aRecipient, aMessage);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   113
    //LOG_NODE_INFO(KMbufGobblerFlowSubTag, KNodeName, *this); does not compile as flow inheritance is different to other nodes
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   114
    CSubConnectionFlowBase::ReceivedL(aSender, aRecipient, aMessage);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   115
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   116
	// Dispatch the message locally
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   117
	if (ESock::TCFDataClient::ERealmId == aMessage.MessageId().Realm())
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   118
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   119
		switch (aMessage.MessageId().MessageId())
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   120
			{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   121
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   122
			case ESock::TCFDataClient::TStart::EId :
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   123
				{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   124
				iSubConnectionProvider.RNodeInterface::PostMessage(
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   125
					Id(),
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   126
					ESock::TCFDataClient::TStarted().CRef()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   127
					);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   128
				}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   129
				break;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   130
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   131
			case ESock::TCFDataClient::TStop::EId :
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   132
				{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   133
				TInt i;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   134
				for (i=iBinders.Count()-1;i>=0;--i)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   135
					{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   136
				    CMbufGobblerBinder* binder = iBinders[i];
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   137
				    binder->UnbindFromLowerFlow();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   138
					delete binder;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   139
					iBinders.Remove(i);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   140
					}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   141
				iSubConnectionProvider.PostMessage(Id(), ESock::TCFDataClient::TStopped(KErrNone).CRef());
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   142
				}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   143
				break;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   144
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   145
			case ESock::TCFDataClient::TProvisionConfig::EId :
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   146
				{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   147
				ESock::TCFDataClient::TProvisionConfig& aMess = Messages::message_cast<ESock::TCFDataClient::TProvisionConfig>(aMessage);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   148
				iAccessPointConfig.Close();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   149
				iAccessPointConfig.Open(aMess.iConfig);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   150
				}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   151
				break;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   152
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   153
			case ESock::TCFDataClient::TBindTo::EId :
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   154
				{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   155
				ESock::TCFDataClient::TBindTo& bindToReq = Messages::message_cast<ESock::TCFDataClient::TBindTo>(aMessage);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   156
				if (bindToReq.iNodeId == Messages::TNodeId::NullId())
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   157
					{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   158
					User::Leave(KErrNotSupported);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   159
					}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   160
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   161
				const Messages::TNodeId& commsId = bindToReq.iNodeId;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   162
				CSubConnectionFlowBase* lowerFlow = Messages::mnode_cast<CSubConnectionFlowBase>(&commsId.Node());
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   163
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   164
				MFlowBinderControl* lowerBinderControl = lowerFlow->GetBinderControlL();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   165
				ASSERT(lowerBinderControl);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   166
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   167
				TInt i;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   168
				for (i=0;i<iBinders.Count();++i)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   169
					{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   170
					// binder for each protocol will request binder for same protocol from lower binder controller using this fn.
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   171
					iBinders[i]->BindToLowerFlowL(*lowerBinderControl);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   172
					}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   173
				ASSERT(i); // there should be some binders!
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   174
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   175
				Messages::RClientInterface::OpenPostMessageClose(
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   176
					Id(),
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   177
					aSender,
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   178
					ESock::TCFDataClient::TBindToComplete().CRef()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   179
					);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   180
				}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   181
				break;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   182
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   183
			default:
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   184
				ASSERT(EFalse);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   185
			}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   186
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   187
	else if (Messages::TEChild::ERealmId == aMessage.MessageId().Realm())
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   188
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   189
		switch (aMessage.MessageId().MessageId())
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   190
			{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   191
			case Messages::TEChild::TDestroy::EId :
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   192
				{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   193
				TInt i;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   194
				for (i=0;i<iBinders.Count();++i)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   195
					{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   196
					// ensure all binders unbound
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   197
					if (iBinders[i]->InUse())
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   198
						{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   199
						//__CFLOG_0(KLogTag1, KLogTag2,_L("something is sending TDestroy to CMbufGobblerFlow before unbinding."));
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   200
						User::Panic(KPanicCategory,KPanic_DestroyReceivedBeforeUnbind);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   201
						}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   202
						
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   203
					// EXAMPLE CODE: cancel requests here if necessary...
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   204
					//iBinders[i]->Cancel();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   205
					
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   206
					}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   207
				if (i==iBinders.Count()) // all unbound
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   208
					{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   209
					DeleteThisFlow();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   210
					}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   211
				}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   212
				break;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   213
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   214
			default:
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   215
				ASSERT(EFalse);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   216
			}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   217
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   218
	// realm != TCFMessage::ERealmId
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   219
	else
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   220
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   221
		ASSERT(EFalse);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   222
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   223
    }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   224
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   225
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   226
///////////////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   227
// Methods from MFlowBinderControl:  //
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   228
///////////////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   229
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   230
ESock::MLowerControl* CMbufGobblerFlow::GetControlL(const TDesC8& aProtocol)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   231
/**
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   232
Create and return an MLowerControl instance of the specified binder type.
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   233
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   234
Called from upper layer during binding procedure.
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   235
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   236
@param aProtocol Protocol type of the binder
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   237
@return MLowerControl instance of the protocol type
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   238
*/
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   239
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   240
	ESock::MLowerControl* lowerControl = FindOrCreateBinderL(aProtocol);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   241
	ASSERT(lowerControl);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   242
	return lowerControl;		
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   243
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   244
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   245
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   246
ESock::MLowerDataSender* CMbufGobblerFlow::BindL(const TDesC8& aProtocol, ESock::MUpperDataReceiver* aReceiver, ESock::MUpperControl* aControl)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   247
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   248
	CMbufGobblerBinder* binder = FindOrCreateBinderL(aProtocol);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   249
	ASSERT(binder);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   250
	binder->BindToUpperL( *aReceiver, *aControl );
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   251
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   252
	iSubConnectionProvider.RNodeInterface::PostMessage(
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   253
		Id(),
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   254
		ESock::TCFControlProvider::TActive().CRef()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   255
		);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   256
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   257
	return binder;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   258
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   259
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   260
void CMbufGobblerFlow::Unbind( ESock::MUpperDataReceiver* aReceiver, ESock::MUpperControl* aControl)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   261
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   262
	ASSERT(aReceiver);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   263
	ASSERT(aControl);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   264
	TInt i;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   265
	TInt numberUnbound=0;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   266
	for (i=0;i<iBinders.Count();++i)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   267
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   268
		numberUnbound += (iBinders[i]->UnbindFromUpper(*aReceiver,*aControl) ? 1 : 0);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   269
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   270
	ASSERT(i); // there should be some binders!
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   271
	ASSERT(numberUnbound<=1); // only 1 unbind should have happened
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   272
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   273
	iSubConnectionProvider.RNodeInterface::PostMessage(
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   274
		Id(),
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   275
		ESock::TCFControlProvider::TIdle().CRef()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   276
		);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   277
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   278
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   279
ESock::CSubConnectionFlowBase* CMbufGobblerFlow::Flow()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   280
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   281
	return this;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   282
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   283
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   284
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   285
/////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   286
// Own methods //
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   287
/////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   288
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   289
CMbufGobblerBinder* CMbufGobblerFlow::FindOrCreateBinderL(const TDesC8& aProtocol)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   290
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   291
	
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   292
	// EXAMPLE CODE, should you want your: perhaps your protocol to work with IPv4
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   293
	//if (aProtocol.Compare(KIp4ProtocolName))
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   294
	//	{  // only work with IPv4
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   295
	//	User::Leave(KErrNotSupported);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   296
	//	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   297
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   298
	for (TInt i=0;i<iBinders.Count();++i)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   299
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   300
		if(iBinders[i]->ProtocolName() == aProtocol)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   301
			{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   302
			return iBinders[i];
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   303
			}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   304
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   305
	// not found.. create it.
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   306
	CMbufGobblerBinder* newBinder = CMbufGobblerBinder::NewL(aProtocol);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   307
	CleanupStack::PushL(newBinder);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   308
	iBinders.AppendL(newBinder);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   309
	CleanupStack::Pop(newBinder);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   310
	return newBinder;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   311
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   312
	
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   313
    
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   314
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   315
	
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   316
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   317
//##################################################################################################
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   318
	
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   319
/////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   320
// class CMbufGobblerBinder  //
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   321
/////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   322
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   323
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   324
////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   325
// My constructor //
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   326
////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   327
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   328
CMbufGobblerBinder::CMbufGobblerBinder(const TDesC8& aProtocolName):
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   329
	iLowerControl(NULL),
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   330
	iLowerDataSender(NULL),
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   331
	iUpperControl(NULL),
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   332
	iUpperDataReceiver(NULL),
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   333
	iProtocolName(aProtocolName)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   334
	{}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   335
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   336
CMbufGobblerBinder* CMbufGobblerBinder::NewL(const TDesC8& aProtocolName)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   337
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   338
	CMbufGobblerBinder* inst = new(ELeave) CMbufGobblerBinder(aProtocolName);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   339
	CleanupStack::PushL(inst);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   340
	inst->ConstructL();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   341
	CleanupStack::Pop(inst);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   342
	return inst;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   343
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   344
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   345
void CMbufGobblerBinder::ConstructL()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   346
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   347
	MBUFGOBBLER_TEST_DATA_INIT
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   348
#if 0
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   349
	// EXAMPLE CODE - set up everything you need to in this method.
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   350
	//  Perhaps you have some kind of test control interface using pub/sub.. if so you'd do something like below..
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   351
	//   Diff this file with networking/netperf/delaymeterproto/src/delaymeterflow.cpp for a full working implementation of such a control interface...
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   352
	CActiveScheduler::Add(this);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   353
	DefinePubSubKeysL();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   354
	// watch for incoming commands
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   355
	User::LeaveIfError(iProperty.Attach(TUid::Uid(KDelayMeterControlLevel), KCommandToDelayMeter));
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   356
	iProperty.Subscribe(iStatus);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   357
	SetActive();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   358
#endif	
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   359
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   360
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   361
/*virtual*/
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   362
CMbufGobblerBinder::~CMbufGobblerBinder()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   363
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   364
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   365
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   366
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   367
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   368
////////////////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   369
// Methods from ESock::MLowerControl: //
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   370
////////////////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   371
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   372
TInt CMbufGobblerBinder::GetName(TDes& aName)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   373
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   374
	TBuf16<10> tmp;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   375
	tmp.Copy(ProtocolName());
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   376
	aName.Format(_L("mbufgobbler[%S][0x%08x]"), &tmp, this);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   377
	
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   378
	return KErrNone;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   379
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   380
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   381
TInt CMbufGobblerBinder::BlockFlow(TBlockOption aOption)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   382
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   383
	if (iLowerControl==NULL)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   384
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   385
		return KErrNotReady;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   386
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   387
	return iLowerControl->BlockFlow(aOption) ;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   388
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   389
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   390
TInt CMbufGobblerBinder::GetConfig(TBinderConfig& aConfig)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   391
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   392
	if (iLowerControl==NULL)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   393
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   394
		return KErrNotReady;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   395
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   396
	return iLowerControl->GetConfig(aConfig) ;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   397
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   398
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   399
TInt CMbufGobblerBinder::Control(TUint aLevel, TUint aName, TDes8& aOption)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   400
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   401
	// Pass it on..
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   402
	if (iLowerControl==NULL)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   403
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   404
		return KErrNotReady;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   405
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   406
	return iLowerControl->Control(aLevel,aName,aOption);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   407
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   408
	
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   409
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   410
///////////////////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   411
// Methods from ESock::MLowerDataSender: //
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   412
///////////////////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   413
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   414
ESock::MLowerDataSender::TSendResult CMbufGobblerBinder::Send(RMBufChain& aData)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   415
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   416
	// EXAMPLE NOTE:
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   417
	//  This is where a protocol implementation will do its work on outgoing data.
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   418
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   419
    MBUFGOBBLER_TEST_POINT(KBinderSend,KErrNone)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   420
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   421
	if (iLowerControl==NULL)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   422
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   423
		return ESendBlocked; // returning this obliges us to send an unblock later..
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   424
							 // so perhaps it'd be better to just swallow the packet?
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   425
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   426
	return iLowerDataSender->Send(aData);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   427
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   428
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   429
////////////////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   430
// Methods from ESock::MUpperControl: //
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   431
////////////////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   432
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   433
/*virtual*/
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   434
void CMbufGobblerBinder::StartSending()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   435
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   436
	if (iUpperControl)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   437
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   438
		iUpperControl->StartSending();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   439
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   440
	else
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   441
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   442
		ASSERT(1); // to allow setting a breakpoint
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   443
		//__CFLOG_0(KLogTag1, KLogTag2,_L("CMbufGobblerBinder::StartSending: upper control not yet known!"));
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   444
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   445
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   446
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   447
/*virtual*/
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   448
void CMbufGobblerBinder::Error(TInt anError)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   449
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   450
	if (iUpperControl)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   451
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   452
		iUpperControl->Error(anError);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   453
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   454
	else
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   455
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   456
		ASSERT(1); // to set a breakpoint
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   457
		//__CFLOG_0(KLogTag1, KLogTag2,_L("CMbufGobblerBinder::Error: upper control not yet known!"));
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   458
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   459
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   460
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   461
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   462
/////////////////////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   463
// Methods from ESock::MUpperDataReceiver: //
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   464
/////////////////////////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   465
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   466
/*virtual*/
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   467
void CMbufGobblerBinder::Process(RMBufChain& aData)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   468
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   469
	// EXAMPLE NOTE:
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   470
	//  This is where a protocol implementation will do its work on incoming data.
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   471
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   472
    MBUFGOBBLER_TEST_POINT(KBinderReceive,KErrNone)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   473
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   474
	if (iUpperDataReceiver == NULL)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   475
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   476
		// Why is the guy below still sending data to me when I'm not bound above?
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   477
		//   Try to ignore it
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   478
		ASSERT(1); // so a breakpoint can be set if necessary
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   479
		//__CFLOG_0(KLogTag1, KLogTag2,_L("CMbufGobblerBinder::Process: incoming traffic discarded as upper data receiver not (or no longer) set"));
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   480
		return;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   481
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   482
	iUpperDataReceiver->Process(aData);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   483
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   484
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   485
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   486
//////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   487
// and my own methods.. //
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   488
//////////////////////////
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   489
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   490
// called by layer above calling my flow's BindL
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   491
void CMbufGobblerBinder::BindToUpperL(MUpperDataReceiver& aUpperDataReceiver, MUpperControl& aUpperControl)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   492
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   493
	if(iUpperDataReceiver || iUpperControl) {User::Leave(KErrInUse);}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   494
	iUpperDataReceiver=&aUpperDataReceiver;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   495
	iUpperControl=&aUpperControl;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   496
    MBUFGOBBLER_TEST_POINT(KBind,KErrNone)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   497
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   498
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   499
// called by layer above calling my flow's Unbind. Returns ETrue if unbind happened here, EFalse otherwise
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   500
TBool CMbufGobblerBinder::UnbindFromUpper(MUpperDataReceiver& aUpperDataReceiver, MUpperControl& aUpperControl)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   501
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   502
	if(&aUpperDataReceiver == iUpperDataReceiver && &aUpperControl == iUpperControl)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   503
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   504
		iUpperDataReceiver=0;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   505
		iUpperControl=0;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   506
		return ETrue;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   507
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   508
	return EFalse;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   509
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   510
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   511
// called by my flow receiving a BinderRequest
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   512
void CMbufGobblerBinder::BindToLowerFlowL(ESock::MFlowBinderControl& aLowerBinderControl)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   513
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   514
//	__CFLOG_0(KLogTag1, KLogTag2, _L("CMbufGobblerBinder::BindToLowerFlowL")); 
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   515
	if(iLowerControl || iLowerDataSender)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   516
		{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   517
		User::Leave(KErrInUse);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   518
		}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   519
	
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   520
	iBinderControl = &aLowerBinderControl;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   521
	iLowerControl = aLowerBinderControl.GetControlL(ProtocolName());
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   522
	iLowerDataSender = aLowerBinderControl.BindL(ProtocolName(), this, this);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   523
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   524
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   525
void CMbufGobblerBinder::UnbindFromLowerFlow()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   526
    {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   527
    if (!iBinderControl)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   528
        return;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   529
    
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   530
    iBinderControl->Unbind(this, this);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   531
    iBinderControl = NULL;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   532
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   533
    iLowerControl = NULL;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   534
    iLowerDataSender = NULL;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   535
    }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   536
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   537
const TDesC8& CMbufGobblerBinder::ProtocolName() const
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   538
	{
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   539
	return iProtocolName;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   540
	}
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   541
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   542
#ifdef SYMBIAN_COMMSFW_MBUF_GOBBLER 
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   543
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   544
CMBufGobbler::CMBufGobbler():
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   545
    CActive(CActive::EPriorityStandard)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   546
    {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   547
    }   
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   548
    
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   549
CMBufGobbler* CMBufGobbler::NewL()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   550
    {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   551
    CMBufGobbler* inst = new(ELeave) CMBufGobbler;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   552
    CleanupStack::PushL(inst);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   553
    inst->ConstructL();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   554
    CleanupStack::Pop(inst);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   555
    return inst;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   556
    }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   557
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   558
void CMBufGobbler::ConstructL()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   559
    {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   560
    iChain.AllocL(128);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   561
    
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   562
    CActiveScheduler::Add(this);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   563
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   564
    TInt result = RProperty::Define(TUid::Uid(EMBufGobbler), EAdjustNumberOfMBufsRemainingInPool, RProperty::EInt);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   565
    // Only want 1 instance of a MBufGobbler Layer, so just leave if KErrAlreadyExists returned
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   566
    User::LeaveIfError(result);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   567
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   568
    // watch for incoming commands
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   569
    User::LeaveIfError(iProperty.Attach(TUid::Uid(EMBufGobbler), EAdjustNumberOfMBufsRemainingInPool));
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   570
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   571
    iProperty.Subscribe(iStatus);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   572
    SetActive();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   573
    }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   574
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   575
/*virtual*/ CMBufGobbler::~CMBufGobbler()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   576
    {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   577
    if (IsActive())
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   578
        {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   579
        Cancel();   
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   580
        }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   581
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   582
    iChain.Free();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   583
    
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   584
    TInt result = RProperty::Delete(TUid::Uid(EMBufGobbler), EAdjustNumberOfMBufsRemainingInPool);  
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   585
    if (result != KErrNone)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   586
        {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   587
        RDebug::Print(_L("CMBufGobbler::~CMBufGobbler() %d"), result);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   588
        }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   589
    }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   590
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   591
/*virtual*/ void CMBufGobbler::DoCancel()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   592
    {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   593
    iProperty.Cancel();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   594
    }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   595
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   596
/*virtual*/ void CMBufGobbler::RunL()
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   597
    {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   598
    // Resubscribe to ensure that next pub/sub notification is picked up
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   599
    iProperty.Subscribe(iStatus);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   600
    SetActive();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   601
    
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   602
    TInt request=EGobbleAllMBufs;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   603
    TInt pubSubRet = iProperty.Get(request);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   604
    if (pubSubRet == KErrNone)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   605
        {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   606
        switch(request)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   607
            {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   608
            case EGobbleAllMBufs:
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   609
                {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   610
                RMBufAllocator allocator;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   611
                RMBufChain chain;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   612
                TInt size = allocator.NextMBufSize(0);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   613
                while (size != KErrNotFound)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   614
                    {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   615
                    TInt ret = KErrNone;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   616
                    while (ret == KErrNone)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   617
                        {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   618
                        ret = chain.Alloc(size);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   619
                        if (ret==KErrNone )
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   620
                            {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   621
                            iChain.Append(chain);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   622
                            }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   623
                        }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   624
                    size = allocator.NextMBufSize(size);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   625
                    }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   626
                TInt length = iChain.Length();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   627
                RDebug::Print(_L("Out of MBuf Memory... Total MBuf memory in use %d"), length);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   628
                TInt numBufs = iChain.NumBufs();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   629
                RDebug::Print(_L("Out of MBuf Memory... Total MBufs in use %d"), numBufs);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   630
                break;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   631
                }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   632
            case EReleaseAllMBufs:
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   633
                {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   634
                if(!iChain.IsEmpty())
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   635
                     {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   636
                     iChain.Free();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   637
                     ASSERT(!iChain.Length());
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   638
                    }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   639
                break;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   640
                }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   641
            case EReleaseASingleMBuf:
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   642
                {            
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   643
                TInt length = iChain.Length();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   644
                if (length != 0)
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   645
                    {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   646
                    TInt trimOffset = length - iChain.Last()->Size();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   647
                    iChain.TrimEnd(trimOffset);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   648
                    }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   649
    
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   650
                length = iChain.Length();
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   651
                RDebug::Print(_L("MBufMemory De-Allocated... Total MBuf memory in use %d"), length);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   652
                break;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   653
                }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   654
            default:
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   655
                {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   656
                RDebug::Print(_L("CMBufGobbler::RunL(), invalid request %d"), request);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   657
                break;
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   658
                }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   659
            }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   660
        }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   661
    else
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   662
        {
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   663
        RDebug::Print(_L("Attempt to process MBufGobbler publish/subscribe failed with value for  %d"), pubSubRet);
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   664
        }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   665
    }
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   666
dd4909eb54cd 201037_01
hgs
parents:
diff changeset
   667
#endif