singrdk/base/Services/Iso9660/Iso9660FileSystemInfo.cs

95 lines
2.9 KiB
C#

///////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
using System;
using System.Collections;
using System.Text;
using System.Threading;
using Microsoft.Singularity.Security;
using Microsoft.Singularity.V1.Services;
namespace Iso9660
{
internal class FSObjectGlobalState {
internal Iso9660FileAttributes attributes;
}
public abstract class Iso9660FileSystemInfo
{
public ulong blockno;
// embedded FSObjectGlobalState globalState;
// globalState.attributes:
public ulong size;
public byte flags;
// embedded Iso9660Ptr:
public byte[] buf;
public int pos;
public Iso9660FileSystemInfo() { buf = new byte[2048];
pos = 0;
}
internal void InitializeMe (byte[] buf, int pos) {
blockno = ByteArray.ToUlong (buf,pos + DirEnt.BLOCK_NO);
size = ByteArray.ToUlong (buf,pos + DirEnt.SIZE);
flags = buf[pos + DirEnt.FLAGS];
}
internal static string[] ParsePath(string path) {
if (path == null) {return null;}
return path.Split(new char[] {SuperBlock.DELIMITER[0]});
}
// given a path, gives you back a filesystem object representing
// that path
public static Iso9660FileSystemInfo InstantiatePath(string path) {
return InstantiatePath(path, null);
}
public static Iso9660FileSystemInfo InstantiatePath(
string path, Iso9660DirectoryInfo startDir) {
Iso9660FileSystemInfo child;
Iso9660DirectoryInfo iterator = (startDir == null) ? SuperBlock.root : startDir;
if (path == "/" || path == "") {
return iterator;
}
string[] names = ParsePath(path);
if (names == null) {
return null;
}
int start = (names[0].Length == 0) ? 1 : 0;
for (int i = start; i < names.Length-1; i++) {
if (!iterator.FindChild(names[i], true, out child)) {
//throw new ArgumentException("Invalid path");
return null;
} else {
iterator = (Iso9660DirectoryInfo)child;
}
}
if (!iterator.FindChild(names[names.Length-1], true, out child)) {
//throw new ArgumentException("Invalid path");
return null;
} else {
return child;
}
}
}
}