You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

96 lines
2.9 KiB

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. namespace SUISS.Cloud
  5. {
  6. public class SSPStorage
  7. {
  8. public SSPStorage(string storageKey, Dictionary<string, object> storage, IMessageController messageController, IPlayernameController playernameController)
  9. {
  10. this._storageKey = storageKey;
  11. this._messageController = messageController;
  12. this._playernames = playernameController;
  13. this._storage = storage;
  14. }
  15. public Dictionary<string, object> Contents
  16. {
  17. get
  18. {
  19. return this._storage;
  20. }
  21. private set
  22. {
  23. Dictionary<string, object> contents = this.Contents;
  24. contents.Clear();
  25. foreach (KeyValuePair<string, object> keyValuePair in value)
  26. {
  27. contents.Add(keyValuePair.Key, keyValuePair.Value);
  28. }
  29. }
  30. }
  31. public CloudRequest<MessageErrors?> TrySendToServer()
  32. {
  33. return new CloudRequest<MessageErrors?>(this.CoTrySendToServer());
  34. }
  35. private IEnumerator CoTrySendToServer()
  36. {
  37. CloudRequest<List<IReceivedMessage>, MessageErrors?> inboxCall = this._messageController.Inbox(this._storageKey);
  38. yield return inboxCall;
  39. if (inboxCall.Error != null)
  40. {
  41. yield return new YieldError<MessageErrors?>(inboxCall.Error);
  42. }
  43. if (inboxCall.Result.Count == 0)
  44. {
  45. CloudRequest<MessageErrors?> newMessageCall = this._messageController.SendMessage(new Message(this._playernames.PlayerUuid, this._storageKey, this.Contents));
  46. yield return newMessageCall;
  47. if (newMessageCall.Error != null)
  48. {
  49. yield return new YieldError<MessageErrors?>(newMessageCall.Error);
  50. }
  51. }
  52. else
  53. {
  54. IReceivedMessage storageMessage = inboxCall.Result[0];
  55. CloudRequest<MessageErrors?> updateCall = this._messageController.UpdateMessage(storageMessage, this.Contents);
  56. yield return updateCall;
  57. if (updateCall.Error != null)
  58. {
  59. if (updateCall.Error.Value == MessageErrors.ConcurrencyError)
  60. {
  61. CloudRequest<IReceivedMessage, MessageErrors?> fetchNewVersionCall = this._messageController.GetMessage(storageMessage);
  62. yield return fetchNewVersionCall;
  63. if (fetchNewVersionCall.Error != null)
  64. {
  65. yield return new YieldError<MessageErrors?>(fetchNewVersionCall.Error);
  66. }
  67. this.Contents.Clear();
  68. foreach (KeyValuePair<string, object> keyValuePair in fetchNewVersionCall.Result.Data)
  69. {
  70. this.Contents.Add(keyValuePair.Key, keyValuePair.Value);
  71. }
  72. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.ConcurrencyError));
  73. }
  74. else
  75. {
  76. yield return new YieldError<MessageErrors?>(updateCall.Error);
  77. }
  78. }
  79. }
  80. yield break;
  81. }
  82. private IMessageController _messageController;
  83. private IPlayernameController _playernames;
  84. private Dictionary<string, object> _storage;
  85. private string _storageKey;
  86. }
  87. }