//-
// ==========================================================================
// Copyright 1995,2006,2008 Autodesk, Inc. All rights reserved.
//
// Use of this software is subject to the terms of the Autodesk
// license agreement provided at the time of installation or download,
// or which otherwise accompanies this software in either electronic
// or hard copy form.
// ==========================================================================
//+

/* 

	file : fileIOMsgCmd.cpp
	class: PreLoad
	----------------------
	This is an example to demonstrate the usages of :

	MString MFileIO::beforeImportFile(MStatus*); 
	MString MFileIO::beforeOpenFile(MStatus*);
	MString MFileIO::beforeExportFile(MStatus*);
	MString MFileIO::beforeReferenceFile(MStatus*);

	Return value of MS::kSuccess indicates correct value returns
		
*/

#include <maya/MFnPlugin.h>
#include <maya/MSceneMessage.h>
#include <maya/MStatus.h>
#include <maya/MPxCommand.h>
#include <maya/MMessage.h>
#include <maya/MGlobal.h>
#include <maya/MFileIO.h>
#include <maya/MCallbackIdArray.h>


class PreLoad : public MPxCommand
{

	public:
		// callback functions.
		static void preOpenFunc(void* clientData);
		static void preImportFunc(void* clientData);
		static void preSaveFunc(void* clientData);
		static void preExportFunc(void* clientData);
		static void preReferenceFunc(void* clientData);

		virtual MStatus doIt( const MArgList& );		
		static void *creator();
		static MCallbackIdArray& getCallbackIds();

	private:
		//callback ids .. used later for removal
		static MCallbackIdArray ids;	

};



MCallbackIdArray PreLoad::ids;


// This is the call back function at Pre Import stage.
void PreLoad::preOpenFunc(void* clientData)
{
	MString msg = "FILE TO BE OPENED IS ";
	MStatus status = MS::kSuccess;

	MString file = MFileIO::beforeOpenFilename(&status);
		
	// check the status and then append accordingly
	msg +=  ( status == MS::kSuccess) ? file : "ERROR: Could not be retrieved" ;

	MGlobal::displayInfo(msg);
	
}

// This is the call back function at Pre Import stage.
void PreLoad::preImportFunc(void* clientData)
{
	MString msg = "PRE IMPORT FILE IS ";
	MStatus status = MS::kSuccess;

	MString file = MFileIO::beforeImportFilename(&status);

	// check the status and then append accordingly
	msg +=  ( status == MS::kSuccess) ? file : "ERROR: Could not be retrieved" ;
	
	MGlobal::displayInfo(msg);
}


// This is the call back function at Pre Save stage.
void PreLoad::preSaveFunc(void* clientData)
{
	MString msg = "FILE TO BE SAVED IS";
	MStatus status = MS::kSuccess;

	MString file = MFileIO::beforeSaveFilename(&status);

	//check the status and then append accordingly
	msg +=  ( status == MS::kSuccess) ? file : "ERROR: File name could not be retrieved" ;
	
	MGlobal::displayInfo(msg);
}


// This is the call back function at Pre Export stage.
void PreLoad::preExportFunc(void* clientData)
{
	MString msg = "FILE TO BE EXPORTED IS";
	MStatus status = MS::kSuccess;

	MString file = MFileIO::beforeSaveFilename(&status);

	 // check the status and then append accordingly
	msg +=  ( status == MS::kSuccess) ? file : "ERROR: File name could not be retrieved" ;
	
	MGlobal::displayInfo(msg);
}


// This is the call back function at Pre Reference stage.
void PreLoad::preReferenceFunc(void* clientData)
{
	MString msg = "FILE TO BE REFERENCED IS";
	MStatus status = MS::kSuccess;

	MString file = MFileIO::beforeReferenceFilename(&status);

	//check the status and then append accordingly
	msg +=  ( status == MS::kSuccess) ? file : "ERROR: File name could not be retrieved" ;
	
	MGlobal::displayInfo(msg);
}

MStatus PreLoad::doIt( const MArgList& )
{
	MStatus status = MS::kSuccess;
	MGlobal::displayInfo("PLUGIN LOADED");

	// add the function call backs
	// and store call back ids for removal later
	ids.append(MSceneMessage::addCallback ( MSceneMessage::kBeforeOpen, preOpenFunc )) ;
	ids.append(MSceneMessage::addCallback ( MSceneMessage::kBeforeImport, preImportFunc )) ;
	ids.append(MSceneMessage::addCallback ( MSceneMessage::kBeforeSave, preSaveFunc )) ;
	ids.append(MSceneMessage::addCallback ( MSceneMessage::kBeforeExport, preExportFunc )) ;
	ids.append(MSceneMessage::addCallback ( MSceneMessage::kBeforeReference, preReferenceFunc )) ;
	
	return status ; 

}	



void* PreLoad::creator() 
{	
	return new PreLoad;
}


MCallbackIdArray& PreLoad::getCallbackIds()
{
	return ids;
}



// standard initialize and uninitialize functions


MStatus initializePlugin(MObject obj)
{
	MFnPlugin pluginFn(obj, PLUGIN_COMPANY, "6.0");

	MStatus status;
	status = pluginFn.registerCommand("fileIOMsgCmd", PreLoad::creator);

	if( !status)
		status.perror("register Command failed");

	return status;
}


MStatus uninitializePlugin ( MObject obj )
{
	MFnPlugin pluginFn(obj);
	MStatus status = MS::kSuccess;
	
	//remove call backs
	MMessage::removeCallbacks(PreLoad::getCallbackIds());
	status = pluginFn.deregisterCommand( "fileIOMsgCmd");
	
	return status;
}

