/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _LOG4CXX_FILE_H
#define _LOG4CXX_FILE_H

#include <log4cxx/logger.h>
#include <log4cxx/logstring.h>

#if defined(_MSC_VER)
#pragma warning ( push )
#pragma warning ( disable: 4251 )
#endif

extern "C" {
	struct apr_file_t;
	struct apr_finfo_t;
}

namespace log4cxx
{
namespace helpers
{
class Transcoder;
class Pool;
}

/**
* An abstract representation of file and directory path names.
*/
class LOG4CXX_EXPORT File
{
	public:
		/**
		*   Construct a new instance.
		*/
		File();
		/**
		*   Construct a new instance.  Use setPath to specify path using a LogString.
		* @param path file path in local encoding.
		*/
		File(const char* path);
		/**
		*   Construct a new instance.  Use setPath to specify path using a LogString.
		* @param path file path in current encoding.
		*/
		File(const std::string& path);
#if LOG4CXX_WCHAR_T_API
		/**
		*   Construct a new instance.  Use setPath to specify path using a LogString.
		* @param path file path.
		*/
		File(const wchar_t* path);
		/**
		*   Construct a new instance.  Use setPath to specify path using a LogString.
		* @param path file path.
		*/
		File(const std::wstring& path);
#endif
#if LOG4CXX_UNICHAR_API
		/**
		*   Construct a new instance.  Use setPath to specify path using a LogString.
		* @param path file path.
		*/
		File(const UniChar* path);
		/**
		*   Construct a new instance.  Use setPath to specify path using a LogString.
		* @param path file path.
		*/
		File(const std::basic_string<UniChar>& path);
#endif
#if LOG4CXX_CFSTRING_API
		/**
		*   Construct a new instance.  Use setPath to specify path using a LogString.
		* @param path file path.
		*/
		File(const CFStringRef& path);
#endif
		/**
		 *  Copy constructor.
		 */
		File(const File& src);
		/**
		 *  Assignment operator.
		 */
		File& operator=(const File& src);
		/**
		 *  Destructor.
		 */
		~File();

		/**
		 *  Determines if file exists.
		 *  @param p pool.
		 *  @return true if file exists.
		 */
		bool exists(log4cxx::helpers::Pool& p) const;
		/**
		 *  Determines length of file.  May not be accurate if file is current open.
		 *  @param p pool.
		 *  @return length of file.
		 */
		size_t length(log4cxx::helpers::Pool& p) const;
		/**
		 *  Determines last modification date.
		 *  @param p pool.
		 *  @return length of file.
		 */
		log4cxx_time_t lastModified(log4cxx::helpers::Pool& p) const;
		/**
		 *  Get final portion of file path.
		 *  @return file name.
		 */
		LogString getName() const;
		/**
		 *  Get file path.
		 *  @return file path.
		 */
		LogString getPath() const;
		/**
		 *  Set file path
		 */
		File& setPath(const LogString&);

		/**
		 *  Open file.  See apr_file_open for details.
		 *  @param file APR file handle.
		 *  @param flags flags.
		 *  @param perm permissions.
		 *  @param p pool.
		 *  @return APR_SUCCESS if successful.
		 */
		log4cxx_status_t open(apr_file_t** file, int flags,
			int perm, log4cxx::helpers::Pool& p) const;

		/**
		 *   List files if current file is a directory.
		 *   @param p pool.
		 *   @return list of files in this directory, operation of non-directory returns empty list.
		 */
		std::vector<LogString> list(log4cxx::helpers::Pool& p) const;

		/**
		 *   Delete file.
		 *   @param p pool.
		 *   @return true if file successfully deleted.
		 */
		bool deleteFile(log4cxx::helpers::Pool& p) const;
		/**
		 *   Rename file.
		 *   @param dest new path for file.
		 *   @param p pool.
		 *   @return true if file successfully renamed.
		 */
		bool renameTo(const File& dest, log4cxx::helpers::Pool& p) const;

		/**
		 *   Get path of parent directory.
		 *   @param p pool.
		 *   @return path of parent directory.
		 */
		LogString getParent(log4cxx::helpers::Pool& p) const;
		/**
		 *  Make directories recursively.
		 *  @param p pool.
		 *  @return true if all requested directories existed or have been created.
		 */
		bool mkdirs(log4cxx::helpers::Pool& p) const;

	private:
		LogString path;
		static char* convertBackSlashes(char*);
		char* getPath(log4cxx::helpers::Pool& p) const;
};
} // namespace log4cxx


#if defined(_MSC_VER)
#pragma warning (pop)
#endif

#define LOG4CXX_FILE(name) log4cxx::File(name)

#endif // _LOG4CXX_FILE_H
