/// <summary> /// Performs the stored action. Returns true if the action was /// successful. /// </summary> public void DoAction() { if (SelectedAction.CanDo()) { // Action about to start! OnActionStarted?.Invoke(SelectedActor, SelectedAction); // Do the action! SelectedAction.Do(); // Notify senpai. OnActionComplete?.Invoke(SelectedActor, SelectedAction); } }
public static void SafeAsyncReceive(this Socket serviceSocket, byte[] buffer, int offset, int len, OnActionComplete completeCallback) { if (!serviceSocket.Connected) { OperationWasCancelled(serviceSocket, completeCallback, buffer, offset); return; } try { serviceSocket.BeginReceive(buffer, offset, len, SocketFlags.None, out var brerr, ar => { if (!serviceSocket.Connected) { OperationWasCancelled(serviceSocket, completeCallback, buffer, offset); return; } try { var result = serviceSocket.EndReceive(ar, out var ererr); if (result <= 0 || ererr != SocketError.Success) { OperationWasCancelled(serviceSocket, completeCallback, buffer, offset); return; } completeCallback(serviceSocket, ar.CompletedSynchronously ? ActorOperationResult.CompletedSyncroniously : ActorOperationResult.Completed, result, buffer, offset); } catch (SocketException e) { #if DEBUG Debug.WriteLine($"Socket exception on end receive operation: {e}"); OperationWasCancelled(serviceSocket, completeCallback, buffer, offset); #endif } catch (ObjectDisposedException e) { #if DEBUG Debug.WriteLine($"Socket disposed exception on end receive operation: {e}"); OperationWasCancelled(serviceSocket, completeCallback, buffer, offset); #endif } }, serviceSocket); } catch (SocketException e) { #if DEBUG Debug.WriteLine($"Socket exception on attempt to receive operation: {e}"); OperationWasCancelled(serviceSocket, completeCallback, buffer, offset); #endif } catch (ObjectDisposedException e) { #if DEBUG Debug.WriteLine($"Socket disposed exception on attempt to receive operation: {e}"); OperationWasCancelled(serviceSocket, completeCallback, buffer, offset); #endif } }
public static void SafeAsyncReceive(this Socket serviceSocket, byte[] buffer, OnActionComplete completeCallback) { SafeAsyncReceive(serviceSocket, buffer, 0, buffer.Length, completeCallback); }
public static void SafeAsyncReceive(this Socket serviceSocket, int len, OnActionComplete completeCallback) { var buffer = new byte[len]; SafeAsyncReceive(serviceSocket, buffer, 0, len, completeCallback); }
private static void OperationWasCancelled(Socket serviceSocket, OnActionComplete action, byte[] buffer, int offset) { action(serviceSocket, ActorOperationResult.Canceled, 0, buffer, offset); }
public static void AsyncReceiveFixed(this Socket serviceSocket, byte[] buffer, int offset, int len, OnActionComplete completeCallback) { SafeAsyncReceive(serviceSocket, buffer, offset, len, (owner, result, i, bytes, bufferOffset) => { if (!serviceSocket.Connected) { OperationWasCancelled(serviceSocket, completeCallback, buffer, offset); return; } if (i < len) { AsyncReceiveFixed(serviceSocket, buffer, offset + i, len - i, completeCallback); } else { completeCallback(serviceSocket, ActorOperationResult.Completed, len, buffer, offset); } }); }