- Timestamp:
- Sep 24, 2014, 9:34:21 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/icedtea-web/plugin/icedteanp/IcedTeaScriptablePluginObject.cc
r348 r429 50 50 IcedTeaScriptablePluginObject::deAllocate(NPObject *npobj) 51 51 { 52 printf("** Unimplemented: IcedTeaScriptablePluginObject::deAllocate %p\n", npobj);52 PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::deAllocate %p\n", npobj); 53 53 } 54 54 … … 56 56 IcedTeaScriptablePluginObject::invalidate(NPObject *npobj) 57 57 { 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 61 bool 62 IcedTeaScriptablePluginObject::hasMethod(NPObject *npobj, NPIdentifier name_id) 63 { 64 PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::hasMethod %p\n", npobj); 65 return false; 66 } 67 68 bool 69 IcedTeaScriptablePluginObject::invoke(NPObject *npobj, NPIdentifier name_id, const NPVariant *args, 70 70 uint32_t argCount,NPVariant *result) 71 71 { 72 printf("** Unimplemented: IcedTeaScriptablePluginObject::invoke %p\n", npobj);72 PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::invoke %p\n", npobj); 73 73 return false; 74 74 } … … 78 78 uint32_t argCount, NPVariant *result) 79 79 { 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 84 bool 85 IcedTeaScriptablePluginObject::hasProperty(NPObject *npobj, NPIdentifier name_id) 86 { 87 PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::hasProperty %p\n", npobj); 88 return false; 89 } 90 91 bool 92 IcedTeaScriptablePluginObject::getProperty(NPObject *npobj, NPIdentifier name_id, NPVariant *result) 93 93 { 94 94 // Package request? 95 if ( !strcmp(browser_functions.utf8fromidentifier(name), "java"))95 if (IcedTeaPluginUtilities::NPIdentifierAsString(name_id) == "java") 96 96 { 97 //NPObject* obj = IcedTeaScriptable PluginObject::get_scriptable_java_package_object(getInstanceFromMemberPtr(npobj), name);97 //NPObject* obj = IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object(getInstanceFromMemberPtr(npobj), name); 98 98 //OBJECT_TO_NPVARIANT(obj, *result); 99 99 100 // printf("Filling variant %p with object %p\n", result);100 //PLUGIN_ERROR ("Filling variant %p with object %p\n", result); 101 101 } 102 102 … … 105 105 106 106 bool 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);107 IcedTeaScriptablePluginObject::setProperty(NPObject *npobj, NPIdentifier name_id, const NPVariant *value) 108 { 109 PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::setProperty %p\n", npobj); 110 return false; 111 } 112 113 bool 114 IcedTeaScriptablePluginObject::removeProperty(NPObject *npobj, NPIdentifier name_id) 115 { 116 PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::removeProperty %p\n", npobj); 117 117 return false; 118 118 } … … 121 121 IcedTeaScriptablePluginObject::enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) 122 122 { 123 printf("** Unimplemented: IcedTeaScriptablePluginObject::enumerate %p\n", npobj);123 PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::enumerate %p\n", npobj); 124 124 return false; 125 125 } … … 129 129 NPVariant *result) 130 130 { 131 printf("** Unimplemented: IcedTeaScriptablePluginObject::construct %p\n", npobj);131 PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::construct %p\n", npobj); 132 132 return false; 133 133 } … … 140 140 } 141 141 142 static NPClass 143 scriptable_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 142 161 NPObject* 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); 162 IcedTeaScriptableJavaPackageObject::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); 165 169 166 170 ((IcedTeaScriptableJavaPackageObject*) scriptable_object)->setPackageName(name); … … 168 172 IcedTeaPluginUtilities::storeInstanceID(scriptable_object, instance); 169 173 170 174 return scriptable_object; 171 175 } 172 176 … … 186 190 IcedTeaScriptableJavaPackageObject::setPackageName(const NPUTF8* name) 187 191 { 188 this->package_name->a ppend(name);192 this->package_name->assign(name); 189 193 } 190 194 … … 192 196 IcedTeaScriptableJavaPackageObject::getPackageName() 193 197 { 194 return this->package_name->c_str();198 return *this->package_name; 195 199 } 196 200 … … 198 202 IcedTeaScriptableJavaPackageObject::deAllocate(NPObject *npobj) 199 203 { 200 browser_functions.releaseobject(npobj);204 delete (IcedTeaScriptableJavaPackageObject*)npobj; 201 205 } 202 206 … … 208 212 209 213 bool 210 IcedTeaScriptableJavaPackageObject::hasMethod(NPObject *npobj, NPIdentifier name )214 IcedTeaScriptableJavaPackageObject::hasMethod(NPObject *npobj, NPIdentifier name_id) 211 215 { 212 216 // Silly caller. Methods are for objects! … … 215 219 216 220 bool 217 IcedTeaScriptableJavaPackageObject::invoke(NPObject *npobj, NPIdentifier name , const NPVariant *args,221 IcedTeaScriptableJavaPackageObject::invoke(NPObject *npobj, NPIdentifier name_id, const NPVariant *args, 218 222 uint32_t argCount,NPVariant *result) 219 223 { 220 printf("** Unimplemented: IcedTeaScriptableJavaPackageObject::invoke %p\n", npobj);224 PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::invoke %p\n", npobj); 221 225 return false; 222 226 } … … 226 230 uint32_t argCount, NPVariant *result) 227 231 { 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 236 bool 237 IcedTeaScriptableJavaPackageObject::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()); 236 242 237 243 bool hasProperty = false; … … 240 246 NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj); 241 247 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()); 244 251 245 252 // "^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")) 249 254 { 250 255 return true; 251 256 } 252 257 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()) 255 260 property_name += "."; 256 property_name += browser_functions.utf8fromidentifier(name);261 property_name += name; 257 262 258 263 PLUGIN_DEBUG("Looking for name \"%s\"\n", property_name.c_str()); … … 276 281 277 282 bool 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)) 283 IcedTeaScriptableJavaPackageObject::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)) 284 290 return false; 285 291 … … 289 295 NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj); 290 296 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; 296 303 297 304 java_result = java_request.findClass(plugin_instance_id, property_name); … … 305 312 { 306 313 PLUGIN_DEBUG("Returning package object\n"); 307 obj = IcedTeaScriptable PluginObject::get_scriptable_java_package_object(314 obj = IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object( 308 315 IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj), 309 316 property_name.c_str()); … … 312 319 { 313 320 PLUGIN_DEBUG("Returning Java object\n"); 314 obj = IcedTeaScriptableJava PackageObject::get_scriptable_java_object(321 obj = IcedTeaScriptableJavaObject::get_scriptable_java_object( 315 322 IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj), 316 323 *(java_result->return_string), "0", false); … … 323 330 324 331 bool 325 IcedTeaScriptableJavaPackageObject::setProperty(NPObject *npobj, NPIdentifier name , const NPVariant *value)332 IcedTeaScriptableJavaPackageObject::setProperty(NPObject *npobj, NPIdentifier name_id, const NPVariant *value) 326 333 { 327 334 // Can't be going around setting properties on namespaces.. that's madness! … … 330 337 331 338 bool 332 IcedTeaScriptableJavaPackageObject::removeProperty(NPObject *npobj, NPIdentifier name )333 { 334 printf("** Unimplemented: IcedTeaScriptableJavaPackageObject::removeProperty %p\n", npobj);339 IcedTeaScriptableJavaPackageObject::removeProperty(NPObject *npobj, NPIdentifier name_id) 340 { 341 PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::removeProperty %p\n", npobj); 335 342 return false; 336 343 } … … 339 346 IcedTeaScriptableJavaPackageObject::enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) 340 347 { 341 printf("** Unimplemented: IcedTeaScriptableJavaPackageObject::enumerate %p\n", npobj);348 PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::enumerate %p\n", npobj); 342 349 return false; 343 350 } … … 347 354 NPVariant *result) 348 355 { 349 printf("** Unimplemented: IcedTeaScriptableJavaPackageObject::construct %p\n", npobj);356 PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::construct %p\n", npobj); 350 357 return false; 351 358 } … … 358 365 } 359 366 367 368 static NPClass 369 scriptable_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 360 387 NPObject* 361 IcedTeaScriptableJava PackageObject::get_scriptable_java_object(NPP instance,388 IcedTeaScriptableJavaObject::get_scriptable_java_object(NPP instance, 362 389 std::string class_id, 363 390 std::string instance_id, 364 391 bool isArray) 365 392 { 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; 372 397 373 398 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); 375 400 376 401 if (scriptable_object != NULL) … … 381 406 } 382 407 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); 401 410 402 411 // didn't work? try creating asynch … … 409 418 410 419 thread_data.parameters.push_back(instance); 411 thread_data.parameters.push_back( np_class);420 thread_data.parameters.push_back(&np_class); 412 421 thread_data.parameters.push_back(&scriptable_object); 413 422 … … 421 430 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); 422 431 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; 425 434 426 435 if (instance_id != "0") 427 ((IcedTeaScriptableJavaObject*) scriptable_object)->setInstanceIdentifier(instance_id);436 scriptable_object->instance_id = instance_id; 428 437 429 438 IcedTeaPluginUtilities::storeInstanceID(scriptable_object, instance); … … 456 465 } 457 466 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)); 467 bool 468 IcedTeaScriptableJavaObject::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)); 512 474 bool hasMethod = false; 513 475 514 476 // 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)) 520 482 return false; 521 483 … … 523 485 JavaRequestProcessor java_request = JavaRequestProcessor(); 524 486 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); 529 488 hasMethod = java_result->return_identifier != 0; 530 489 } … … 535 494 536 495 bool 537 IcedTeaScriptableJavaObject::invoke(NPObject *npobj, NPIdentifier name , const NPVariant *args,496 IcedTeaScriptableJavaObject::invoke(NPObject *npobj, NPIdentifier name_id, const NPVariant *args, 538 497 uint32_t argCount, NPVariant *result) 539 498 { 540 NPUTF8* method_name = browser_functions.utf8fromidentifier(name);499 std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id); 541 500 542 501 // 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()); 544 503 for (int i=0; i < argCount; i++) 545 504 { … … 550 509 JavaRequestProcessor java_request = JavaRequestProcessor(); 551 510 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; 557 515 558 516 NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj); … … 567 525 if (id == "-1") 568 526 { 569 printf("Unable to create arguments on Java side\n");527 PLUGIN_ERROR("Unable to create arguments on Java side\n"); 570 528 return false; 571 529 } … … 577 535 { 578 536 PLUGIN_DEBUG("Calling static method\n"); 579 callee = ((IcedTeaScriptableJavaObject*) npobj)->getClassID();580 537 java_result = java_request.callStaticMethod( 581 538 IcedTeaPluginUtilities::getSourceFromInstance(instance), 582 callee, browser_functions.utf8fromidentifier(name), arg_ids);539 scriptable_object->class_id, name, arg_ids); 583 540 } else 584 541 { 585 542 PLUGIN_DEBUG("Calling method normally\n"); 586 callee = ((IcedTeaScriptableJavaObject*) npobj)->getInstanceID();587 543 java_result = java_request.callMethod( 588 544 IcedTeaPluginUtilities::getSourceFromInstance(instance), 589 callee, browser_functions.utf8fromidentifier(name), arg_ids);545 scriptable_object->instance_id, name, arg_ids); 590 546 } 591 547 592 548 if (java_result->error_occurred) 593 549 { 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()); 598 551 return false; 599 552 } … … 604 557 605 558 bool 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)); 559 IcedTeaScriptableJavaObject::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)); 617 564 bool hasProperty = false; 618 565 566 IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*)npobj; 619 567 // 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") 624 571 hasProperty = true; 625 572 626 573 } else 627 574 { 628 629 if (!browser_functions.utf8fromidentifier(name)) 575 if (!browser_functions.identifierisstring(name_id)) 630 576 return false; 631 577 632 if ( !strcmp(browser_functions.utf8fromidentifier(name), "Packages"))578 if (name == "Packages") 633 579 { 634 580 hasProperty = true; … … 638 584 JavaRequestProcessor java_request = JavaRequestProcessor(); 639 585 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); 644 587 645 588 hasProperty = java_result->return_identifier != 0; … … 652 595 653 596 bool 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; 597 IcedTeaScriptableJavaObject::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 659 603 JavaResultData* java_result; 660 604 JavaRequestProcessor java_request = JavaRequestProcessor(); 661 605 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; 666 611 667 612 if (instance_id.length() > 0) // Could be an array or a simple object 668 613 { 669 614 // 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") 673 616 { 674 617 java_result = java_request.getArrayLength(instance_id); 675 } else if ( ((IcedTeaScriptableJavaObject*) npobj)->isArray()&&676 browser_functions.intfromidentifier(name ) >= 0) // else if array and requesting index618 } else if ( scriptable_object->is_object_array && 619 browser_functions.intfromidentifier(name_id) >= 0) // else if array and requesting index 677 620 { 678 621 … … 680 623 if (java_result->error_occurred) 681 624 { 682 printf("ERROR: Couldn't fetch array length\n");625 PLUGIN_ERROR("ERROR: Couldn't fetch array length\n"); 683 626 return false; 684 627 } … … 687 630 688 631 // Access beyond size? 689 if (browser_functions.intfromidentifier(name ) >= length)632 if (browser_functions.intfromidentifier(name_id) >= length) 690 633 { 691 634 VOID_TO_NPVARIANT(*result); … … 694 637 695 638 std::string index = std::string(); 696 IcedTeaPluginUtilities::itoa(browser_functions.intfromidentifier(name ), &index);639 IcedTeaPluginUtilities::itoa(browser_functions.intfromidentifier(name_id), &index); 697 640 java_result = java_request.getSlot(instance_id, index); 698 641 699 642 } else // Everything else 700 643 { 701 if (! browser_functions.utf8fromidentifier(name))644 if (!is_string_id) { 702 645 return false; 703 704 if (!strcmp(browser_functions.utf8fromidentifier(name), "Packages")) 646 } 647 648 if (name == "Packages") 705 649 { 706 NPObject* pkgObject = IcedTeaScriptable PluginObject::get_scriptable_java_package_object(instance, "");650 NPObject* pkgObject = IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object(instance, ""); 707 651 OBJECT_TO_NPVARIANT(pkgObject, *result); 708 652 return true; … … 711 655 java_result = java_request.getField( 712 656 IcedTeaPluginUtilities::getSourceFromInstance(instance), 713 class_id, instance_id, browser_functions.utf8fromidentifier(name));657 class_id, instance_id, name); 714 658 } 715 659 } 716 660 else 717 661 { 718 if (!browser_functions.utf8fromidentifier(name)) 719 return true; 662 if (!is_string_id) { 663 return false; 664 } 720 665 721 666 java_result = java_request.getStaticField( 722 667 IcedTeaPluginUtilities::getSourceFromInstance(instance), 723 class_id, browser_functions.utf8fromidentifier(name));668 class_id, name); 724 669 } 725 670 … … 734 679 735 680 bool 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)); 681 IcedTeaScriptableJavaObject::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)); 739 685 IcedTeaPluginUtilities::printNPVariant(*value); 740 686 741 bool isPropertyClass = false;742 687 JavaResultData* java_result; 743 688 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(); 748 693 749 694 NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj); … … 752 697 { 753 698 // 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") 757 700 { 758 printf("ERROR: Array length is not a modifiable property\n");701 PLUGIN_ERROR("ERROR: Array length is not a modifiable property\n"); 759 702 return false; 760 } else if ( ((IcedTeaScriptableJavaObject*) npobj)->isArray()&&761 browser_functions.intfromidentifier(name ) >= 0) // else if array and requesting index703 } else if ( scriptable_object->is_object_array && 704 browser_functions.intfromidentifier(name_id) >= 0) // else if array and requesting index 762 705 { 763 706 … … 765 708 if (java_result->error_occurred) 766 709 { 767 printf("ERROR: Couldn't fetch array length\n");710 PLUGIN_ERROR("ERROR: Couldn't fetch array length\n"); 768 711 return false; 769 712 } … … 772 715 773 716 // Access beyond size? 774 if (browser_functions.intfromidentifier(name ) >= length)717 if (browser_functions.intfromidentifier(name_id) >= length) 775 718 { 776 719 return true; … … 778 721 779 722 std::string index = std::string(); 780 IcedTeaPluginUtilities::itoa(browser_functions.intfromidentifier(name ), &index);723 IcedTeaPluginUtilities::itoa(browser_functions.intfromidentifier(name_id), &index); 781 724 782 725 std::string value_id = std::string(); … … 792 735 java_result = java_request.setField( 793 736 IcedTeaPluginUtilities::getSourceFromInstance(instance), 794 class_id, instance_id, browser_functions.utf8fromidentifier(name), value_id);737 class_id, instance_id, name, value_id); 795 738 } 796 739 } … … 802 745 java_result = java_request.setStaticField( 803 746 IcedTeaPluginUtilities::getSourceFromInstance(instance), 804 class_id, browser_functions.utf8fromidentifier(name), value_id);747 class_id, name, value_id); 805 748 } 806 749 … … 815 758 816 759 bool 817 IcedTeaScriptableJavaObject::removeProperty(NPObject *npobj, NPIdentifier name)818 {819 printf ("** Unimplemented: IcedTeaScriptableJavaObject::removeProperty %p\n", npobj);820 return false;821 }822 823 bool824 IcedTeaScriptableJavaObject::enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count)825 {826 printf ("** Unimplemented: IcedTeaScriptableJavaObject::enumerate %p\n", npobj);827 return false;828 }829 830 bool831 760 IcedTeaScriptableJavaObject::construct(NPObject *npobj, const NPVariant *args, uint32_t argCount, 832 761 NPVariant *result) 833 762 { 763 IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*)npobj; 834 764 // 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()); 836 766 for (int i=0; i < argCount; i++) 837 767 { … … 842 772 JavaRequestProcessor java_request = JavaRequestProcessor(); 843 773 844 NPObject* obj;845 std::string class_id = ((IcedTeaScriptableJavaObject*) npobj)->getClassID();846 774 NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj); 847 775 … … 854 782 if (id == "0") 855 783 { 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"); 861 785 return false; 862 786 } … … 867 791 java_result = java_request.newObject( 868 792 IcedTeaPluginUtilities::getSourceFromInstance(instance), 869 class_id,793 scriptable_object->class_id, 870 794 arg_ids); 871 795 872 796 if (java_result->error_occurred) 873 797 { 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()); 880 799 return false; 881 800 } 882 801 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( 888 806 IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj), 889 807 return_obj_class_id, return_obj_instance_id, false);
Note:
See TracChangeset
for help on using the changeset viewer.