1/*
2 * Copyright (c) 2008 Stephan Aßmus <superstippi@gmx.de>. All rights reserved.
3 * Distributed under the terms of the MIT/X11 license.
4 *
5 * Copyright (c) 1999 Mike Steed. You are free to use and distribute this software
6 * as long as it is accompanied by it's documentation and this copyright notice.
7 * The software comes with no warranty, etc.
8 */
9
10
11#include "Snapshot.h"
12
13#include <stdio.h>
14#include <string.h>
15
16#include <Directory.h>
17#include <Mime.h>
18#include <NodeInfo.h>
19#include <Path.h>
20#include <Volume.h>
21
22
23static const char* kFileType = B_FILE_MIME_TYPE;
24static const char* kDirType = "application/x-vnd.Be-directory";
25static const char* kVolumeType = "application/x-vnd.Be-volume";
26
27
28FileInfo::FileInfo()
29	:
30	pseudo(false),
31	size(0),
32	count(0),
33	parent(NULL),
34	children()
35{
36}
37
38
39FileInfo::~FileInfo()
40{
41	while (children.size() != 0) {
42		FileInfo* child = *children.begin();
43		delete child;
44		children.erase(children.begin());
45	}
46}
47
48
49void
50FileInfo::GetPath(string& path) const
51{
52	if (pseudo) {
53		path.assign(ref.name);
54	} else {
55		BEntry entry(&ref, true);
56		BPath pathObj(&entry);
57		path.assign(pathObj.Path());
58	}
59}
60
61
62FileInfo*
63FileInfo::FindChild(const char* name) const
64{
65	vector<FileInfo*>::const_iterator i = children.begin();
66	while (i != children.end()) {
67		if (strcmp((*i)->ref.name, name) == 0)
68			return *i;
69		i++;
70	}
71
72	return NULL;
73}
74
75
76BMimeType*
77FileInfo::Type() const
78{
79	char mimeStr[B_MIME_TYPE_LENGTH] = { '\0' };
80	if (parent == NULL) {
81		// This is the volume's root directory; treat it as a volume type.
82		strlcpy(mimeStr, kVolumeType, sizeof(mimeStr));
83	} else {
84		// Get the MIME type from the registrar.
85		BNode node(&ref);
86		if (node.InitCheck() == B_OK) {
87			BNodeInfo nodeInfo(&node);
88			if (nodeInfo.InitCheck() == B_OK) {
89				status_t s = nodeInfo.GetType(mimeStr);
90				if (s != B_OK && children.size() > 0) {
91					if (s == B_ENTRY_NOT_FOUND) {
92						// This status appears to be returned only for files on
93						// BFS volumes (e.g., CDFS volumes return B_BAD_VALUE).
94						//nodeInfo.SetType(kDirType);
95					}
96					strlcpy(mimeStr, kDirType, sizeof(mimeStr));
97				}
98			}
99		}
100	}
101
102	if (strlen(mimeStr) == 0)
103		strlcpy(mimeStr, kFileType, sizeof(mimeStr));
104
105	return new BMimeType(mimeStr);
106}
107
108
109// #pragma mark -
110
111
112VolumeSnapshot::VolumeSnapshot(const BVolume* volume)
113{
114	char nameBuffer[B_FILE_NAME_LENGTH];
115	volume->GetName(nameBuffer);
116	name = nameBuffer;
117
118	capacity = volume->Capacity();
119	freeBytes = volume->FreeBytes();
120	rootDir = NULL;
121	freeSpace = NULL;
122}
123
124
125VolumeSnapshot::~VolumeSnapshot()
126{
127	delete rootDir;
128	delete freeSpace;
129}
130