28
28
#if ENABLE(NETSCAPE_PLUGIN_API)
30
#include "IdentifierRep.h"
30
31
#include "npruntime_internal.h"
31
32
#include "npruntime_impl.h"
32
33
#include "npruntime_priv.h"
38
39
#include <wtf/HashMap.h>
40
41
using namespace JSC::Bindings;
42
typedef HashMap<RefPtr<JSC::UString::Rep>, PrivateIdentifier*> StringIdentifierMap;
44
static StringIdentifierMap* getStringIdentifierMap()
46
static StringIdentifierMap* stringIdentifierMap = 0;
47
if (!stringIdentifierMap)
48
stringIdentifierMap = new StringIdentifierMap;
49
return stringIdentifierMap;
52
typedef HashMap<int, PrivateIdentifier*> IntIdentifierMap;
54
static IntIdentifierMap* getIntIdentifierMap()
56
static IntIdentifierMap* intIdentifierMap = 0;
57
if (!intIdentifierMap)
58
intIdentifierMap = new IntIdentifierMap;
59
return intIdentifierMap;
42
using namespace WebCore;
62
44
NPIdentifier _NPN_GetStringIdentifier(const NPUTF8* name)
67
PrivateIdentifier* identifier = 0;
69
JSC::JSLock lock(false);
71
identifier = getStringIdentifierMap()->get(identifierFromNPIdentifier(name).ustring().rep());
72
if (identifier == 0) {
73
identifier = (PrivateIdentifier*)malloc(sizeof(PrivateIdentifier));
74
// We never release identifier names, so this dictionary will grow, as will
75
// the memory for the identifier name strings.
76
identifier->isString = true;
77
identifier->value.string = strdup(name);
79
getStringIdentifierMap()->set(identifierFromNPIdentifier(name).ustring().rep(), identifier);
81
return (NPIdentifier)identifier;
46
return static_cast<NPIdentifier>(IdentifierRep::get(name));
87
49
void _NPN_GetStringIdentifiers(const NPUTF8** names, int32_t nameCount, NPIdentifier* identifiers)
90
52
ASSERT(identifiers);
92
if (names && identifiers)
54
if (names && identifiers) {
93
55
for (int i = 0; i < nameCount; i++)
94
56
identifiers[i] = _NPN_GetStringIdentifier(names[i]);
97
60
NPIdentifier _NPN_GetIntIdentifier(int32_t intid)
99
PrivateIdentifier* identifier;
101
if (intid == 0 || intid == -1) {
102
static PrivateIdentifier* negativeOneAndZeroIdentifiers[2];
104
identifier = negativeOneAndZeroIdentifiers[intid + 1];
106
identifier = (PrivateIdentifier*)malloc(sizeof(PrivateIdentifier));
107
identifier->isString = false;
108
identifier->value.number = intid;
110
negativeOneAndZeroIdentifiers[intid + 1] = identifier;
113
identifier = getIntIdentifierMap()->get(intid);
115
identifier = (PrivateIdentifier*)malloc(sizeof(PrivateIdentifier));
116
// We never release identifier names, so this dictionary will grow.
117
identifier->isString = false;
118
identifier->value.number = intid;
120
getIntIdentifierMap()->set(intid, identifier);
123
return (NPIdentifier)identifier;
62
return static_cast<NPIdentifier>(IdentifierRep::get(intid));
126
65
bool _NPN_IdentifierIsString(NPIdentifier identifier)
128
PrivateIdentifier* i = (PrivateIdentifier*)identifier;
67
return static_cast<IdentifierRep*>(identifier)->isString();
132
70
NPUTF8 *_NPN_UTF8FromIdentifier(NPIdentifier identifier)
134
PrivateIdentifier* i = (PrivateIdentifier*)identifier;
135
if (!i->isString || !i->value.string)
138
return (NPUTF8 *)strdup(i->value.string);
72
const char* string = static_cast<IdentifierRep*>(identifier)->string();
76
return strdup(string);
141
79
int32_t _NPN_IntFromIdentifier(NPIdentifier identifier)
143
PrivateIdentifier* i = (PrivateIdentifier*)identifier;
146
return i->value.number;
81
return static_cast<IdentifierRep*>(identifier)->number();
149
84
void NPN_InitializeVariantWithStringCopy(NPVariant* variant, const NPString* value)
151
86
variant->type = NPVariantType_String;
152
87
variant->value.stringValue.UTF8Length = value->UTF8Length;
153
88
variant->value.stringValue.UTF8Characters = (NPUTF8 *)malloc(sizeof(NPUTF8) * value->UTF8Length);
89
if (!variant->value.stringValue.UTF8Characters)
154
91
memcpy((void*)variant->value.stringValue.UTF8Characters, value->UTF8Characters, sizeof(NPUTF8) * value->UTF8Length);