No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 

143 líneas
3.7 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright © 2013—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com>
  5. // © 2017—2019 Sam Hocevar <sam@hocevar.net>
  6. //
  7. // Lol Engine is free software. It comes without any warranty, to
  8. // the extent permitted by applicable law. You can redistribute it
  9. // and/or modify it under the terms of the Do What the Fuck You Want
  10. // to Public License, Version 2, as published by the WTFPL Task Force.
  11. // See http://www.wtfpl.net/ for more details.
  12. //
  13. #include <lol/engine-internal.h>
  14. #include <string>
  15. #include <cstring>
  16. #include <cstdlib>
  17. #include <time.h>
  18. namespace lol
  19. {
  20. // This is needed to map MessageService::Send() to the JS when building the HTML.
  21. #if __EMSCRIPTEN__
  22. extern "C"
  23. {
  24. int C_Send(const char* message) { return (int)MessageService::Send(MessageBucket::AppIn, message); }
  25. //NOT IMPLEMENTED
  26. //bool C_FetchFirst(std::string& message);
  27. }
  28. #endif // __EMSCRIPTEN__
  29. /*
  30. * The global g_messageservice object, initialised by MessageService::Setup()
  31. */
  32. MessageService *g_messageservice = nullptr;
  33. //-----------------------------------------------------------------------------
  34. // Ctor/Dtor
  35. //----
  36. MessageService::MessageService()
  37. {
  38. }
  39. MessageService::~MessageService()
  40. {
  41. m_bucket.clear();
  42. }
  43. //Setup/Destroy
  44. void MessageService::Setup()
  45. {
  46. g_messageservice = new MessageService();
  47. g_messageservice->m_bucket.resize(MessageBucket::MAX);
  48. }
  49. void MessageService::Destroy()
  50. {
  51. delete g_messageservice;
  52. g_messageservice = nullptr;
  53. }
  54. //-----------------------------------------------------------------------------
  55. bool MessageService::Send(MessageBucket id, const std::string& message)
  56. {
  57. if (g_messageservice)
  58. {
  59. MessageService& g = *g_messageservice;
  60. array<MessageList>& bucket = g.m_bucket[id.ToScalar()];
  61. bucket << MessageList(time(nullptr), message);
  62. return true;
  63. }
  64. return false;
  65. }
  66. //----
  67. bool MessageService::FetchFirst(MessageBucket id, std::string& message)
  68. {
  69. if (g_messageservice)
  70. {
  71. ASSERT(0 <= id.ToScalar() && id.ToScalar() < g_messageservice->m_bucket.count());
  72. time_t timestamp;
  73. return g_messageservice->FetchFirst(id, message, timestamp);
  74. }
  75. return false;
  76. }
  77. bool MessageService::FetchFirst(MessageBucket id, std::string& message, time_t& timestamp)
  78. {
  79. if (g_messageservice)
  80. {
  81. ASSERT(0 <= id.ToScalar() && id.ToScalar() < g_messageservice->m_bucket.count());
  82. MessageService& g = *g_messageservice;
  83. array<MessageList>& bucket = g.m_bucket[id.ToScalar()];
  84. if (bucket.count())
  85. {
  86. message = bucket[0].m_message;
  87. timestamp = bucket[0].m_timestamp;
  88. bucket.remove(0);
  89. return true;
  90. }
  91. }
  92. return false;
  93. }
  94. //----
  95. bool MessageService::FetchAll(MessageBucket id, std::string& message)
  96. {
  97. if (g_messageservice)
  98. {
  99. ASSERT(0 <= id.ToScalar() && id.ToScalar() < g_messageservice->m_bucket.count());
  100. time_t timestamp;
  101. return g_messageservice->FetchAll(id, message, timestamp);
  102. }
  103. return false;
  104. }
  105. bool MessageService::FetchAll(MessageBucket id, std::string& message, time_t& first_timestamp)
  106. {
  107. if (g_messageservice)
  108. {
  109. ASSERT(0 <= id.ToScalar() && id.ToScalar() < g_messageservice->m_bucket.count());
  110. MessageService& g = *g_messageservice;
  111. array<MessageList>& bucket = g.m_bucket[id.ToScalar()];
  112. message = "";
  113. if (bucket.count())
  114. {
  115. first_timestamp = bucket[0].m_timestamp;
  116. for (int i = 0; i < bucket.count(); ++i)
  117. message += bucket[i].m_message;
  118. bucket.clear();
  119. return true;
  120. }
  121. }
  122. return false;
  123. }
  124. } /* namespace lol */