18 #ifndef INC_C4StartupModsDlg
19 #define INC_C4StartupModsDlg
46 std::vector<std::string>
tags;
77 discoveryFinishedEvent(true),
96 CStdLock lock(&modInformationModification);
98 return modsInformation.count(
id) != 0;
102 CStdLock lock(&modInformationModification);
104 return modsInformation[id];
108 CStdLock lock(&modInformationModification);
109 modsInformation.erase(
id);
111 ModsInfo &
AddMod(
const std::string &
id,
const std::string &path,
const std::string &name)
113 CStdLock lock(&modInformationModification);
114 modsInformation[id] =
ModsInfo{ id, path, name };
115 return modsInformation[id];
121 return modsInformation;
125 return std::move(
CStdLock(&modInformationModification));
129 void ExecuteDiscovery();
130 bool discoveryFinished =
false;
132 CStdCSec modInformationModification;
134 std::map<std::string, ModsInfo> modsInformation;
160 ModInfo() : localDiscoveryCheck(*this) {}
163 ModInfo(std::string modID, std::string name);
164 ~ModInfo() { Clear(); }
166 std::vector<FileInfo> files;
167 std::vector<std::string> dependencies;
169 std::set<std::string> requiredFilenames;
173 void CheckProgress();
174 void CancelRequest();
176 std::tuple<size_t, size_t> GetProgress()
const {
return std::make_tuple(downloadedBytes, totalBytes); }
177 void SetError(
const std::string &e) { errorMessage += (errorMessage.empty() ?
"" :
" ") + e; }
178 bool HasError()
const {
return !errorMessage.empty(); }
179 bool WasSuccessful()
const {
return successful && !HasError(); }
180 bool IsBusy()
const {
return postClient.get() !=
nullptr; }
181 bool HasFilesRemaining()
const {
return !files.empty(); }
182 bool RequiresMetadataUpdate()
const {
return hasOnlyIncompleteInformation; }
183 std::string GetErrorMessage()
const {
if (errorMessage.empty())
return "";
return name +
": " + errorMessage; }
184 std::string GetPath();
198 } localDiscoveryCheck;
200 bool successful{
false };
202 bool hasOnlyIncompleteInformation{
true };
203 size_t totalSuccesfullyDownloadedBytes{ 0 };
204 size_t downloadedBytes{ 0 };
205 size_t totalBytes{ 0 };
206 std::unique_ptr<C4HTTPClient> postClient;
207 std::string errorMessage;
208 TiXmlNode *originalXMLNode{
nullptr };
211 std::vector<std::unique_ptr<ModInfo>> items;
219 void CancelRequest();
220 void ExecuteCheckDownloadProgress();
221 void ExecutePreRequestChecks();
222 void ExecuteWaitForChecksums();
223 void ExecuteRequestConfirmation();
225 void ExecuteMetadataUpdate();
226 std::unique_ptr<C4HTTPClient> postMetadataClient;
227 int metadataQueriedForModIdx{ -1 };
229 std::function<void(
void)> progressCallback;
232 bool Execute(
int, pollfd *)
override
265 int32_t iInfoIconCount;
266 bool isInfoEntry{
false };
273 void AddStatusIcon(
C4GUI::Icons eIcon,
const char *szToolTip,
bool insertLeft=
true);
275 void UpdateEntrySize();
281 std::unique_ptr<ModXMLData> modXMLData;
287 void FromXML(
const TiXmlElement *xml,
ModXMLData::Source source, std::string fallbackID=
"", std::string fallbackName=
"");
299 void OnError(std::string message);
300 void ShowPageInfo(
int page,
int totalPages,
int totalResults);
331 bool queryWasSuccessful =
false;
333 time_t lastQueryEndTime = 0;
334 static const time_t QueryRetryTimeout = 5;
337 bool requiredSyncWithDiscovery{
false };
370 void CancelRequest();
372 static std::string GetBaseServerURL();
373 static std::string GetOpenClonkVersionStringTag();
374 void QueryModList(
bool loadNextPage=
false);
376 void UpdateList(
bool fGotReference =
false,
bool onlyWithLocalFiles =
false);
379 struct TiXmlElementLoaderInfo
381 TiXmlElementLoaderInfo(
const TiXmlElement* element, std::string
id=
"", std::string name=
"") :
382 element(element), id(id), name(name) {}
383 const TiXmlElement* element;
384 const TiXmlElement* operator->()
const {
return element; }
385 std::string id, name;
387 void AddToList(std::vector<TiXmlElementLoaderInfo> elements,
ModXMLData::Source source);
388 void UpdateSelection();
389 void CheckRemoveMod();
391 void CheckUpdateAll();
395 std::unique_ptr<C4HTTPClient> postClient;
397 std::unique_ptr<C4StartupModsDownloader> downloader;
405 const char * titleAsc, * titleDesc;
406 SortingOption(
const char * _key,
const char * _titleAsc,
const char * _titleDesc) :
407 key(_key), titleAsc(_titleAsc), titleDesc(_titleDesc) {}
409 std::vector<SortingOption> sortingOptions;
410 std::string sortKeySuffix =
"";
414 const int maxResultsPerQuery{ 30 };
415 int totalResults{ 0 };
416 int currentlySkipped{ 0 };
418 int getItemsToPage(
int itemNumber)
const
420 return itemNumber / maxResultsPerQuery +
static_cast<int>(itemNumber % maxResultsPerQuery != 0);
422 int getCurrentPage()
const
424 return getItemsToPage(currentlySkipped) + 1;
426 int getTotalPages()
const
428 return getItemsToPage(totalResults);
433 virtual bool SetSubscreen(
const char *toScreen)
override;
virtual bool SetSubscreen(const char *toScreen) override
C4GUI::Control * GetDlgModeFocusControl()
void OnUpdateAllBtn(C4GUI::Control *btn)
virtual void DrawElement(C4TargetFacet &cgo)
virtual C4GUI::Control * GetDefaultControl()
void OnInstallModBtn(C4GUI::Control *btn)
void OnSelChange(class C4GUI::Element *pEl)
void OnSelDblClick(class C4GUI::Element *pEl)
void QueueSyncWithDiscovery()
bool OnSortComboSelChange(C4GUI::ComboBox *pForCombo, int32_t idNewSelection)
virtual void OnClosed(bool fOK)
virtual bool HasBackground()
void OnShowInstalledBtn(C4GUI::Control *btn)
void OnSortComboFill(C4GUI::ComboBox_FillCB *pFiller)
C4GUI::Edit::InputResult OnSearchFieldEnter(C4GUI::Edit *edt, bool fPasting, bool fPastingMore)
void OnSearchOnlineBtn(C4GUI::Control *btn)
void OnBackBtn(C4GUI::Control *btn)
void OnUninstallModBtn(C4GUI::Control *btn)
C4StartupModsDownloader(C4StartupModsDlg *parent, const C4StartupModsListEntry *entry)
~C4StartupModsDownloader()
void OnConfirmInstallation(C4GUI::Element *element)
void AddModToQueue(std::string modID, std::string name)
virtual void OnThreadEvent(C4InteractiveEventType eEvent, void *pEventData)
void RequestConfirmation()
bool IsLoadedFromLocal() const
void UpdateInstalledState(C4StartupModsLocalModDiscovery::ModsInfo *modInfo)
std::string GetTitle() const
const ModXMLData & GetModXMLData() const
void ShowPageInfo(int page, int totalPages, int totalResults)
std::string GetID() const
const TiXmlNode * GetXMLNode() const
~C4StartupModsListEntry()
virtual void DrawElement(C4TargetFacet &cgo)
void FromXML(const TiXmlElement *xml, ModXMLData::Source source, std::string fallbackID="", std::string fallbackName="")
void SetVisibility(bool fToValue)
C4StartupModsListEntry(C4GUI::ListBox *pForListBox, C4GUI::Element *pInsertBefore, class C4StartupModsDlg *pModsDlg)
void OnError(std::string message)
const std::vector< ModXMLData::FileInfo > & GetFileInfos() const
virtual int32_t GetListItemTopSpacing()
void RemoveMod(const std::string &id)
bool IsDiscoveryFinished() const
const std::map< std::string, ModsInfo > & GetAllModInformation()
const bool IsModInstalled(const std::string &id)
C4StartupModsLocalModDiscovery(C4StartupModsDlg *parent)
void WaitForDiscoveryFinished()
ModsInfo & AddMod(const std::string &id, const std::string &path, const std::string &name)
ModsInfo GetModInformation(const std::string &id)
LocalDiscoveryCheck(ModInfo &mod)
bool atLeastOneFileExisted
std::string longDescription
std::vector< std::string > dependencies
std::vector< FileInfo > files
TiXmlNode * originalXMLElement
std::vector< std::string > tags
bool requiresUpdate() const
ModXMLData(const TiXmlElement *xml, Source source=Source::Unknown)