/* * Copyright (c) 2008 Stephan Aßmus . All rights reserved. * Distributed under the terms of the MIT/X11 license. * * Copyright (c) 1999 Mike Steed. You are free to use and distribute this software * as long as it is accompanied by it's documentation and this copyright notice. * The software comes with no warranty, etc. */ #include "Snapshot.h" #include #include #include #include #include #include #include static const char* kFileType = B_FILE_MIME_TYPE; static const char* kDirType = "application/x-vnd.Be-directory"; static const char* kVolumeType = "application/x-vnd.Be-volume"; FileInfo::FileInfo() : pseudo(false), size(0), count(0), parent(NULL), children() { } FileInfo::~FileInfo() { while (children.size() != 0) { FileInfo* child = *children.begin(); delete child; children.erase(children.begin()); } } void FileInfo::GetPath(string& path) const { if (pseudo) { path.assign(ref.name); } else { BEntry entry(&ref, true); BPath pathObj(&entry); path.assign(pathObj.Path()); } } FileInfo* FileInfo::FindChild(const char* name) const { vector::const_iterator i = children.begin(); while (i != children.end()) { if (strcmp((*i)->ref.name, name) == 0) return *i; i++; } return NULL; } BMimeType* FileInfo::Type() const { char mimeStr[B_MIME_TYPE_LENGTH] = { '\0' }; if (parent == NULL) { // This is the volume's root directory; treat it as a volume type. strlcpy(mimeStr, kVolumeType, sizeof(mimeStr)); } else { // Get the MIME type from the registrar. BNode node(&ref); if (node.InitCheck() == B_OK) { BNodeInfo nodeInfo(&node); if (nodeInfo.InitCheck() == B_OK) { status_t s = nodeInfo.GetType(mimeStr); if (s != B_OK && children.size() > 0) { if (s == B_ENTRY_NOT_FOUND) { // This status appears to be returned only for files on // BFS volumes (e.g., CDFS volumes return B_BAD_VALUE). //nodeInfo.SetType(kDirType); } strlcpy(mimeStr, kDirType, sizeof(mimeStr)); } } } } if (strlen(mimeStr) == 0) strlcpy(mimeStr, kFileType, sizeof(mimeStr)); return new BMimeType(mimeStr); } // #pragma mark - VolumeSnapshot::VolumeSnapshot(const BVolume* volume) { char nameBuffer[B_FILE_NAME_LENGTH]; volume->GetName(nameBuffer); name = nameBuffer; capacity = volume->Capacity(); freeBytes = volume->FreeBytes(); rootDir = NULL; freeSpace = NULL; } VolumeSnapshot::~VolumeSnapshot() { delete rootDir; delete freeSpace; }