Ignore:
Timestamp:
Sep 24, 2014, 9:34:21 PM (11 years ago)
Author:
dmik
Message:

icedtea-web: Merge version 1.5.1 from vendor to trunk.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/icedtea-web/plugin/icedteanp/IcedTeaScriptablePluginObject.cc

    r348 r429  
    5050IcedTeaScriptablePluginObject::deAllocate(NPObject *npobj)
    5151{
    52         printf ("** Unimplemented: IcedTeaScriptablePluginObject::deAllocate %p\n", npobj);
     52        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::deAllocate %p\n", npobj);
    5353}
    5454
     
    5656IcedTeaScriptablePluginObject::invalidate(NPObject *npobj)
    5757{
    58         printf ("** Unimplemented: IcedTeaScriptablePluginObject::invalidate %p\n", npobj);
    59 }
    60 
    61 bool
    62 IcedTeaScriptablePluginObject::hasMethod(NPObject *npobj, NPIdentifier name)
    63 {
    64         printf ("** Unimplemented: IcedTeaScriptablePluginObject::hasMethod %p\n", npobj);
    65         return false;
    66 }
    67 
    68 bool
    69 IcedTeaScriptablePluginObject::invoke(NPObject *npobj, NPIdentifier name, const NPVariant *args,
     58        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::invalidate %p\n", npobj);
     59}
     60
     61bool
     62IcedTeaScriptablePluginObject::hasMethod(NPObject *npobj, NPIdentifier name_id)
     63{
     64        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::hasMethod %p\n", npobj);
     65        return false;
     66}
     67
     68bool
     69IcedTeaScriptablePluginObject::invoke(NPObject *npobj, NPIdentifier name_id, const NPVariant *args,
    7070                        uint32_t argCount,NPVariant *result)
    7171{
    72         printf ("** Unimplemented: IcedTeaScriptablePluginObject::invoke %p\n", npobj);
     72        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::invoke %p\n", npobj);
    7373        return false;
    7474}
     
    7878                               uint32_t argCount, NPVariant *result)
    7979{
    80         printf ("** Unimplemented: IcedTeaScriptablePluginObject::invokeDefault %p\n", npobj);
    81         return false;
    82 }
    83 
    84 bool
    85 IcedTeaScriptablePluginObject::hasProperty(NPObject *npobj, NPIdentifier name)
    86 {
    87         printf ("** Unimplemented: IcedTeaScriptablePluginObject::hasProperty %p\n", npobj);
    88         return false;
    89 }
    90 
    91 bool
    92 IcedTeaScriptablePluginObject::getProperty(NPObject *npobj, NPIdentifier name, NPVariant *result)
     80        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::invokeDefault %p\n", npobj);
     81        return false;
     82}
     83
     84bool
     85IcedTeaScriptablePluginObject::hasProperty(NPObject *npobj, NPIdentifier name_id)
     86{
     87        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::hasProperty %p\n", npobj);
     88        return false;
     89}
     90
     91bool
     92IcedTeaScriptablePluginObject::getProperty(NPObject *npobj, NPIdentifier name_id, NPVariant *result)
    9393{
    9494        // Package request?
    95         if (!strcmp(browser_functions.utf8fromidentifier(name), "java"))
     95        if (IcedTeaPluginUtilities::NPIdentifierAsString(name_id) == "java")
    9696        {
    97                 //NPObject* obj = IcedTeaScriptablePluginObject::get_scriptable_java_package_object(getInstanceFromMemberPtr(npobj), name);
     97                //NPObject* obj = IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object(getInstanceFromMemberPtr(npobj), name);
    9898                //OBJECT_TO_NPVARIANT(obj, *result);
    9999
    100                 //printf ("Filling variant %p with object %p\n", result);
     100                //PLUGIN_ERROR ("Filling variant %p with object %p\n", result);
    101101        }
    102102
     
    105105
    106106bool
    107 IcedTeaScriptablePluginObject::setProperty(NPObject *npobj, NPIdentifier name, const NPVariant *value)
    108 {
    109         printf ("** Unimplemented: IcedTeaScriptablePluginObject::setProperty %p\n", npobj);
    110         return false;
    111 }
    112 
    113 bool
    114 IcedTeaScriptablePluginObject::removeProperty(NPObject *npobj, NPIdentifier name)
    115 {
    116         printf ("** Unimplemented: IcedTeaScriptablePluginObject::removeProperty %p\n", npobj);
     107IcedTeaScriptablePluginObject::setProperty(NPObject *npobj, NPIdentifier name_id, const NPVariant *value)
     108{
     109        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::setProperty %p\n", npobj);
     110        return false;
     111}
     112
     113bool
     114IcedTeaScriptablePluginObject::removeProperty(NPObject *npobj, NPIdentifier name_id)
     115{
     116        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::removeProperty %p\n", npobj);
    117117        return false;
    118118}
     
    121121IcedTeaScriptablePluginObject::enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count)
    122122{
    123         printf ("** Unimplemented: IcedTeaScriptablePluginObject::enumerate %p\n", npobj);
     123        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::enumerate %p\n", npobj);
    124124        return false;
    125125}
     
    129129                   NPVariant *result)
    130130{
    131         printf ("** Unimplemented: IcedTeaScriptablePluginObject::construct %p\n", npobj);
     131        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::construct %p\n", npobj);
    132132        return false;
    133133}
     
    140140}
    141141
     142static NPClass
     143scriptable_plugin_object_class() {
     144    NPClass np_class;
     145    np_class.structVersion = NP_CLASS_STRUCT_VERSION;
     146    np_class.allocate = allocate_scriptable_jp_object;
     147    np_class.deallocate = IcedTeaScriptableJavaPackageObject::deAllocate;
     148    np_class.invalidate = IcedTeaScriptableJavaPackageObject::invalidate;
     149    np_class.hasMethod = IcedTeaScriptableJavaPackageObject::hasMethod;
     150    np_class.invoke = IcedTeaScriptableJavaPackageObject::invoke;
     151    np_class.invokeDefault = IcedTeaScriptableJavaPackageObject::invokeDefault;
     152    np_class.hasProperty = IcedTeaScriptableJavaPackageObject::hasProperty;
     153    np_class.getProperty = IcedTeaScriptableJavaPackageObject::getProperty;
     154    np_class.setProperty = IcedTeaScriptableJavaPackageObject::setProperty;
     155    np_class.removeProperty = IcedTeaScriptableJavaPackageObject::removeProperty;
     156    np_class.enumerate = IcedTeaScriptableJavaPackageObject::enumerate;
     157    np_class.construct = IcedTeaScriptableJavaPackageObject::construct;
     158    return np_class;
     159}
     160
    142161NPObject*
    143 IcedTeaScriptablePluginObject::get_scriptable_java_package_object(NPP instance, const NPUTF8* name)
    144 {
    145 
    146         NPObject* scriptable_object;
    147 
    148         NPClass* np_class = new NPClass();
    149         np_class->structVersion = NP_CLASS_STRUCT_VERSION;
    150         np_class->allocate = allocate_scriptable_jp_object;
    151         np_class->deallocate = IcedTeaScriptableJavaPackageObject::deAllocate;
    152         np_class->invalidate = IcedTeaScriptableJavaPackageObject::invalidate;
    153         np_class->hasMethod = IcedTeaScriptableJavaPackageObject::hasMethod;
    154         np_class->invoke = IcedTeaScriptableJavaPackageObject::invoke;
    155         np_class->invokeDefault = IcedTeaScriptableJavaPackageObject::invokeDefault;
    156         np_class->hasProperty = IcedTeaScriptableJavaPackageObject::hasProperty;
    157         np_class->getProperty = IcedTeaScriptableJavaPackageObject::getProperty;
    158         np_class->setProperty = IcedTeaScriptableJavaPackageObject::setProperty;
    159         np_class->removeProperty = IcedTeaScriptableJavaPackageObject::removeProperty;
    160         np_class->enumerate = IcedTeaScriptableJavaPackageObject::enumerate;
    161         np_class->construct = IcedTeaScriptableJavaPackageObject::construct;
    162 
    163         scriptable_object = browser_functions.createobject(instance, np_class);
    164         PLUGIN_DEBUG("Returning new scriptable package class: %p from instance %p with name %s\n", scriptable_object, instance, name);
     162IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object(NPP instance, const NPUTF8* name)
     163{
     164    /* Shared NPClass instance for IcedTeaScriptablePluginObject */
     165    static NPClass np_class = scriptable_plugin_object_class();
     166
     167    NPObject* scriptable_object = browser_functions.createobject(instance, &np_class);
     168    PLUGIN_DEBUG("Returning new scriptable package class: %p from instance %p with name %s\n", scriptable_object, instance, name);
    165169
    166170    ((IcedTeaScriptableJavaPackageObject*) scriptable_object)->setPackageName(name);
     
    168172    IcedTeaPluginUtilities::storeInstanceID(scriptable_object, instance);
    169173
    170         return scriptable_object;
     174    return scriptable_object;
    171175}
    172176
     
    186190IcedTeaScriptableJavaPackageObject::setPackageName(const NPUTF8* name)
    187191{
    188     this->package_name->append(name);
     192    this->package_name->assign(name);
    189193}
    190194
     
    192196IcedTeaScriptableJavaPackageObject::getPackageName()
    193197{
    194     return this->package_name->c_str();
     198    return *this->package_name;
    195199}
    196200
     
    198202IcedTeaScriptableJavaPackageObject::deAllocate(NPObject *npobj)
    199203{
    200     browser_functions.releaseobject(npobj);
     204    delete (IcedTeaScriptableJavaPackageObject*)npobj;
    201205}
    202206
     
    208212
    209213bool
    210 IcedTeaScriptableJavaPackageObject::hasMethod(NPObject *npobj, NPIdentifier name)
     214IcedTeaScriptableJavaPackageObject::hasMethod(NPObject *npobj, NPIdentifier name_id)
    211215{
    212216    // Silly caller. Methods are for objects!
     
    215219
    216220bool
    217 IcedTeaScriptableJavaPackageObject::invoke(NPObject *npobj, NPIdentifier name, const NPVariant *args,
     221IcedTeaScriptableJavaPackageObject::invoke(NPObject *npobj, NPIdentifier name_id, const NPVariant *args,
    218222                        uint32_t argCount,NPVariant *result)
    219223{
    220         printf ("** Unimplemented: IcedTeaScriptableJavaPackageObject::invoke %p\n", npobj);
     224        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::invoke %p\n", npobj);
    221225        return false;
    222226}
     
    226230                               uint32_t argCount, NPVariant *result)
    227231{
    228         printf ("** Unimplemented: IcedTeaScriptableJavaPackageObject::invokeDefault %p\n", npobj);
    229         return false;
    230 }
    231 
    232 bool
    233 IcedTeaScriptableJavaPackageObject::hasProperty(NPObject *npobj, NPIdentifier name)
    234 {
    235         PLUGIN_DEBUG("IcedTeaScriptableJavaPackageObject::hasProperty %s\n", browser_functions.utf8fromidentifier(name));
     232        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::invokeDefault %p\n", npobj);
     233        return false;
     234}
     235
     236bool
     237IcedTeaScriptableJavaPackageObject::hasProperty(NPObject *npobj, NPIdentifier name_id)
     238{
     239        std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id);
     240
     241        PLUGIN_DEBUG("IcedTeaScriptableJavaPackageObject::hasProperty %s\n", name.c_str());
    236242
    237243        bool hasProperty = false;
     
    240246    NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj);
    241247    int plugin_instance_id = get_id_from_instance(instance);
    242 
    243         PLUGIN_DEBUG("Object package name: \"%s\"\n", ((IcedTeaScriptableJavaPackageObject*) npobj)->getPackageName().c_str());
     248        IcedTeaScriptableJavaPackageObject* scriptable_obj = (IcedTeaScriptableJavaPackageObject*)npobj;
     249
     250        PLUGIN_DEBUG("Object package name: \"%s\"\n", scriptable_obj->getPackageName().c_str());
    244251
    245252        // "^java" is always a package
    246         if (((IcedTeaScriptableJavaPackageObject*) npobj)->getPackageName().length() == 0 &&
    247             (  !strcmp(browser_functions.utf8fromidentifier(name), "java") ||
    248                !strcmp(browser_functions.utf8fromidentifier(name), "javax")))
     253        if (scriptable_obj->getPackageName().empty() && (name == "java" || name == "javax"))
    249254        {
    250255            return true;
    251256        }
    252257
    253         std::string property_name = ((IcedTeaScriptableJavaPackageObject*) npobj)->getPackageName();
    254         if (property_name.length() > 0)
     258        std::string property_name = scriptable_obj->getPackageName();
     259        if (!property_name.empty())
    255260            property_name += ".";
    256         property_name += browser_functions.utf8fromidentifier(name);
     261        property_name += name;
    257262
    258263        PLUGIN_DEBUG("Looking for name \"%s\"\n", property_name.c_str());
     
    276281
    277282bool
    278 IcedTeaScriptableJavaPackageObject::getProperty(NPObject *npobj, NPIdentifier name, NPVariant *result)
    279 {
    280 
    281         PLUGIN_DEBUG("IcedTeaScriptableJavaPackageObject::getProperty %s\n", browser_functions.utf8fromidentifier(name));
    282 
    283         if (!browser_functions.utf8fromidentifier(name))
     283IcedTeaScriptableJavaPackageObject::getProperty(NPObject *npobj, NPIdentifier name_id, NPVariant *result)
     284{
     285    std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id);
     286
     287        PLUGIN_DEBUG("IcedTeaScriptableJavaPackageObject::getProperty %s\n", name.c_str());
     288
     289        if (!browser_functions.identifierisstring(name_id))
    284290            return false;
    285291
     
    289295    NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj);
    290296    int plugin_instance_id = get_id_from_instance(instance);
    291 
    292         std::string property_name = ((IcedTeaScriptableJavaPackageObject*) npobj)->getPackageName();
    293         if (property_name.length() > 0)
    294             property_name += ".";
    295         property_name += browser_functions.utf8fromidentifier(name);
     297    IcedTeaScriptableJavaPackageObject* scriptable_obj = (IcedTeaScriptableJavaPackageObject*)npobj;
     298
     299    std::string property_name = scriptable_obj->getPackageName();
     300    if (!property_name.empty())
     301        property_name += ".";
     302    property_name += name;
    296303
    297304        java_result = java_request.findClass(plugin_instance_id, property_name);
     
    305312        {
    306313                PLUGIN_DEBUG("Returning package object\n");
    307                 obj = IcedTeaScriptablePluginObject::get_scriptable_java_package_object(
     314                obj = IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object(
    308315                                  IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj),
    309316                                  property_name.c_str());
     
    312319        {
    313320                PLUGIN_DEBUG("Returning Java object\n");
    314                 obj = IcedTeaScriptableJavaPackageObject::get_scriptable_java_object(
     321                obj = IcedTeaScriptableJavaObject::get_scriptable_java_object(
    315322                                IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj),
    316323                                *(java_result->return_string), "0", false);
     
    323330
    324331bool
    325 IcedTeaScriptableJavaPackageObject::setProperty(NPObject *npobj, NPIdentifier name, const NPVariant *value)
     332IcedTeaScriptableJavaPackageObject::setProperty(NPObject *npobj, NPIdentifier name_id, const NPVariant *value)
    326333{
    327334        // Can't be going around setting properties on namespaces.. that's madness!
     
    330337
    331338bool
    332 IcedTeaScriptableJavaPackageObject::removeProperty(NPObject *npobj, NPIdentifier name)
    333 {
    334         printf ("** Unimplemented: IcedTeaScriptableJavaPackageObject::removeProperty %p\n", npobj);
     339IcedTeaScriptableJavaPackageObject::removeProperty(NPObject *npobj, NPIdentifier name_id)
     340{
     341        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::removeProperty %p\n", npobj);
    335342        return false;
    336343}
     
    339346IcedTeaScriptableJavaPackageObject::enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count)
    340347{
    341         printf ("** Unimplemented: IcedTeaScriptableJavaPackageObject::enumerate %p\n", npobj);
     348        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::enumerate %p\n", npobj);
    342349        return false;
    343350}
     
    347354                   NPVariant *result)
    348355{
    349         printf ("** Unimplemented: IcedTeaScriptableJavaPackageObject::construct %p\n", npobj);
     356        PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::construct %p\n", npobj);
    350357        return false;
    351358}
     
    358365}
    359366
     367
     368static NPClass
     369scriptable_java_package_object_class() {
     370    NPClass np_class;
     371    np_class.structVersion = NP_CLASS_STRUCT_VERSION;
     372    np_class.allocate = allocate_scriptable_java_object;
     373    np_class.deallocate = IcedTeaScriptableJavaObject::deAllocate;
     374    np_class.invalidate = IcedTeaScriptableJavaObject::invalidate;
     375    np_class.hasMethod = IcedTeaScriptableJavaObject::hasMethod;
     376    np_class.invoke = IcedTeaScriptableJavaObject::invoke;
     377    np_class.invokeDefault = IcedTeaScriptableJavaObject::invokeDefault;
     378    np_class.hasProperty = IcedTeaScriptableJavaObject::hasProperty;
     379    np_class.getProperty = IcedTeaScriptableJavaObject::getProperty;
     380    np_class.setProperty = IcedTeaScriptableJavaObject::setProperty;
     381    np_class.removeProperty = IcedTeaScriptableJavaObject::removeProperty;
     382    np_class.enumerate = IcedTeaScriptableJavaObject::enumerate;
     383    np_class.construct = IcedTeaScriptableJavaObject::construct;
     384    return np_class;
     385}
     386
    360387NPObject*
    361 IcedTeaScriptableJavaPackageObject::get_scriptable_java_object(NPP instance,
     388IcedTeaScriptableJavaObject::get_scriptable_java_object(NPP instance,
    362389                                    std::string class_id,
    363390                                    std::string instance_id,
    364391                                    bool isArray)
    365392{
    366     NPObject* scriptable_object;
    367 
    368     std::string obj_key = std::string();
    369     obj_key += class_id;
    370     obj_key += ":";
    371     obj_key += instance_id;
     393    /* Shared NPClass instance for IcedTeaScriptablePluginObject */
     394    static NPClass np_class = scriptable_java_package_object_class();
     395
     396    std::string obj_key = class_id + ":" + instance_id;
    372397
    373398    PLUGIN_DEBUG("get_scriptable_java_object searching for %s...\n", obj_key.c_str());
    374     scriptable_object = IcedTeaPluginUtilities::getNPObjectFromJavaKey(obj_key);
     399    IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*) IcedTeaPluginUtilities::getNPObjectFromJavaKey(obj_key);
    375400
    376401    if (scriptable_object != NULL)
     
    381406    }
    382407
    383 
    384         NPClass* np_class = new NPClass();
    385         np_class->structVersion = NP_CLASS_STRUCT_VERSION;
    386         np_class->allocate = allocate_scriptable_java_object;
    387         np_class->deallocate = IcedTeaScriptableJavaObject::deAllocate;
    388         np_class->invalidate = IcedTeaScriptableJavaObject::invalidate;
    389         np_class->hasMethod = IcedTeaScriptableJavaObject::hasMethod;
    390         np_class->invoke = IcedTeaScriptableJavaObject::invoke;
    391         np_class->invokeDefault = IcedTeaScriptableJavaObject::invokeDefault;
    392         np_class->hasProperty = IcedTeaScriptableJavaObject::hasProperty;
    393         np_class->getProperty = IcedTeaScriptableJavaObject::getProperty;
    394         np_class->setProperty = IcedTeaScriptableJavaObject::setProperty;
    395         np_class->removeProperty = IcedTeaScriptableJavaObject::removeProperty;
    396         np_class->enumerate = IcedTeaScriptableJavaObject::enumerate;
    397         np_class->construct = IcedTeaScriptableJavaObject::construct;
    398 
    399         // try to create normally
    400     scriptable_object =  browser_functions.createobject(instance, np_class);
     408    // try to create normally
     409    scriptable_object = (IcedTeaScriptableJavaObject*)browser_functions.createobject(instance, &np_class);
    401410
    402411    // didn't work? try creating asynch
     
    409418
    410419        thread_data.parameters.push_back(instance);
    411         thread_data.parameters.push_back(np_class);
     420        thread_data.parameters.push_back(&np_class);
    412421        thread_data.parameters.push_back(&scriptable_object);
    413422
     
    421430    PLUGIN_DEBUG("Constructed new Java Object with classid=%s, instanceid=%s, isArray=%d and scriptable_object=%p\n", class_id.c_str(), instance_id.c_str(), isArray, scriptable_object);
    422431
    423         ((IcedTeaScriptableJavaObject*) scriptable_object)->setClassIdentifier(class_id);
    424     ((IcedTeaScriptableJavaObject*) scriptable_object)->setIsArray(isArray);
     432    scriptable_object->class_id = class_id;
     433    scriptable_object->is_object_array = isArray;
    425434
    426435        if (instance_id != "0")
    427             ((IcedTeaScriptableJavaObject*) scriptable_object)->setInstanceIdentifier(instance_id);
     436            scriptable_object->instance_id = instance_id;
    428437
    429438        IcedTeaPluginUtilities::storeInstanceID(scriptable_object, instance);
     
    456465}
    457466
    458 IcedTeaScriptableJavaObject::IcedTeaScriptableJavaObject(NPP instance)
    459 {
    460         this->instance = instance;
    461         this->class_id = new std::string();
    462         this->instance_id = new std::string();
    463 }
    464 
    465 IcedTeaScriptableJavaObject::~IcedTeaScriptableJavaObject()
    466 {
    467         delete this->class_id;
    468         delete this->instance_id;
    469 }
    470 
    471 void
    472 IcedTeaScriptableJavaObject::setClassIdentifier(std::string class_id)
    473 {
    474         this->class_id->append(class_id);
    475 }
    476 
    477 void
    478 IcedTeaScriptableJavaObject::setInstanceIdentifier(std::string instance_id)
    479 {
    480         this->instance_id->append(instance_id);
    481 }
    482 
    483 void
    484 IcedTeaScriptableJavaObject::setIsArray(bool isArray)
    485 {
    486     this->isObjectArray = isArray;
    487 }
    488 
    489 void
    490 IcedTeaScriptableJavaObject::deAllocate(NPObject *npobj)
    491 {
    492         browser_functions.releaseobject(npobj);
    493 }
    494 
    495 void
    496 IcedTeaScriptableJavaObject::invalidate(NPObject *npobj)
    497 {
    498         IcedTeaPluginUtilities::removeInstanceID(npobj);
    499 
    500         std::string obj_key = std::string();
    501         obj_key += ((IcedTeaScriptableJavaObject*) npobj)->getClassID();
    502         obj_key += ":";
    503         obj_key += ((IcedTeaScriptableJavaObject*) npobj)->getInstanceID();
    504 
    505         IcedTeaPluginUtilities::removeObjectMapping(obj_key);
    506 }
    507 
    508 bool
    509 IcedTeaScriptableJavaObject::hasMethod(NPObject *npobj, NPIdentifier name)
    510 {
    511     PLUGIN_DEBUG("IcedTeaScriptableJavaObject::hasMethod %s (ival=%d)\n", browser_functions.utf8fromidentifier(name), browser_functions.intfromidentifier(name));
     467bool
     468IcedTeaScriptableJavaObject::hasMethod(NPObject *npobj, NPIdentifier name_id)
     469{
     470    std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id);
     471    IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*) npobj;
     472
     473    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::hasMethod %s (ival=%d)\n", name.c_str(), browser_functions.intfromidentifier(name_id));
    512474    bool hasMethod = false;
    513475
    514476    // If object is an array and requested "method" may be a number, check for it first
    515     if ( !((IcedTeaScriptableJavaObject*) npobj)->isArray()  ||
    516          (browser_functions.intfromidentifier(name) < 0))
    517     {
    518 
    519         if (!browser_functions.utf8fromidentifier(name))
     477    if ( !scriptable_object->is_object_array  ||
     478         (browser_functions.intfromidentifier(name_id) < 0))
     479    {
     480
     481        if (!browser_functions.identifierisstring(name_id))
    520482            return false;
    521483
     
    523485        JavaRequestProcessor java_request = JavaRequestProcessor();
    524486
    525         std::string classId = std::string(((IcedTeaScriptableJavaObject*) npobj)->getClassID());
    526         std::string methodName = browser_functions.utf8fromidentifier(name);
    527 
    528         java_result = java_request.hasMethod(classId, methodName);
     487        java_result = java_request.hasMethod(scriptable_object->class_id, name);
    529488        hasMethod = java_result->return_identifier != 0;
    530489    }
     
    535494
    536495bool
    537 IcedTeaScriptableJavaObject::invoke(NPObject *npobj, NPIdentifier name, const NPVariant *args,
     496IcedTeaScriptableJavaObject::invoke(NPObject *npobj, NPIdentifier name_id, const NPVariant *args,
    538497                        uint32_t argCount, NPVariant *result)
    539498{
    540     NPUTF8* method_name = browser_functions.utf8fromidentifier(name);
     499    std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id);
    541500
    542501    // Extract arg type array
    543     PLUGIN_DEBUG("IcedTeaScriptableJavaObject::invoke %s. Args follow.\n", method_name);
     502    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::invoke %s. Args follow.\n", name.c_str());
    544503    for (int i=0; i < argCount; i++)
    545504    {
     
    550509    JavaRequestProcessor java_request = JavaRequestProcessor();
    551510
    552     NPObject* obj;
    553     std::string instance_id = ((IcedTeaScriptableJavaObject*) npobj)->getInstanceID();
    554     std::string class_id = ((IcedTeaScriptableJavaObject*) npobj)->getClassID();
    555     std::string callee;
    556     std::string source;
     511    IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*)npobj;
     512
     513    std::string instance_id = scriptable_object->instance_id;
     514    std::string class_id = scriptable_object->class_id;
    557515
    558516    NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj);
     
    567525        if (id == "-1")
    568526        {
    569             printf("Unable to create arguments on Java side\n");
     527            PLUGIN_ERROR("Unable to create arguments on Java side\n");
    570528            return false;
    571529        }
     
    577535    {
    578536        PLUGIN_DEBUG("Calling static method\n");
    579         callee = ((IcedTeaScriptableJavaObject*) npobj)->getClassID();
    580537        java_result = java_request.callStaticMethod(
    581538                        IcedTeaPluginUtilities::getSourceFromInstance(instance),
    582                         callee, browser_functions.utf8fromidentifier(name), arg_ids);
     539                        scriptable_object->class_id, name, arg_ids);
    583540    } else
    584541    {
    585542        PLUGIN_DEBUG("Calling method normally\n");
    586         callee = ((IcedTeaScriptableJavaObject*) npobj)->getInstanceID();
    587543        java_result = java_request.callMethod(
    588544                        IcedTeaPluginUtilities::getSourceFromInstance(instance),
    589                         callee, browser_functions.utf8fromidentifier(name), arg_ids);
     545                        scriptable_object->instance_id, name, arg_ids);
    590546    }
    591547
    592548    if (java_result->error_occurred)
    593549    {
    594         // error message must be allocated on heap
    595         char* error_msg = (char*) malloc(java_result->error_msg->length()*sizeof(char));
    596         strcpy(error_msg, java_result->error_msg->c_str());
    597         browser_functions.setexception(npobj, error_msg);
     550        browser_functions.setexception(npobj, java_result->error_msg->c_str());
    598551        return false;
    599552    }
     
    604557
    605558bool
    606 IcedTeaScriptableJavaObject::invokeDefault(NPObject *npobj, const NPVariant *args,
    607                                uint32_t argCount, NPVariant *result)
    608 {
    609         printf ("** Unimplemented: IcedTeaScriptableJavaObject::invokeDefault %p\n", npobj);
    610         return false;
    611 }
    612 
    613 bool
    614 IcedTeaScriptableJavaObject::hasProperty(NPObject *npobj, NPIdentifier name)
    615 {
    616     PLUGIN_DEBUG("IcedTeaScriptableJavaObject::hasProperty %s (ival=%d)\n", browser_functions.utf8fromidentifier(name), browser_functions.intfromidentifier(name));
     559IcedTeaScriptableJavaObject::hasProperty(NPObject *npobj, NPIdentifier name_id)
     560{
     561    std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id);
     562
     563    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::hasProperty %s (ival=%d)\n", name.c_str(), browser_functions.intfromidentifier(name_id));
    617564    bool hasProperty = false;
    618565
     566    IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*)npobj;
    619567    // If it is an array, only length and indexes are valid
    620     if (((IcedTeaScriptableJavaObject*) npobj)->isArray())
    621     {
    622         if (browser_functions.intfromidentifier(name) >= 0 ||
    623             !strcmp(browser_functions.utf8fromidentifier(name), "length"))
     568    if (scriptable_object->is_object_array)
     569    {
     570        if (browser_functions.intfromidentifier(name_id) >= 0 || name == "length")
    624571            hasProperty = true;
    625572
    626573    } else
    627574    {
    628 
    629         if (!browser_functions.utf8fromidentifier(name))
     575        if (!browser_functions.identifierisstring(name_id))
    630576            return false;
    631577
    632         if (!strcmp(browser_functions.utf8fromidentifier(name), "Packages"))
     578        if (name == "Packages")
    633579        {
    634580            hasProperty = true;
     
    638584            JavaRequestProcessor java_request = JavaRequestProcessor();
    639585
    640             std::string class_id = std::string(((IcedTeaScriptableJavaObject*) npobj)->getClassID());
    641             std::string fieldName = browser_functions.utf8fromidentifier(name);
    642 
    643             java_result = java_request.hasField(class_id, fieldName);
     586            java_result = java_request.hasField(scriptable_object->class_id, name);
    644587
    645588            hasProperty = java_result->return_identifier != 0;
     
    652595
    653596bool
    654 IcedTeaScriptableJavaObject::getProperty(NPObject *npobj, NPIdentifier name, NPVariant *result)
    655 {
    656     PLUGIN_DEBUG("IcedTeaScriptableJavaObject::getProperty %s (ival=%d)\n", browser_functions.utf8fromidentifier(name), browser_functions.intfromidentifier(name));
    657 
    658     bool isPropertyClass = false;
     597IcedTeaScriptableJavaObject::getProperty(NPObject *npobj, NPIdentifier name_id, NPVariant *result)
     598{
     599    std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id);
     600    bool is_string_id = browser_functions.identifierisstring(name_id);
     601    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::getProperty %s (ival=%d)\n", name.c_str(), browser_functions.intfromidentifier(name_id));
     602
    659603    JavaResultData* java_result;
    660604    JavaRequestProcessor java_request = JavaRequestProcessor();
    661605
    662     NPObject* obj;
    663     std::string instance_id = ((IcedTeaScriptableJavaObject*) npobj)->getInstanceID();
    664     std::string class_id = ((IcedTeaScriptableJavaObject*) npobj)->getClassID();
    665     NPP instance = ((IcedTeaScriptableJavaObject*) npobj)->getInstance();
     606    IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*)npobj;
     607
     608    std::string instance_id = scriptable_object->getInstanceID();
     609    std::string class_id = scriptable_object->getClassID();
     610    NPP instance = scriptable_object->instance;
    666611
    667612    if (instance_id.length() > 0) // Could be an array or a simple object
    668613    {
    669614        // If array and requesting length
    670         if ( ((IcedTeaScriptableJavaObject*) npobj)->isArray() &&
    671              browser_functions.utf8fromidentifier(name) &&
    672              !strcmp(browser_functions.utf8fromidentifier(name), "length"))
     615        if ( scriptable_object->is_object_array && name == "length")
    673616        {
    674617            java_result = java_request.getArrayLength(instance_id);
    675         } else if ( ((IcedTeaScriptableJavaObject*) npobj)->isArray() &&
    676                     browser_functions.intfromidentifier(name) >= 0) // else if array and requesting index
     618        } else if ( scriptable_object->is_object_array &&
     619                    browser_functions.intfromidentifier(name_id) >= 0) // else if array and requesting index
    677620        {
    678621
     
    680623            if (java_result->error_occurred)
    681624            {
    682                 printf("ERROR: Couldn't fetch array length\n");
     625                PLUGIN_ERROR("ERROR: Couldn't fetch array length\n");
    683626                return false;
    684627            }
     
    687630
    688631            // Access beyond size?
    689             if (browser_functions.intfromidentifier(name) >= length)
     632            if (browser_functions.intfromidentifier(name_id) >= length)
    690633            {
    691634                VOID_TO_NPVARIANT(*result);
     
    694637
    695638            std::string index = std::string();
    696             IcedTeaPluginUtilities::itoa(browser_functions.intfromidentifier(name), &index);
     639            IcedTeaPluginUtilities::itoa(browser_functions.intfromidentifier(name_id), &index);
    697640            java_result = java_request.getSlot(instance_id, index);
    698641
    699642        } else // Everything else
    700643        {
    701             if (!browser_functions.utf8fromidentifier(name))
     644            if (!is_string_id) {
    702645                return false;
    703 
    704             if (!strcmp(browser_functions.utf8fromidentifier(name), "Packages"))
     646            }
     647
     648            if (name == "Packages")
    705649            {
    706                 NPObject* pkgObject = IcedTeaScriptablePluginObject::get_scriptable_java_package_object(instance, "");
     650                NPObject* pkgObject = IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object(instance, "");
    707651                OBJECT_TO_NPVARIANT(pkgObject, *result);
    708652                return true;
     
    711655            java_result = java_request.getField(
    712656                        IcedTeaPluginUtilities::getSourceFromInstance(instance),
    713                         class_id, instance_id, browser_functions.utf8fromidentifier(name));
     657                        class_id, instance_id, name);
    714658        }
    715659    }
    716660    else
    717661    {
    718         if (!browser_functions.utf8fromidentifier(name))
    719             return true;
     662        if (!is_string_id) {
     663            return false;
     664        }
    720665
    721666        java_result = java_request.getStaticField(
    722667                                IcedTeaPluginUtilities::getSourceFromInstance(instance),
    723                                 class_id, browser_functions.utf8fromidentifier(name));
     668                                class_id, name);
    724669    }
    725670
     
    734679
    735680bool
    736 IcedTeaScriptableJavaObject::setProperty(NPObject *npobj, NPIdentifier name, const NPVariant *value)
    737 {
    738     PLUGIN_DEBUG("IcedTeaScriptableJavaObject::setProperty %s (ival=%d) to:\n", browser_functions.utf8fromidentifier(name), browser_functions.intfromidentifier(name));
     681IcedTeaScriptableJavaObject::setProperty(NPObject *npobj, NPIdentifier name_id, const NPVariant *value)
     682{
     683    std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id);
     684    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::setProperty %s (ival=%d) to:\n", name.c_str(), browser_functions.intfromidentifier(name_id));
    739685    IcedTeaPluginUtilities::printNPVariant(*value);
    740686
    741     bool isPropertyClass = false;
    742687    JavaResultData* java_result;
    743688    JavaRequestProcessor java_request = JavaRequestProcessor();
    744 
    745     NPObject* obj;
    746     std::string instance_id = ((IcedTeaScriptableJavaObject*) npobj)->getInstanceID();
    747     std::string class_id = ((IcedTeaScriptableJavaObject*) npobj)->getClassID();
     689    IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*)npobj;
     690
     691    std::string instance_id = scriptable_object->getInstanceID();
     692    std::string class_id = scriptable_object->getClassID();
    748693
    749694    NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj);
     
    752697    {
    753698        // If array
    754         if ( ((IcedTeaScriptableJavaObject*) npobj)->isArray() &&
    755              browser_functions.utf8fromidentifier(name) &&
    756              !strcmp(browser_functions.utf8fromidentifier(name), "length"))
     699        if (scriptable_object->is_object_array && name == "length")
    757700        {
    758             printf("ERROR: Array length is not a modifiable property\n");
     701            PLUGIN_ERROR("ERROR: Array length is not a modifiable property\n");
    759702            return false;
    760         } else if ( ((IcedTeaScriptableJavaObject*) npobj)->isArray() &&
    761                     browser_functions.intfromidentifier(name) >= 0) // else if array and requesting index
     703        } else if ( scriptable_object->is_object_array &&
     704                    browser_functions.intfromidentifier(name_id) >= 0) // else if array and requesting index
    762705        {
    763706
     
    765708            if (java_result->error_occurred)
    766709            {
    767                 printf("ERROR: Couldn't fetch array length\n");
     710                PLUGIN_ERROR("ERROR: Couldn't fetch array length\n");
    768711                return false;
    769712            }
     
    772715
    773716            // Access beyond size?
    774             if (browser_functions.intfromidentifier(name) >= length)
     717            if (browser_functions.intfromidentifier(name_id) >= length)
    775718            {
    776719                return true;
     
    778721
    779722            std::string index = std::string();
    780             IcedTeaPluginUtilities::itoa(browser_functions.intfromidentifier(name), &index);
     723            IcedTeaPluginUtilities::itoa(browser_functions.intfromidentifier(name_id), &index);
    781724
    782725            std::string value_id = std::string();
     
    792735            java_result = java_request.setField(
    793736                        IcedTeaPluginUtilities::getSourceFromInstance(instance),
    794                         class_id, instance_id, browser_functions.utf8fromidentifier(name), value_id);
     737                        class_id, instance_id, name, value_id);
    795738        }
    796739    }
     
    802745        java_result = java_request.setStaticField(
    803746                                IcedTeaPluginUtilities::getSourceFromInstance(instance),
    804                                 class_id, browser_functions.utf8fromidentifier(name), value_id);
     747                                class_id, name, value_id);
    805748    }
    806749
     
    815758
    816759bool
    817 IcedTeaScriptableJavaObject::removeProperty(NPObject *npobj, NPIdentifier name)
    818 {
    819         printf ("** Unimplemented: IcedTeaScriptableJavaObject::removeProperty %p\n", npobj);
    820         return false;
    821 }
    822 
    823 bool
    824 IcedTeaScriptableJavaObject::enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count)
    825 {
    826         printf ("** Unimplemented: IcedTeaScriptableJavaObject::enumerate %p\n", npobj);
    827         return false;
    828 }
    829 
    830 bool
    831760IcedTeaScriptableJavaObject::construct(NPObject *npobj, const NPVariant *args, uint32_t argCount,
    832761                   NPVariant *result)
    833762{
     763    IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*)npobj;
    834764    // Extract arg type array
    835     PLUGIN_DEBUG("IcedTeaScriptableJavaObject::construct %s. Args follow.\n", ((IcedTeaScriptableJavaObject*) npobj)->getClassID().c_str());
     765    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::construct %s. Args follow.\n", scriptable_object->getClassID().c_str());
    836766    for (int i=0; i < argCount; i++)
    837767    {
     
    842772    JavaRequestProcessor java_request = JavaRequestProcessor();
    843773
    844     NPObject* obj;
    845     std::string class_id = ((IcedTeaScriptableJavaObject*) npobj)->getClassID();
    846774    NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj);
    847775
     
    854782        if (id == "0")
    855783        {
    856             // error message must be allocated on heap
    857             char* error_msg = (char*) malloc(1024*sizeof(char));
    858             strcpy(error_msg, "Unable to create argument on Java side");
    859 
    860             browser_functions.setexception(npobj, error_msg);
     784            browser_functions.setexception(npobj, "Unable to create argument on Java side");
    861785            return false;
    862786        }
     
    867791    java_result = java_request.newObject(
    868792                            IcedTeaPluginUtilities::getSourceFromInstance(instance),
    869                             class_id,
     793                            scriptable_object->class_id,
    870794                            arg_ids);
    871795
    872796    if (java_result->error_occurred)
    873797    {
    874         // error message must be allocated on heap
    875         int length = java_result->error_msg->length();
    876         char* error_msg = (char*) malloc((length+1)*sizeof(char));
    877         strcpy(error_msg, java_result->error_msg->c_str());
    878 
    879         browser_functions.setexception(npobj, error_msg);
     798        browser_functions.setexception(npobj, java_result->error_msg->c_str());
    880799        return false;
    881800    }
    882801
    883     std::string return_obj_instance_id = std::string();
    884     std::string return_obj_class_id = class_id;
    885     return_obj_instance_id.append(*(java_result->return_string));
    886 
    887     obj = IcedTeaScriptableJavaPackageObject::get_scriptable_java_object(
     802    std::string return_obj_instance_id = *java_result->return_string;
     803    std::string return_obj_class_id = scriptable_object->class_id;
     804
     805    NPObject* obj = IcedTeaScriptableJavaObject::get_scriptable_java_object(
    888806                                IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj),
    889807                                return_obj_class_id, return_obj_instance_id, false);
Note: See TracChangeset for help on using the changeset viewer.