using System; using System.Collections.Generic; using System.Text; using ORiN2.ManagedCAO; using System.Windows.Forms; namespace NJSample.VarInfo { abstract class VariableInfo { private bool _isArrayMember; private uint _arrayIndex; private string _name; private VariableInfo _parent = null; private List _childs = new List(); private List _arrayLengthList = new List(); private List _arrayLBoundList = new List(); private VarType _vt; private string _structName; private CIPType _cipType; private CCaoVariable _variable = null; private CCaoController _controller = null; private static readonly DateTime TIME_ORIGIN = new DateTime(1970, 1, 1); public bool IsArrayMember { get { return _isArrayMember; } set { _isArrayMember = value; } } public uint ArrayIndex { get { return _arrayIndex; } set { _arrayIndex = value; } } public string Name { get { return _name; } set { _name = value; } } public VarType VarType { get { return _vt; } set { _vt = value; } } public CIPType CIPType { get { return _cipType; } set { _cipType = value; } } public string StructName { get { return _structName; } set { _structName = value; } } public VariableInfo Parent { get { return _parent; } set { _parent = value; } } public List ChildList { get { return _childs; } } public List ArrayLengthList { get { return _arrayLengthList; } } public List ArrayLBoundList { get { return _arrayLBoundList; } } public string GetVariableAccessName() { StringBuilder sb = new StringBuilder(); if (Parent != null) { sb.Append(Parent.GetVariableAccessName()); } if (sb.Length > 0 && !IsArrayMember) { sb.Append("."); } if (IsArrayMember) { sb.AppendFormat("[{0}]", ArrayIndex); } else { sb.Append(Name); } return sb.ToString(); } public virtual bool HasValue { get { return false; } } public GetValueResult GetValue() { object obj = GetVariable().Value; GetValueResult result = new GetValueResult(); result.Type = obj.GetType(); if (!(obj is Array) && ( CIPType == CIPType.TIME_NSEC || CIPType == CIPType.TIME_OF_DAY_NSEC || CIPType == CIPType.DATE_NSEC || CIPType == CIPType.DATE_AND_TIME_NSEC)) { long val = (long)(Convert.ToUInt64(obj) / 100); if (CIPType == CIPType.TIME_NSEC || CIPType == CIPType.TIME_OF_DAY_NSEC) { TimeSpan ts = new TimeSpan(val); obj = obj.ToString() + "(" + ts.ToString() + ")"; } else { DateTime dt = new DateTime(val + TIME_ORIGIN.Ticks); obj = obj.ToString() + "(" + dt.ToString() + ")"; } } result.Value = obj; return result; } public void PutValue(object obj) { if (CIPType == CIPType.TIME_NSEC || CIPType == CIPType.TIME_OF_DAY_NSEC) { TimeSpan ts; if (TimeSpan.TryParse(obj.ToString(), out ts)) { obj = ((ulong)ts.Ticks) * 100; } } else if (CIPType == CIPType.DATE_NSEC || CIPType == CIPType.DATE_AND_TIME_NSEC) { DateTime dt; if (DateTime.TryParse(obj.ToString(), out dt)) { obj = (ulong)(dt.Ticks - TIME_ORIGIN.Ticks) * 100; } } GetVariable().Value = obj; } public virtual void Create(CCaoController ctrl) { _controller = ctrl; CreateImpl(ctrl); } protected abstract void CreateImpl(CCaoController ctrl); protected virtual string GetTypeString() { return string.Format(" ({0})", CIPType.ToString()); } protected virtual string GetNodeString() { StringBuilder sb = new StringBuilder(); if (IsArrayMember) { sb.AppendFormat("[{0}]", ArrayIndex); } else { sb.Append(Name); } sb.Append(GetTypeString()); return sb.ToString(); } public TreeNode CreateNode() { TreeNode node = new TreeNode(GetNodeString()); node.Tag = this; foreach (VariableInfo child in ChildList) { node.Nodes.Add(child.CreateNode()); } return node; } private CCaoVariable GetVariable() { if (_variable == null) { _variable = _controller.AddVariable(GetVariableAccessName(), GetVariableOption()); } return _variable; } protected virtual string GetVariableOption() { return string.Empty; } } class GetValueResult { private object _value; private Type _type; public object Value { get { return _value; } set { _value = value; } } public Type Type { get { return _type; } set { _type = value; } } } }