diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/ssock/ss_commsdataobject.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datacommsserver/esockserver/ssock/ss_commsdataobject.cpp Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,149 @@ +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @internalTechnology +*/ + +#include "ss_commsdataobject.h" + +#include + +#include +#include +#include +#include + +using namespace ESock; +using namespace Messages; + +TBool TGetOrSetParameters::CanProcess(MeshMachine::TNodeContextBase& aContext) + { + TUint interfaceId = (*iDataObject)->RequiredItfExtId(); + return HasInterface(aContext, (TSupportedCommsApiExt)interfaceId); + } + +void TGetOrSetParameters::ForwardL(MeshMachine::TNodeContextBase& aContext) + { + TUint interfaceId = (*iDataObject)->RequiredItfExtId(); + RLegacyResponseMsg responseMsg(aContext, iMessage, iMessage.Int0()); + TRAPD(err, ForwardRequestL(aContext)); + if(err == KErrNotFound) + { + // We've reached the bottom of the stack, so complete the message + if ((*iDataObject)->IsProgressive()) + { + // If the data object was progressive (meaning it traverses the entire + // stack progressively building up information using all nodes that + // support its required interface) then we complete with KErrNone at + // the bottom... + __CFLOG_VAR((KESockComponentTag, KESockMessage, + _L8("TGetOrSetParameters::ForwardL() Node %08x implementing interface id 0x%08x completing message (%08X) with %d"), + &aContext.Node(), interfaceId, iMessage.Handle(), err)); + responseMsg.Complete(KErrNone); + } + else + { + // ...if on the other hand the data object was not progressive + // hitting the bottom of the stack means it didn't find any + // nodes that supporting its required interface. In thay case + // we complete with KErrNotFound + User::Leave(KErrNotFound); + } + return; + } + User::LeaveIfError(err); + } + +void TGetOrSetParameters::ProcessL(MeshMachine::TNodeContextBase& aContext) + { + TAny* interface = NULL; + TUint interfaceId = (*iDataObject)->RequiredItfExtId(); + TRAPD(err, interface = FetchInterfaceL(aContext.Node(), (TSupportedCommsApiExt)interfaceId)); + ASSERT(interface); + + RLegacyResponseMsg responseMsg(aContext, iMessage, iMessage.Int0()); + User::LeaveIfError(err); + + if (interface) + { + XCommsDataObject::TProgressAction action(XCommsDataObject::EComplete); + TRAP(err, action = (*iDataObject)->DispatchL(interface, this)); + if (err != KErrNone) + { + NM_LOG_START_BLOCK(KESockMessage, _L8("TGetOrSetParameters::ProcessL()")); + NM_LOG((KESockMessage, _L8("Node implementing interface id 0x%08x failed with %d"), interfaceId, err)); + NM_LOG_NODE(KESockMessage, aContext.Node().Id().Node()); + NM_LOG_END_BLOCK(KESockMessage, _L8("TGetOrSetParameters::ProcessL()")); + + Complete(aContext, err); + return; + } + + if ((action == XCommsDataObject::EComplete) + || !(*iDataObject)->IsProgressive()) + { + Complete(aContext, KErrNone); + return; + } + + // On successful handling of a progressive data object + // forward the data object down to the next node + TRAP(err, ForwardRequestL(aContext)); + + if(err == KErrNotFound) + { + // We've reached the bottom of the stack, so complete the message + Complete(aContext, KErrNone); + return; + } + User::LeaveIfError(err); + } + } + +TInt TGetOrSetParameters::CheckError(MeshMachine::TNodeContextBase& /*aContext*/, TInt aError) + { + // The query set container is owned by the CConnection that originated + // this message - if an error occurs we need to delete it and NULL the + // pointer + if (aError != KErrNone) + { + delete (*iDataObject); + *iDataObject = NULL; + } + + return aError; + } + +void TGetOrSetParameters::Complete(MeshMachine::TNodeContextBase& aContext, TInt aError) + { + RLegacyResponseMsg responseMsg(aContext, iMessage, iMessage.Int0()); + + __CFLOG_VAR((KESockComponentTag, KESockMessage, + _L8("TGetOrSetParameters::Complete() completing message (%08X) with %d"), + iMessage.Handle(), aError)); + + if ((*iDataObject)->OperationMode() == XCommsDataObject::EOperationSet) + { + // Done with the object + delete (*iDataObject); + *iDataObject = NULL; + } + + responseMsg.Complete(aError); + } + +