Boolean VMacResFile::GetString(VString& outString, sLONG inID) const { outString.Clear(); if (!testAssert(fRefNum != -1)) return false; if (!testAssert(inID >= -32768 && inID <= 32767)) return false; sWORD curres = ::CurResFile(); if (curres != fRefNum) ::UseResFile(fRefNum); Handle data = fUseResourceChain ? ::GetResource('STR ', (short) inID) : ::Get1Resource('STR ', (short) inID); if (curres != fRefNum) ::UseResFile(curres); Boolean isOK = false; if (testAssert(data != NULL)) { if (testAssert(*data != NULL)) { ::HLock(data); outString.MAC_FromMacPString((StringPtr) *data); ::HUnlock(data); isOK = true; } } return isOK; }
void VMacResourceIterator::GetCurrentResourceName(VString& outName) { if (!testAssert(fPos >= 1 && fPos <= fIDs.GetCount())) return; sWORD refnum = fRefNums.GetWord(fPos); sWORD id = fIDs.GetWord(fPos); sWORD curres = ::CurResFile(); if (curres != refnum) ::UseResFile(refnum); ::SetResLoad(false); Handle data = ::Get1Resource(fType, id); OSErr macError = ::ResError(); ::SetResLoad(true); if (curres != refnum) ::UseResFile(curres); if (data != NULL) { ResType type; sWORD id2; Str255 spName; ::GetResInfo(data, &id2, &type, spName); macError = ::ResError(); if (testAssert(macError == noErr)) outName.MAC_FromMacPString(spName); } }
VError VMacResFile::GetResourceListNames(const VString& inType, VArrayString& outNames) const { OSErr macError = noErr; outNames.SetCount(0); if (!testAssert(fRefNum != -1)) return VE_STREAM_NOT_OPENED; ResType type = inType.GetOsType(); if (type == 0) return VE_INVALID_PARAMETER; sWORD oldref = ::CurResFile(); sWORD ref = fRefNum; while(ref != -1 && ref != 0) { ::UseResFile(ref); sWORD count = ::Count1Resources(type); ::UseResFile(oldref); for(sWORD i = 1 ; i <= count ; ++i) { ::UseResFile(ref); ::SetResLoad(false); Handle data = ::Get1IndResource(type, i); macError = ::ResError(); ::SetResLoad(true); ::UseResFile(oldref); // one must restore proper context before calling VArrayValue::AppendWord if (data != NULL) { ResType type2; sWORD id; Str255 spName; ::GetResInfo(data, &id, &type2, spName); macError = ::ResError(); if (macError == noErr && spName[0] > 0) { VString name; name.MAC_FromMacPString(spName); if (outNames.Find(name) == -1) outNames.AppendString(name); } } } if (!fUseResourceChain) break; else { macError = ::GetNextResourceFile(ref, &ref); // returns ref = 0 and noerror at the end if (!testAssert(macError == noErr)) break; } } return VE_OK; }
Boolean VMacResFile::GetString(VString& outString, sLONG inID, sLONG inIndex) const { outString.Clear(); if (!testAssert(fRefNum != -1)) return false; if (!testAssert(inID >= -32768 && inID <= 32767 && inIndex > 0)) return false; Boolean isOK = false; sWORD curres = ::CurResFile(); if (curres != fRefNum) ::UseResFile(fRefNum); if (fReadOnly && (fLastStringListID == inID) && (fLastStringList != NULL)) { if (*fLastStringList == NULL) ::LoadResource(fLastStringList); } else { fLastStringListID = (short) inID; fLastStringList = fUseResourceChain ? ::GetResource('STR#', fLastStringListID) : ::Get1Resource('STR#', fLastStringListID); } if (curres != fRefNum) ::UseResFile(curres); if (testAssert(fLastStringList != NULL)) { if (testAssert(*fLastStringList != NULL)) { ::HLock(fLastStringList); sLONG count = **(sWORD**) fLastStringList; if (count >= inIndex) { StringPtr strs = (StringPtr) *fLastStringList + sizeof(sWORD); while(--inIndex) strs += strs[0] + 1; outString.MAC_FromMacPString(strs); isOK = true; } ::HUnlock(fLastStringList); } } return isOK; }
VError VMacResFile::GetResourceName(const VString& inType, sLONG inID, VString& outName) const { outName.Clear(); Handle data = NULL; VError error = _GetResource(inType, inID, &data); if (error == VE_OK) { ResType type; sWORD id; Str255 spName; ::GetResInfo(data, &id, &type, spName); OSErr macError = ::ResError(); if (testAssert(macError == noErr)) { outName.MAC_FromMacPString(spName); } else error = VErrorBase::NativeErrorToVError((VNativeError)macError); } return error; }