18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is free software; you can redistribute it and/or
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  modify it under the terms of the GNU Lesser General Public
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License as published by the Free Software Foundation; either
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  version 2 of the License, or (at your option) any later version.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is distributed in the hope that it will be useful,
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Lesser General Public License for more details.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  You should have received a copy of the GNU Lesser General Public
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License along with this library; if not, write to the Free Software
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#ifndef qt_instance_h
215af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#define qt_instance_h
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2353733164eb6cabab5a1eddcabb42e4ce27eb0e44Ben Murdoch#include "BridgeJSC.h"
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "runtime_root.h"
251325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include <QtScript/qscriptengine.h>
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <qhash.h>
271325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include <qpointer.h>
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <qset.h>
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace Bindings {
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass QtClass;
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass QtField;
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass QtRuntimeMetaMethod;
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass QtInstance : public Instance {
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ~QtInstance();
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual Class* getClass() const;
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual RuntimeObject* newRuntimeObject(ExecState*);
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void begin();
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void end();
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual JSValue valueOf(ExecState*) const;
495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual JSValue defaultValue(ExecState*, PreferredPrimitiveType) const;
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    void markAggregate(MarkStack&);
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual JSValue getMethod(ExecState* exec, const Identifier& propertyName);
545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    virtual JSValue invokeMethod(ExecState*, RuntimeMethod*);
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void getPropertyNames(ExecState*, PropertyNameArray&);
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue stringValue(ExecState* exec) const;
595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue numberValue(ExecState* exec) const;
605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue booleanValue() const;
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QObject* getObject() const { return m_object; }
63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QObject* hashKey() const { return m_hashkey; }
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    static PassRefPtr<QtInstance> getQtInstance(QObject*, PassRefPtr<RootObject>, QScriptEngine::ValueOwnership ownership);
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual bool getOwnPropertySlot(JSObject*, ExecState*, const Identifier&, PropertySlot&);
685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void put(JSObject*, ExecState*, const Identifier&, JSValue, PutPropertySlot&);
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void removeCachedMethod(JSObject*);
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static QtInstance* getInstance(JSObject*);
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    static PassRefPtr<QtInstance> create(QObject *instance, PassRefPtr<RootObject> rootObject, QScriptEngine::ValueOwnership ownership)
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return adoptRef(new QtInstance(instance, rootObject, ownership));
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    friend class QtClass;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    friend class QtField;
828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    QtInstance(QObject*, PassRefPtr<RootObject>, QScriptEngine::ValueOwnership ownership); // Factory produced only..
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mutable QtClass* m_class;
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QPointer<QObject> m_object;
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QObject* m_hashkey;
862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    mutable QHash<QByteArray, WriteBarrier<JSObject> > m_methods;
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mutable QHash<QString, QtField*> m_fields;
882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    mutable WriteBarrier<QtRuntimeMetaMethod> m_defaultMethod;
898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    QScriptEngine::ValueOwnership m_ownership;
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace Bindings
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
97