diff --git a/include/System/IO/Directory.h b/include/System/IO/Directory.h index e8c82b3..a68ec55 100644 --- a/include/System/IO/Directory.h +++ b/include/System/IO/Directory.h @@ -4,8 +4,8 @@ * XFX Directory class definition file * * Copyright © XFX Team. All Rights Reserved * ********************************************************/ -#ifndef _IO_DIRECTORY_ -#define _IO_DIRECTORY_ +#ifndef _SYSTEM_IO_DIRECTORY_ +#define _SYSTEM_IO_DIRECTORY_ #include "../Types.h" @@ -48,4 +48,4 @@ namespace System } } -#endif //_IO_DIRECTORY_ +#endif //_SYSTEM_IO_DIRECTORY_ diff --git a/include/System/IO/DirectoryInfo.h b/include/System/IO/DirectoryInfo.h index 0079ec0..1af4d44 100644 --- a/include/System/IO/DirectoryInfo.h +++ b/include/System/IO/DirectoryInfo.h @@ -32,13 +32,13 @@ namespace System DirectoryInfo Parent(); DirectoryInfo Root(); - DirectoryInfo(const char* path, bool junk); + DirectoryInfo(const char* path); // Initializes a new instance of the System::IO::DirectoryInfo class on the specified path. - void Create(); - DirectoryInfo CreateSubDirectory(const char* path); - void Delete(); - void Delete(bool recursive); - DirectoryInfo* GetDirectories(); + void Create(); // Creates a directory. + DirectoryInfo CreateSubDirectory(const char* path); // Creates a subdirectory or subdirectories on the specified path. The specified path can be relative to this instance of the System::IO::DirectoryInfo class. + void Delete(); // Deletes this System::IO::DirectoryInfo if it is empty. + void Delete(bool recursive); // Deletes this instance of a System::IO::DirectoryInfo, specifying whether to delete subdirectories and files. + DirectoryInfo* GetDirectories(); // DirectoryInfo* GetDirectories(const char* searchPattern); FileSystemInfo* GetFileSystemInfos(); FileSystemInfo* GetFileSystemInfos(const char* searchPattern); diff --git a/include/System/IO/FileSystemInfo.h b/include/System/IO/FileSystemInfo.h index 66fda67..8aa2194 100644 --- a/include/System/IO/FileSystemInfo.h +++ b/include/System/IO/FileSystemInfo.h @@ -7,6 +7,10 @@ namespace System { class FileSystemInfo { + protected: + char* FullPath; + char* OriginalPath; + public: virtual char* FullName(); }; diff --git a/include/System/IO/Stream.h b/include/System/IO/Stream.h index 0f8e5b7..fe52d7c 100644 --- a/include/System/IO/Stream.h +++ b/include/System/IO/Stream.h @@ -43,12 +43,8 @@ namespace System int WriteTimeOut; static const Stream Null; - virtual IAsyncResult* BeginRead(byte buffer[], int offset, int count, ASyncCallback callback, Object* state); - virtual IAsyncResult* BeginWrite(byte buffer[], int offset, int count, ASyncCallback callback, Object* state); virtual void Close(); void Dispose(); - virtual int EndRead(IAsyncResult* asyncResult); - virtual void EndWrite(IAsyncResult* asyncResult); virtual void Flush(); virtual int Read(byte buffer[], int offset, int count); virtual int ReadByte(); diff --git a/include/System/String.h b/include/System/String.h index d6dc879..d2156e2 100644 --- a/include/System/String.h +++ b/include/System/String.h @@ -8,7 +8,7 @@ #define _SYSTEM_STRING_ #include "Enums.h" -#include +#include "Types.h" namespace System { @@ -50,6 +50,7 @@ namespace System int IndexOf(char value, int startIndex); int IndexOf(char value, int startIndex, int count); static bool IsNullOrEmpty(String value); + static bool IsNullOrEmpty(char* value); static String Join(String &separator, String value[]); static String Join(String &separator, String value[], int startIndex, int count); String PadLeft(int totalWidth); @@ -65,7 +66,7 @@ namespace System char** Split(char separator[], int count); char** Split(char separator[]); bool StartsWith(char* value); - String SubString(int startIndex); + static char* SubString(int startIndex); String SubString(int startIndex, int length); char *ToCharArray(int startIndex, int length); char *ToCharArray(); @@ -74,6 +75,7 @@ namespace System String ToUpper(); bool operator!=(const String right); + bool operator!=(const char* right); bool operator==(const String right); bool operator==(const char* right); String operator=(const char* right); diff --git a/src/libmscorlib/Directory.cpp b/src/libmscorlib/Directory.cpp index 2f0dd4d..5fe5ee7 100644 --- a/src/libmscorlib/Directory.cpp +++ b/src/libmscorlib/Directory.cpp @@ -1,3 +1,30 @@ +// Copyright (C) 2010-2012, Halofreak_1990 +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the copyright holder nor the names of any +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + #include #include #include @@ -6,10 +33,7 @@ #include -#if ENABLE_XBOX #include -#else -#endif namespace System { @@ -23,10 +47,9 @@ namespace System if (File::Exists(path)) throw IOException(strcat((char*)"Cannot create ", strcat(path,(char*)" because a file with the same name already exists."))); -#if ENABLE_XBOX XCreateDirectory(path); -#else -#endif + + return DirectoryInfo(path); } void Directory::Delete(char* path) @@ -36,9 +59,7 @@ namespace System void Directory::Delete(char* path, bool recursive) { -#if ENABLE_XBOX -#else -#endif + } bool Directory::Exists(char* path) diff --git a/src/libmscorlib/DirectoryInfo.cpp b/src/libmscorlib/DirectoryInfo.cpp new file mode 100644 index 0000000..78ba71f --- /dev/null +++ b/src/libmscorlib/DirectoryInfo.cpp @@ -0,0 +1,84 @@ +// Copyright (C) 2010-2012, Halofreak_1990 +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the copyright holder nor the names of any +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include +#include + +namespace System +{ + namespace IO + { + DirectoryInfo::DirectoryInfo(const char* path) + { + if (path == null) + throw ArgumentNullException("path"); + + if ((String::Length() == 2) && (path[1] == ':')) + { + OriginalPath = "."; + } + else + { + OriginalPath = path; + } + } + + void DirectoryInfo::Create() + { + } + + DirectoryInfo DirectoryInfo::CreateSubDirectory(const char* path) + { + + } + + void DirectoryInfo::Delete() + { + Directory::Delete(FullPath, false); + } + + void DirectoryInfo::Delete(bool recursive) + { + Directory::Delete(FullPath, recursive); + } + + DirectoryInfo* DirectoryInfo::GetDirectories() + { + return GetDirectories("*"); + } + + DirectoryInfo* DirectoryInfo::GetDirectories(const char* searchPattern) + { + if (searchPattern = null) + throw ArgumentNullException("searchPattern"); + + + } + } +} diff --git a/src/libmscorlib/File.cpp b/src/libmscorlib/File.cpp index c7470db..ac5ed07 100644 --- a/src/libmscorlib/File.cpp +++ b/src/libmscorlib/File.cpp @@ -33,8 +33,7 @@ #include #include #include - -extern void *malloc(unsigned int size); +#include namespace System { @@ -72,16 +71,16 @@ namespace System int sourceHandle; int destHandle; UInt32 length; - byte *buffer; + void *buffer; ret = XCreateFile(&sourceHandle, sourceFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); if(ret == 0) { XGetFileSize(sourceHandle, &length); - buffer = (byte*)malloc((int)length); - XReadFile(sourceHandle, (void*)buffer, length, NULL); + buffer = MmAllocateContiguousMemory((int)length); + XReadFile(sourceHandle, buffer, length, NULL); XCloseHandle(sourceHandle); XCreateFile(&destHandle, destFileName, GENERIC_WRITE, FILE_SHARE_WRITE, CREATE_NEW, FILE_ATTRIBUTE_NORMAL); - XWriteFile(destHandle, (void*)buffer, length, NULL); + XWriteFile(destHandle, buffer, length, NULL); XCloseHandle(destHandle); } } @@ -114,7 +113,7 @@ namespace System bool File::Exists(char* path) { - bool flag; + bool flag = false; try { if(path == null) @@ -124,7 +123,7 @@ namespace System return false; path = Path::GetFullPath(path); - PXBOX_FIND_DATA data; + PXBOX_FIND_DATA data = null; flag = ((FileAttributeInfo(path, data, false, false) == 0) && (data->dwFileAttributes != -1) && ((data->dwFileAttributes & 0x10) == 0)); } catch(ArgumentException) @@ -175,6 +174,7 @@ namespace System char* dst = Path::GetFullPath(destFileName); //! TODO: Move the file + // I suspect MoveFile is simply copying the file, and then removing the source file. } FileStream File::Open(char* path, FileMode_t mode) diff --git a/src/libmscorlib/FileStream.cpp b/src/libmscorlib/FileStream.cpp index d4ee94e..6466822 100644 --- a/src/libmscorlib/FileStream.cpp +++ b/src/libmscorlib/FileStream.cpp @@ -28,12 +28,10 @@ #include #include -#if ENABLE_XBOX -extern "C" { +extern "C" +{ #include } -#else -#endif namespace System { @@ -63,11 +61,9 @@ namespace System throw NotSupportedException("The stream does not support seeking."); Int64 length; -#if ENABLE_XBOX if(XGetFileSize(handle, (unsigned int *)length) != STATUS_SUCCESS) throw IOException("Could not determine file size. The file may be corrupt."); -#else -#endif + if ((_writePos > 0) && ((_pos + _writePos) > length)) { length = _writePos + _pos; @@ -108,10 +104,8 @@ namespace System throw ArgumentNullException("path", "path was either NULL or an empty string."); _access = (mode == FileMode::Append ? FileAccess::Write : FileAccess::ReadWrite); -#if ENABLE_XBOX + XCreateFile(&handle, path, _access, FileShare::Read, mode, FILE_ATTRIBUTE_NORMAL); -#else -#endif } FileStream::FileStream(char* path, FileMode_t mode, FileAccess_t access) @@ -120,10 +114,8 @@ namespace System throw ArgumentNullException("path", "path was either NULL, or an empty string."); _access = access; -#if ENABLE_XBOX + XCreateFile(&handle, path, access, FILE_SHARE_READ | FILE_SHARE_WRITE, mode, FILE_ATTRIBUTE_NORMAL); -#else -#endif } FileStream::FileStream(char* path, FileMode_t mode, FileAccess_t access, FileShare_t share) @@ -131,10 +123,7 @@ namespace System if(path == null || path == "") throw ArgumentNullException("path", "path was either NULL, or an empty string."); -#if ENABLE_XBOX XCreateFile(&handle, path, access, share, mode, FILE_ATTRIBUTE_NORMAL); -#else -#endif } FileStream::FileStream(char* path, FileMode_t mode, FileAccess_t access, FileShare_t share, int bufferSize) @@ -147,18 +136,7 @@ namespace System if (bufferSize <= 0) throw ArgumentOutOfRangeException("bufferSize", "Positive number required."); -#if ENABLE_XBOX - isAsync = useAsync; - - if(isAsync) - { - } - else - { - XCreateFile(&handle, path, access, share, mode, FILE_ATTRIBUTE_NORMAL); - } -#else -#endif + XCreateFile(&handle, path, access, share, mode, FILE_ATTRIBUTE_NORMAL); } FileStream::~FileStream() @@ -204,18 +182,7 @@ namespace System void FileStream::FlushWrite(bool calledFromFinalizer) { - if (isAsync) - { - IAsyncResult* asyncResult = BeginWrite(_buffer, 0, _writePos, null, null); - if (!calledFromFinalizer) - { - EndWrite(asyncResult); - } - } - else - { - Write(_buffer, 0, _writePos); - } + Write(_buffer, 0, _writePos); _writePos = 0; } @@ -241,18 +208,9 @@ namespace System if (offset > len - count) throw ArgumentException("Reading would overrun buffer"); - if(isAsync) - { - IAsyncResult* ares = BeginRead(array, offset, count, null, null); - return EndRead(ares); - } - -#if ENABLE_XBOX UInt32 bytesRead; XReadFile(handle, &array[offset], count, &bytesRead); return bytesRead; -#else -#endif } int FileStream::ReadByte() @@ -272,7 +230,6 @@ namespace System if(handle == -1) throw ObjectDisposedException("FileStream", "The stream has been closed."); -#if ENABLE_XBOX FILE_POSITION_INFORMATION positionInfo; LARGE_INTEGER targetPointer; IO_STATUS_BLOCK ioStatusBlock; @@ -311,8 +268,6 @@ namespace System { return targetPointer.QuadPart; } -#else -#endif } void FileStream::SetLength(long long value) @@ -328,34 +283,18 @@ namespace System Flush(); - // - if (Position() > value) Position(value); } void FileStream::Write(byte array[], int offset, int count) { - if(isAsync) - { - IAsyncResult* asyncResult = BeginWrite(array, offset, count, null, null); - EndWrite(asyncResult); - } - else - { -#if ENABLE_XBOX XWriteFile(handle, &array[offset], count, null); -#else -#endif - } } void FileStream::WriteByte(byte value) { -#if ENABLE_XBOX XWriteFile(handle, (void*)value, 1, null); -#else -#endif } } } diff --git a/src/libmscorlib/MemoryStream.cpp b/src/libmscorlib/MemoryStream.cpp index 6f19825..1324e56 100644 --- a/src/libmscorlib/MemoryStream.cpp +++ b/src/libmscorlib/MemoryStream.cpp @@ -35,11 +35,8 @@ namespace System { namespace IO { -#if ENABLE_XBOX // The XBOX Limits us to 64MB; we do not take XDKs into account + // The XBOX Limits us to 64MB; we do not take XDK/Debug units into account const int MemoryStream::MemStreamMaxLength = 0x40000000; -#else - const int MemoryStream::MemStreamMaxLength = 0x7fffffff; -#endif bool MemoryStream::CanRead() { @@ -132,6 +129,7 @@ namespace System } _buffer = buffer; _length = _capacity = Array::Length(buffer); + _expandable = false; _writable = true; _exposable = false; _origin = 0; diff --git a/src/libmscorlib/Stream.cpp b/src/libmscorlib/Stream.cpp index f0c165b..35e0143 100644 --- a/src/libmscorlib/Stream.cpp +++ b/src/libmscorlib/Stream.cpp @@ -43,46 +43,6 @@ namespace System return false; } - IAsyncResult* Stream::BeginRead(byte buffer[], int offset, int count, ASyncCallback callback, Object* state) - { - if(!CanRead()) - throw NotSupportedException("This stream does not support reading"); - - StreamAsyncResult result = StreamAsyncResult(state); - try - { - int nbytes = Read(buffer, offset, count); - result.SetComplete(null, nbytes); - } - catch (Exception e) - { - result.SetComplete(&e, 0); - } - - return result; - } - - IAsyncResult* Stream::BeginWrite(byte buffer[], int offset, int count, ASyncCallback callback, Object* state) - { - if(!CanWrite()) - throw NotSupportedException("This stream does not support writing"); - - StreamAsyncResult result = StreamAsyncResult(state); - try - { - Write (buffer, offset, count); - result.SetComplete(null); - } - catch (Exception e) - { - result.SetComplete(&e); - } - - callback(result); - - return result; - } - void Stream::Close() { Dispose(true); @@ -93,36 +53,6 @@ namespace System Close(); } - int Stream::EndRead(IAsyncResult* asyncResult) - { - StreamAsyncResult result = (StreamAsyncResult)asyncResult; - if (result.NBytes() == -1) - throw ArgumentException("Invalid IAsyncResult", "asyncResult"); - - if (result.Done) - throw InvalidOperationException("EndRead already called."); - - result.Done = true; - if (result.Exception_() != null) - throw result.Exception_(); - - return result.NBytes(); - } - - void Stream::EndWrite(IAsyncResult* asyncResult) - { - StreamAsyncResult result = (StreamAsyncResult)asyncResult; - if (result.NBytes() != -1) - throw ArgumentException("Invalid IAsyncResult", "asyncResult"); - - if (result.Done) - throw InvalidOperationException("EndWrite already called."); - - result.Done = true; - if (result.Exception_() != null) - throw result.Exception_(); - } - int Stream::ReadByte() { byte* buffer = new byte[1]; diff --git a/src/libmscorlib/libmscorlib.vcproj b/src/libmscorlib/libmscorlib.vcproj index add4a14..5c10a59 100644 --- a/src/libmscorlib/libmscorlib.vcproj +++ b/src/libmscorlib/libmscorlib.vcproj @@ -191,6 +191,10 @@ RelativePath=".\Directory.cpp" > + +