ActionManager.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #ifndef ACTIONMANAGER_CPP
  2. #define ACTIONMANAGER_CPP
  3. #include <random>
  4. #include "ActionManager.h"
  5. // #include "ActionRequest.h"
  6. // #include "ActionResult.h"
  7. using namespace std;
  8. static int getRandomInt(int a, int b){
  9. int max, min;
  10. if(a>b){
  11. max = a; min = b;
  12. }else{
  13. max = b; min = a;
  14. }
  15. random_device rd;
  16. mt19937 gen(rd());
  17. uniform_real_distribution<double> distr(min, max);
  18. return (int) distr(gen);
  19. }
  20. static string randomString(int len = 9) {
  21. const char alphanum[] =
  22. "0123456789"
  23. "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  24. "abcdefghijklmnopqrstuvwxyz";
  25. int stringLen = sizeof(alphanum) - 1;
  26. string str;
  27. for (int i = 0; i < len; i++) {
  28. int rnd = getRandomInt(0, stringLen);
  29. str += alphanum[rnd % stringLen];
  30. }
  31. return str;
  32. }
  33. ///ActionResult
  34. ///ActionRequest
  35. ///ActionManager
  36. ActionManager::ActionManager(){
  37. }
  38. ActionManager::~ActionManager(){
  39. if(hasAnyRequests()){
  40. while(hasAnyRequests()){
  41. ActionRequest* req = popFromQueue();
  42. ActionResult* res = getResultByID(req->getID());
  43. if(req){
  44. emit(req->getID());
  45. if(res){
  46. req->handle(res);
  47. }
  48. removeRequest(req->getID());
  49. removeResult(req->getID());
  50. }
  51. }
  52. }
  53. }
  54. bool ActionManager::hasAnyRequests(){
  55. return (!requests.empty());
  56. }
  57. bool ActionManager::isEmptyQueue(){
  58. return actionQueue.empty();
  59. }
  60. bool ActionManager::handleCurrRequest(){
  61. ActionRequest* req = popFromQueue();
  62. if(req){
  63. ActionResult* newRes = processRequest(req);
  64. ActionResult* oldRes = getResultByID(req->getID());
  65. ARS status = req->getStatus();
  66. if(status == ARS::FULFILLED){
  67. sendEvent(req->getID(), newRes);
  68. req->handle(newRes);
  69. }
  70. if(req->isWaiting()){
  71. pushToNext(req);
  72. results[req->getID()] = newRes;
  73. }else{
  74. removeRequest(req->getID());
  75. removeResult(req->getID());
  76. }
  77. return true;
  78. }
  79. return false;
  80. }
  81. ActionResult* ActionManager::processRequest(ActionRequest* req){
  82. ActionResult* oldRes = getResultByID(req->getID());
  83. ActionResult* newRes = NULL;
  84. if(req->isWaiting()){
  85. ARS oldState = req->getStatus();
  86. if(oldState == ARS::PROCESSING){
  87. req->waitOnce();
  88. }
  89. ActionResult* newRes = req->process(oldRes);
  90. ARS newState = req->getStatus();
  91. if(newState != oldState){
  92. req->onStateChange(newRes);
  93. }
  94. return newRes;
  95. }else{
  96. newRes = new ActionResult(*oldRes);
  97. }
  98. return newRes;
  99. }
  100. ActionRequest* ActionManager::getCurrentRequest(){
  101. ActionRequest* req = NULL;
  102. if(!actionQueue.empty()){
  103. req = actionQueue.front();
  104. }
  105. return req;
  106. }
  107. void ActionManager::pushRequest(ActionRequest* req){
  108. if(req==NULL) return;
  109. if(results.count(req->getID())<=0){
  110. requests[req->getID()] = req;
  111. results[req->getID()] = new ActionResult(req->getID());
  112. // req->changeStatus(ARS::PENDING);
  113. subscribe(req->getID(), req->getActionHandler());
  114. pushToQueue(req);
  115. }
  116. }
  117. ActionRequest* ActionManager::removeRequest(string id){
  118. ActionRequest* req = NULL;
  119. if(requests.count(id)>0){
  120. req = requests[id];
  121. if(req){
  122. requests.erase(id);
  123. }
  124. }
  125. return req;
  126. }
  127. ActionResult* ActionManager::removeResult(string id){
  128. ActionResult* res = NULL;
  129. if(results.count(id)>0){
  130. res = results[id];
  131. if(res){
  132. results.erase(id);
  133. }
  134. }
  135. return res;
  136. }
  137. void ActionManager::pushToQueue(ActionRequest* req){
  138. actionQueue.push(req);
  139. }
  140. void ActionManager::pushToNext(ActionRequest* req){
  141. nextQueue.push(req);
  142. }
  143. ActionRequest* ActionManager::popFromQueue(){
  144. ActionRequest* req = NULL;
  145. if(!actionQueue.empty()){
  146. req = actionQueue.front();
  147. actionQueue.pop();
  148. }
  149. return req;
  150. }
  151. ActionRequest* ActionManager::getRequestByID(string id){
  152. if(requests.count(id)>0){
  153. return requests[id];
  154. }
  155. return NULL;
  156. }
  157. ActionResult* ActionManager::getResultByID(string id){
  158. if(results.count(id)>0){
  159. return results[id];
  160. }
  161. return NULL;
  162. }
  163. void ActionManager::emit(string n){
  164. if(hasSignal(n)){
  165. SignalEvent* event = createSignalEvent(n);
  166. sendEvent(n, event);
  167. }
  168. }
  169. SignalEvent* ActionManager::createSignalEvent(string n){
  170. ActionResult* event = NULL;
  171. if(results.count(n)>0){
  172. event = results[n];
  173. }
  174. return event;
  175. }
  176. void ActionManager::placeNextQueue(){
  177. actionQueue = nextQueue;
  178. queue<ActionRequest*> newQueue;
  179. nextQueue = newQueue;
  180. }
  181. #endif