in src/RPIServiceMethods.cpp [152:185]
Status RPIServiceImpl::loadInstalledPackages(ServerContext *context, const Empty *, RInstalledPackageList *response) {
executeOnMainThread([&] {
ShieldSEXP jetbrainsEnv = RI->globalEnv.getVar(".jetbrains");
ShieldSEXP func = jetbrainsEnv.getVar("loadInstalledPackages");
ShieldSEXP packages = func();
if (TYPEOF(packages) != VECSXP || packages.length() < 4) return;
ShieldSEXP names = RI->names(packages);
characterizeCells(packages);
int rowsCnt = asInt(RI->nrow(packages));
for (int i = 0; i < rowsCnt; ++i) {
RInstalledPackageList_RInstalledPackage *rInstalledPackage = response->add_packages();
rInstalledPackage->set_packagename(getCellStringValue(packages, i, 0));
rInstalledPackage->set_packageversion(getCellStringValue(packages, i, 1));
std::string priority = getCellStringValue(packages, i, 2);
if (priority.empty()) {
rInstalledPackage->set_priority(RInstalledPackageList_RInstalledPackage_RPackagePriority_NA);
} else if (priority == "base") {
rInstalledPackage->set_priority(RInstalledPackageList_RInstalledPackage_RPackagePriority_BASE);
} else {
rInstalledPackage->set_priority(RInstalledPackageList_RInstalledPackage_RPackagePriority_RECOMMENDED);
}
rInstalledPackage->set_librarypath(getCellStringValue(packages, i, 3));
rInstalledPackage->set_canonicalpackagepath(getCellStringValue(packages, i, 4));
for (int j = 5; j < packages.length(); ++j) {
RInstalledPackageList_RInstalledPackage_MapEntry *mapEntry = rInstalledPackage->add_description();
mapEntry->set_key(stringEltUTF8(names, j));
mapEntry->set_value(getCellStringValue(packages, i, j));
}
}
}, context, true);
return Status::OK;
}