/****************************************************************************
**
** 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
