#include <stdio.h>
#define OPENMAYA_EXPORT
#include <maya/MIOStream.h>
#include <maya/MGlobal.h>
#include <maya/MString.h>
#include <maya/MStringArray.h>
#include <maya/MEventMessage.h>
#include <maya/MFnPlugin.h>
#include <maya/MPxCommand.h>
#include <maya/MSyntax.h>
#include <maya/MArgDatabase.h>
#define kMessageFlag "m"
#define kMessageFlagLong "message"
static void eventCB(void * data);
typedef MCallbackId* MCallbackIdPtr;
static MCallbackIdPtr callbackId = NULL;
static MStringArray eventNames;
class eventTest : public MPxCommand
{
public:
eventTest();
virtual ~eventTest();
MStatus doIt( const MArgList& args );
static MSyntax newSyntax();
static void* creator();
private:
MStatus parseArgs( const MArgList& args );
bool addMessage;
bool delMessage;
MStringArray events;
};
eventTest::eventTest()
: addMessage(false)
, delMessage(false)
{
events.clear();
}
eventTest::~eventTest()
{
}
void* eventTest::creator()
{
return (void *) (new eventTest);
}
MSyntax eventTest::newSyntax()
{
MSyntax syntax;
syntax.addFlag(kMessageFlag, kMessageFlagLong, MSyntax::kBoolean);
syntax.setObjectType(MSyntax::kStringObjects);
return syntax;
}
MStatus eventTest::parseArgs(const MArgList& args)
{
MStatus status;
MArgDatabase argData(syntax(), args);
if (argData.isFlagSet(kMessageFlag))
{
bool flag;
status = argData.getFlagArgument(kMessageFlag, 0, flag);
if (!status)
{
status.perror("could not parse message flag");
return status;
}
if (flag)
{
addMessage = true;
}
else
{
delMessage = true;
}
}
status = argData.getObjects(events);
if (!status)
{
status.perror("could not parse event names");
}
if (events.length() == 0)
{
events = eventNames;
}
return status;
}
MStatus eventTest::doIt(const MArgList& args)
{
MStatus status;
status = parseArgs(args);
if (!status)
{
return status;
}
int * indices = new int [events.length()];
int i, j;
for (i = 0; i < (int)events.length(); ++i)
{
indices[i] = -1;
for (j = 0; j < (int)eventNames.length(); ++j)
{
if (events[i] == eventNames[j])
{
indices[i] = j;
break;
}
}
}
for (i = 0; i < (int)events.length(); ++i)
{
j = indices[i];
if (j == -1)
{
MGlobal::displayWarning(events[i] +
MString("is not a valid event name\n"));
break;
}
if (addMessage && callbackId[j] == 0)
{
callbackId[j] = MEventMessage::addEventCallback(
events[i],
eventCB,
(void *)(size_t)j,
&status);
if (!status)
{
status.perror("failed to add callback for " + events[i]);
callbackId[j] = 0;
}
}
else if (delMessage && callbackId[j] != 0)
{
status = MMessage::removeCallback(callbackId[j]);
if (!status)
{
status.perror("failed to remove callback for " + events[i]);
}
callbackId[j] = 0;
}
}
MGlobal::displayInfo("Event Name Msgs On\n");
MGlobal::displayInfo("-------------------- -------\n");
char tmpStr[128];
bool msgs;
for (i = 0; i < (int)events.length(); ++i)
{
j = indices[i];
if (j == -1)
{
continue;
}
msgs = (callbackId[j] != 0);
sprintf(tmpStr, "%-20s %s\n",
events[i].asChar(),
msgs ? "yes" : "no");
MGlobal::displayInfo(tmpStr);
}
delete [] indices;
return status;
}
MStatus initializePlugin( MObject obj )
{
MStatus status;
MFnPlugin plugin( obj, PLUGIN_COMPANY, "3.0", "Any");
status = MEventMessage::getEventNames(eventNames);
if (!status)
{
return status;
}
int i;
for (i = 0; i < (int)eventNames.length(); ++i)
{
if (eventNames[i] == "idle" ||
eventNames[i] == "idleHigh")
{
eventNames.remove(i);
--i;
}
}
cout<<"eventTest: "<<eventNames.length()<<" events are defined"<<endl;
callbackId = new MCallbackId [eventNames.length()];
if (!callbackId)
{
return MStatus(MS::kInsufficientMemory);
}
for (i = 0; i < (int)eventNames.length(); ++i)
{
callbackId[i] = 0;
}
status = plugin.registerCommand("eventTest",
eventTest::creator,
eventTest::newSyntax);
if (!status)
{
status.perror("registerCommand");
}
return status;
}
MStatus uninitializePlugin( MObject obj)
{
MStatus status;
MFnPlugin plugin( obj );
int i;
int len = eventNames.length();
for (i = 0; i < len; ++i)
{
if (callbackId[i] != 0)
{
MGlobal::displayWarning("Removing callback for " +
eventNames[i] +
"\n");
MMessage::removeCallback(callbackId[i]);
callbackId[i] = 0;
}
}
eventNames.clear();
delete [] callbackId;
status = plugin.deregisterCommand("eventTest");
if (!status)
{
status.perror("deregisterCommand");
}
return status;
}
static void eventCB(void * data)
{
int i = (int)(size_t)data;
if (i >= 0 && i < (int)eventNames.length())
{
MGlobal::displayInfo("event " +
eventNames[i] +
" occurred\n");
}
else
{
MGlobal::displayWarning("BOGUS client data in eventCB!\n");
}
}