본문 바로가기

C/C++

[npruntime] NPVariant로 배열(array) 넘기기 및 받기

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(NPVariantresult) {

  // 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

  NPObjectobject = NPVARIANT_TO_OBJECT(variant);

  if (object) {

    NPVariant value;

    INT32_TO_NPVARIANT(12value);

    NPN_SetProperty(npp_objectNPN_GetIntIdentifier(0), &value);

    INT32_TO_NPVARIANT(34value);

    NPN_SetProperty(npp_objectNPN_GetIntIdentifier(1), &value);

    OBJECT_TO_NPVARIANT(object, *result);

  }

  return true;

}

 



반대로, javascript의 array 타입(NPVariant)을 plugin으로 넘길 때

NPVariant array  -> Plugin

bool

ScriptablePluginObject::Invoke (NPIdentifier nameconst NPVariant * args,

                                                     uint32_t argCountNPVariant * result)

{

    if (name == sTest_id)

    {

        NPObject *inObject = args[0].value.objectValue;

        NPVariant npvLength;

        NPN_GetProperty(mNppinObjectNPN_GetStringIdentifier("length"), &npvLength);

        for (uint32_t i = 0i < npvLength.value.intValuei++)

        {

            NPVariant curValue;

            NPN_GetProperty(mNppinObjectNPN_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