//- // ========================================================================== // 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 is provided for use exclusively by You. You have the right // to use, modify, and incorporate this Data into other products for // purposes authorized by the Autodesk software license agreement, // without fee. // // 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. // // ========================================================================== //+ #include #define OPENMAYA_EXPORT #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////// // // Definitions // /////////////////////////////////////////////////// // Message flag // #define kMessageFlag "m" #define kMessageFlagLong "message" /////////////////////////////////////////////////// // // Declarations // /////////////////////////////////////////////////// // Callback function for messages // static void eventCB(void * data); // Array of callback ids. // typedef MCallbackId* MCallbackIdPtr; static MCallbackIdPtr callbackId = NULL; // Array of event names. // static MStringArray eventNames; /////////////////////////////////////////////////// // // Command class declaration // /////////////////////////////////////////////////// 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; }; /////////////////////////////////////////////////// // // Command class implementation // /////////////////////////////////////////////////// // Constructor // eventTest::eventTest() : addMessage(false) , delMessage(false) { events.clear(); } // Destructor // eventTest::~eventTest() { // Do nothing } // creator // void* eventTest::creator() { return (void *) (new eventTest); } // newSyntax // MSyntax eventTest::newSyntax() { MSyntax syntax; syntax.addFlag(kMessageFlag, kMessageFlagLong, MSyntax::kBoolean); syntax.setObjectType(MSyntax::kStringObjects); return syntax; } // parseArgs // 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 there are no events specified, operate on all of them // if (events.length() == 0) { // eventNames is set in initializePlugin to all the // currently available event names. // events = eventNames; } return status; } // doIt // MStatus eventTest::doIt(const MArgList& args) { MStatus status; status = parseArgs(args); if (!status) { return status; } // Allocate an array of indices. events[n] is a user provided // event name. Look it up in the static eventNames array // and set indices[n] to the index of the entry in eventNames. // // This maps the user specified events to the global events // so we can track callback adds and removes globally. // int * indices = new int [events.length()]; int i, j; for (i = 0; i < (int)events.length(); ++i) { // Initialize the entry to "not found". // indices[i] = -1; // Search event names for a match. // for (j = 0; j < (int)eventNames.length(); ++j) { if (events[i] == eventNames[j]) { // Found a match. Store the index and stop looking for // 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; } } // Ok, we've made all the necessary changes. Now show the status. // 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); } // Free up the indices we allocated. // delete [] indices; return status; } /////////////////////////////////////////////////// // // Plug-in functions // /////////////////////////////////////////////////// MStatus initializePlugin( MObject obj ) { MStatus status; MFnPlugin plugin( obj, PLUGIN_COMPANY, "3.0", "Any"); status = MEventMessage::getEventNames(eventNames); if (!status) { return status; } // Search for and remove idle and idleHigh events since they will // completely swamp the output. They are tested by the idleTest // plug-in // int i; for (i = 0; i < (int)eventNames.length(); ++i) { if (eventNames[i] == "idle" || eventNames[i] == "idleHigh") { eventNames.remove(i); --i; } } cout<<"eventTest: "<= 0 && i < (int)eventNames.length()) { MGlobal::displayInfo("event " + eventNames[i] + " occurred\n"); } else { MGlobal::displayWarning("BOGUS client data in eventCB!\n"); } }