using System; using System.Collections; using System.Collections.Generic; namespace SUISS.Cloud { public class SSPStorage { public SSPStorage(string storageKey, Dictionary storage, IMessageController messageController, IPlayernameController playernameController) { this._storageKey = storageKey; this._messageController = messageController; this._playernames = playernameController; this._storage = storage; } public Dictionary Contents { get { return this._storage; } private set { Dictionary contents = this.Contents; contents.Clear(); foreach (KeyValuePair keyValuePair in value) { contents.Add(keyValuePair.Key, keyValuePair.Value); } } } public CloudRequest TrySendToServer() { return new CloudRequest(this.CoTrySendToServer()); } private IEnumerator CoTrySendToServer() { CloudRequest, MessageErrors?> inboxCall = this._messageController.Inbox(this._storageKey); yield return inboxCall; if (inboxCall.Error != null) { yield return new YieldError(inboxCall.Error); } if (inboxCall.Result.Count == 0) { CloudRequest newMessageCall = this._messageController.SendMessage(new Message(this._playernames.PlayerUuid, this._storageKey, this.Contents)); yield return newMessageCall; if (newMessageCall.Error != null) { yield return new YieldError(newMessageCall.Error); } } else { IReceivedMessage storageMessage = inboxCall.Result[0]; CloudRequest updateCall = this._messageController.UpdateMessage(storageMessage, this.Contents); yield return updateCall; if (updateCall.Error != null) { if (updateCall.Error.Value == MessageErrors.ConcurrencyError) { CloudRequest fetchNewVersionCall = this._messageController.GetMessage(storageMessage); yield return fetchNewVersionCall; if (fetchNewVersionCall.Error != null) { yield return new YieldError(fetchNewVersionCall.Error); } this.Contents.Clear(); foreach (KeyValuePair keyValuePair in fetchNewVersionCall.Result.Data) { this.Contents.Add(keyValuePair.Key, keyValuePair.Value); } yield return new YieldError(new MessageErrors?(MessageErrors.ConcurrencyError)); } else { yield return new YieldError(updateCall.Error); } } } yield break; } private IMessageController _messageController; private IPlayernameController _playernames; private Dictionary _storage; private string _storageKey; } }