/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the QtDeclarative module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef QDECLARATIVEEXPRESSION_P_H
#define QDECLARATIVEEXPRESSION_P_H

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists purely as an
// implementation detail.  This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//

#include "qdeclarativeexpression.h"

#include "private/qdeclarativeengine_p.h"
#include "private/qdeclarativeguard_p.h"

#include <QtScript/qscriptvalue.h>

QT_BEGIN_NAMESPACE

class QDeclarativeAbstractExpression
{
public:
    QDeclarativeAbstractExpression();
    virtual ~QDeclarativeAbstractExpression();

    bool isValid() const;

    QDeclarativeContextData *context() const;
    void setContext(QDeclarativeContextData *);

    virtual void refresh();

private:
    friend class QDeclarativeContext;
    friend class QDeclarativeContextData;
    friend class QDeclarativeContextPrivate;
    QDeclarativeContextData *m_context;
    QDeclarativeAbstractExpression **m_prevExpression;
    QDeclarativeAbstractExpression  *m_nextExpression;
};

class QDeclarativeDelayedError 
{
public:
    inline QDeclarativeDelayedError() : nextError(0), prevError(0) {}
    inline ~QDeclarativeDelayedError() { removeError(); }

    QDeclarativeError error;

    bool addError(QDeclarativeEnginePrivate *);

    inline void removeError() {
        if (!prevError) return;
        if (nextError) nextError->prevError = prevError;
        *prevError = nextError;
        nextError = 0;
        prevError = 0;
    }

private:
    QDeclarativeDelayedError  *nextError;
    QDeclarativeDelayedError **prevError;
};

class QDeclarativeQtScriptExpression : public QDeclarativeAbstractExpression, 
                                       public QDeclarativeDelayedError
{
public:
    enum Mode { SharedContext, ExplicitContext };

    enum EvaluateFlag { RequiresThisObject = 0x01 };
    Q_DECLARE_FLAGS(EvaluateFlags, EvaluateFlag)

    QDeclarativeQtScriptExpression();
    virtual ~QDeclarativeQtScriptExpression();

    QDeclarativeRefCount *dataRef;

    QString expression;

    Mode expressionFunctionMode;
    QScriptValue expressionFunction;

    QScriptValue expressionContext; // Only used in ExplicitContext
    QObject *scopeObject;           // Only used in SharedContext

    bool notifyOnValueChange() const;
    void setNotifyOnValueChange(bool);
    void resetNotifyOnChange();
    void setNotifyObject(QObject *, int );

    void setEvaluateFlags(EvaluateFlags flags);
    EvaluateFlags evaluateFlags() const;

    QScriptValue scriptValue(QObject *secondaryScope, bool *isUndefined);

    class DeleteWatcher {
    public:
        inline DeleteWatcher(QDeclarativeQtScriptExpression *data);
        inline ~DeleteWatcher();
        inline bool wasDeleted() const;
    private:
        bool *m_wasDeleted;
        bool m_wasDeletedStorage;
        QDeclarativeQtScriptExpression *m_d;
    };

private:
    void clearGuards();
    QScriptValue eval(QObject *secondaryScope, bool *isUndefined);
    void updateGuards(const QPODVector<QDeclarativeEnginePrivate::CapturedProperty> &properties);

    bool trackChange;

    QDeclarativeNotifierEndpoint *guardList;
    int guardListLength;

    QObject *guardObject;
    int guardObjectNotifyIndex;
    bool *deleted;

    EvaluateFlags evalFlags;
};

Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativeQtScriptExpression::EvaluateFlags)


class QDeclarativeExpression;
class QString;
class QDeclarativeExpressionPrivate : public QObjectPrivate, public QDeclarativeQtScriptExpression
{
    Q_DECLARE_PUBLIC(QDeclarativeExpression)
public:
    QDeclarativeExpressionPrivate();
    ~QDeclarativeExpressionPrivate();

    void init(QDeclarativeContextData *, const QString &, QObject *);
    void init(QDeclarativeContextData *, const QScriptValue &, QObject *);
    void init(QDeclarativeContextData *, void *, QDeclarativeRefCount *, QObject *, const QString &, int);

    QVariant value(QObject *secondaryScope = 0, bool *isUndefined = 0);
    QScriptValue scriptValue(QObject *secondaryScope = 0, bool *isUndefined = 0);

    static QDeclarativeExpressionPrivate *get(QDeclarativeExpression *expr) {
        return static_cast<QDeclarativeExpressionPrivate *>(QObjectPrivate::get(expr));
    }
    static QDeclarativeExpression *get(QDeclarativeExpressionPrivate *expr) {
        return expr->q_func();
    }

    void _q_notify();
    virtual void emitValueChanged();

    static void exceptionToError(QScriptEngine *, QDeclarativeError &);
    static QScriptValue evalInObjectScope(QDeclarativeContextData *, QObject *, const QString &, const QString &,
                                          int, QScriptValue *);
    static QScriptValue evalInObjectScope(QDeclarativeContextData *, QObject *, const QScriptProgram &, 
                                          QScriptValue *);

    bool expressionFunctionValid:1;

    QString url; // This is a QString for a reason.  QUrls are slooooooow...
    int line;
    QByteArray name; //function name, hint for the debugger
};

QDeclarativeQtScriptExpression::DeleteWatcher::DeleteWatcher(QDeclarativeQtScriptExpression *data)
: m_wasDeletedStorage(false), m_d(data) 
{
    if (!m_d->deleted) 
        m_d->deleted = &m_wasDeletedStorage; 
    m_wasDeleted = m_d->deleted;
}

QDeclarativeQtScriptExpression::DeleteWatcher::~DeleteWatcher() 
{
    if (false == *m_wasDeleted && m_wasDeleted == m_d->deleted)
        m_d->deleted = 0;
}

bool QDeclarativeQtScriptExpression::DeleteWatcher::wasDeleted() const 
{ 
    return *m_wasDeleted; 
}

QT_END_NAMESPACE

#endif // QDECLARATIVEEXPRESSION_P_H
