linklayerprotocols/ethernetnif/IRLAN/IRLANDAT.CPP
changeset 0 af10295192d8
--- /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;
+}