/* * Copyright 2016-2025, Andrew Lindesay . * All rights reserved. Distributed under the terms of the MIT License. * * Note that this file included code earlier from `Model.cpp` and * copyrights have been latterly been carried across in 2024. */ #include "PopulatePkgChangelogFromServerProcess.h" #include #include #include "Logger.h" #include "ServerHelper.h" #undef B_TRANSLATION_CONTEXT #define B_TRANSLATION_CONTEXT "PopulatePkgChangelogFromServerProcess" PopulatePkgChangelogFromServerProcess::PopulatePkgChangelogFromServerProcess( const BString& packageName, Model* model) : fModel(model), fPackageName(packageName) { } PopulatePkgChangelogFromServerProcess::~PopulatePkgChangelogFromServerProcess() { } const char* PopulatePkgChangelogFromServerProcess::Name() const { return "PopulatePkgChangelogFromServerProcess"; } const char* PopulatePkgChangelogFromServerProcess::Description() const { return B_TRANSLATE("Fetching changelog for package"); } status_t PopulatePkgChangelogFromServerProcess::RunInternal() { if (!ServerHelper::IsNetworkAvailable()) { HDINFO("no network so will not populate changelog"); return B_OK; } // TODO; use API spec to code generation techniques instead of this manually written client. BMessage responsePayload; status_t result; result = fModel->WebApp()->GetChangelog(fPackageName, responsePayload); if (result == B_OK) { BMessage resultMessage; BString content; result = responsePayload.FindMessage("result", &resultMessage); if (result == B_OK) { if (resultMessage.FindString("content", &content) == B_OK) { content.Trim(); result = _UpdateChangelog(content); HDDEBUG("changelog populated for [%s] (length %" B_PRIi32 ")", fPackageName.String(), content.Length()); } else { HDDEBUG("no changelog present for [%s]", fPackageName.String()); } } } else { ServerHelper::NotifyTransportError(result); } return result; } status_t PopulatePkgChangelogFromServerProcess::_UpdateChangelog(const BString& value) { PackageInfoRef package = fModel->PackageForName(fPackageName); if (!package.IsSet()) { HDERROR("the package [%s] was not found", fPackageName.String()); return B_ERROR; } PackageLocalizedTextRef localizedText = PackageLocalizedTextBuilder(package->LocalizedText()).WithChangelog(value).BuildRef(); PackageInfoRef updatedPackage = PackageInfoBuilder(package).WithLocalizedText(localizedText).BuildRef(); fModel->AddPackage(updatedPackage); return B_OK; }