void Request::ActionDialog::OnActionChoice(CppConsUI::Button& activator, size_t i, GCallback cb) { if (cb) reinterpret_cast<PurpleRequestActionCb>(cb)(user_data, i); /* It's possible that the callback action already called * purple_request_destroy() in which case 'this' object is already deleted * and calling Close() in such a case leads to an error. */ Requests *requests = &REQUEST->requests; if (requests->find(this) != requests->end()) Close(); }
Requests StoragesAssigner::PerformAssignment(Requests& requests) { Requests assignedRequests; // the result set Requests::iterator it = requests.begin(); Requests::iterator itEnd = requests.end(); // generate the assosiative set of nodes RequestsStorages requestsStorages; // form the vector from the set to have an ability to sort it std::vector<Request::Storages * > storages; storages.reserve(requests.size()); for ( ; it != itEnd; ++it ) { requestsStorages[&(*it)->getStorages()] = (*it); storages.push_back(&(*it)->getStorages()); } std::sort(storages.begin(), storages.end(), requestStoragesCompare); for ( unsigned requestIndex = 0; requestIndex < storages.size(); ++requestIndex ) { Request::Storages * st = storages[requestIndex]; // generate new assignment for the chosen storage Assignment* reqAssignment = new Assignment(); requestAssignment[requestsStorages[st]] = reqAssignment; bool result = assignOneRequest(st, reqAssignment); if ( result ) // virtual machine assigned successfully assignedRequests.insert(requestsStorages[st]); else { requestAssignment.erase(requestsStorages[st]); delete reqAssignment; } } return assignedRequests; }