npapi/npruntime 에는 자료형으로 NPVariant 형을 사용하는데,
NPVariant 에는 array 타입이 없습니다.
다시 말해서,
javascript에서 플러그인으로 배열형을 넘겨줄때 NPVariant 타입으로 넘기면 되는데,...
NPVariant 타입은 아래와 같이 7개가 전부 입니다.
: NPVariantType_Void, NPVariantType_Null, NPVariantType_Bool,
NPVariantType_Double, NPVariantType_Int32, NPVariantType_String,
NPVariantType_Object
그래서, 플러그인에서 javascript로 배열 타입을 넘겨 줄때는 따로 처리를 해줘야 합니다.
javascript로 넘겨준다는 것이 NPVariant에 배열 타입을 변환해서 넘겨주는 것이고요.
먼저, 플러그인에서 NPVariant로 배열 타입을 넘겨줄때...
Plugin array type -> NPVariant object |
bool ScriptablePluginObject::GetBar(NPVariant* result) { // Initialize the return value NULL_TO_NPVARIANT(*result);
// Create a new JavaScript array object. NPVariant variant; NPString npstr; npstr.utf8characters= "new Array();"; npstr.utf8length = static_cast<uint32_t>(strlen(npstr.utf8characters)); if (!NPN_Evaluate(npp_, window_object, &npstr, &variant) || !NPVARIANT_IS_OBJECT(variant)) { return true; }
// Set the properties NPObject* object = NPVARIANT_TO_OBJECT(variant); if (object) { NPVariant value; INT32_TO_NPVARIANT(12, value); NPN_SetProperty(npp_, object, NPN_GetIntIdentifier(0), &value); INT32_TO_NPVARIANT(34, value); NPN_SetProperty(npp_, object, NPN_GetIntIdentifier(1), &value); OBJECT_TO_NPVARIANT(object, *result); } return true; }
|
반대로, javascript의 array 타입(NPVariant)을 plugin으로 넘길 때
NPVariant array -> Plugin |
bool ScriptablePluginObject::Invoke (NPIdentifier name, const NPVariant * args, uint32_t argCount, NPVariant * result) { if (name == sTest_id) { NPObject *inObject = args[0].value.objectValue; NPVariant npvLength; NPN_GetProperty(mNpp, inObject, NPN_GetStringIdentifier("length"), &npvLength); for (uint32_t i = 0; i < npvLength.value.intValue; i++) { NPVariant curValue; NPN_GetProperty(mNpp, inObject, NPN_GetIntIdentifier(i), &curValue); printf ("%s", curValue); } return true; } } return false;
} |
이렇게 해주면 됩니다.
그런데 위 코드의 length를 얻는 과정에서 firefox/opera와 safari가 좀 다르게 동작하네요.
즉, 'npvLength.value' 값이 firefox/opera는 int형으로 리턴해주는 반면, safari는 double형으로 리턴해주네요
출처 :
http://nativeclient.googlecode.com/svn/trunk/src/native_client/tests/npapi_bridge/plugin.cc
http://groups.google.com/group/mozilla.dev.tech.plugins/browse_thread/thread/049c6aaa534076e9/74a9fd1a490c2aac