int32 QueryMenu::QueryThread( void ) { BAutolock lock( fQueryLock ); if( !lock.IsLocked() ) return B_ERROR; fCancelQuery = false; // Begin resolving query fQuery->Fetch(); entry_ref ref; node_ref node; // Build Menu // The leash it a work-around for when the something in the query breaks and prevents // GetNextRef() from ever returning B_ENTRY_NOT_FOUND for( int32 leash=0; (fQuery->GetNextRef( &ref ) != B_ENTRY_NOT_FOUND)&&(!fCancelQuery)&&(leash < 128); leash++ ) { BEntry entry( &ref ); entry.GetNodeRef( &node ); EntryCreated( ref, node.node ); } return B_OK; }
int32 QueryMenu::QueryThread() { BAutolock lock(fQueryLock); if (!lock.IsLocked()) return B_ERROR; // Begin resolving query fCancelQuery = false; fQuery->Fetch(); // Build Menu entry_ref ref; node_ref node; while (fQuery->GetNextRef(&ref) == B_OK && !fCancelQuery) { BEntry entry(&ref); entry.GetNodeRef(&node); EntryCreated(ref, node.node); } // Remove the group separator if there are no groups or no items without groups BMenuItem *item; if (dynamic_cast<BSeparatorItem *>(item = ItemAt(0)) != NULL) RemoveItem(item); else if (dynamic_cast<BSeparatorItem *>(item = ItemAt(CountItems() - 1)) != NULL) RemoveItem(item); return B_OK; }
void QueryMenu::DoQueryMessage( BMessage *msg ) { int32 opcode; int64 directory; int32 device; int64 node; const char *name; if( (msg->FindInt32( "opcode", &opcode ) == B_OK)&& (msg->FindInt64( "directory", &directory ) == B_OK)&& (msg->FindInt32( "device", &device ) == B_OK)&& (msg->FindInt64( "node", &node ) == B_OK) ) { if( (opcode == B_ENTRY_CREATED)&&(msg->FindString( "name", &name ) == B_OK) ) { entry_ref ref( device, directory, name ); EntryCreated( ref, node ); return; } else if( opcode == B_ENTRY_REMOVED ) { BAutolock lock( fQueryLock ); if( !lock.IsLocked() ) return; EntryRemoved( node ); } } }
void AttrChanged(WatchedFile* file) { EntryRemoved(file); EntryCreated(file); }