--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayerprotocols/ethernetnif/IRLAN/IRLANDAT.CPP Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,386 @@
+// Copyright (c) 1997-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:
+// Irlan parameter data model code
+//
+//
+
+/**
+ @file
+*/
+
+#include <e32base.h>
+#include "IRLANUTL.H"
+#include "IRLANDAT.H"
+
+/**
+current IrLAN version 1.1
+@internalComponent
+*/
+
+/*
+CIrlanRegister::CIrlanRegister()
+ {
+ __DECLARE_NAME(_S("CIrlanRegister"));
+ iParameterList.SetOffset(_FOFF(CIrlanCommand,iLink));
+ iUnique=1;
+ }
+
+CIrlanRegister::~CIrlanRegister()
+ {
+ CIrlanCommand *cl;
+ TDblQueIter<CIrlanCommand> i(iParameterList);
+
+ while (cl=i++,cl!=NULL)
+ {
+ cl->iLink.Deque();
+ delete cl;
+ }
+ }
+
+CIrlanRegister *CIrlanRegister::NewL()
+// Invoked to create a new instance of the IAS register object
+ {
+ CIrlanRegister *reg=new (ELeave) CIrlanRegister();
+ reg->InitL();
+ return reg;
+ }
+
+void CIrlanRegister::InitL()
+// register the compulsory device classes
+ {
+ TIASDatabaseEntry ent;
+ SetHostName(PROTEA_DEFAULT_NICKNAME);
+ ent.SetClassName(IRDA_IAS_DEVICE_CLASSNAME);
+ ent.SetAttributeName(IRDA_IAS_DEVICENAME_ATTR);
+ ent.SetToCharString(iHostName);
+ RegisterEntryL(ent);
+
+ ent.SetClassName(IRDA_IAS_DEVICE_CLASSNAME);
+ ent.SetAttributeName(IRDA_IAS_LMPSUPPORT_ATTR);
+ TBuf8<3> data;
+ data.SetLength(3);
+ data[0]=KIrLMPVersionMask;
+ data[1]=KIASSupportMask;
+ data[2]=KIrLMPSupportMask;
+ ent.SetToOctetSeq(data);
+ RegisterEntryL(ent);
+ return;
+ }
+
+void CIrlanRegister::RegisterEntryL(const TDesC8& aBuffer)
+// Add a new command to the data base
+ {
+ TIASDatabaseEntry ent;
+ ent.Copy(aBuffer);
+ CIASClass * cls=LookUpCommand(ent().iClassName);
+ if (cls==NULL)
+ {
+ TInt uniqueID=0; // "Device" is always id 0 - autoincrement for others.
+ if (ent().iClassName!=IRDA_IAS_DEVICE_CLASSNAME)
+ uniqueID=iUnique++;
+ cls=CIASClass::NewL(ent().iClassName,uniqueID);
+ iIASClassList.AddLast(*cls);
+ }
+ cls->AddAttributeL(ent().iAttributeName,ent().iData);
+ }
+
+TInt CIrlanRegister::UnregisterEntry(const TDesC8& aBuffer)
+//
+// Remove a whole class from the database.
+//
+ {
+ TIrlanDatabaseEntry ent;
+ ent.Copy(aBuffer);
+ CIASClass * cls=LookUpClass(ent().iClassName);
+ if (cls==NULL)
+ return KErrNotFound;
+ return cls->RemoveAttribute(ent().iAttributeName);
+ }
+
+TIASQueryResult CIASRegister::Lookup(const TDesC8& aClassName,
+ const TDesC8& anAttributeName,TUint16& anObjectId,TIASResponse& aResponse)
+ {
+ CIASClass* cls=LookUpClass(aClassName);
+ if (cls!=NULL)
+ {
+ anObjectId=cls->LookUpObjectID();
+
+ CIASAttribute* attr=cls->LookUpAttribute(anAttributeName);
+ if (attr!=NULL)
+ attr->GetAttributeData(aResponse);
+ else
+ return EIASNoSuchAttribute;
+ }
+ else
+ return EIASNoSuchClass;
+
+ return EIASSuccess;
+ }
+
+CIASClass* CIASRegister::LookUpClass(const TDesC8& aName)
+//
+// Go through the list of classes and see if any of them match
+// on names with aName.
+//
+ {
+ CIASClass *cl;
+ TDblQueIter<CIASClass> i(iIASClassList);
+
+ while (cl=i++,cl!=NULL)
+ {
+ if (cl->Match(aName))
+ return cl;
+ }
+ return NULL;
+ }
+
+void CIASRegister::SetHostName(const TDesC8 &aName)
+ {
+ iHostName.Copy(aName);
+ }
+
+void CIASRegister::GetHostName(TDes8 &aName)
+ {
+ aName.Copy(iHostName);
+ }
+
+ */
+
+//*******************************************************************
+
+/**
+Constructor.
+*/
+CIrlanParameter::CIrlanParameter()
+{
+ __DECLARE_NAME(_S("CIrlanParameter"));
+}
+
+/**
+Destructor.
+*/
+CIrlanParameter::~CIrlanParameter()
+{
+ CIrlanParameterValue *val;
+ TDblQueIter<CIrlanParameterValue> i(iIrlanParameterValueList);
+
+ delete iParamName;
+ while (val=i++,val!=NULL)
+ {
+ val->iLink.Deque();
+ delete val;
+ }
+}
+
+/**
+Invoked to create a new instance of an irlan parameter object.
+@param aName parameter name.
+@param aID parameter ID.
+@return A pointer to CIrlanParameter object.
+*/
+CIrlanParameter *CIrlanParameter::NewL(const TDesC8& aName,const TUint8 aID)
+{
+ CIrlanParameter *cl=new (ELeave) CIrlanParameter();
+ CleanupStack::PushL(cl);
+ cl->InitL(aName,aID);
+ CleanupStack::Pop();
+ return cl;
+}
+
+/**
+We don't initialise attributes here. Must subsequently invoke.
+Add the newly created object to an parameter list.
+@param aName The parameter name.
+@param aCode The Command Code.
+*/
+void CIrlanParameter::InitL(const TDesC8& aName,TUint8 aCode)
+{
+ iParamName=HBufC8::NewL(aName.Length());
+ TPtr8 temp=iParamName->Des();
+ temp=aName;
+
+ iCommandCode=aCode;
+ iIrlanParameterValueList.SetOffset(_FOFF(CIrlanParameterValue,iLink));
+}
+
+/**
+Adds the parameter value to List.
+@param aName parameter name.
+@param aType parameter type.
+*/
+void CIrlanParameter::AddParameterValueL(const TDesC8& aName,const TIrlanParameterType& aType)
+{
+ if (LookUpParameterValue(aName)!=NULL)
+ User::Leave(KErrAlreadyExists);
+ CIrlanParameterValue *val=CIrlanParameterValue::NewL(aName,aType);
+ iIrlanParameterValueList.AddFirst(*val);
+}
+
+/**
+Searchs a parameter in the parameter List.
+@return A pointer to CIrlanParameterValue class
+*/
+CIrlanParameterValue* CIrlanParameter::LookUpParameterValue()
+{
+ CIrlanParameterValue *val=NULL;
+ CIrlanParameterValue *ret=NULL;
+ TDblQueIter<CIrlanParameterValue> i(iIrlanParameterValueList);
+
+ TInt count=0;
+ while (val=i++,val!=NULL)
+ {
+ ret=val;
+ count++;
+ }
+ __ASSERT_DEBUG(count<=1,IrlanUtil::Fault(EIrlanInvalidParameter));
+ return ret;
+}
+
+/**
+Searchs a parameter in the parameter List depending on the value.
+@param aValue A parameter value to be searched.
+@return A pointer to CIrlanParameterValue class
+*/
+CIrlanParameterValue* CIrlanParameter::LookUpParameterValue(const TDesC8& aValue)
+{
+ CIrlanParameterValue *val;
+ TDblQueIter<CIrlanParameterValue> i(iIrlanParameterValueList);
+
+ while (val=i++,val!=NULL)
+ {
+ if (val->Match(aValue))
+ return val;
+ }
+ return NULL;
+}
+
+/**
+Remove the paramter value from the parameter list.
+@param aValue A parameter value to be removed.
+@return KErrNone if success else KErrNotFound.
+*/
+TInt CIrlanParameter::RemoveParameterValue(const TDesC8& aValue)
+{
+ CIrlanParameterValue *val=LookUpParameterValue(aValue);
+ if (val==NULL)
+ return KErrNotFound;
+ val->iLink.Deque();
+ delete val;
+ if (iIrlanParameterValueList.IsEmpty())
+ {
+ iLink.Deque();
+ delete this;
+ }
+ return KErrNone;
+}
+
+/**
+Searches this descriptor's data for a match with the match pattern supplied in the specified
+descriptor.
+@param aName A 8 bit non modifable descriptor containing the match pattern
+@return If a match is found, the offset within this descriptor's data where the match first
+ occurs.
+*/
+TBool CIrlanParameter::Match(const TDesC8& aName)const
+{
+ return (iParamName->Compare(aName)==0);
+}
+
+/**
+Get the command code.
+@return The command code.
+*/
+TUint8 CIrlanParameter::GetCommandCode()
+{
+ return iCommandCode;
+}
+
+//*******************************************************************
+
+/**
+Constructor.
+*/
+CIrlanParameterValue::CIrlanParameterValue()
+{
+ __DECLARE_NAME(_S("CIrlanParameter"));
+}
+
+/**
+Destructor.
+*/
+CIrlanParameterValue::~CIrlanParameterValue()
+{
+ delete iParamValue;
+}
+
+/**
+Invoked to create a new instance of an irlan parameter object.
+@param aValue parameter value.
+@param aType parameter Type.
+@return A pointer to CIrlanParameterValue object.
+*/
+CIrlanParameterValue* CIrlanParameterValue::NewL(const TDesC8& aValue,const TIrlanParameterType& aType)
+{
+ CIrlanParameterValue *val=new (ELeave) CIrlanParameterValue();
+ CleanupStack::PushL(val);
+ val->InitL(aValue,aType);
+ CleanupStack::Pop();
+ return val;
+}
+
+/**
+Add the newly created object to an parameter list.
+@param aValue parameter value.
+@param aType parameter Type.
+*/
+void CIrlanParameterValue::InitL(const TDesC8& aValue,const TIrlanParameterType& aType)
+{
+ iParamValue=HBufC8::NewL(aValue.Length());
+ TPtr8 temp=iParamValue->Des();
+ temp=aValue;
+
+ iParamValueLength=TUint16(aValue.Length());
+ iParamValueType=aType;
+}
+
+/**
+Searches this descriptor's data for a match with the match pattern supplied in the specified
+descriptor.
+@param aName A 8 bit non modifable descriptor containing the match pattern
+@return If a match is found, the offset within this descriptor's data where the match first
+ occurs.
+*/
+TBool CIrlanParameterValue::Match(const TDesC8& aName) const
+{
+ return (iParamValue->Compare(aName)==0);
+}
+
+/**
+Gets a 8-bit integer value from the buffer.
+@param aDes On completion, the 8-bit value from the buffer
+*/
+void CIrlanParameterValue::GetValue(TPtr8& aDes)
+{
+ TPtr8 val=iParamValue->Des();
+ aDes.Set(val);
+}
+
+/**
+Gets the length of the Parameter value.
+@return The 16-bit parameter value.
+*/
+TUint16 CIrlanParameterValue::GetValueLength()
+{
+ return iParamValueLength;
+}