bool Ini_UpdaterLists::saveRollbackInfo(const FileVector &rollbackList) { STRING section_name = SS_KEY_RollbackTree; long k = 0; STRING rollbackFileAndPath; if(!getProductFolder(m_useCurrentFolder, rollbackFileAndPath, pLog)) { TRACE_MESSAGE("Unable to save rollback information, because failed to get product folder"); return false; } rollbackFileAndPath += UPDATER_LISTS_FILENEME; TRACE_MESSAGE2("Saving rollback list to '%s'", rollbackFileAndPath.to_string().c_str()); removeRollbackSection(); // for output saved entries in rows and save space in trace file std::string savedEntries; unsigned long logLineSplitIndex = 0; for(FileVector::const_iterator iter = rollbackList.begin(); iter != rollbackList.end(); ++iter) { if(iter->m_rollbackChange == STRING(SS_KEY_RecentStatusAdded) || iter->m_rollbackChange == STRING(SS_KEY_RecentStatusModified) || iter->m_rollbackChange == STRING(SS_KEY_RecentStatusDeleted)) { STRING newSectionName; const long order_number = k++; makeNewSectionName(order_number, iter->m_filename, newSectionName); if(!saveRollbackListEntry(rollbackFileAndPath.c_str(), section_name.c_str(), order_number, newSectionName, *iter)) { TRACE_MESSAGE2("Unable to save rollback information for file entry '%s'", (iter->m_localPath + iter->m_filename).to_string().c_str()); return false; } // append comma before all items, but the very first one if(logLineSplitIndex++) savedEntries += ", "; // split line each 3 elements, but not before last element if(iter + 1 != rollbackList.end()) { if(!(logLineSplitIndex % 3)) savedEntries += "\n\t"; } savedEntries += (iter->m_localPath + iter->m_filename).to_string(); } } TRACE_MESSAGE3("Rollback information saved successfully to %s, entries: %s", rollbackFileAndPath.to_string().c_str(), savedEntries.c_str()); return true; }