using System;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using TDMS.Common;
using TDMS.Externals;
namespace TDMS.Default
{
internal abstract class BaseTDMSLevel : ITDMSLevel
{
protected IntPtr _SelfPtr;
internal IntPtr GetPtr()
{
return _SelfPtr;
}
[AllowNull]
public PropertyOperator PropertyOperator { get; protected internal set; }
#region Implementation of ITDMSLevelPropertyOperation
///
public virtual void CreateOrUpdateProperty(string propertyName, T propertyValue)
{
if (!PropertyExists(propertyName))
CreateProperty(propertyName, propertyValue);
else
UpdateProperty(propertyName, propertyValue);
}
protected virtual void CreateProperty(string propertyName, T propertyValue)
{
int success;
switch (propertyValue)
{
case string stringValue:
PropertyOperator.CreateStringValue(propertyName, Tail(stringValue)); break;
case byte byteValue:
PropertyOperator.CreateByteValue(propertyName, byteValue); break;
case short shortValue:
PropertyOperator.CreateShortValue(propertyName, shortValue); break;
case int intValue:
PropertyOperator.CreateIntValue(propertyName, intValue); break;
case float floatValue:
PropertyOperator.CreateFloatValue(propertyName, floatValue); break;
case double doubleValue:
PropertyOperator.CreateDoubleValue(propertyName, doubleValue); break;
case DateTime dateTimeValue:
PropertyOperator.CreateDateTimeValue(propertyName, dateTimeValue); break;
default:
throw new ArgumentException("Unsupported property value type");
}
}
protected virtual void UpdateProperty(string propertyName, T propertyValue)
{
int success;
switch (propertyValue)
{
case string stringValue:
PropertyOperator.SetStringValue(propertyName, Tail(stringValue)); break;
case byte byteValue:
PropertyOperator.SetByteValue(propertyName, byteValue); break;
case short shortValue:
PropertyOperator.SetShortValue(propertyName, shortValue); break;
case int intValue:
PropertyOperator.SetIntValue(propertyName, intValue); break;
case float floatValue:
PropertyOperator.SetFloatValue(propertyName, floatValue); break;
case double doubleValue:
PropertyOperator.SetDoubleValue(propertyName, doubleValue); break;
case DateTime dateTimeValue:
PropertyOperator.SetDateTimeValue(propertyName, dateTimeValue); break;
default:
throw new ArgumentException("Unsupported property value type");
}
}
///
public virtual bool PropertyExists(string propertyName)
{
return PropertyOperator.Exists(propertyName);
}
///
public string[] GetPropertyNames()
{
return PropertyOperator.GetPropertyNames();
}
///
public virtual bool TryGetProperty(string propertyName, out T propertyValue)
{
if(!PropertyExists(propertyName))
{
propertyValue = default;
return false;
}
var srcDataType = PropertyOperator.GetDataType(propertyName);
var type = typeof(T).ToDataType();
if(srcDataType != type)
{
var e = new InvalidCastException(
$"The data type of the property '{propertyName}' is not '{type}', is '{srcDataType}'.");
throw new TDMSErrorException($"{type} is error input arg", e);
}
switch (type)
{
case TDMSDataType.String:
{
propertyValue = (T)(object)PropertyOperator.GetStringValue(propertyName);
return true;
}
case TDMSDataType.UInt8:
{
propertyValue = (T)(object)PropertyOperator.GetByteValue(propertyName);
return true;
}
case TDMSDataType.Int16:
{
propertyValue = (T)(object)PropertyOperator.GetShortValue(propertyName);
return true;
}
case TDMSDataType.Int32:
{
propertyValue = (T)(object)PropertyOperator.GetIntValue(propertyName);
return true;
}
case TDMSDataType.Float:
{
propertyValue = (T)(object)PropertyOperator.GetFloatValue(propertyName);
return true;
}
case TDMSDataType.Double:
{
propertyValue = (T)(object)PropertyOperator.GetDoubleValue(propertyName);
return true;
}
case TDMSDataType.Timestamp:
{
propertyValue = (T)(object)PropertyOperator.GetDateTimeValue(propertyName);
return true;
}
case TDMSDataType.UnDefine:
default:
throw new InvalidEnumArgumentException();
}
}
#endregion
#region Implementation of ITDMSLevel
protected void SetNameAndDescription()
{
Name = GetDefaultProperty(Constants.DDC_LEVEL_NAME);
Description = GetDefaultProperty(Constants.DDC_LEVEL_DESCRIPTION);
}
/// 快速获取层级的默认属性值
protected string GetDefaultProperty(string propertyName)
{
var has = TryGetProperty(propertyName, out var propertyValue);
if(!has)
throw new TDMSErrorException($"Failed to retrieve the default '{propertyName}' property.");
return propertyValue;
}
///
public string Name { get; private set; }
///
public string Description { get; private set; }
///
public abstract bool Close();
///
public abstract ulong ChildCount { get; }
///
public abstract bool Clear();
///
public abstract bool Contains(string levelName);
///
public abstract bool TryGetItem(string levelName, out ITDMSLevel level);
///
public abstract bool Remove(string levelName);
///
public abstract bool RemoveAt(int index);
#endregion
#region Implementation of IDisposable
protected bool _IsClosed;
~BaseTDMSLevel()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
PropertyOperator?.Dispose();
if(_SelfPtr != IntPtr.Zero)
{
_IsClosed = Close();
_SelfPtr = IntPtr.Zero;
}
if(disposing)
{
// 释放托管资源
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
protected static string Tail(string source)
{
return $"{source}";
}
}
}