}           //	end constructor

        public override int HandleReadRequests()
        {
            int count = Requests.Count;

            for (int i = 0; i < count; i++)
            {
                DaRequest request = (DaRequest)Requests[i];
                if (request.PropertyId == 0)
                {
                    // get address space element value
                    // take the Toolkit cache value
                    ValueQT cacheValue = null;
                    request.AddressSpaceElement.GetCacheValue(ref cacheValue);
                    request.Value  = cacheValue;
                    request.Result = EnumResultCode.S_OK;
                }
                else
                {
                    // get property value
                    // get the value from the address space element
                    MyDaAddressSpaceElement element = request.AddressSpaceElement as MyDaAddressSpaceElement;
                    if (element != null)
                    {
                        element.GetPropertyValue(request);
                    }
                    else
                    {
                        request.Result = EnumResultCode.E_FAIL;
                    } //	end if ... else
                }     //	end if ... else
            }         //	end for
            return(CompleteRequests());
        }             //	end HandleReadRequests
        }             //	end HandleReadRequests

        public override int HandleWriteRequests()
        {
            int count = Requests.Count;

            for (int i = 0; i < count; i++)
            {
                DaRequest request = Requests[i] as DaRequest;
                if (request != null)
                {
                    MyDaAddressSpaceElement element = (MyDaAddressSpaceElement)request.AddressSpaceElement;
                    if (element != null)
                    {
                        ValueQT valueQT = request.Value;
                        request.Result = (EnumResultCode)element.ValueChanged(valueQT);
                    } //	end if
                }     //	end if
            }         //	end for
            return(CompleteRequests());
        }             //	end HandleWriteRequests
        }         //end addAddressSpaceElement

        protected void ChangeSimulationValuesNode(MyDaAddressSpaceElement node)
        {
            System.Collections.ArrayList nodeChildren;
            nodeChildren = node.GetChildren();

            foreach (MyDaAddressSpaceElement child in nodeChildren)
            {
                if (child.HasChildren)
                {
                    ChangeSimulationValuesNode(child);
                }
                else if (child.IsChanging)
                {
                    if (!ResultCode.SUCCEEDED(child.changeValue()))
                    {
                        Trace(EnumTraceLevel.ERR,
                              EnumTraceGroup.ALL,
                              "OpcServer::ChangeSimulationValuesNode",
                              "Error in changing value. Data type unknown");
                    }
                }
            }
        }           //	end ChangeSimulationValuesNode
        }        // end parseConfigFile

        protected int addAddressSpaceElement()
        {
            Type                    dataType;
            EnumAccessRights        accessRights;
            MyDaAddressSpaceElement parent;
            bool                    isChanging;
            bool                    isArray;
            bool                    hasChildren;

            //String tempParentID;

            if (m_currentLine[4] == "true")
            {
                isArray = true;
            }
            else
            {
                isArray = false;
            }

            switch (m_currentLine[2])
            {
            case "UI1":
            case "BYTE":
                if (isArray)
                {
                    dataType = typeof(System.Byte[]);
                }
                else
                {
                    dataType = typeof(System.Byte);
                }
                break;

            case "CHAR":
                if (isArray)
                {
                    dataType = typeof(System.SByte[]);
                }
                else
                {
                    dataType = typeof(System.SByte);
                }
                break;

            case "UI2":
            case "WORD":
                if (isArray)
                {
                    dataType = typeof(System.UInt16[]);
                }
                else
                {
                    dataType = typeof(System.UInt16);
                }
                break;

            case "INT":
                if (isArray)
                {
                    dataType = typeof(System.Int16[]);
                }
                else
                {
                    dataType = typeof(System.Int16);
                }
                break;

            case "UI4":
            case "DWORD":
                if (isArray)
                {
                    dataType = typeof(System.UInt32[]);
                }
                else
                {
                    dataType = typeof(System.UInt32);
                }
                break;

            case "DINT":
                if (isArray)
                {
                    dataType = typeof(System.Int32[]);
                }
                else
                {
                    dataType = typeof(System.Int32);
                }
                break;

            case "REAL":
            case "FLOAT":
                if (isArray)
                {
                    dataType = typeof(float[]);
                }
                else
                {
                    dataType = typeof(float);
                }
                //dataType = typeof(System.Double);
                break;

            case "BOOL":
                if (isArray)
                {
                    dataType = typeof(System.Boolean[]);
                }
                else
                {
                    dataType = typeof(System.Boolean);
                }
                break;

            case "DATE_AND_TIME":
                if (isArray)
                {
                    dataType = typeof(System.DateTime[]);
                }
                else
                {
                    dataType = typeof(System.DateTime);
                }
                break;

            case "STRING":
                if (isArray)
                {
                    dataType = typeof(System.String[]);
                }
                else
                {
                    dataType = typeof(System.String);
                }
                break;

            case "NONE":
                dataType = null;
                break;

            default:
                dataType = null;
                break;
            }            //end switch data type

            switch (m_currentLine[3])
            {
            case "NONE":
                accessRights = EnumAccessRights.READABLE;
                break;

            case "R":
                accessRights = EnumAccessRights.READABLE;
                break;

            case "W":
                accessRights = EnumAccessRights.WRITEABLE;
                break;

            case "RW":
                accessRights = EnumAccessRights.READWRITEABLE;
                break;

            default:
                accessRights = EnumAccessRights.READABLE;
                break;
            }            // end switch access rights

            if (m_currentLine[6] == "true")
            {
                isChanging = true;
            }
            else
            {
                isChanging = false;
            }

            if (m_currentLine[5] == "true")
            {
                hasChildren = true;
            }
            else
            {
                hasChildren = false;
            }

            m_daElement              = (MyDaAddressSpaceElement)m_creator.CreateMyDaAddressSpaceElement();
            m_daElement.ItemId       = m_currentLine[0];
            m_daElement.Name         = m_currentLine[1];
            m_daElement.AccessRights = accessRights;
            m_daElement.Datatype     = dataType;
            m_daElement.IsChanging   = isChanging;
            m_daElement.IoMode       = EnumIoMode.REPORT;
            m_daElement.HasChildren  = hasChildren;

            //determine parent
            if (m_currentLine[9] == "")
            {
                if (!m_daRoot.AddChild(m_daElement))
                {
                    Trace(EnumTraceLevel.ERR,
                          EnumTraceGroup.ALL,
                          "OpcServer::addAddressSpaceElement",
                          "Error in adding child to root node");
                    return((int)EnumResultCode.E_FAIL);
                }
            }
            else
            {
                //tempParentID = m_currentLine[9];
                //tempParentID.Replace('/', '.');
                if (m_parentHash.ContainsKey(m_currentLine[9]))
                {
                    parent = (MyDaAddressSpaceElement)m_parentHash[m_currentLine[9]];
                    if (!parent.AddChild(m_daElement))
                    {
                        Trace(EnumTraceLevel.ERR,
                              EnumTraceGroup.ALL,
                              "OpcServer::addAddressSpaceElement",
                              "Error in adding child to his parent");
                        return((int)EnumResultCode.E_FAIL);
                    }
                }
                else
                {
                    Trace(EnumTraceLevel.ERR,
                          EnumTraceGroup.ALL,
                          "OpcServer::addAddressSpaceElement",
                          "Cannot find parent in hashmap");
                    return((int)EnumResultCode.E_FAIL);
                }
            }

            if (m_daElement.HasChildren)
            {
                m_parentHash.Add(m_daElement.ItemId, m_daElement);
            }
            else
            {
                if (!ResultCode.SUCCEEDED(m_daElement.SetInitialValue(m_currentLine[7], m_currentLine[8])))
                {
                    Trace(EnumTraceLevel.ERR,
                          EnumTraceGroup.ALL,
                          "OpcServer::parseConfigFile",
                          "Error in setting initial value. Data type unknown");
                    return((int)EnumResultCode.E_FAIL);
                }
            }
            return((int)EnumResultCode.S_OK);
        }         //end addAddressSpaceElement