aboutsummaryrefslogtreecommitdiff
path: root/backends/PalmOS/Src/forms/formCards.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/PalmOS/Src/forms/formCards.cpp')
-rw-r--r--backends/PalmOS/Src/forms/formCards.cpp281
1 files changed, 281 insertions, 0 deletions
diff --git a/backends/PalmOS/Src/forms/formCards.cpp b/backends/PalmOS/Src/forms/formCards.cpp
new file mode 100644
index 0000000000..4ecb567b48
--- /dev/null
+++ b/backends/PalmOS/Src/forms/formCards.cpp
@@ -0,0 +1,281 @@
+#include <PalmOS.h>
+#include <VFSMgr.h>
+
+#include "start.h"
+#include "forms.h"
+
+typedef struct {
+ UInt16 volRefNum;
+ Char nameP[expCardInfoStringMaxLen+1];
+
+} CardInfoType;
+
+void CardSlotCreateDirs() {
+ if (gPrefs->card.volRefNum != sysInvalidRefNum) {
+ VFSDirCreate(gPrefs->card.volRefNum, "/PALM");
+ VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs");
+ VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM");
+ VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM/Games");
+ VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM/Saved");
+ }
+}
+
+static void CardSlotFromShowHideOptions() {
+ ControlType *cck1P;
+ FormPtr frmP = FrmGetActiveForm();
+
+ cck1P = (ControlType *)GetObjectPtr(CardSlotMoveCheckbox);
+
+ if (CtlGetValue(cck1P)) {
+ FrmShowObject(frmP, FrmGetObjectIndex (frmP, CardSlotDeleteCheckbox));
+ FrmShowObject(frmP, FrmGetObjectIndex (frmP, CardSlotConfirmCheckbox));
+ } else {
+ FrmHideObject(frmP, FrmGetObjectIndex (frmP, CardSlotDeleteCheckbox));
+ FrmHideObject(frmP, FrmGetObjectIndex (frmP, CardSlotConfirmCheckbox));
+ }
+}
+
+static UInt16 CardSlotFormInit(Boolean display, Boolean bDraw) {
+ Err err;
+ UInt16 volRefNum;
+ UInt32 volIterator = vfsIteratorStart;
+ UInt8 counter = 0;
+ UInt32 other = 1;
+
+ MemHandle cards = NULL;
+ CardInfoType *cardsInfo;
+
+ while (volIterator != vfsIteratorStop) {
+ err = VFSVolumeEnumerate(&volRefNum, &volIterator);
+
+ if (!err) {
+ Char labelP[expCardInfoStringMaxLen+1];
+ err = VFSVolumeGetLabel(volRefNum, labelP, expCardInfoStringMaxLen+1);
+
+ if (err || StrLen(labelP) == 0) { // if no label try to retreive card type
+ VolumeInfoType volInfo;
+ err = VFSVolumeInfo(volRefNum, &volInfo);
+
+ if (!err) {
+ ExpCardInfoType info;
+ err = ExpCardInfo(volInfo.slotRefNum, &info);
+ StrCopy(labelP, info.deviceClassStr);
+ }
+
+ if (err) // if err default name
+ StrPrintF(labelP,"Other Card %ld", other++);
+ }
+
+ if (!cards)
+ cards = MemHandleNew(sizeof(CardInfoType));
+ else
+ MemHandleResize(cards, MemHandleSize(cards) + sizeof(CardInfoType));
+
+ cardsInfo = (CardInfoType *)MemHandleLock(cards);
+ cardsInfo[counter].volRefNum = volRefNum;
+ StrCopy(cardsInfo[counter].nameP, labelP);
+ MemHandleUnlock(cards);
+ counter++;
+ }
+ }
+
+ if (display) {
+ FormPtr frmP;
+ ListPtr listP;
+ ControlType *cck1P, *cck2P, *cck3P;
+ UInt16 index;
+ Int16 selected = -1;
+
+ CardInfoType *cardsInfo;
+ MemHandle items = NULL;
+
+ listP = (ListType *)GetObjectPtr(CardSlotSlotList);
+ cck1P = (ControlType *)GetObjectPtr(CardSlotMoveCheckbox);
+ cck2P = (ControlType *)GetObjectPtr(CardSlotDeleteCheckbox);
+ cck3P = (ControlType *)GetObjectPtr(CardSlotConfirmCheckbox);
+
+ if (counter > 0) {
+ cardsInfo = (CardInfoType *)MemHandleLock(cards);
+
+ for (index = 0; index < counter; index++) {
+ if (!items)
+ items = MemHandleNew(sizeof(Char *));
+ else
+ MemHandleResize(items, MemHandleSize(items) + sizeof(Char *));
+
+ itemsText = (Char **)MemHandleLock(items);
+ itemsText[index] = cardsInfo[index].nameP;
+ MemHandleUnlock(items);
+
+ if (cardsInfo[index].volRefNum == gPrefs->card.volRefNum)
+ selected = index;
+ }
+
+ itemsText = (Char **)MemHandleLock(items);
+ LstSetListChoices (listP, itemsText, counter);
+ LstSetSelection(listP, selected);
+ // save globals and set list
+ itemsText = (Char **)MemHandleLock(items);
+ itemsList = (void *)cardsInfo;
+ itemsType = ITEM_TYPE_CARD;
+
+ } else {
+ LstSetListChoices(listP, NULL, 0);
+ // save globals and set list
+ itemsText = NULL;
+ itemsList = NULL;
+ itemsType = ITEM_TYPE_CARD;
+ }
+
+ // bDraw = true -> draw whole from
+ // bDraw = false -> redraw list
+ if (bDraw) {
+ CtlSetValue(cck1P, gPrefs->card.moveDB);
+ CtlSetValue(cck2P, gPrefs->card.deleteDB);
+ CtlSetValue(cck3P, gPrefs->card.confirmMoveDB);
+ CardSlotFromShowHideOptions();
+ frmP = FrmGetActiveForm();
+ FrmDrawForm(frmP);
+
+ } else {
+ WinScreenLock(winLockCopy);
+ LstDrawList(listP);
+ WinScreenUnlock();
+ }
+ } else { // if !display, we just want to retreive an avaliable card
+ if (counter > 0) {
+ UInt16 volRefNum;
+ cardsInfo = (CardInfoType *)MemHandleLock(cards);
+ volRefNum = cardsInfo[0].volRefNum; // return the first volref
+ MemHandleUnlock(cards);
+ MemHandleFree(cards);
+ return volRefNum;
+ }
+ }
+
+ return sysInvalidRefNum; // default
+}
+
+static void CardSlotFormExit(Boolean bSave) {
+ MemHandle cards;
+ MemHandle items;
+ CardInfoType *cardsInfo;
+ UInt16 updateCode = frmRedrawUpdateMS;
+
+ if (itemsText && itemsList) {
+ cardsInfo = (CardInfoType *)itemsList;
+ cards = MemPtrRecoverHandle(cardsInfo);
+ items = MemPtrRecoverHandle(itemsText);
+
+ itemsText = NULL;
+ itemsList = NULL;
+ } else {
+ cards = NULL;
+ items = NULL;
+ }
+ itemsType = ITEM_TYPE_UNKNOWN;
+
+ if (bSave) {
+ ListType *listP;
+ ControlType *cck1P, *cck2P, *cck3P;
+ Int16 selected;
+
+ listP = (ListType *)GetObjectPtr(CardSlotSlotList);
+ cck1P = (ControlType *)GetObjectPtr(CardSlotMoveCheckbox);
+ cck2P = (ControlType *)GetObjectPtr(CardSlotDeleteCheckbox);
+ cck3P = (ControlType *)GetObjectPtr(CardSlotConfirmCheckbox);
+ selected = LstGetSelection(listP);
+
+ if (selected == -1) {
+ gPrefs->card.volRefNum = sysInvalidRefNum;
+ } else if (gPrefs->card.volRefNum != cardsInfo[selected].volRefNum) {
+ updateCode = frmRedrawUpdateMSImport;
+ gPrefs->card.volRefNum = cardsInfo[selected].volRefNum;
+ }
+
+ gPrefs->card.moveDB = CtlGetValue(cck1P);
+ gPrefs->card.deleteDB = CtlGetValue(cck2P);
+ gPrefs->card.confirmMoveDB = CtlGetValue(cck3P);
+ CardSlotCreateDirs();
+ }
+
+ FrmReturnToMain(updateCode);
+
+ if (items && cards) {
+ MemHandleUnlock(items);
+ MemHandleUnlock(cards);
+ MemHandleFree(items);
+ MemHandleFree(cards);
+ }
+}
+
+void CardSlotFormUpdate() {
+ if (itemsType == ITEM_TYPE_CARD) {
+ if (itemsText && itemsList) {
+ MemHandle cards;
+ MemHandle items;
+ ListType *listP;
+
+ listP = (ListType *)GetObjectPtr(CardSlotSlotList);
+ cards = MemPtrRecoverHandle(itemsList);
+ items = MemPtrRecoverHandle(itemsText);
+
+ itemsText = NULL;
+ itemsList = NULL;
+ itemsType = ITEM_TYPE_UNKNOWN;
+
+ MemHandleUnlock(items);
+ MemHandleUnlock(cards);
+ MemHandleFree(items);
+ MemHandleFree(cards);
+ }
+ CardSlotFormInit(true, false);
+ }
+}
+
+Boolean CardSlotFormHandleEvent(EventPtr eventP) {
+ Boolean handled = false;
+
+ switch (eventP->eType) {
+
+ case frmOpenEvent:
+ CardSlotFormInit(true, true);
+ handled = true;
+ break;
+
+ case frmCloseEvent:
+ CardSlotFormExit(false);
+ handled = true;
+ break;
+
+ case ctlSelectEvent:
+ switch (eventP->data.ctlSelect.controlID)
+ {
+ case CardSlotOkButton:
+ CardSlotFormExit(true);
+ break;
+
+ case CardSlotCancelButton:
+ CardSlotFormExit(false);
+ break;
+
+ case CardSlotMoveCheckbox:
+ CardSlotFromShowHideOptions();
+ break;
+ }
+ handled = true;
+ break;
+
+ default:
+ break;
+ }
+
+ return handled;
+}
+
+UInt16 parseCards() {
+ UInt16 volRefNum = CardSlotFormInit(false, false);
+ CardSlotFormExit(false);
+
+ return volRefNum;
+} \ No newline at end of file