Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
            }
        }
Example #4
0
        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;
        }