#include "config.h"
#include "c_class.h"
#include "c_instance.h"
#include "c_runtime.h"
#include "npruntime_impl.h"
namespace KJS {
namespace Bindings {
CClass::CClass(NPClass* aClass)
{
_isa = aClass;
_methods = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &MethodDictionaryValueCallBacks);
_fields = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &FieldDictionaryValueCallBacks);
}
CClass::~CClass()
{
CFRelease(_methods);
CFRelease(_fields);
}
static CFMutableDictionaryRef classesByIsA = 0;
CClass* CClass::classForIsA(NPClass* isa)
{
if (!classesByIsA)
classesByIsA = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
CClass* aClass = (CClass*)CFDictionaryGetValue(classesByIsA, isa);
if (!aClass) {
aClass = new CClass(isa);
CFDictionaryAddValue(classesByIsA, isa, aClass);
}
return aClass;
}
const char* CClass::name() const
{
return "";
}
MethodList CClass::methodsNamed(const char* _name, Instance* instance) const
{
MethodList methodList;
CFStringRef methodName = CFStringCreateWithCString(NULL, _name, kCFStringEncodingASCII);
Method* method = (Method*)CFDictionaryGetValue(_methods, methodName);
if (method) {
CFRelease(methodName);
methodList.addMethod(method);
return methodList;
}
NPIdentifier ident = _NPN_GetStringIdentifier(_name);
const CInstance* inst = static_cast<const CInstance*>(instance);
NPObject* obj = inst->getObject();
if (_isa->hasMethod && _isa->hasMethod(obj, ident)){
Method* aMethod = new CMethod(ident); CFDictionaryAddValue(_methods, methodName, aMethod);
methodList.addMethod(aMethod);
}
CFRelease(methodName);
return methodList;
}
Field* CClass::fieldNamed(const char* name, Instance* instance) const
{
CFStringRef fieldName = CFStringCreateWithCString(NULL, name, kCFStringEncodingASCII);
Field* aField = (Field *)CFDictionaryGetValue(_fields, fieldName);
if (aField) {
CFRelease(fieldName);
return aField;
}
NPIdentifier ident = _NPN_GetStringIdentifier(name);
const CInstance* inst = static_cast<const CInstance*>(instance);
NPObject* obj = inst->getObject();
if (_isa->hasProperty && _isa->hasProperty(obj, ident)){
aField = new CField(ident); CFDictionaryAddValue(_fields, fieldName, aField);
}
CFRelease(fieldName);
return aField;
}
}
}