2
0
mirror of https://github.com/esiur/esiur-dotnet.git synced 2025-09-13 12:43:17 +00:00

AsyncReply

This commit is contained in:
2025-08-19 15:24:05 +03:00
parent 39da379569
commit 46b7744852
15 changed files with 1473 additions and 1721 deletions

View File

@@ -33,6 +33,7 @@ using Esiur.Resource;
using Esiur.Resource.Template;
using Esiur.Security.Authority;
using Esiur.Security.Membership;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
@@ -49,6 +50,39 @@ namespace Esiur.Net.IIP;
public partial class DistributedConnection : NetworkConnection, IStore
{
public delegate void ProtocolGeneralHandler(DistributedConnection connection, TransmissionType dataType, byte[] data);
public delegate void ProtocolRequestReplyHandler(DistributedConnection connection, uint callbackId, TransmissionType dataType, byte[] data);
//ProtocolGeneralHandler[] NotificationHandlers = new ProtocolGeneralHandler[]
//{
// IIPNotificationResourceDestroyed,
// IIPNotificationResourceReassigned,
// IIPNotificationResourceMoved,
// IIPNotificationSystemFailure,
// IIPNotificationPropertyModified
//};
//ProtocolRequestReplyHandler[] RequestHandlers = new ProtocolRequestReplyHandler[]
//{
// IIPRequestAttachResource,
// IIPRequest
//};
//ProtocolRequestReplyHandler[] ReplyHandlers = new ProtocolRequestReplyHandler[]
//{
//};
//ProtocolGeneralHandler[] ExtensionHandler = new ProtocolGeneralHandler[]
//{
//};
// Delegates
public delegate void ReadyEvent(DistributedConnection sender);
public delegate void ErrorEvent(DistributedConnection sender, byte errorCode, string errorMessage);
@@ -112,10 +146,10 @@ public partial class DistributedConnection : NetworkConnection, IStore
/// </summary>
public Session Session => session;
[Export]
[Export]
public virtual ConnectionStatus Status { get; private set; }
[Export]
[Export]
public virtual uint Jitter { get; private set; }
// Attributes
@@ -164,6 +198,9 @@ public partial class DistributedConnection : NetworkConnection, IStore
return true;
}
/// <summary>
/// Send data to the other end as parameters
/// </summary>
@@ -373,16 +410,11 @@ public partial class DistributedConnection : NetworkConnection, IStore
lastKeepAliveSent = now;
SendRequest(IIPPacketRequest.KeepAlive)
.AddDateTime(now)
.AddUInt32(interval)
.Done()
SendRequest(IIPPacketRequest.KeepAlive, now, interval)
.Then(x =>
{
Jitter = (uint)x[1];
Jitter = (uint)x;
keepAliveTimer.Start();
//Console.WriteLine($"Keep Alive Received {Jitter}");
}).Error(ex =>
{
keepAliveTimer.Stop();
@@ -393,9 +425,6 @@ public partial class DistributedConnection : NetworkConnection, IStore
Close();
});
//Console.WriteLine("Keep Alive sent");
}
public uint KeepAliveInterval { get; set; } = 30;
@@ -417,7 +446,6 @@ public partial class DistributedConnection : NetworkConnection, IStore
if (rt <= 0)
{
var size = ends - offset;
data.HoldFor(msg, offset, size, size + (uint)(-rt));
return ends;
@@ -427,311 +455,153 @@ public partial class DistributedConnection : NetworkConnection, IStore
offset += (uint)rt;
if (packet.DataType != null)
{
var dt = packet.DataType.Value;
if (packet.DataType == null)
return offset;
var (_, parsed) = Codec.Parse(msg, dt.Offset, this, null, dt);
parsed.Then(value =>
{
if (packet.Method == IIPPacketMethod.Notification)
{
switch (packet.Notification)
{
case IIPPacketNotification.ResourceDestroyed:
IIPNotificationResourceDestroyed(value);
break;
case IIPPacketNotification.ResourceReassigned:
IIPNotificationResourceReassigned(value);
break;
case IIPPacketNotification.ResourceMoved:
IIPNotificationResourceMoved(value);
break;
case IIPPacketNotification.SystemFailure:
IIPNotificationSystemFailure(value);
break;
case IIPPacketNotification.PropertyModified:
IIPNotificationPropertyModified()
}
}
});
}
if (packet.Method == IIPPacketMethod.Notification)
{
var dt = packet.DataType.Value;
switch (packet.Notification)
{
// Invoke
case IIPPacketNotification.PropertyModified:
IIPNotificationPropertyModified(dt, msg);
break;
case IIPPacketNotification.EventOccurred:
IIPNotificationEventOccurred(dt, msg);
break;
// Manage
case IIPPacketNotification.ResourceDestroyed:
case IIPPacketEvent.ResourceReassigned:
IIPEventResourceReassigned(packet.ResourceId, packet.NewResourceId);
IIPNotificationResourceDestroyed(dt, msg);
break;
case IIPPacketEvent.ResourceDestroyed:
IIPEventResourceDestroyed(packet.ResourceId);
case IIPPacketNotification.ResourceReassigned:
IIPNotificationResourceReassigned(dt, msg);
break;
case IIPPacketEvent.PropertyUpdated:
IIPEventPropertyUpdated(packet.ResourceId, packet.MethodIndex, (TransmissionType)packet.DataType, msg);
case IIPPacketNotification.ResourceMoved:
IIPNotificationResourceMoved(dt, msg);
break;
case IIPPacketEvent.EventOccurred:
IIPEventEventOccurred(packet.ResourceId, packet.MethodIndex, (TransmissionType)packet.DataType, msg);
break;
case IIPPacketEvent.ChildAdded:
IIPEventChildAdded(packet.ResourceId, packet.ChildId);
break;
case IIPPacketEvent.ChildRemoved:
IIPEventChildRemoved(packet.ResourceId, packet.ChildId);
break;
case IIPPacketEvent.Renamed:
IIPEventRenamed(packet.ResourceId, packet.ResourceLink);
break;
case IIPPacketEvent.AttributesUpdated:
// @TODO: fix this
//IIPEventAttributesUpdated(packet.ResourceId, packet.Content);
case IIPPacketNotification.SystemFailure:
IIPNotificationSystemFailure(dt, msg);
break;
}
}
else if (packet.Command == IIPPacketCommand.Request)
else if (packet.Method == IIPPacketMethod.Request)
{
switch (packet.Action)
var dt = packet.DataType.Value;
switch (packet.Request)
{
// Manage
case IIPPacketRequest.AttachResource:
IIPRequestAttachResource(packet.CallbackId, packet.ResourceId);
break;
case IIPPacketRequest.ReattachResource:
IIPRequestReattachResource(packet.CallbackId, packet.ResourceId, packet.ResourceAge);
break;
case IIPPacketRequest.DetachResource:
IIPRequestDetachResource(packet.CallbackId, packet.ResourceId);
break;
case IIPPacketRequest.CreateResource:
//@TODO : fix this
//IIPRequestCreateResource(packet.CallbackId, packet.StoreId, packet.ResourceId, packet.Content);
break;
case IIPPacketRequest.DeleteResource:
IIPRequestDeleteResource(packet.CallbackId, packet.ResourceId);
break;
case IIPPacketRequest.AddChild:
IIPRequestAddChild(packet.CallbackId, packet.ResourceId, packet.ChildId);
break;
case IIPPacketRequest.RemoveChild:
IIPRequestRemoveChild(packet.CallbackId, packet.ResourceId, packet.ChildId);
break;
case IIPPacketRequest.RenameResource:
IIPRequestRenameResource(packet.CallbackId, packet.ResourceId, packet.ResourceName);
break;
// Inquire
case IIPPacketRequest.TemplateFromClassName:
IIPRequestTemplateFromClassName(packet.CallbackId, packet.ClassName);
break;
case IIPPacketRequest.TemplateFromClassId:
IIPRequestTemplateFromClassId(packet.CallbackId, packet.ClassId);
break;
case IIPPacketRequest.TemplateFromResourceId:
IIPRequestTemplateFromResourceId(packet.CallbackId, packet.ResourceId);
break;
case IIPPacketRequest.QueryLink:
IIPRequestQueryResources(packet.CallbackId, packet.ResourceLink);
break;
case IIPPacketRequest.ResourceChildren:
IIPRequestResourceChildren(packet.CallbackId, packet.ResourceId);
break;
case IIPPacketRequest.ResourceParents:
IIPRequestResourceParents(packet.CallbackId, packet.ResourceId);
break;
case IIPPacketRequest.ResourceHistory:
IIPRequestInquireResourceHistory(packet.CallbackId, packet.ResourceId, packet.FromDate, packet.ToDate);
break;
case IIPPacketRequest.LinkTemplates:
IIPRequestLinkTemplates(packet.CallbackId, packet.ResourceLink);
break;
// Invoke
case IIPPacketRequest.InvokeFunction:
IIPRequestInvokeFunction(packet.CallbackId, packet.ResourceId, packet.MethodIndex, (TransmissionType)packet.DataType, msg);
IIPRequestInvokeFunction(packet.CallbackId, dt, msg);
break;
//case IIPPacket.IIPPacketAction.InvokeFunctionNamedArguments:
// IIPRequestInvokeFunctionNamedArguments(packet.CallbackId, packet.ResourceId, packet.MethodIndex, (TransmissionType)packet.DataType, msg);
// break;
//case IIPPacket.IIPPacketAction.GetProperty:
// IIPRequestGetProperty(packet.CallbackId, packet.ResourceId, packet.MethodIndex);
// break;
//case IIPPacket.IIPPacketAction.GetPropertyIfModified:
// IIPRequestGetPropertyIfModifiedSince(packet.CallbackId, packet.ResourceId, packet.MethodIndex, packet.ResourceAge);
// break;
case IIPPacketRequest.Listen:
IIPRequestListen(packet.CallbackId, packet.ResourceId, packet.MethodIndex);
break;
case IIPPacketRequest.Unlisten:
IIPRequestUnlisten(packet.CallbackId, packet.ResourceId, packet.MethodIndex);
break;
case IIPPacketRequest.SetProperty:
IIPRequestSetProperty(packet.CallbackId, packet.ResourceId, packet.MethodIndex, (TransmissionType)packet.DataType, msg);
IIPRequestSetProperty(packet.CallbackId, dt, msg);
break;
// Attribute
case IIPPacketRequest.GetAllAttributes:
// @TODO : fix this
//IIPRequestGetAttributes(packet.CallbackId, packet.ResourceId, packet.Content, true);
case IIPPacketRequest.Subscribe:
IIPRequestSubscribe(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.UpdateAllAttributes:
// @TODO : fix this
//IIPRequestUpdateAttributes(packet.CallbackId, packet.ResourceId, packet.Content, true);
case IIPPacketRequest.Unsubscribe:
IIPRequestUnsubscribe(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.ClearAllAttributes:
// @TODO : fix this
//IIPRequestClearAttributes(packet.CallbackId, packet.ResourceId, packet.Content, true);
// Inquire
case IIPPacketRequest.TemplateFromClassName:
IIPRequestTemplateFromClassName(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.GetAttributes:
// @TODO : fix this
//IIPRequestGetAttributes(packet.CallbackId, packet.ResourceId, packet.Content, false);
case IIPPacketRequest.TemplateFromClassId:
IIPRequestTemplateFromClassId(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.UpdateAttributes:
// @TODO : fix this
//IIPRequestUpdateAttributes(packet.CallbackId, packet.ResourceId, packet.Content, false);
case IIPPacketRequest.TemplateFromResourceId:
IIPRequestTemplateFromResourceId(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.ClearAttributes:
// @TODO : fix this
//IIPRequestClearAttributes(packet.CallbackId, packet.ResourceId, packet.Content, false);
case IIPPacketRequest.Query:
IIPRequestQueryResources(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.KeepAlive:
IIPRequestKeepAlive(packet.CallbackId, packet.CurrentTime, packet.Interval);
case IIPPacketRequest.LinkTemplates:
IIPRequestLinkTemplates(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.ProcedureCall:
IIPRequestProcedureCall(packet.CallbackId, packet.Procedure, (TransmissionType)packet.DataType, msg);
case IIPPacketRequest.Token:
IIPRequestToken(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.StaticCall:
IIPRequestStaticCall(packet.CallbackId, packet.ClassId, packet.MethodIndex, (TransmissionType)packet.DataType, msg);
case IIPPacketRequest.GetResourceIdByLink:
IIPRequestGetResourceIdByLink(packet.CallbackId, dt, msg);
break;
}
}
else if (packet.Command == IIPPacketCommand.Reply)
{
switch (packet.Action)
{
// Manage
case IIPPacketRequest.AttachResource:
IIPReply(packet.CallbackId, packet.ClassId, packet.ResourceAge, packet.ResourceLink, packet.DataType, msg);
IIPRequestAttachResource(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.ReattachResource:
IIPReply(packet.CallbackId, packet.ResourceAge, packet.DataType, msg);
IIPRequestReattachResource(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.DetachResource:
IIPReply(packet.CallbackId);
IIPRequestDetachResource(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.CreateResource:
IIPReply(packet.CallbackId, packet.ResourceId);
IIPRequestCreateResource(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.DeleteResource:
case IIPPacketRequest.AddChild:
case IIPPacketRequest.RemoveChild:
case IIPPacketRequest.RenameResource:
IIPReply(packet.CallbackId);
IIPRequestDeleteResource(packet.CallbackId, dt, msg);
break;
// Inquire
case IIPPacketRequest.TemplateFromClassName:
case IIPPacketRequest.TemplateFromClassId:
case IIPPacketRequest.TemplateFromResourceId:
var content = msg.Clip(packet.DataType.Value.Offset, (uint)packet.DataType.Value.ContentLength);
IIPReply(packet.CallbackId, TypeTemplate.Parse(content));
case IIPPacketRequest.MoveResource:
IIPRequestMoveResource(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.QueryLink:
case IIPPacketRequest.ResourceChildren:
case IIPPacketRequest.ResourceParents:
case IIPPacketRequest.ResourceHistory:
case IIPPacketRequest.LinkTemplates:
IIPReply(packet.CallbackId, (TransmissionType)packet.DataType, msg);// packet.Content);
break;
// Invoke
case IIPPacketRequest.InvokeFunction:
case IIPPacketRequest.StaticCall:
case IIPPacketRequest.ProcedureCall:
IIPReplyInvoke(packet.CallbackId, (TransmissionType)packet.DataType, msg);// packet.Content);
break;
//case IIPPacket.IIPPacketAction.GetProperty:
// IIPReply(packet.CallbackId, packet.Content);
// break;
//case IIPPacket.IIPPacketAction.GetPropertyIfModified:
// IIPReply(packet.CallbackId, packet.Content);
// break;
case IIPPacketRequest.Listen:
case IIPPacketRequest.Unlisten:
case IIPPacketRequest.SetProperty:
IIPReply(packet.CallbackId);
break;
// Attribute
case IIPPacketRequest.GetAllAttributes:
case IIPPacketRequest.GetAttributes:
IIPReply(packet.CallbackId, (TransmissionType)packet.DataType, msg);// packet.Content);
break;
case IIPPacketRequest.UpdateAllAttributes:
case IIPPacketRequest.UpdateAttributes:
case IIPPacketRequest.ClearAllAttributes:
case IIPPacketRequest.ClearAttributes:
IIPReply(packet.CallbackId);
break;
// Static
case IIPPacketRequest.KeepAlive:
IIPReply(packet.CallbackId, packet.CurrentTime, packet.Jitter);
IIPRequestKeepAlive(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.ProcedureCall:
IIPRequestProcedureCall(packet.CallbackId, dt, msg);
break;
case IIPPacketRequest.StaticCall:
IIPRequestStaticCall(packet.CallbackId, dt, msg);
break;
}
}
else if (packet.Command == IIPPacketCommand.Report)
else if (packet.Method == IIPPacketMethod.Reply)
{
switch (packet.Report)
{
case IIPPacketReport.ManagementError:
IIPReportError(packet.CallbackId, ErrorType.Management, packet.ErrorCode, null);
break;
case IIPPacketReport.ExecutionError:
IIPReportError(packet.CallbackId, ErrorType.Exception, packet.ErrorCode, packet.ErrorMessage);
break;
case IIPPacketReport.ProgressReport:
IIPReportProgress(packet.CallbackId, ProgressType.Execution, packet.ProgressValue, packet.ProgressMax);
break;
case IIPPacketReport.ChunkStream:
IIPReportChunk(packet.CallbackId, (TransmissionType)packet.DataType, msg);
var dt = packet.DataType.Value;
switch (packet.Reply)
{
case IIPPacketReply.Completed:
IIPReplyCompleted(packet.CallbackId, dt, msg);
break;
case IIPPacketReply.Propagated:
IIPReplyPropagated(packet.CallbackId, dt, msg);
break;
case IIPPacketReply.PermissionError:
IIPReplyError(packet.CallbackId, dt, msg, ErrorType.Management);
break;
case IIPPacketReply.ExecutionError:
IIPReplyError(packet.CallbackId, dt, msg, ErrorType.Exception);
break;
case IIPPacketReply.Progress:
IIPReplyProgress(packet.CallbackId, dt, msg);
break;
case IIPPacketReply.Chunk:
IIPReplyChunk(packet.CallbackId, dt, msg);
break;
case IIPPacketReply.Warning:
IIPReplyWarning(packet.Extension, dt, msg);
break;
}
}
else if (packet.Method == IIPPacketMethod.Extension)
{
IIPExtensionAction(packet.Extension, packet.DataType, msg);
}
}
}
else
{
// check if the reqeust through websockets
// check if the request through Websockets
if (initialPacket)
{
@@ -755,7 +625,6 @@ public partial class DistributedConnection : NetworkConnection, IStore
HTTPConnection.Upgrade(req, res);
res.Compose(HTTPComposeOption.AllCalculateLength);
Send(res.Data);
// replace my socket with websockets
@@ -784,11 +653,8 @@ public partial class DistributedConnection : NetworkConnection, IStore
}
}
var rt = authPacket.Parse(msg, offset, ends);
if (rt <= 0)
{
data.HoldFor(msg, ends + (uint)(-rt));
@@ -810,9 +676,6 @@ public partial class DistributedConnection : NetworkConnection, IStore
}
return offset;
//if (offset < ends)
// processPacket(msg, offset, ends, data, chunkId);
}
private void ProcessClientAuth(byte[] data)
@@ -831,9 +694,9 @@ public partial class DistributedConnection : NetworkConnection, IStore
var dataType = authPacket.DataType.Value;
var (_, parsed) = Codec.Parse(data, dataType.Offset, this, null, dataType);
var (_, parsed) = Codec.ParseSync(data, dataType.Offset, dataType);
var rt = (Map<byte, object>)parsed.Wait();
var rt = (Map<byte, object>)parsed;
session.RemoteHeaders = rt.Select(x => new KeyValuePair<IIPAuthPacketHeader, object>((IIPAuthPacketHeader)x.Key, x.Value));
@@ -924,7 +787,7 @@ public partial class DistributedConnection : NetworkConnection, IStore
ready = true;
Status = ConnectionStatus.Connected;
// put it in the warehouse
if (this.Instance == null)
@@ -957,8 +820,8 @@ public partial class DistributedConnection : NetworkConnection, IStore
else if (authPacket.Event == IIPAuthPacketEvent.IAuthPlain)
{
var dataType = authPacket.DataType.Value;
var (_, parsed) = Codec.Parse(data, dataType.Offset, this, null, dataType);
var rt = (Map<byte, object>)parsed.Wait();
var (_, parsed) = Codec.ParseSync(data, dataType.Offset, dataType);
var rt = (Map<byte, object>)parsed;
var headers = rt.Select(x => new KeyValuePair<IIPAuthPacketIAuthHeader, object>((IIPAuthPacketIAuthHeader)x.Key, x.Value));
var iAuthRequest = new AuthorizationRequest(headers);
@@ -983,7 +846,8 @@ public partial class DistributedConnection : NetworkConnection, IStore
.Done();
})
.Timeout(iAuthRequest.Timeout * 1000,
() => {
() =>
{
SendParams()
.AddUInt8((byte)IIPAuthPacketEvent.ErrorTerminate)
.AddUInt8((byte)ExceptionCode.Timeout)
@@ -996,8 +860,8 @@ public partial class DistributedConnection : NetworkConnection, IStore
else if (authPacket.Event == IIPAuthPacketEvent.IAuthHashed)
{
var dataType = authPacket.DataType.Value;
var (_, parsed) = Codec.Parse(data, dataType.Offset, this, null, dataType);
var rt = (Map<byte, object>)parsed.Wait();
var (_, parsed) = Codec.ParseSync(data, dataType.Offset, dataType);
var rt = (Map<byte, object>)parsed;
var headers = rt.Select(x => new KeyValuePair<IIPAuthPacketIAuthHeader, object>((IIPAuthPacketIAuthHeader)x.Key, x.Value));
@@ -1033,14 +897,15 @@ public partial class DistributedConnection : NetworkConnection, IStore
.Done();
})
.Timeout(iAuthRequest.Timeout * 1000,
() => {
SendParams()
.AddUInt8((byte)IIPAuthPacketEvent.ErrorTerminate)
.AddUInt8((byte)ExceptionCode.Timeout)
.AddUInt16(7)
.AddString("Timeout")
.Done();
});
() =>
{
SendParams()
.AddUInt8((byte)IIPAuthPacketEvent.ErrorTerminate)
.AddUInt8((byte)ExceptionCode.Timeout)
.AddUInt16(7)
.AddString("Timeout")
.Done();
});
}
}
else if (authPacket.Event == IIPAuthPacketEvent.IAuthEncrypted)
@@ -1058,10 +923,9 @@ public partial class DistributedConnection : NetworkConnection, IStore
var dataType = authPacket.DataType.Value;
var (_, parsed) = Codec.Parse(data, dataType.Offset, this, null, dataType);
var rt = (Map<byte, object>)parsed.Wait();
var (_, parsed) = Codec.ParseSync(data, dataType.Offset, dataType);
var rt = (Map<byte, object>)parsed;
session.RemoteHeaders = rt.Select(x => new KeyValuePair<IIPAuthPacketHeader, object>((IIPAuthPacketHeader)x.Key, x.Value));
@@ -1250,7 +1114,7 @@ public partial class DistributedConnection : NetworkConnection, IStore
reply = Server.Membership.GetToken((ulong)session.RemoteHeaders[IIPAuthPacketHeader.TokenIndex],
(string)session.RemoteHeaders[IIPAuthPacketHeader.Domain]);
}
else
else
{
throw new NotImplementedException("Authentication method unsupported.");
}
@@ -1317,9 +1181,7 @@ public partial class DistributedConnection : NetworkConnection, IStore
var reference = authPacket.Reference;
var dataType = authPacket.DataType.Value;
var (_, parsed) = Codec.Parse(data, dataType.Offset, this, null, dataType);
var value = parsed.Wait();
var (_, value) = Codec.ParseSync(data, dataType.Offset, dataType);
Server.Membership.AuthorizePlain(session, reference, value)
.Then(x => ProcessAuthorization(x));
@@ -1386,7 +1248,7 @@ public partial class DistributedConnection : NetworkConnection, IStore
session.Id = new byte[32];
r.NextBytes(session.Id);
var accountId = session.AuthorizedAccount.ToBytes();
SendParams()
.AddUInt8((byte)IIPAuthPacketEvent.IndicationEstablished)
.AddUInt8((byte)session.Id.Length)
@@ -1687,33 +1549,22 @@ public partial class DistributedConnection : NetworkConnection, IStore
try
{
var ar = await SendRequest(IIPPacketRequest.QueryLink)
.AddUInt16((ushort)link.Length)
.AddUInt8Array(link)
.Done();
var id = (uint)await SendRequest(IIPPacketRequest.GetResourceIdByLink, link);
var dataType = (TransmissionType)ar[0];
var data = ar[1] as byte[];
if (dataType.Identifier == TransmissionTypeIdentifier.ResourceList)
{
// remove from suspended.
suspendedResources.Remove(r.DistributedResourceInstanceId);
// remove from suspended.
suspendedResources.Remove(r.DistributedResourceInstanceId);
// id changed ?
if (id != r.DistributedResourceInstanceId)
r.DistributedResourceInstanceId = id;
// parse them as int
var id = data.GetUInt32(8, Endian.Little);
neededResources[id] = r;
// id changed ?
if (id != r.DistributedResourceInstanceId)
r.DistributedResourceInstanceId = id;
await Fetch(id, null);
neededResources[id] = r;
Global.Log("DistributedConnection", LogType.Debug, "Restored " + id);
await Fetch(id, null);
Global.Log("DistributedConnection", LogType.Debug, "Restored " + id);
}
}
catch (AsyncException ex)
{

File diff suppressed because it is too large Load Diff

View File

@@ -68,7 +68,7 @@ public class DistributedResource : DynamicObject, IResource, INotifyPropertyChan
string link;
//ulong age;
//ulong[] ages;
protected object[] properties;
internal List<DistributedResource> parents = new List<DistributedResource>();
internal List<DistributedResource> children = new List<DistributedResource>();
@@ -174,16 +174,31 @@ public class DistributedResource : DynamicObject, IResource, INotifyPropertyChan
/// <returns></returns>
internal PropertyValue[] _Serialize()
{
var props = new PropertyValue[properties.Length];
for (byte i = 0; i < properties.Length; i++)
props[i] = new PropertyValue(properties[i], Instance.GetAge(i), Instance.GetModificationDate(i));
props[i] = new PropertyValue(properties[i],
Instance.GetAge(i),
Instance.GetModificationDate(i));
return props;
}
internal Map<byte, PropertyValue> _SerializeAfter(ulong age = 0)
{
var rt = new Map<byte, PropertyValue>();
for (byte i = 0; i < properties.Length; i++)
if (Instance.GetAge(i) > age)
rt.Add(i, new PropertyValue(properties[i],
Instance.GetAge(i),
Instance.GetModificationDate(i)));
return rt;
}
internal bool _Attach(PropertyValue[] properties)
{
if (attached)
@@ -568,7 +583,7 @@ public class DistributedResource : DynamicObject, IResource, INotifyPropertyChan
protected virtual void EmitPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
~DistributedResource()