status_t VirtualDirectoryEntryList::GetNextEntry(BEntry* entry, bool traverse) { entry_ref ref; status_t error = GetNextRef(&ref); if (error != B_OK) return error; return entry->SetTo(&ref, traverse); }
/*! \brief Returns the BDirectory's next entry as a BEntry. Unlike GetNextDirents() this method ignores the entries "." and "..". \param entry a pointer to a BEntry to be initialized to the found entry \param traverse specifies whether to follow it, if the found entry is a symbolic link. \note The iterator used by this method is the same one used by GetNextRef(), GetNextDirents(), Rewind() and CountEntries(). \return - \c B_OK: Everything went fine. - \c B_BAD_VALUE: \c NULL \a entry. - \c B_ENTRY_NOT_FOUND: No more entries found. - \c B_PERMISSION_DENIED: Directory permissions didn't allow operation. - \c B_NO_MEMORY: Insufficient memory for operation. - \c B_LINK_LIMIT: Indicates a cyclic loop within the file system. - \c B_BUSY: A node was busy. - \c B_FILE_ERROR: A general file error. - \c B_NO_MORE_FDS: The application has run out of file descriptors. */ status_t BDirectory::GetNextEntry(BEntry* entry, bool traverse) { status_t error = (entry ? B_OK : B_BAD_VALUE); if (error == B_OK) { entry_ref ref; error = GetNextRef(&ref); if (error == B_OK) error = entry->SetTo(&ref, traverse); } return error; }
status_t TFilteredQuery::GetNextEntry(BEntry *entry, bool traverse) { // This code is almost a full copy/paste from Haiku's // BQuery::GetNextEntry(BEntry *entry, bool traverse) entry_ref ref; status_t error = GetNextRef(&ref); if (error == B_OK) error = entry->SetTo(&ref, traverse); return error; }
status_t TVolWalker::GetNextRef(entry_ref* ref) { if (fTopDir == NULL) return B_ENTRY_NOT_FOUND; // Get the next ref. status_t result = _inherited::GetNextRef(ref); while (result != B_OK) { // we're done with the current volume, go to the next one result = NextVolume(); if (result != B_OK) break; result = GetNextRef(ref); } return result; }
status_t TNodeWalker::GetNextRef(entry_ref* ref) { if (fJustFile != NULL) { fJustFile->GetRef(ref); fJustFile = 0; return B_OK; } if (fTopDir == NULL) { // done return B_ENTRY_NOT_FOUND; } // If requested to include the top directory, return that first. if (fIncludeTopDir) { fIncludeTopDir = false; BEntry entry; status_t err = fTopDir->GetEntry(&entry); if (err == B_OK) err = entry.GetRef(ref); return err; } // get the next entry status_t err = fTopDir->GetNextRef(ref); if (err != B_OK) { err = PopDirCommon(); if (err != B_OK) return err; return GetNextRef(ref); } // See if this entry is a directory, if it is then push it onto the stack. if (fTopDir->Contains(ref->name, B_DIRECTORY_NODE)) PushDirCommon(ref); return B_OK; }
BMenuItem* BRecentItemsList::GetNextMenuItem(const BMessage* fileOpenInvokeMessage, const BMessage* containerOpenInvokeMessage, BHandler* target, entry_ref* currentItemRef) { entry_ref ref; if (GetNextRef(&ref) != B_OK) return NULL; Model model(&ref, true); if (model.InitCheck() != B_OK) return NULL; bool container = false; if (model.IsSymLink()) { Model* newResolvedModel = NULL; Model* result = model.LinkTo(); if (result == NULL) { newResolvedModel = new Model(model.EntryRef(), true, true); if (newResolvedModel->InitCheck() != B_OK) { // broken link, still can show though, bail delete newResolvedModel; result = NULL; } else result = newResolvedModel; } else { BModelOpener opener(result); // open the model, if it ain't open already PoseInfo poseInfo; BNode* resultNode = result->Node(); if (resultNode != NULL) { resultNode->ReadAttr(kAttrPoseInfo, B_RAW_TYPE, 0, &poseInfo, sizeof(poseInfo)); } result->CloseNode(); ref = *result->EntryRef(); container = result->IsContainer(); } model.SetLinkTo(result); } else { ref = *model.EntryRef(); container = model.IsContainer(); } // if user asked for it, return the current item ref if (currentItemRef != NULL) *currentItemRef = ref; BMessage* message; if (container && containerOpenInvokeMessage) message = new BMessage(*containerOpenInvokeMessage); else if (!container && fileOpenInvokeMessage) message = new BMessage(*fileOpenInvokeMessage); else message = new BMessage(B_REFS_RECEIVED); message->AddRef("refs", model.EntryRef()); // Truncate the name if necessary BString truncatedString(model.Name()); be_plain_font->TruncateString(&truncatedString, B_TRUNCATE_END, BNavMenu::GetMaxMenuWidth()); ModelMenuItem* item = NULL; if (!container || !fNavMenuFolders) item = new ModelMenuItem(&model, truncatedString.String(), message); else { // add another nav menu item if it's a directory BNavMenu* menu = new BNavMenu(truncatedString.String(), message->what, target, 0); menu->SetNavDir(&ref); item = new ModelMenuItem(&model, menu); item->SetMessage(message); } if (item != NULL && target != NULL) item->SetTarget(target); return item; }
status_t Feeder::GetNextRemoval(entry_ref *ref) { return GetNextRef(&fDeleteQueue, ref) ; }
status_t Feeder::GetNextUpdate(entry_ref *ref) { return GetNextRef(&fIndexQueue, ref) ; }