22 #include "IException.h"
23 #include "NaifStatus.h"
24 #include "PvlKeyword.h"
52 Kernels::Kernels(
const Kernels &kernels) {
53 _kernels = kernels._kernels;
54 _camVersion = kernels._camVersion;
56 UpdateManagedStatus();
77 if (
this != &kernels) {
79 _kernels = kernels._kernels;
80 _camVersion = kernels._camVersion;
82 UpdateManagedStatus();
92 Kernels::Kernels(
const QString &filename) {
111 Kernels::Kernels(
Pvl &pvl) {
120 int Kernels::Missing()
const {
122 for (
unsigned int i = 0 ; i < _kernels.size() ; i++) {
123 if (!_kernels[i].exists) nMissing++;
142 void Kernels::Init(
Pvl &pvl) {
145 addKernels(findKernels(pvl,
"TargetPosition"));
146 addKernels(findKernels(pvl,
"InstrumentPosition"));
147 addKernels(findKernels(pvl,
"InstrumentPointing"));
148 addKernels(findKernels(pvl,
"Frame"));
149 addKernels(findKernels(pvl,
"TargetAttitudeShape"));
150 addKernels(findKernels(pvl,
"Instrument"));
151 addKernels(findKernels(pvl,
"InstrumentAddendum"));
152 addKernels(findKernels(pvl,
"LeapSecond"));
153 addKernels(findKernels(pvl,
"SpacecraftClock"));
154 addKernels(findKernels(pvl,
"ShapeModel"));
155 addKernels(findKernels(pvl,
"Extra"));
156 _camVersion = getCameraVersion(pvl);
178 bool Kernels::Add(
const QString &kfile) {
179 if (!findByName(kfile)) {
180 _kernels.push_back(examine(kfile,
true));
195 void Kernels::Clear() {
235 int Kernels::Discover() {
238 NaifStatus::CheckErrors();
239 ktotal_c(
"ALL", &count);
241 for (
int i = 0 ; i < count ; i++) {
244 SpiceChar source[128];
247 kdata_c(i,
"ALL",
sizeof(file),
sizeof(ktype),
sizeof(source),
248 file, ktype,source, &handle, &found);
249 if (found == SPICETRUE) {
250 _kernels.push_back(examine(file,
false));
254 NaifStatus::CheckErrors();
269 void Kernels::Manage() {
270 for (
unsigned int i = 0 ; i < _kernels.size() ; i++) {
271 _kernels[i].managed =
true;
288 void Kernels::UnManage() {
289 for (
unsigned int i = 0 ; i < _kernels.size() ; i++) {
290 _kernels[i].managed =
false;
308 bool Kernels::IsManaged()
const {
309 for (
unsigned int i = 0 ; i < _kernels.size() ; i++) {
310 if (!_kernels[i].managed)
return (
false);;
333 void Kernels::InitializeNaifKernelPool() {
334 NaifStatus::CheckErrors();
336 NaifStatus::CheckErrors();
337 for (
unsigned int i = 0 ; i < _kernels.size() ; i++) {
338 _kernels[i].loaded =
false;
364 int Kernels::Load(
const QString &ktypes) {
367 if (ktypes.isEmpty()) {
368 for (
unsigned int k = 0 ; k < _kernels.size() ; k++) {
369 if (Load(_kernels[k])) { nLoaded++; }
375 for (
int t = 0 ; t < tlist.size() ; t++) {
376 for (
unsigned int k = 0; k < _kernels.size() ; k++) {
377 if (_kernels[k].ktype == tlist[t]) {
378 if (Load(_kernels[k])) { nLoaded++; }
405 int Kernels::Load() {
408 for (
unsigned int k = 0 ; k < _kernels.size() ; k++) {
409 if (Load(_kernels[k])) { nLoaded++; }
425 int Kernels::UnLoad() {
427 for (
unsigned int i = 0 ; i < _kernels.size() ; i++) {
428 if (UnLoad(_kernels[i])) nUnloaded++;
453 int Kernels::UnLoad(
const QString &ktypes) {
456 if (ktypes.isEmpty()) {
457 nUnloaded = UnLoad();
462 for (
int t = 0 ; t < tlist.size() ; t++) {
463 for (
unsigned int k = 0; k < _kernels.size() ; k++) {
464 if (_kernels[k].ktype == tlist[t]) {
465 if (UnLoad(_kernels[k])) nUnloaded++;
491 int Kernels::UpdateLoadStatus() {
493 for (
unsigned int i = 0 ; i < _kernels.size() ; i++) {
495 if (IsNaifType(_kernels[i].ktype)) {
497 SpiceChar source[128];
501 NaifStatus::CheckErrors();
502 kinfo_c(_kernels[i].fullpath.toLatin1().data(),
sizeof(ktype),
sizeof(source),
503 ktype,source, &handle, &found);
504 NaifStatus::CheckErrors();
506 if (found == SPICETRUE) {
507 if (!_kernels[i].loaded) nchanged++;
508 _kernels[i].loaded =
true;
511 if (_kernels[i].loaded) nchanged++;
512 _kernels[i].loaded =
false;
539 int Kernels::UpdateManagedStatus() {
541 for (
unsigned int i = 0 ; i < _kernels.size() ; i++) {
542 if (_kernels[i].loaded) {
543 _kernels[i].managed =
false;
547 _kernels[i].managed =
true;
601 for (
unsigned int i = 0 ; i < other._kernels.size() ; i++) {
602 KernelFile *kernel = findByName(other._kernels[i].fullpath);
605 kfile.managed =
false;
606 _kernels.push_back(kfile);
610 if (other._kernels[i].loaded) {
611 kernel->loaded =
true;
612 kernel->managed =
false;
653 for (
int i = 0 ; i < kmap.
size() ; i++) {
654 types.append(kmap.
key(i));
676 if (ktypes.isEmpty()) {
677 for (
unsigned int k = 0; k < _kernels.size() ; k++) {
678 flist.push_back(_kernels[k].pathname);
684 for (
int t = 0 ; t < tlist.size() ; t++) {
685 for (
unsigned int k = 0; k < _kernels.size() ; k++) {
686 if (_kernels[k].ktype == tlist[t]) {
687 flist.push_back(_kernels[k].pathname);
723 if (ktypes.isEmpty()) {
724 for (
unsigned int i = 0 ; i < _kernels.size() ; i++) {
725 if (_kernels[i].loaded) flist.push_back(_kernels[i].pathname);
730 for (
int t = 0 ; t < tlist.size() ; t++ ) {
731 for (
unsigned int k = 0; k < _kernels.size() ; k++) {
732 if (_kernels[k].ktype == tlist[t]) {
733 flist.push_back(_kernels[k].pathname);
754 for (
unsigned int i = 0 ; i < _kernels.size() ; i++) {
755 if (!_kernels[i].exists) flist.push_back(_kernels[i].pathname);
775 if (IsNaifType(kfile.ktype)) {
777 NaifStatus::CheckErrors();
779 furnsh_c(kfile.fullpath.toLatin1().data());
780 NaifStatus::CheckErrors();
782 kfile.managed =
true;
789 return (kfile.loaded);
816 bool wasLoaded(
false);
819 NaifStatus::CheckErrors();
821 unload_c(kfile.fullpath.toLatin1().data());
822 NaifStatus::CheckErrors();
827 kfile.loaded =
false;
868 for (
int k = 0 ; k < tlist.size() ; k++) {
881 void Kernels::addKernels(
const KernelList &klist) {
882 copy(klist.begin(), klist.end(), back_inserter(_kernels));
903 Kernels::KernelList Kernels::findKernels(
Pvl &pvl,
904 const QString &kname,
905 const bool &manage) {
912 for (
int i = 0 ; i < kkey.
size() ; i++) {
914 if (kkey[i].toLower() !=
"table") {
915 klist.push_back(examine(kkey[i], manage));
950 KernelList::iterator klist;
951 for (klist = _kernels.begin() ; klist != _kernels.end() ; ++klist) {
952 if (klist->pathname == kfile) {
return (&(*klist)); }
953 if (klist->name == kfile) {
return (&(*klist)); }
954 if (klist->fullpath == kfile) {
return (&(*klist)); }
970 for (
unsigned int i = 0 ; i < _kernels.size() ; i++) {
972 if (ktypes.
exists(_kernels[i].ktype)) {
973 ktypes.
get(_kernels[i].ktype).push_back(kfile);
976 ktypes.
add(_kernels[i].ktype, KernelFileList(1, kfile));
991 bool Kernels::IsNaifType(
const QString &ktype)
const {
992 if (ktype.toUpper() ==
"UNKNOWN")
return (
false);
993 if (ktype.toUpper() ==
"DEM")
return (
false);
1045 const bool &manage)
const {
1049 kf.pathname = kfile;
1050 kf.name = kernfile.
name();
1053 kf.ktype =
"UNKNOWN";
1055 kf.managed = manage;
1059 kf.ktype = resolveType(kf.fullpath);
1062 if (IsNaifType(kf.ktype)) {
1063 SpiceChar ktype[32];
1064 SpiceChar source[128];
1068 NaifStatus::CheckErrors();
1069 kinfo_c(kf.fullpath.toLatin1().data(),
sizeof(ktype),
sizeof(source), ktype,
1070 source, &handle, &found);
1071 NaifStatus::CheckErrors();
1073 if (found == SPICETRUE) {
1108 QString Kernels::resolveType(
const QString &kfile)
const {
1110 QString kpath = kernFile.
expanded();
1111 ifstream ifile(kpath.toLatin1().data(), ios::in | ios::binary);
1112 QString ktype(
"UNKNOWN");
1115 ifile.read(ibuf, 8);
1117 for (
int i = 0 ; i < 8 ; i++)
1118 if (ibuf[i] ==
'\n') ibuf[i] =
'\0';
1123 if (istr.contains(
"/")) {
1124 ktype = istr.split(
"/").last();
1128 if ((ktype ==
"UNKNOWN") || (ktype ==
"DAF")) {
1129 ktype = resolveTypeByExt(kfile, ktype);
1181 QString Kernels::resolveTypeByExt(
const QString &kfile,
1182 const QString &iktype)
const {
1184 QString ktype(iktype);
1194 else if (ext ==
"ti") {
1198 string::size_type idx = base.find(
"addendum");
1199 if (idx != string::npos) {
1203 else if (ext ==
"tsc") {
1206 else if (ext ==
"tf") {
1209 else if (ext ==
"tls") {
1212 else if (ext ==
"tpc") {
1215 else if (ext ==
"bc") {
1218 else if (ext ==
"bsp") {
1221 else if (ext ==
"bes") {
1224 else if (ext ==
"bds") {
1227 else if (ext ==
"meta") {
1248 int Kernels::getCameraVersion(
Pvl &pvl)
const {