Status RPIServiceImpl::loadInstalledPackages()

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;
}