예제 #1
0
파일: mrb_js.cpp 프로젝트: guofei/JsMruby
bool convert_js_to_mrb_hash(NPP npp, const NPVariant &variant, mrb_state *mrb, mrb_value *result)
{
    NPIdentifier *id_list = NULL;
    uint32_t count;
    NPN_Enumerate(npp, NPVARIANT_TO_OBJECT(variant), &id_list, &count);

    mrb_value ret_hash = mrb_hash_new_capa(mrb, count);
    for (uint32_t i=0; i<count; i++){
        NPVariant item;
        NPN_GetProperty(npp, NPVARIANT_TO_OBJECT(variant), id_list[i], &item);

        mrb_value mrb_item;
        if (!convert_js_to_mrb(npp, item, mrb, &mrb_item)){
            NPN_MemFree(id_list);
            NPN_ReleaseVariantValue(&item);
            return false;
        }
        NPN_ReleaseVariantValue(&item);

        NPUTF8 *key = NPN_UTF8FromIdentifier(id_list[i]);
        mrb_hash_set(mrb, ret_hash, mrb_str_new2(mrb, key), mrb_item);
        NPN_MemFree(key);
    }

    NPN_MemFree(id_list);
    *result = ret_hash;
    return true;
}
unordered_map<wstring, wstring> NPObjectToUnorderedMap(NPP npp, NPObject* npobj)
{
	unordered_map<wstring, wstring> result;

	NPIdentifier* pIdentifiers = NULL;
	uint32_t nIdentifiers = 0;
	if (NPN_Enumerate(npp, npobj, &pIdentifiers, &nIdentifiers)) {
		for (uint32_t i = 0; i < nIdentifiers; i++) {
			NPIdentifier npid = pIdentifiers[i];
			CString idName = NPIdentifierToCString(npid);
			NPVariant npvValue;
			if (NPN_GetProperty(npp, npobj, npid, &npvValue)) {
				if (NPVARIANT_IS_STRING(npvValue)) {
					result[idName.GetString()] = NPStringToCString(NPVARIANT_TO_STRING(npvValue)).GetString();
				}
				NPN_ReleaseVariantValue(&npvValue);
			}
		}
		NPN_MemFree(pIdentifiers);
	}

	return result;
}