src/declarative/qml/qdeclarativedom.cpp
changeset 37 758a864f9613
parent 33 3e2da88830cd
equal deleted inserted replaced
36:ef0373b55136 37:758a864f9613
    40 ****************************************************************************/
    40 ****************************************************************************/
    41 
    41 
    42 #include "private/qdeclarativedom_p.h"
    42 #include "private/qdeclarativedom_p.h"
    43 #include "private/qdeclarativedom_p_p.h"
    43 #include "private/qdeclarativedom_p_p.h"
    44 
    44 
    45 #include "private/qdeclarativecompositetypedata_p.h"
       
    46 #include "private/qdeclarativecompiler_p.h"
    45 #include "private/qdeclarativecompiler_p.h"
    47 #include "private/qdeclarativeengine_p.h"
    46 #include "private/qdeclarativeengine_p.h"
    48 #include "private/qdeclarativescriptparser_p.h"
    47 #include "private/qdeclarativescriptparser_p.h"
    49 #include "private/qdeclarativeglobal_p.h"
    48 #include "private/qdeclarativeglobal_p.h"
    50 
    49 
   143 bool QDeclarativeDomDocument::load(QDeclarativeEngine *engine, const QByteArray &data, const QUrl &url)
   142 bool QDeclarativeDomDocument::load(QDeclarativeEngine *engine, const QByteArray &data, const QUrl &url)
   144 {
   143 {
   145     d->errors.clear();
   144     d->errors.clear();
   146     d->imports.clear();
   145     d->imports.clear();
   147 
   146 
   148     QDeclarativeCompiledData *component = new QDeclarativeCompiledData(engine);
   147     QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
   149     QDeclarativeCompiler compiler;
   148     QDeclarativeTypeData *td = ep->typeLoader.get(data, url, QDeclarativeTypeLoader::PreserveParser);
   150 
   149 
   151     QDeclarativeCompositeTypeData *td = ((QDeclarativeEnginePrivate *)QDeclarativeEnginePrivate::get(engine))->typeManager.getImmediate(data, url);
   150     if(td->isError()) {
   152 
   151         d->errors = td->errors();
   153     if(td->status == QDeclarativeCompositeTypeData::Error) {
       
   154         d->errors = td->errors;
       
   155         td->release();
   152         td->release();
   156         component->release();
       
   157         return false;
   153         return false;
   158     } else if(td->status == QDeclarativeCompositeTypeData::Waiting ||
   154     } else if(!td->isCompleteOrError()) {
   159               td->status == QDeclarativeCompositeTypeData::WaitingResources) {
       
   160         QDeclarativeError error;
   155         QDeclarativeError error;
   161         error.setDescription(QLatin1String("QDeclarativeDomDocument supports local types only"));
   156         error.setDescription(QLatin1String("QDeclarativeDomDocument supports local types only"));
   162         d->errors << error;
   157         d->errors << error;
   163         td->release();
   158         td->release();
   164         component->release();
       
   165         return false;
   159         return false;
   166     }
   160     }
   167 
   161 
   168     compiler.compile(engine, td, component);
   162     for (int i = 0; i < td->parser().imports().size(); ++i) {
   169 
   163         QDeclarativeScriptParser::Import parserImport = td->parser().imports().at(i);
   170     if (compiler.isError()) {
       
   171         d->errors = compiler.errors();
       
   172         td->release();
       
   173         component->release();
       
   174         return false;
       
   175     }
       
   176 
       
   177     for (int i = 0; i < td->data.imports().size(); ++i) {
       
   178         QDeclarativeScriptParser::Import parserImport = td->data.imports().at(i);
       
   179         QDeclarativeDomImport domImport;
   164         QDeclarativeDomImport domImport;
   180         domImport.d->type = static_cast<QDeclarativeDomImportPrivate::Type>(parserImport.type);
   165         domImport.d->type = static_cast<QDeclarativeDomImportPrivate::Type>(parserImport.type);
   181         domImport.d->uri = parserImport.uri;
   166         domImport.d->uri = parserImport.uri;
   182         domImport.d->qualifier = parserImport.qualifier;
   167         domImport.d->qualifier = parserImport.qualifier;
   183         domImport.d->version = parserImport.version;
   168         domImport.d->version = parserImport.version;
   184         d->imports += domImport;
   169         d->imports += domImport;
   185     }
   170     }
   186 
   171 
   187     if (td->data.tree()) {
   172     if (td->parser().tree()) {
   188         d->root = td->data.tree();
   173         d->root = td->parser().tree();
   189         d->root->addref();
   174         d->root->addref();
   190     }
   175     }
   191 
   176 
   192     component->release();
   177     td->release();
   193     return true;
   178     return true;
   194 }
   179 }
   195 
   180 
   196 /*!
   181 /*!
   197     Returns the last load errors.  The load errors will be reset after a
   182     Returns the last load errors.  The load errors will be reset after a