Skip to content

Commit 527049f

Browse files
authored
[csolution-rpc] Handle GetDraftProjects method
1 parent 79ac97f commit 527049f

File tree

4 files changed

+235
-22
lines changed

4 files changed

+235
-22
lines changed

tools/projmgr/include/ProjMgrWorker.h

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ struct BoardItem {
124124
std::string vendor;
125125
std::string name;
126126
std::string revision;
127+
bool operator==(const BoardItem& b) const {
128+
return name == b.name && revision == b.revision;
129+
}
127130
};
128131

129132
/**
@@ -287,6 +290,7 @@ struct GdbServerItem {
287290
struct EnvironmentItem {
288291
std::string load;
289292
std::string folder;
293+
bool operator==(const EnvironmentItem& b) const { return true; }
290294
};
291295

292296
/**
@@ -315,6 +319,10 @@ struct ExampleItem {
315319
std::vector<std::string> categories;
316320
std::vector<std::string> keywords;
317321
std::string pack;
322+
bool operator==(const ExampleItem& e) const {
323+
return name == e.name && version == e.version && description == e.description &&
324+
boards == e.boards && environments == e.environments;
325+
}
318326
};
319327

320328
/**
@@ -428,9 +436,9 @@ struct ContextItem {
428436
RteProject* rteActiveProject = nullptr;
429437
RteTarget* rteActiveTarget = nullptr;
430438
RteModel* rteFilteredModel = nullptr;
431-
RteItem* rteComponents;
432-
RteDeviceItem* rteDevice;
433-
RteBoard* rteBoard;
439+
RteItem* rteComponents = nullptr;
440+
RteDeviceItem* rteDevice = nullptr;
441+
RteBoard* rteBoard = nullptr;
434442
TranslationControl controls;
435443
TargetItem targetItem;
436444
DirectoriesItem directories;
@@ -525,6 +533,7 @@ enum class BoardOrDevice {
525533
Both,
526534
None,
527535
SkipDevice,
536+
SkipProcessor,
528537
};
529538

530539
/**
@@ -812,6 +821,13 @@ class ProjMgrWorker {
812821
*/
813822
bool InitializeModel(void);
814823

824+
/**
825+
* @brief initialize rte target for a given context
826+
* @param context reference
827+
* @return true if executed successfully
828+
*/
829+
bool InitializeTarget(ContextItem& context);
830+
815831
/**
816832
* @brief load all relevant packs
817833
* @return true if executed successfully
@@ -994,6 +1010,29 @@ class ProjMgrWorker {
9941010
*/
9951011
void AddImageOnlyContext();
9961012

1013+
/**
1014+
* @brief process device and/or board
1015+
* @param context item
1016+
* @param scope: process board, device or both
1017+
* @return true if there is no error
1018+
*/
1019+
bool ProcessDevice(ContextItem& context, BoardOrDevice process = BoardOrDevice::Both);
1020+
1021+
/**
1022+
* @brief collect examples
1023+
* @param context item
1024+
* @param environments filter
1025+
* @return vector of example items
1026+
*/
1027+
std::vector<ExampleItem> CollectExamples(const ContextItem& context, const StrVec& filter);
1028+
1029+
/**
1030+
* @brief collect templates
1031+
* @param context item
1032+
* @return vector of template items
1033+
*/
1034+
std::vector<TemplateItem> CollectTemplates(const ContextItem& context);
1035+
9971036
/**
9981037
* @brief clear worker members for reloading a solution
9991038
* @return true if there is no error
@@ -1073,11 +1112,9 @@ class ProjMgrWorker {
10731112
bool CheckContextFilters(const TypeFilter& typeFilter, const ContextItem& context);
10741113
bool GetTypeContent(ContextItem& context);
10751114
bool GetProjectSetup(ContextItem& context);
1076-
bool InitializeTarget(ContextItem& context);
10771115
bool ProcessPrecedences(ContextItem& context, BoardOrDevice process = BoardOrDevice::None, bool rerun = false);
10781116
bool ProcessPrecedence(StringCollection& item);
10791117
bool ProcessCompilerPrecedence(StringCollection& item, bool acceptRedefinition = false);
1080-
bool ProcessDevice(ContextItem& context, BoardOrDevice process = BoardOrDevice::Both);
10811118
bool ProcessDevicePrecedence(StringCollection& item);
10821119
bool ProcessBoardPrecedence(StringCollection& item);
10831120
bool ProcessToolchain(ContextItem& context);
@@ -1171,10 +1208,10 @@ class ProjMgrWorker {
11711208
bool IsCreatedByExecute(const std::string file, const std::string dir);
11721209
bool CollectAllRequiredPdscFiles();
11731210
bool ParseTargetSetContextSelection();
1174-
std::vector<ExampleItem> CollectExamples(ContextItem& context);
1175-
std::vector<RteBoard*> GetCompatibleBoards(ContextItem& context);
1211+
std::vector<RteBoard*> GetCompatibleBoards(const ContextItem& context);
11761212
bool IsBoardListCompatible(const ContextItem& context, const std::vector<RteBoard*> compatibleBoards, const Collection<RteItem*>& boards);
1177-
std::vector<TemplateItem> CollectTemplates(ContextItem& context);
1213+
bool IsEnvironmentCompatible(const std::string& environment, const StrVec& filter);
1214+
bool HasCompatibleEnvironment(const Collection<RteItem*>& environments, const StrVec& filter);
11781215
};
11791216

11801217
#endif // PROJMGRWORKER_H

tools/projmgr/src/ProjMgrRpcServer.cpp

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ class RpcHandler : public RpcMethods {
9494
RpcArgs::SuccessResult SelectBundle(const string& context, const string& className, const string& bundleName) override;
9595
RpcArgs::Results ValidateComponents(const string& context) override;
9696
RpcArgs::LogMessages GetLogMessages(void) override;
97+
RpcArgs::DraftProjectsInfo GetDraftProjects(const RpcArgs::DraftProjectsFilter& filter) override;
9798

9899
protected:
99100
enum Exception
@@ -584,4 +585,92 @@ RpcArgs::LogMessages RpcHandler::GetLogMessages(void) {
584585
return messages;
585586
}
586587

588+
RpcArgs::DraftProjectsInfo RpcHandler::GetDraftProjects(const RpcArgs::DraftProjectsFilter& filter) {
589+
RpcArgs::DraftProjectsInfo applications;
590+
applications.success = false;
591+
592+
if (!m_packsLoaded) {
593+
applications.message = "Packs must be loaded before retrieving draft projects";
594+
return applications;
595+
}
596+
597+
// initialize context and target attributes with board and device
598+
ContextItem context;
599+
m_worker.InitializeTarget(context);
600+
if (filter.board.has_value() || filter.device.has_value()) {
601+
context.board = filter.board.has_value() ? filter.board.value() : "";
602+
context.device = filter.device.has_value() ? filter.device.value() : "";
603+
if (!m_worker.ProcessDevice(context, BoardOrDevice::SkipProcessor)) {
604+
applications.message = "Board or device processing failed";
605+
return applications;
606+
}
607+
m_worker.SetTargetAttributes(context, context.targetAttributes);
608+
}
609+
610+
// collect examples, optionally filtered for 'environments'
611+
vector<RpcArgs::ExampleProject> examples, refApps;
612+
const auto& environments = filter.environments.has_value() ? filter.environments.value() : StrVec();
613+
const auto& collectedExamples = m_worker.CollectExamples(context, environments);
614+
for (const auto& example : collectedExamples) {
615+
RpcArgs::ExampleProject e;
616+
e.name = example.name;
617+
e.pack = example.pack;
618+
e.doc = example.doc;
619+
e.description = example.description;
620+
if (!example.version.empty()) {
621+
e.version = example.version;
622+
}
623+
if (!example.archive.empty()) {
624+
e.archive = example.archive;
625+
}
626+
for (const auto& [name, environment] : example.environments) {
627+
RpcArgs::ExampleEnvironment env;
628+
env.name = name;
629+
env.file = environment.load;
630+
env.folder = environment.folder;
631+
e.environments.push_back(env);
632+
}
633+
if (!example.components.empty()) {
634+
e.components = example.components;
635+
}
636+
if (!example.categories.empty()) {
637+
e.categories = example.categories;
638+
}
639+
if (!example.keywords.empty()) {
640+
e.keywords = example.keywords;
641+
}
642+
// classify the example as ref-app if it does not specify boards
643+
auto& ref = example.boards.empty() ? refApps : examples;
644+
ref.push_back(e);
645+
}
646+
if (!examples.empty()) {
647+
applications.examples = examples;
648+
}
649+
if (!refApps.empty()) {
650+
applications.refApps = refApps;
651+
}
652+
653+
// collect templates
654+
vector<RpcArgs::SolutionTemplate> templates;
655+
const auto& csolutionTemplates = m_worker.CollectTemplates(context);
656+
for (const auto& csolutionTemplate : csolutionTemplates) {
657+
RpcArgs::SolutionTemplate t;
658+
t.name = csolutionTemplate.name;
659+
t.pack = csolutionTemplate.pack;
660+
t.description = csolutionTemplate.description;
661+
t.file = csolutionTemplate.file;
662+
t.folder = csolutionTemplate.path;
663+
if (!csolutionTemplate.copyTo.empty()) {
664+
t.copyTo = csolutionTemplate.copyTo;
665+
}
666+
templates.push_back(t);
667+
}
668+
if (!templates.empty()) {
669+
applications.templates = templates;
670+
}
671+
672+
applications.success = true;
673+
return applications;
674+
}
675+
587676
// end of ProkMgrRpcServer.cpp

tools/projmgr/src/ProjMgrWorker.cpp

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1413,7 +1413,7 @@ bool ProjMgrWorker::ProcessDevice(ContextItem& context, BoardOrDevice process) {
14131413
if (!deviceItem.pname.empty()) {
14141414
ProjMgrLogger::Get().Error("processor name '" + deviceItem.pname + "' was not found", context.name);
14151415
return false;
1416-
} else if (!HasVarDefineError()) {
1416+
} else if (!HasVarDefineError() && process != BoardOrDevice::SkipProcessor) {
14171417
string msg = "one of the following processors must be specified:";
14181418
const auto& processors = matchedDevice->GetProcessors();
14191419
for (const auto& p : processors) {
@@ -4187,11 +4187,11 @@ bool ProjMgrWorker::ListDependencies(vector<string>& dependencies, const string&
41874187
return true;
41884188
}
41894189

4190-
vector<RteBoard*> ProjMgrWorker::GetCompatibleBoards(ContextItem& context) {
4190+
vector<RteBoard*> ProjMgrWorker::GetCompatibleBoards(const ContextItem& context) {
41914191
vector<RteBoard*> compatibleBoards;
4192-
if (!context.board.empty()) {
4192+
if (context.rteBoard) {
41934193
compatibleBoards.push_back(context.rteBoard);
4194-
} else if (!context.device.empty()) {
4194+
} else if (context.rteDevice) {
41954195
context.rteFilteredModel->GetCompatibleBoards(compatibleBoards, context.rteDevice);
41964196
}
41974197
return compatibleBoards;
@@ -4224,11 +4224,23 @@ bool ProjMgrWorker::IsBoardListCompatible(const ContextItem& context, const vect
42244224
return false;
42254225
}
42264226

4227-
std::vector<ExampleItem> ProjMgrWorker::CollectExamples(ContextItem& context) {
4227+
bool ProjMgrWorker::IsEnvironmentCompatible(const std::string& environment, const StrVec& filter) {
4228+
return (filter.empty() || find(filter.begin(), filter.end(), environment) != filter.end());
4229+
}
4230+
4231+
bool ProjMgrWorker::HasCompatibleEnvironment(const Collection<RteItem*>& environments, const StrVec& filter) {
4232+
for (const auto& environment : environments) {
4233+
if (IsEnvironmentCompatible(environment->GetName(), filter)) {
4234+
return true;
4235+
}
4236+
}
4237+
return false;
4238+
}
4239+
4240+
std::vector<ExampleItem> ProjMgrWorker::CollectExamples(const ContextItem& context, const StrVec& filter) {
42284241
std::vector<ExampleItem> examples;
42294242
vector<const RteItem*> rteExamples;
4230-
const auto& packs = context.rteFilteredModel->GetPackages();
4231-
for (const auto& [_, pack] : packs) {
4243+
for (const auto& pack : m_loadedPacks) {
42324244
const RteItem* packExamples = pack->GetExamples();
42334245
if (packExamples) {
42344246
const Collection<RteItem*> items = packExamples->GetChildren();
@@ -4246,6 +4258,11 @@ std::vector<ExampleItem> ProjMgrWorker::CollectExamples(ContextItem& context) {
42464258
if (!IsBoardListCompatible(context, compatibleBoards, boards)) {
42474259
continue;
42484260
}
4261+
Collection<RteItem*> environments;
4262+
environments = rteExample->GetChildrenByTag("environment", environments);
4263+
if (!HasCompatibleEnvironment(environments, filter)) {
4264+
continue;
4265+
}
42494266
ExampleItem example;
42504267
example.name = rteExample->GetName();
42514268
example.description = rteExample->GetDescription();
@@ -4262,17 +4279,18 @@ std::vector<ExampleItem> ProjMgrWorker::CollectExamples(ContextItem& context) {
42624279
for (const auto& board : boards) {
42634280
example.boards.push_back(BoardItem{ board->GetVendorString(), board->GetName() });
42644281
}
4265-
const auto& version = rteExample->GetVersionString();
4282+
const auto& version = rteExample->GetAttribute("version");
42664283
if (!version.empty()) {
42674284
example.version = version;
42684285
}
42694286

4270-
Collection<RteItem*> environments;
4271-
environments = rteExample->GetChildrenByTag("environment", environments);
42724287
for (const auto& item : environments) {
4288+
const auto& name = item->GetName();
4289+
if (!IsEnvironmentCompatible(name, filter)) {
4290+
continue;
4291+
}
42734292
string load = item->GetAttribute("load");
42744293
RteFsUtils::NormalizePath(load, folder);
4275-
const auto& name = item->GetName();
42764294
example.environments[name].load = load;
42774295
example.environments[name].folder = item->GetFolderString();
42784296
RteFsUtils::NormalizePath(example.environments[name].folder, folder);
@@ -4296,7 +4314,9 @@ std::vector<ExampleItem> ProjMgrWorker::CollectExamples(ContextItem& context) {
42964314
example.keywords.push_back(item->GetText());
42974315
}
42984316

4299-
examples.push_back(example);
4317+
if (find(examples.begin(), examples.end(), example) == examples.end()) {
4318+
examples.push_back(example);
4319+
}
43004320
}
43014321
return examples;
43024322
}
@@ -4316,7 +4336,7 @@ bool ProjMgrWorker::ListExamples(vector<string>& examples, const string& filter)
43164336
return false;
43174337
}
43184338

4319-
const auto& collectedExamples = CollectExamples(context);
4339+
const auto& collectedExamples = CollectExamples(context, StrVec());
43204340

43214341
for (const auto& exampleItem : collectedExamples) {
43224342
if (!filter.empty() && exampleItem.name.find(filter) == string::npos) {
@@ -4348,7 +4368,7 @@ bool ProjMgrWorker::ListExamples(vector<string>& examples, const string& filter)
43484368
return true;
43494369
}
43504370

4351-
std::vector<TemplateItem> ProjMgrWorker::CollectTemplates(ContextItem& context) {
4371+
std::vector<TemplateItem> ProjMgrWorker::CollectTemplates(const ContextItem& context) {
43524372
std::vector<TemplateItem> templates;
43534373
const auto& rteTemplates = context.rteFilteredModel->GetProjectDescriptors();
43544374
for (const auto& rteTemplate : rteTemplates) {

0 commit comments

Comments
 (0)