| #ifndef _H_NPVariantUtil | 
 | #define _H_NPVariantUtil | 
 |  | 
 | #include "Debug.h" | 
 | #include "mozincludes.h" | 
 |  | 
 | /** | 
 |  * Wraps an NPVariant and provides various helper functions | 
 |  */ | 
 | class NPVariantUtil { | 
 | public: | 
 |   static int isBoolean(const NPVariant& variant) { | 
 |     return NPVARIANT_IS_BOOLEAN(variant); | 
 |   } | 
 |  | 
 |   static bool getAsBoolean(const NPVariant& variant) { | 
 |     return NPVARIANT_TO_BOOLEAN(variant); | 
 |   } | 
 |  | 
 |   // Return true if the variant is holding a regular integer or an integral double. | 
 |   static int isInt(const NPVariant& variant) { | 
 |     if (NPVARIANT_IS_INT32(variant)) { | 
 |       return 1; | 
 |     } else if (NPVARIANT_IS_DOUBLE(variant)) { | 
 |       // As of http://trac.webkit.org/changeset/72974 we get doubles for all | 
 |       // numerical variants out of V8. | 
 |       double d = NPVARIANT_TO_DOUBLE(variant); | 
 |       int i = static_cast<int>(d); | 
 |       // Verify that d is an integral value in range. | 
 |       return (d == static_cast<double>(i)); | 
 |     } else { | 
 |       return 0; | 
 |     } | 
 |   } | 
 |  | 
 |   static int getAsInt(const NPVariant& variant) { | 
 |     if (isInt(variant)) { | 
 |       if (NPVARIANT_IS_INT32(variant)) { | 
 |         return NPVARIANT_TO_INT32(variant); | 
 |       } else if (NPVARIANT_IS_DOUBLE(variant)) { | 
 |         return static_cast<int>(NPVARIANT_TO_DOUBLE(variant)); | 
 |       } | 
 |     } | 
 |  | 
 |     Debug::log(Debug::Error) << "getAsInt: variant " << | 
 |       NPVariantUtil::toString(variant) << "not int" << Debug::flush; | 
 |     return 0; | 
 |   } | 
 |  | 
 |   static int isNull(const NPVariant& variant) { | 
 |     return NPVARIANT_IS_NULL(variant); | 
 |   } | 
 |  | 
 |   static int isObject(const NPVariant& variant) { | 
 |     return NPVARIANT_IS_OBJECT(variant); | 
 |   } | 
 |  | 
 |   static NPObject* getAsObject(const NPVariant& variant) { | 
 |     if (NPVARIANT_IS_OBJECT(variant)) { | 
 |       return NPVARIANT_TO_OBJECT(variant); | 
 |     } | 
 |     Debug::log(Debug::Error) << "getAsObject: variant not object" << Debug::flush; | 
 |     return 0; | 
 |   } | 
 |  | 
 |   static int isString(const NPVariant& variant) { | 
 |     return NPVARIANT_IS_STRING(variant); | 
 |   } | 
 |  | 
 |   static const NPString* getAsNPString(const NPVariant& variant) { | 
 |     if (NPVARIANT_IS_STRING(variant)) { | 
 |       return &NPVARIANT_TO_STRING(variant); | 
 |     } | 
 |     Debug::log(Debug::Error) << "getAsNPString: variant not string" << Debug::flush; | 
 |     return 0; | 
 |   } | 
 |  | 
 |   static std::string toString(const NPVariant& variant) { | 
 |     std::string retval; | 
 |     // TODO(jat): remove sprintfs | 
 |     char buf[40]; | 
 |     NPObject* npObj; | 
 |     switch (variant.type) { | 
 |       case NPVariantType_Void: | 
 |         retval = "undef"; | 
 |         break; | 
 |       case NPVariantType_Null: | 
 |         retval = "null"; | 
 |         break; | 
 |       case NPVariantType_Bool: | 
 |         retval = "bool("; | 
 |         retval += (NPVARIANT_TO_BOOLEAN(variant) ? "true" : "false"); | 
 |         retval += ')'; | 
 |         break; | 
 |       case NPVariantType_Int32: | 
 |         retval = "int("; | 
 |         snprintf(buf, sizeof(buf), "%d)", NPVARIANT_TO_INT32(variant)); | 
 |         retval += buf; | 
 |         break; | 
 |       case NPVariantType_Double: | 
 |         retval = "double("; | 
 |         snprintf(buf, sizeof(buf), "%g)", NPVARIANT_TO_DOUBLE(variant)); | 
 |         retval += buf; | 
 |         break; | 
 |       case NPVariantType_String: | 
 |         { | 
 |           retval = "string("; | 
 |           NPString str = NPVARIANT_TO_STRING(variant); | 
 |           retval += std::string(str.UTF8Characters, str.UTF8Length); | 
 |           retval += ')'; | 
 |         } | 
 |         break; | 
 |       case NPVariantType_Object: | 
 |         npObj = NPVARIANT_TO_OBJECT(variant); | 
 |         snprintf(buf, sizeof(buf), "obj(class=%p, ", npObj->_class); | 
 |         retval = buf; | 
 |         snprintf(buf, sizeof(buf), "count=%d, ", npObj->referenceCount); | 
 |         retval += buf; | 
 |         snprintf(buf, sizeof(buf), "%p)", npObj); | 
 |         retval += buf; | 
 |         break; | 
 |       default: | 
 |         snprintf(buf, sizeof(buf), "Unknown type %d", variant.type); | 
 |         retval = buf; | 
 |         break; | 
 |     } | 
 |     return retval; | 
 |   } | 
 |  | 
 | }; | 
 |  | 
 | #endif |