diff options
Diffstat (limited to 'indra/llcommon')
| -rwxr-xr-x | indra/llcommon/llerror.cpp | 4 | ||||
| -rwxr-xr-x | indra/llcommon/llfile.cpp | 170 | ||||
| -rwxr-xr-x | indra/llcommon/llfile.h | 191 | ||||
| -rwxr-xr-x | indra/llcommon/llliveappconfig.cpp | 2 | ||||
| -rwxr-xr-x | indra/llcommon/llstring.cpp | 2 | 
5 files changed, 345 insertions, 24 deletions
| diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index 3cb81b4e47..2100989316 100755 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -135,7 +135,7 @@ namespace {  		}  	private: -		std::ofstream mFile; +		llofstream mFile;  	}; @@ -335,7 +335,7 @@ namespace  		LLSD configuration;  		{ -			std::ifstream file(filename().c_str()); +			llifstream file(filename().c_str());  			if (file.is_open())  			{  				LLSDSerialize::fromXML(configuration, file); diff --git a/indra/llcommon/llfile.cpp b/indra/llcommon/llfile.cpp index ab432a923d..295c97eac8 100755 --- a/indra/llcommon/llfile.cpp +++ b/indra/llcommon/llfile.cpp @@ -424,26 +424,6 @@ LLFILE *	LLFile::_Fiopen(const std::string& filename,  /************** llstdio file buffer ********************************/ -//llstdio_filebuf* llstdio_filebuf::open(const char *_Filename, -//	ios_base::openmode _Mode) -//{ -//#if LL_WINDOWS -//	_Filet *_File; -//	if (is_open() || (_File = LLFILE::_Fiopen(_Filename, _Mode)) == 0) -//		return (0);	// open failed -// -//	_Init(_File, _Openfl); -//	_Initcvt(&_USE(_Mysb::getloc(), _Cvt)); -//	return (this);	// open succeeded -//#else -//	std::filebuf* _file = std::filebuf::open(_Filename, _Mode); -//	if (NULL == _file) return NULL; -//	return this; -//#endif -//} - - -// *TODO: Seek the underlying c stream for better cross-platform compatibility?  #if !LL_WINDOWS  llstdio_filebuf::int_type llstdio_filebuf::overflow(llstdio_filebuf::int_type __c)  { @@ -865,3 +845,153 @@ int llstdio_filebuf::sync()  }  #endif +#if LL_WINDOWS +/************** input file stream ********************************/ + +llifstream::llifstream() : +    _M_filebuf(), +	std::istream(&_M_filebuf) +{ +} + +// explicit +llifstream::llifstream(const std::string& _Filename,  +                       ios_base::openmode _Mode) : +    _M_filebuf(), +	std::istream(&_M_filebuf) +{ +	llutf16string wideName = utf8str_to_utf16str( _Filename ); +	if (_M_filebuf.open(wideName.c_str(), _Mode | ios_base::in) == 0) +	{ +		_Myios::setstate(ios_base::failbit); +	} +} + +// explicit +llifstream::llifstream(const char* _Filename,  +                       ios_base::openmode _Mode) : +    _M_filebuf(), +	std::istream(&_M_filebuf) +{ +	llutf16string wideName = utf8str_to_utf16str( _Filename ); +	if (_M_filebuf.open(wideName.c_str(), _Mode | ios_base::in) == 0) +	{ +		_Myios::setstate(ios_base::failbit); +	} +} + +bool llifstream::is_open() const +{	// test if C stream has been opened +	return _M_filebuf.is_open(); +} + +void llifstream::open(const char* _Filename, ios_base::openmode _Mode) +{	// open a C stream with specified mode +	llutf16string wideName = utf8str_to_utf16str( _Filename ); +	if (_M_filebuf.open( wideName.c_str(), _Mode | ios_base::in) == 0) +	{ +		_Myios::setstate(ios_base::failbit); +	} +	else +	{ +		_Myios::clear(); +	} +} + +void llifstream::close() +{	// close the C stream +	if (_M_filebuf.close() == 0) +	{ +		_Myios::setstate(ios_base::failbit); +	} +} + + +/************** output file stream ********************************/ + + +llofstream::llofstream() : +    _M_filebuf(), +	std::ostream(&_M_filebuf) +{ +} + +// explicit +llofstream::llofstream(const std::string& _Filename, +                       ios_base::openmode _Mode) : +    _M_filebuf(), +	std::ostream(&_M_filebuf) +{ +	llutf16string wideName = utf8str_to_utf16str( _Filename ); +	if (_M_filebuf.open( wideName.c_str(), _Mode | ios_base::out) == 0) +	{ +		_Myios::setstate(ios_base::failbit); +	} +} + +// explicit +llofstream::llofstream(const char* _Filename, +                       ios_base::openmode _Mode) : +    _M_filebuf(), +	std::ostream(&_M_filebuf) +{ +	llutf16string wideName = utf8str_to_utf16str( _Filename ); +	if (_M_filebuf.open( wideName.c_str(), _Mode | ios_base::out) == 0) +	{ +		_Myios::setstate(ios_base::failbit); +	} +} + +bool llofstream::is_open() const +{	// test if C stream has been opened +	return _M_filebuf.is_open(); +} + +void llofstream::open(const char* _Filename, ios_base::openmode _Mode) +{	// open a C stream with specified mode +	llutf16string wideName = utf8str_to_utf16str( _Filename ); +	if (_M_filebuf.open( wideName.c_str(), _Mode | ios_base::out) == 0) +	{ +		_Myios::setstate(ios_base::failbit); +	} +	else +	{ +		_Myios::clear(); +	} +} + +void llofstream::close() +{	// close the C stream +	if (_M_filebuf.close() == 0) +	{ +		_Myios::setstate(ios_base::failbit); +	} +} + +/************** helper functions ********************************/ + +std::streamsize llifstream_size(llifstream& ifstr) +{ +	if(!ifstr.is_open()) return 0; +	std::streampos pos_old = ifstr.tellg(); +	ifstr.seekg(0, ios_base::beg); +	std::streampos pos_beg = ifstr.tellg(); +	ifstr.seekg(0, ios_base::end); +	std::streampos pos_end = ifstr.tellg(); +	ifstr.seekg(pos_old, ios_base::beg); +	return pos_end - pos_beg; +} + +std::streamsize llofstream_size(llofstream& ofstr) +{ +	if(!ofstr.is_open()) return 0; +	std::streampos pos_old = ofstr.tellp(); +	ofstr.seekp(0, ios_base::beg); +	std::streampos pos_beg = ofstr.tellp(); +	ofstr.seekp(0, ios_base::end); +	std::streampos pos_end = ofstr.tellp(); +	ofstr.seekp(pos_old, ios_base::beg); +	return pos_end - pos_beg; +} + +#endif  // LL_WINDOWS diff --git a/indra/llcommon/llfile.h b/indra/llcommon/llfile.h index e310d47325..347c9867aa 100755 --- a/indra/llcommon/llfile.h +++ b/indra/llcommon/llfile.h @@ -192,4 +192,195 @@ protected:  #endif  }; +#if LL_WINDOWS +/** + *  @brief  Controlling input for files. + * + *  This class supports reading from named files, using the inherited + *  functions from std::basic_istream.  To control the associated + *  sequence, an instance of std::basic_filebuf (or a platform-specific derivative) + *  which allows construction using a pre-exisintg file stream buffer.  + *  We refer to this std::basic_filebuf (or derivative) as @c sb. + */ +class LL_COMMON_API llifstream	:	public	std::istream +{ +	// input stream associated with a C stream +  public: +	// Constructors: +	/** +	 *  @brief  Default constructor. +	 * +	 *  Initializes @c sb using its default constructor, and passes +	 *  @c &sb to the base class initializer.  Does not open any files +	 *  (you haven't given it a filename to open). +     */ +	llifstream(); + +	/** +	 *  @brief  Create an input file stream. +	 *  @param  Filename  String specifying the filename. +	 *  @param  Mode  Open file in specified mode (see std::ios_base). +	 * +     *  @c ios_base::in is automatically included in @a mode. +     */ +	explicit llifstream(const std::string& _Filename, +                        ios_base::openmode _Mode = ios_base::in); +	explicit llifstream(const char* _Filename, +                        ios_base::openmode _Mode = ios_base::in); + +	/** +	 *  @brief  The destructor does nothing. +	 * +	 *  The file is closed by the filebuf object, not the formatting +	 *  stream. +     */ +	virtual ~llifstream() {} + +	// Members: +	/** +	 *  @brief  Accessing the underlying buffer. +	 *  @return  The current basic_filebuf buffer. +	 * +	 *  This hides both signatures of std::basic_ios::rdbuf(). +	*/ +	llstdio_filebuf* rdbuf() const +	{ return const_cast<llstdio_filebuf*>(&_M_filebuf); } + +	/** +	 *  @brief  Wrapper to test for an open file. +	 *  @return  @c rdbuf()->is_open() +     */ +	bool is_open() const; + +	/** +	 *  @brief  Opens an external file. +	 *  @param  Filename  The name of the file. +	 *  @param  Node  The open mode flags. +	 * +	 *  Calls @c llstdio_filebuf::open(s,mode|in).  If that function +	 *  fails, @c failbit is set in the stream's error state. +     */ +	void open(const std::string& _Filename, +              ios_base::openmode _Mode = ios_base::in) +	{ open(_Filename.c_str(), _Mode); } +	void open(const char* _Filename, +              ios_base::openmode _Mode = ios_base::in); + +	/** +	 *  @brief  Close the file. +	 * +	 *  Calls @c llstdio_filebuf::close().  If that function +	 *  fails, @c failbit is set in the stream's error state. +     */ +	void close(); + +  private: +	llstdio_filebuf _M_filebuf; +}; + + +/** + *  @brief  Controlling output for files. + * + *  This class supports writing to named files, using the inherited + *  functions from std::basic_ostream.  To control the associated + *  sequence, an instance of std::basic_filebuf (or a platform-specific derivative) + *  which allows construction using a pre-exisintg file stream buffer.  + *  We refer to this std::basic_filebuf (or derivative) as @c sb. +*/ +class LL_COMMON_API llofstream	:	public	std::ostream +{ +  public: +	// Constructors: +	/** +	 *  @brief  Default constructor. +	 * +	 *  Initializes @c sb using its default constructor, and passes +	 *  @c &sb to the base class initializer.  Does not open any files +	 *  (you haven't given it a filename to open). +     */ +	llofstream(); + +	/** +	 *  @brief  Create an output file stream. +	 *  @param  Filename  String specifying the filename. +	 *  @param  Mode  Open file in specified mode (see std::ios_base). +	 * +	 *  @c ios_base::out|ios_base::trunc is automatically included in +	 *  @a mode. +     */ +	explicit llofstream(const std::string& _Filename, +                        ios_base::openmode _Mode = ios_base::out|ios_base::trunc); +	explicit llofstream(const char* _Filename, +                        ios_base::openmode _Mode = ios_base::out|ios_base::trunc); + +	/** +	 *  @brief  The destructor does nothing. +	 * +	 *  The file is closed by the filebuf object, not the formatting +	 *  stream. +	*/ +	virtual ~llofstream() {} + +	// Members: +	/** +	 *  @brief  Accessing the underlying buffer. +	 *  @return  The current basic_filebuf buffer. +	 * +	 *  This hides both signatures of std::basic_ios::rdbuf(). +	*/ +	llstdio_filebuf* rdbuf() const +	{ return const_cast<llstdio_filebuf*>(&_M_filebuf); } + +	/** +	 *  @brief  Wrapper to test for an open file. +	 *  @return  @c rdbuf()->is_open() +	*/ +	bool is_open() const; + +	/** +	 *  @brief  Opens an external file. +	 *  @param  Filename  The name of the file. +	 *  @param  Node  The open mode flags. +	 * +	 *  Calls @c llstdio_filebuf::open(s,mode|out).  If that function +	 *  fails, @c failbit is set in the stream's error state. +     */ +	void open(const std::string& _Filename, +              ios_base::openmode _Mode = ios_base::out|ios_base::trunc) +	{ open(_Filename.c_str(), _Mode); } +	void open(const char* _Filename, +              ios_base::openmode _Mode = ios_base::out|ios_base::trunc); + +	/** +	 *  @brief  Close the file. +	 * +	 *  Calls @c llstdio_filebuf::close().  If that function +	 *  fails, @c failbit is set in the stream's error state. +     */ +	void close(); + +  private: +	llstdio_filebuf _M_filebuf; +}; + + +/** + * @breif filesize helpers. + * + * The file size helpers are not considered particularly efficient, + * and should only be used for config files and the like -- not in a + * loop. + */ +std::streamsize LL_COMMON_API llifstream_size(llifstream& fstr); +std::streamsize LL_COMMON_API llofstream_size(llofstream& fstr); + +#else // ! LL_WINDOWS + +// on non-windows, llifstream and llofstream are just mapped directly to the std:: equivalents +typedef std::ifstream llifstream; +typedef std::ofstream llofstream; + +#endif // LL_WINDOWS or ! LL_WINDOWS +  #endif // not LL_LLFILE_H diff --git a/indra/llcommon/llliveappconfig.cpp b/indra/llcommon/llliveappconfig.cpp index f955194009..a9b1cdf4f6 100755 --- a/indra/llcommon/llliveappconfig.cpp +++ b/indra/llcommon/llliveappconfig.cpp @@ -49,7 +49,7 @@ bool LLLiveAppConfig::loadFile()  {  	LL_INFOS() << "LLLiveAppConfig::loadFile(): reading from "  		<< filename() << LL_ENDL; -    std::ifstream file(filename().c_str()); +    llifstream file(filename().c_str());  	LLSD config;      if (file.is_open())      { diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 227f81e88f..f3b8999883 100755 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -107,7 +107,7 @@ bool iswindividual(llwchar elem)  bool _read_file_into_string(std::string& str, const std::string& filename)  { -	std::ifstream ifs(filename.c_str(), std::ifstream::binary); +	llifstream ifs(filename.c_str(), llifstream::binary);  	if (!ifs.is_open())  	{  		LL_INFOS() << "Unable to open file " << filename << LL_ENDL; | 
