const char * Model::PreferredAppSignature() const { if (IsVolume() || IsSymLink()) return ""; return fPreferredAppName ? fPreferredAppName : ""; }
void Model::SetPreferredAppSignature(const char *signature) { ASSERT(!IsVolume() && !IsSymLink()); ASSERT(signature != fPreferredAppName); // self assignment should not be an option free(fPreferredAppName); if (signature) fPreferredAppName = strdup(signature); else fPreferredAppName = NULL; }
void Model::DeletePreferredAppVolumeNameLinkTo() { if (IsSymLink()) { Model* tmp = fLinkTo; // deal with link to link to self fLinkTo = NULL; delete tmp; } else if (IsVolume()) free(fVolumeName); else free(fPreferredAppName); fPreferredAppName = NULL; }
bool Model::AttrChanged(const char* attrName) { // called on an attribute changed node monitor // sync up cached values of mime type and preferred app and // return true if icon needs updating ASSERT(IsNodeOpen()); if (attrName != NULL && (strcmp(attrName, kAttrIcon) == 0 || strcmp(attrName, kAttrMiniIcon) == 0 || strcmp(attrName, kAttrLargeIcon) == 0)) { return true; } if (attrName == NULL || strcmp(attrName, kAttrMIMEType) == 0 || strcmp(attrName, kAttrPreferredApp) == 0) { char mimeString[B_MIME_TYPE_LENGTH]; BNodeInfo info(fNode); if (info.GetType(mimeString) != B_OK) fMimeType = ""; else { // node has a specific mime type fMimeType = mimeString; if (!IsVolume() && !IsSymLink() && info.GetPreferredApp(mimeString) == B_OK) { SetPreferredAppSignature(mimeString); } } #if xDEBUG if (fIconFrom != kNode) { PRINT(("%s, %s:updating icon because file type changed\n", Name(), attrName != NULL ? attrName : "")); } else { PRINT(("Not updating icon even though type changed " "because icon is from node.\n")); } #endif return fIconFrom != kNode; // update icon unless it is coming from a node } return attrName == NULL; }
void Model::UpdateEntryRef(const node_ref *dirNode, const char *name) { if (IsVolume()) { if (fVolumeName) DeletePreferredAppVolumeNameLinkTo(); fVolumeName = strdup(name); } fEntryRef.device = dirNode->device; fEntryRef.directory = dirNode->node; if (fEntryRef.name && strcmp(fEntryRef.name, name) == 0) return; fEntryRef.set_name(name); }
status_t Model::WatchVolumeAndMountPoint(uint32 , BHandler *target) { ASSERT(IsVolume()); if (fEntryRef.name && fVolumeName && strcmp(fEntryRef.name, "boot") == 0) { // watch mount point for boot volume BString bootMountPoint("/"); bootMountPoint += fVolumeName; BEntry mountPointEntry(bootMountPoint.String()); Model mountPointModel(&mountPointEntry); TTracker::WatchNode(mountPointModel.NodeRef(), B_WATCH_NAME | B_WATCH_STAT | B_WATCH_ATTR, target); } return TTracker::WatchNode(NodeRef(), B_WATCH_NAME | B_WATCH_STAT | B_WATCH_ATTR, target); }
void Model::PrintToStream(int32 level, bool deep) { PRINT(("model name %s, entry name %s, inode %Lx, dev %x, directory inode %Lx\n", Name() ? Name() : "**empty name**", EntryRef()->name ? EntryRef()->name : "**empty ref name**", NodeRef()->node, NodeRef()->device, EntryRef()->directory)); PRINT(("type %s \n", MimeType())); PRINT(("model type: ")); switch (fBaseType) { case kPlainNode: PRINT(("plain\n")); break; case kQueryNode: PRINT(("query\n")); break; case kQueryTemplateNode: PRINT(("query template\n")); break; case kExecutableNode: PRINT(("exe\n")); break; case kDirectoryNode: PRINT(("dir\n")); break; case kLinkNode: PRINT(("link\n")); break; case kRootNode: PRINT(("root\n")); break; case kVolumeNode: PRINT(("volume, name %s\n", fVolumeName ? fVolumeName : "")); break; default: PRINT(("unknown\n")); break; } if (level < 1) return; if (!IsVolume()) PRINT(("preferred app %s\n", fPreferredAppName ? fPreferredAppName : "")); PRINT(("icon from: ")); switch (IconFrom()) { case kUnknownSource: PRINT(("unknown\n")); break; case kUnknownNotFromNode: PRINT(("unknown but not from a node\n")); break; case kTrackerDefault: PRINT(("tracker default\n")); break; case kTrackerSupplied: PRINT(("tracker supplied\n")); break; case kMetaMime: PRINT(("metamime\n")); break; case kPreferredAppForType: PRINT(("preferred app for type\n")); break; case kPreferredAppForNode: PRINT(("preferred app for node\n")); break; case kNode: PRINT(("node\n")); break; case kVolume: PRINT(("volume\n")); break; } PRINT(("model %s opened %s \n", !IsNodeOpen() ? "not " : "", IsNodeOpenForWriting() ? "for writing" : "")); if (IsNodeOpen()) { node_ref nodeRef; fNode->GetNodeRef(&nodeRef); PRINT(("node ref of open Node %Lx %x\n", nodeRef.node, nodeRef.device)); } if (deep && IsSymLink()) { BEntry tmpEntry(EntryRef(), true); Model tmp(&tmpEntry); PRINT(("symlink to:\n")); tmp.PrintToStream(); } TrackIconSource(B_MINI_ICON); TrackIconSource(B_LARGE_ICON); }