void IClient::handleString(ByteArray &piece, string &str, shared_ptr<Invoke> &baInvoke, size_t size) { static size_t CLOSED_PARENTHESIS = string("</invoke>").size(); if (piece.getPosition() >= size) return; // LIST OF INVOKE MESSAGES list<shared_ptr<Invoke>> invokeList; // READ STRING string &pieceString = piece.read<string>(); str.append(pieceString); WeakString wstr = str; vector<WeakString> &wstrArray = wstr.betweens("<invoke ", "</invoke>"); for (size_t i = 0; i < wstrArray.size(); i++) { string &message = "<invoke " + wstrArray[i].str() + "</invoke>"; shared_ptr<Invoke> invoke( new Invoke() ); invoke->construct(make_shared<XML>(message)); invokeList.push_back(invoke); } /*list<shared_ptr<Invoke>> invokeList; pair<size_t, size_t> posPair = {-1, -1}; pair<size_t, size_t> sizePair = {0, 0}; pair<size_t, size_t> indexPair = {0, 0}; size_t endIndex = -1; while (true) { // FIND WORDS pair<size_t, size_t> myPair = { str.find("<invoke ", indexPair.first), str.find("</invoke>", indexPair.second) }; // COUNTS if (myPair.first != -1) { sizePair.first++; indexPair.first = myPair.first + string("<invoke ").size(); } if (myPair.second != -1) { sizePair.second++; indexPair.second = myPair.second + string("</invoke>").size(); } // IF AN INVOKE MESSAGE HAS FOUND if (sizePair.first == sizePair.second && sizePair.first != 0) { if (posPair.first == -1 && posPair.second == -1) posPair = myPair; else posPair.second = myPair.second; endIndex = posPair.second + string("</invoke>").size(); WeakString wstr(str.data() + posPair.first, str.data() + endIndex); shared_ptr<XML> xml(new XML(wstr)); shared_ptr<Invoke> invoke(new Invoke()); invoke->construct(xml); cout << invoke->toXML()->toString() << endl; invokeList.push_back(invoke); posPair = { -1, -1 }; } else if (myPair.first != -1 && posPair.first == -1) posPair.first = myPair.first; }*/ //BASIC DATA /*list<shared_ptr<Invoke>> invokeList; unique_ptr<pair<size_t, size_t>> indexPair(nullptr); pair<size_t, size_t> sizePair = {0, 0}; size_t startIndex = 0; size_t endIndex = 0; while (true) { //FIND WORDS pair<size_t, size_t> iPair = { str.find("<invoke ", startIndex), str.find("</invoke>", endIndex) }; //COUNTS if (iPair.first != -1) sizePair.first++; if (iPair.second != -1) sizePair.second++; //IF IT MEANS THE START, if (indexPair.get() != nullptr && sizePair.first == 0) { //SPECIFY THE STARTING INDEX indexPair.reset(new pair<size_t, size_t>(iPair.first, string::npos)); } //FAILED TO FIND NOTHING if(iPair.first == string::npos || iPair.second == string::npos) break; //AN INVOKE HAS FOUND if(indexPair.get() != nullptr && sizePair.first == sizePair.second) { //INDEX size_t start = indexPair->first; size_t end = indexPair->second + string("</invoke>").size(); //CONSTRUCT INVOKE shared_ptr<XML> xml(new XML(str.substr(start, end - start))); shared_ptr<Invoke> invoke(new Invoke()); invoke->construct(xml); invokeList.push_back(invoke); //CLEAR CURRENT INEX PAIR endIndex = end; indexPair.reset(nullptr); } //ADJUST INDEX startIndex = (iPair.second == string::npos) ? iPair.first + 1 : iPair.second + 1; } //ERASE USED CHARACTERS if (endIndex != string::npos) str = str.substr(endIndex);*/ if (invokeList.empty() == true) return; /*str = str.substr(endIndex); cout << "#" << invokeList.size() << endl;*/ // CUT USED STRING str = move(str.substr(str.rfind("</invoke>") + CLOSED_PARENTHESIS)); //CALL REPLY_DATA auto last_it = --invokeList.end(); for (auto it = invokeList.begin(); it != last_it; it++) _replyData(*it); //TEST WHETHER THE LAST CONTAINS BINARY DATA shared_ptr<Invoke> &lastInvoke = *last_it; for (size_t i = 0; i < lastInvoke->size(); i++) { //IF HAS, TO HANDLE_BINARY if (lastInvoke->at(i)->getType() == "ByteArray") { baInvoke = lastInvoke; piece.setPosition ( piece.getPosition() - (pieceString.size() - (pieceString.rfind("</invoke>") + CLOSED_PARENTHESIS)) ); //HANDLING LEFT BINARY PIECE handleBinary(piece, str, baInvoke, size); return; } } //ELSE, DOES NOT HAVE, CALL REPLY_DATA _replyData(lastInvoke); }