96 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Intel.Management.Wsman;
namespace Intel.Management.PSModule.Amt
{
class ClockService : DriveContainer
{
public ClockService( DriveItem parent)
: base("Clock", parent)
{
}
public override void GetChildItems(ChildWriter writer)
{
DateTime standardTime = new DateTime(1970, 1, 1);
IWsmanConnection conn = ((AmtRootService)GetRoot()).Connection;
IManagedReference refToClock = conn.NewReference("AMT_TimeSynchronizationService");
IManagedInstance inputObj = refToClock.CreateMethodInput("GetLowAccuracyTimeSynch");
IManagedInstance outObj = refToClock.InvokeMethod(inputObj);
uint ta0 = uint.Parse( outObj.GetProperty("Ta0").ToString());
DateTime time = standardTime.AddSeconds(ta0);
writer.Add(new DriveEntry("LocalTime", time.ToLocalTime(), this));
writer.Add(new DriveEntry("UniversalTime", time, this));
}
public override void Invoke(DriveProvider provider)
{
DateTime standardTime = new DateTime(1970, 1, 1);
IWsmanConnection conn = ((AmtRootService)GetRoot()).Connection;
IManagedReference refToClock = conn.NewReference("AMT_TimeSynchronizationService");
IManagedInstance inputObj = refToClock.CreateMethodInput("GetLowAccuracyTimeSynch");
IManagedInstance outObj = refToClock.InvokeMethod(inputObj);
if (!outObj.GetProperty("ReturnValue").ToString().Equals("0"))
AmtException.ThrowInvokeError(outObj);
uint ta0 = uint.Parse(outObj.GetProperty("Ta0").ToString());
uint tm1 =(uint)DateTime.UtcNow.Subtract(standardTime).TotalSeconds;
inputObj = refToClock.CreateMethodInput("SetHighAccuracyTimeSynch");
inputObj.SetProperty("Ta0", ta0.ToString());
inputObj.SetProperty("Tm1", tm1.ToString());
inputObj.SetProperty("Tm2", tm1.ToString());
outObj = refToClock.InvokeMethod(inputObj);
switch (outObj.GetProperty("ReturnValue").ToString())
{
case "0":
break;
case "1":
throw new WsmanInvokeException("Internal Error");
case "36":
throw new WsmanInvokeException("Invalid Parameter");
case "38":
throw new WsmanInvokeException("Flash write limit exceeded");
default:
throw new WsmanInvokeException("AMT error " + outObj.GetProperty("ReturnValue").ToString());
}
_items = null;
}
public override object GetReturnObject()
{
return new NameValuePairItem(Name, Value);
}
}
}