public Stream Open(MediaFileMode mode, MediaFileAccess access) { Debug.Assert(mode == MediaFileMode.Normal); if (mode != MediaFileMode.Normal) { return(null); } Debug.Assert(access == MediaFileAccess.Read); if (access != MediaFileAccess.Read) { return(null); } Stream stream = _device.OpenStream(_position, _length); // If the file is under 2mb, load it in to memory #if CACHESMALLFILES if (_length < MaximumCachableFileSize) { byte[] buffer = new byte[_length]; stream.Read(buffer, 0, buffer.Length); MemoryStream memoryStream = new MemoryStream(buffer, false); stream.Dispose(); stream = null; return(memoryStream); } #endif return(stream); }
public Stream Open(MediaFileMode mode, MediaFileAccess access) { if (_device.IsReadOnly == true) { return(null); } FileMode fsMode = FileMode.OpenOrCreate; switch (mode) { case MediaFileMode.Normal: fsMode = FileMode.OpenOrCreate; break; case MediaFileMode.Append: fsMode = FileMode.Open; break; case MediaFileMode.Truncate: fsMode = FileMode.Truncate; break; } FileAccess fsAccess = FileAccess.Read; switch (access) { case MediaFileAccess.Read: fsAccess = FileAccess.Read; break; case MediaFileAccess.Write: fsAccess = FileAccess.Write; break; case MediaFileAccess.ReadWrite: fsAccess = FileAccess.ReadWrite; break; } Stream stream = _info.Open(fsMode, fsAccess, FileShare.ReadWrite); // Hack to overcome the Win32 limitation of not being able to // open a file for read/write append if (mode == MediaFileMode.Append) { stream.Seek(0, SeekOrigin.End); } return(stream); }
public int realIoOpen(int fileName, int flags, int mode, bool async) { string path = _kernel.ReadString(( uint )fileName); if (string.IsNullOrEmpty(path) == true) { return(-1); } IMediaItem item = _kernel.FindPath(path); if (item is IMediaFolder) { // Block access? Debug.Assert(item.Device is IUmdDevice); IUmdDevice umd = ( IUmdDevice )item.Device; Stream stream = umd.OpenImageStream(); if (stream == null) { Log.WriteLine(Verbosity.Normal, Feature.Bios, "sceIoOpen: could not open image stream '{0}'", path); if (async == true) { KFile fakehandle = new KFile(_kernel, false); fakehandle.Result = 0x80010002; fakehandle.PendingClose = true; _kernel.AddHandle(fakehandle); return(( int )fakehandle.UID); } return(-1); } KDevice dev = _kernel.FindDevice(umd); Debug.Assert(dev != null); KFile handle = new KFile(_kernel, dev, item, stream); handle.IsBlockAccess = true; _kernel.AddHandle(handle); handle.Result = handle.UID; Log.WriteLine(Verbosity.Verbose, Feature.Bios, "sceIoOpen: opened block access on {0} with ID {1:X}", path, handle.UID); return(( int )handle.UID); } else { IMediaFile file = ( IMediaFile )item; if (file == null) { // Create if needed if ((flags & 0x0200) != 0) { string newName; IMediaFolder parent; if (path.IndexOf('/') >= 0) { string parentPath = path.Substring(0, path.LastIndexOf('/')); newName = path.Substring(path.LastIndexOf('/') + 1); parent = ( IMediaFolder )_kernel.FindPath(parentPath); } else { newName = path; parent = _kernel.CurrentPath; } if (parent == null) { Log.WriteLine(Verbosity.Normal, Feature.Bios, "sceIoOpen: could not find parent to create file '{0}' in on open", path); if (async == true) { KFile fakehandle = new KFile(_kernel, false); fakehandle.Result = 0x80010002; fakehandle.PendingClose = true; _kernel.AddHandle(fakehandle); return(( int )fakehandle.UID); } return(-1); } file = parent.CreateFile(newName); } else { Log.WriteLine(Verbosity.Normal, Feature.Bios, "sceIoOpen: could not find path '{0}'", path); if (async == true) { KFile fakehandle = new KFile(_kernel, false); fakehandle.Result = 0x80010002; fakehandle.PendingClose = true; _kernel.AddHandle(fakehandle); return(( int )fakehandle.UID); } return(unchecked (( int )0x8002012f)); } } /* * #define PSP_O_RDONLY 0x0001 #define PSP_O_WRONLY 0x0002 #define PSP_O_RDWR (PSP_O_RDONLY | PSP_O_WRONLY) #define PSP_O_NBLOCK 0x0004 #define PSP_O_DIROPEN 0x0008 // Internal use for dopen #define PSP_O_APPEND 0x0100 #define PSP_O_CREAT 0x0200 #define PSP_O_TRUNC 0x0400 #define PSP_O_EXCL 0x0800 #define PSP_O_NOWAIT 0x8000*/ MediaFileMode fileMode = MediaFileMode.Normal; if ((flags & 0x0100) == 0x0100) { fileMode = MediaFileMode.Append; } if ((flags & 0x0400) == 0x0400) { fileMode = MediaFileMode.Truncate; } MediaFileAccess fileAccess = MediaFileAccess.ReadWrite; if ((flags & 0x0001) == 0x0001) { fileAccess = MediaFileAccess.Read; } if ((flags & 0x0002) == 0x0002) { fileAccess = MediaFileAccess.Write; } if ((flags & 0x0003) == 0x0003) { fileAccess = MediaFileAccess.ReadWrite; } if ((flags & 0x0800) != 0) { // Exclusive O_EXCL //int x = 1; } if ((flags & 0x8000) != 0) { // Non-blocking O_NOWAIT //int x = 1; } if ((flags & 0x0004) != 0) { // ? O_NBLOCK //int x = 1; } Stream stream = file.Open(fileMode, fileAccess); if (stream == null) { Log.WriteLine(Verbosity.Normal, Feature.Bios, "sceIoOpen: could not open stream on file '{0}' for mode {1} access {2}", path, fileMode, fileAccess); return(-1); } IMediaDevice device = file.Device; KDevice dev = _kernel.FindDevice(file.Device); Debug.Assert(dev != null); KFile handle = new KFile(_kernel, dev, file, stream); _kernel.AddHandle(handle); handle.Result = handle.UID; Log.WriteLine(Verbosity.Verbose, Feature.Bios, "sceIoOpen: opened file {0} with ID {1:X}", path, handle.UID); return(( int )handle.UID); } }
public Stream Open( MediaFileMode mode, MediaFileAccess access ) { if( _device.IsReadOnly == true ) return null; FileMode fsMode = FileMode.OpenOrCreate; switch( mode ) { case MediaFileMode.Normal: fsMode = FileMode.OpenOrCreate; break; case MediaFileMode.Append: fsMode = FileMode.Open; break; case MediaFileMode.Truncate: fsMode = FileMode.Truncate; break; } FileAccess fsAccess = FileAccess.Read; switch( access ) { case MediaFileAccess.Read: fsAccess = FileAccess.Read; break; case MediaFileAccess.Write: fsAccess = FileAccess.Write; break; case MediaFileAccess.ReadWrite: fsAccess = FileAccess.ReadWrite; break; } Stream stream = _info.Open( fsMode, fsAccess, FileShare.ReadWrite ); // Hack to overcome the Win32 limitation of not being able to // open a file for read/write append if( mode == MediaFileMode.Append ) stream.Seek( 0, SeekOrigin.End ); return stream; }