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; }