#ifndef _MFileObject
#define _MFileObject
//-
// ==========================================================================
// Copyright (C) 1995 - 2006 Autodesk, Inc., and/or its licensors.  All
// rights reserved.
//
// The coded instructions, statements, computer programs, and/or related
// material (collectively the "Data") in these files contain unpublished
// information proprietary to Autodesk, Inc. ("Autodesk") and/or its
// licensors,  which is protected by U.S. and Canadian federal copyright law
// and by international treaties.
//
// The Data may not be disclosed or distributed to third parties or be
// copied or duplicated, in whole or in part, without the prior written
// consent of Autodesk.
//
// The copyright notices in the Software and this entire statement,
// including the above license grant, this restriction and the following
// disclaimer, must be included in all copies of the Software, in whole
// or in part, and all derivative works of the Software, unless such copies
// or derivative works are solely in the form of machine-executable object
// code generated by a source language processor.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
// AUTODESK DOES NOT MAKE AND HEREBY DISCLAIMS ANY EXPRESS OR IMPLIED
// WARRANTIES INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF
// NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE,
// OR ARISING FROM A COURSE OF DEALING, USAGE, OR TRADE PRACTICE. IN NO
// EVENT WILL AUTODESK AND/OR ITS LICENSORS BE LIABLE FOR ANY LOST
// REVENUES, DATA, OR PROFITS, OR SPECIAL, DIRECT, INDIRECT, OR
// CONSEQUENTIAL DAMAGES, EVEN IF AUTODESK AND/OR ITS LICENSORS HAS
// BEEN ADVISED OF THE POSSIBILITY OR PROBABILITY OF SUCH DAMAGES.
// ==========================================================================
//+
//
// CLASS:    MFileObject
//
// ****************************************************************************

#if defined __cplusplus

// ****************************************************************************
// INCLUDED HEADER FILES


#include <maya/MStatus.h>
#include <maya/MTypes.h>

// ****************************************************************************
// DECLARATIONS

class MString;

// ****************************************************************************
// CLASS DECLARATION (MFileObject)

//! \ingroup OpenMaya
//! \brief Manipulate filenames and search paths. 
/*!
The MFileObject class implements an object that contains both a
filename and a search path.  The search path is specified by a single
string in which multiple elements are separated by ':' characters.  As
well this string can contain Unix environment variables, specified as
$VARNAME,

Filenames can be produced by the class by combining the path element
with the filename element of the MFileObject.  As well, methods are
available to test for the existance of the files produced.
*/
class OPENMAYA_EXPORT MFileObject
{
public:
				MFileObject();
				MFileObject( const MFileObject & other );
				virtual ~MFileObject();
	MFileObject& operator=( const MFileObject & other );

	MStatus   	setRawName( const MString & fileName );
	MStatus   	setRawPath( const MString & filePath );
	MStatus   	setRawFullName( const MString & fullFileName );

	MStatus   	overrideResolvedFullName( const MString & fullFileName );

	MString  	rawName() const;
	MString  	rawPath() const;
	MString  	rawFullName() const;

	MString  	expandedPath() const;
	MString  	expandedFullName() const;

	MString  	resolvedName() const;
	MString  	resolvedPath() const;
	MString  	resolvedFullName() const;

	unsigned int	pathCount();
	MString  	ithPath( unsigned int index );
	MString  	ithFullName( unsigned int index );
	bool        exists();
	bool        exists( unsigned int index );
	bool        isSet() const;


	/*! 
	    Options to be used when resolving a file path.
	    When more than one resolve method is used, Maya will perform checks in
		a pre-determined sequence, stopping when it encounters an existing file.
	    The default mode MFileResolveMethod::kNone cannot be used in combination with other
		modes.
	    Note that not all resolve methods check whether or not a file actually exists. 
		Some resolution modes, such as MFileResolveMethod::kInputFile, imply that the file 
		is being used for input, and is expected to exist.  These modes will check if the 
		file exists to determine whether or not the resolution is successful. 
	*/

	enum MFileResolveMethod 
	{
		//! (Default) The resolved path is simply the resulting path after converting
		//! the raw value to its expanded form. If the path contains environment variables,
		//! the resolved value will be the first path returned from their expansion.
		//! Relative paths will be considered to be relative to root of the current project.
		//! The resolution algorithm will not check if this file actually exists - the
		//! resolution will be considered successful whether it exists or not.
		//! With this mode, the resolver will not continue on to attempt to resolve 
		//! using any other resolve method. 
		//! The user must explicitly check MFileObject::exists() to determine if it is an 
		//! existing path. 
		kNone 				= (1<<0),

		//! Checks if expanded paths exist. If paths are relative, assume it's relative to
		//! the current workspace (so check workspace current directory, file-rule directory and
		//! root directory)
		kExact 			    = (1<<1),

		//! Checks path against mappings defined with the dirmap command. Only for absolute paths
		kDirMap			    = (1<<2),

		//! Check path against any previously re-mapped reference locations. If kRelative/kBaseName
		//! are set, then even if we have an absolute path, convert to relative and/or baseName and
		//! look for them in directories provided to the missing reference dialog.
		kReferenceMappings	= (1<<3),

		//! Strips away the project directory, and treats path as relative. Relative to the current
		//! workspace, that is. So look in the workspace current directory, file-rules directory
		//! and the root directory
		kRelative		    = (1<<4),

		//! Strips away everything but the base file name and look in the current workspace
		kBaseName		    = (1<<5),

		//! This mode is the default on file open and import, and is suitable for 
		//! files that are to be used as input files.  The file will be checked for 
		//! existence.
		kInputFile		    = kExact | kDirMap | kRelative | kBaseName,

		//! This mode is the default on file reference. In addition to the checks done for
		//! a regular input file, it will also check the reference mappings. 
		kInputReference		= kInputFile | kReferenceMappings,

		//! Equivalent to the file -strict flag
		kStrict			    = kExact | kDirMap
	};

	void					setResolveMethod(MFileResolveMethod method);
	MFileResolveMethod		resolveMethod() const;

	// The following methods are deprecated.
	//
	MStatus   	setName( const MString & fileName );
	MStatus   	setFullName( const MString & fileName );
	MString  	name() const;
	MString  	path() const;
	MString  	fullName() const;

    // Static member functions
    //
    static bool isAbsolutePath(const MString & fileName );
	static MString getResolvedFullName(const MString &rawFullName);
	static MString getResolvedFullName(const MString &rawFullName, bool &exists, MFileObject::MFileResolveMethod method=MFileObject::kNone);

protected:
// No protected members

private:
	void * data;
};

#endif /* __cplusplus */
#endif /* _MFileObject */
