| 229 | } |
| 230 | |
| 231 | void __CARDMountCallback(s32 chan, s32 result) { |
| 232 | CARDControl* card; |
| 233 | CARDCallback callback; |
| 234 | |
| 235 | card = &__CARDBlock[chan]; |
| 236 | |
| 237 | switch (result) { |
| 238 | case CARD_RESULT_READY: |
| 239 | if (++card->mountStep < CARD_MAX_MOUNT_STEP) { |
| 240 | result = DoMount(chan); |
| 241 | if (0 <= result) { |
| 242 | return; |
| 243 | } |
| 244 | } else { |
| 245 | result = __CARDVerify(card); |
| 246 | } |
| 247 | break; |
| 248 | case CARD_RESULT_UNLOCKED: |
| 249 | card->unlockCallback = __CARDMountCallback; |
| 250 | if (!EXILock(chan, 0, __CARDUnlockedHandler)) { |
| 251 | return; |
| 252 | } |
| 253 | card->unlockCallback = 0; |
| 254 | |
| 255 | result = DoMount(chan); |
| 256 | if (0 <= result) { |
| 257 | return; |
| 258 | } |
| 259 | break; |
| 260 | case CARD_RESULT_IOERROR: |
| 261 | case CARD_RESULT_NOCARD: |
| 262 | DoUnmount(chan, result); |
| 263 | break; |
| 264 | } |
| 265 | |
| 266 | callback = card->apiCallback; |
| 267 | card->apiCallback = 0; |
| 268 | __CARDPutControlBlock(card, result); |
| 269 | callback(chan, result); |
| 270 | } |
| 271 | |
| 272 | s32 CARDMountAsync(s32 chan, void *workArea, CARDCallback detachCallback, |
| 273 | CARDCallback attachCallback) |
no test coverage detected