| 315 | } |
| 316 | |
| 317 | bool TitleCatalog::scanCard(void) |
| 318 | { |
| 319 | if (mLoading) { |
| 320 | return false; |
| 321 | } |
| 322 | |
| 323 | static bool isScanning = false; |
| 324 | if (isScanning) { |
| 325 | return false; |
| 326 | } |
| 327 | else { |
| 328 | isScanning = true; |
| 329 | } |
| 330 | |
| 331 | bool ret = false; |
| 332 | Result res = 0; |
| 333 | u32 count = 0; |
| 334 | FS_CardType cardType; |
| 335 | res = FSUSER_GetCardType(&cardType); |
| 336 | if (R_SUCCEEDED(res)) { |
| 337 | if (cardType == CARD_CTR) { |
| 338 | res = AM_GetTitleCount(MEDIATYPE_GAME_CARD, &count); |
| 339 | if (R_SUCCEEDED(res) && count > 0) { |
| 340 | u64 id; |
| 341 | res = AM_GetTitleList(NULL, MEDIATYPE_GAME_CARD, 1, &id); |
| 342 | if (validId(id)) { |
| 343 | Title title; |
| 344 | IconStore cardIcons; |
| 345 | if (TitleProbe::probe(title, id, MEDIATYPE_GAME_CARD, cardType, cardIcons)) { |
| 346 | ret = true; |
| 347 | if (title.accessibleSave()) { |
| 348 | std::lock_guard<std::mutex> lock(mMutex); |
| 349 | if (mSaves.empty() || mSaves.at(0).mediaType() != MEDIATYPE_GAME_CARD) { |
| 350 | mIcons.mergeFrom(cardIcons); |
| 351 | mSaves.insert(mSaves.begin(), title); |
| 352 | } |
| 353 | } |
| 354 | if (title.accessibleExtdata()) { |
| 355 | std::lock_guard<std::mutex> lock(mMutex); |
| 356 | if (mExtdatas.empty() || mExtdatas.at(0).mediaType() != MEDIATYPE_GAME_CARD) { |
| 357 | mIcons.mergeFrom(cardIcons); |
| 358 | mExtdatas.insert(mExtdatas.begin(), title); |
| 359 | } |
| 360 | } |
| 361 | } |
| 362 | } |
| 363 | } |
| 364 | } |
| 365 | else { |
| 366 | Title title; |
| 367 | IconStore cardIcons; |
| 368 | if (TitleProbe::probe(title, 0, MEDIATYPE_GAME_CARD, cardType, cardIcons)) { |
| 369 | ret = true; |
| 370 | std::lock_guard<std::mutex> lock(mMutex); |
| 371 | if (mSaves.empty() || mSaves.at(0).mediaType() != MEDIATYPE_GAME_CARD) { |
| 372 | mIcons.mergeFrom(cardIcons); |
| 373 | mSaves.insert(mSaves.begin(), title); |
| 374 | } |
no test coverage detected