QString QDomDocumentTypeProto:: name() const { QDomDocumentType *item = qscriptvalue_cast<QDomDocumentType*>(thisObject()); if (item) return item->name(); return QString(); }
QString QDomDocumentTypeProto::toString() const { QDomDocumentType *item = qscriptvalue_cast<QDomDocumentType*>(thisObject()); if (item) return QString("[QDomDocumentType(type = %1, public = %2, system = %3)]") .arg(item->name()) .arg(item->publicId()) .arg(item->systemId()); return QString("[QDomDocumentType(unknown)]"); }
bool MainWindow2::openObject( QString strFilePath ) { QProgressDialog progress( tr("Opening document..."), tr("Abort"), 0, 100, this ); progress.setWindowModality( Qt::WindowModal ); progress.show(); editor->setCurrentLayer( 0 ); editor->layerManager()->setCurrentFrameIndex( 1 ); editor->fps = 12; m_pTimeLine->setFps( editor->fps ); m_pScribbleArea->setMyView( QMatrix() ); ObjectSaveLoader objectLoader( this ); Object* pObject = objectLoader.loadFromFile( strFilePath ); if ( pObject != NULL && objectLoader.error().code() == PCL_OK ) { SafeDelete( m_object ); m_object = pObject; pObject->setFilePath( strFilePath ); QSettings settings( "Pencil", "Pencil" ); settings.setValue( "lastFilePath", QVariant( pObject->filePath() ) ); editor->setObject( pObject ); editor->updateObject(); m_recentFileMenu->addRecentFile( pObject->filePath() ); m_recentFileMenu->saveToDisk(); qDebug() << "Current File Path=" << pObject->filePath(); setWindowTitle( pObject->filePath() ); } else { return false; } return true; //------------------- QString filePath = strFilePath; bool openingTheOLDWAY = true; QString realXMLFilePath = filePath; QString tmpFilePath; // ---- test before opening ---- QStringList zippedFileList = JlCompress::getFileList( filePath ); if ( !zippedFileList.empty() ) { qDebug() << "Recognized New zipped Pencil File Format !"; openingTheOLDWAY = false; // ---- now decompress PFF ----- QFileInfo fileInfo( filePath ); QDir dir( QDir::tempPath() ); tmpFilePath = QDir::tempPath() + "/" + fileInfo.completeBaseName() + PFF_TMP_DECOMPRESS_EXT; if ( fileInfo.exists() ) { dir.rmpath( tmpFilePath ); // --removes an old decompression directory removePFFTmpDirectory( tmpFilePath ); // --removes an old decompression directory - better approach } dir.mkpath( tmpFilePath ); // --creates a new decompression directory JlCompress::extractDir( filePath, tmpFilePath ); realXMLFilePath = tmpFilePath + "/" + PFF_XML_FILE_NAME; } else { qDebug() << "Recognized Old Pencil File Format !"; } QScopedPointer<QFile> file( new QFile( realXMLFilePath ) ); //QFile* file = new QFile(filePath); if ( !file->open( QFile::ReadOnly ) ) { if ( !openingTheOLDWAY ) { removePFFTmpDirectory( tmpFilePath ); // --removes temporary decompression directory } return false; } QDomDocument doc; if ( !doc.setContent( file.data() ) ) { if ( !openingTheOLDWAY ) { removePFFTmpDirectory( tmpFilePath ); // --removes temporary decompression directory } return false; // this is not a XML file } QDomDocumentType type = doc.doctype(); if ( type.name() != "PencilDocument" && type.name() != "MyObject" ) { if ( !openingTheOLDWAY ) { removePFFTmpDirectory( tmpFilePath ); // --removes temporary decompression directory } return false; // this is not a Pencil document } // delete old object @sent foreward -> if (ok) /*if (m_object != NULL) { m_object->deleteLater(); }*/ // ----------------------------- //QSettings settings("Pencil","Pencil"); //settings.setValue("lastFilePath", QVariant(object->strCurrentFilePath) ); QString dataLayersDir; if ( openingTheOLDWAY ) { dataLayersDir = filePath + "." + PFF_LAYERS_DIR; } else { dataLayersDir = tmpFilePath + "/" + PFF_LAYERS_DIR; } Object* newObject = new Object(); if ( !newObject->loadPalette( dataLayersDir ) ) { newObject->loadDefaultPalette(); } editor->setObject( newObject ); newObject->setFilePath( filePath ); // ------- reads the XML file ------- bool ok = true; int progVal = 0; QDomElement docElem = doc.documentElement(); if ( docElem.isNull() ) { return false; } if ( docElem.tagName() == "document" ) { qDebug( "Object Loader: start." ); qreal rProgressValue = 0; qreal rProgressDelta = 100 / docElem.childNodes().count(); QDomNode tag = docElem.firstChild(); while ( !tag.isNull() ) { QDomElement element = tag.toElement(); // try to convert the node to an element. if ( !element.isNull() ) { progVal = qMin( (int)rProgressValue, 100 ); progress.setValue( progVal ); rProgressValue += rProgressDelta; if ( element.tagName() == "editor" ) { qDebug( " Load editor" ); loadDomElement( element, filePath ); } else if ( element.tagName() == "object" ) { qDebug( " Load object" ); ok = newObject->loadDomElement( element, dataLayersDir ); qDebug() << " dataDir:" << dataLayersDir; } } tag = tag.nextSibling(); } } else { if ( docElem.tagName() == "object" || docElem.tagName() == "MyOject" ) // old Pencil format (<=0.4.3) { ok = newObject->loadDomElement( docElem, filePath ); } } // ------------------------------ if ( ok ) { editor->updateObject(); if ( !openingTheOLDWAY ) { removePFFTmpDirectory( tmpFilePath ); // --removes temporary decompression directory } m_recentFileMenu->addRecentFile( filePath ); m_recentFileMenu->saveToDisk(); //qDebug() << "Current File Path=" << newObject->strCurrentFilePath; setWindowTitle( newObject->filePath() ); // FIXME: need to free the old object. but delete object will crash app, don't know why. // fixed by shoshon... don't know if it's right Object* objectToDelete = m_object; m_object = newObject; if ( objectToDelete != NULL ) { delete objectToDelete; } } progress.setValue( 100 ); return true; }
bool MainWindow2::openObject(QString filePath) { // ---- test before opening ---- QScopedPointer<QFile> file(new QFile(filePath)); //QFile* file = new QFile(filePath); if (!file->open(QFile::ReadOnly)) { return false; } QDomDocument doc; if (!doc.setContent(file.data())) { return false; // this is not a XML file } QDomDocumentType type = doc.doctype(); if (type.name() != "PencilDocument" && type.name() != "MyObject") { return false; // this is not a Pencil document } // delete old object if (m_object != NULL) { m_object->deleteLater(); } // ----------------------------- QProgressDialog progress("Opening document...", "Abort", 0, 100, this); progress.setWindowModality(Qt::WindowModal); progress.show(); //QSettings settings("Pencil","Pencil"); //settings.setValue("lastFilePath", QVariant(object->strCurrentFilePath) ); Object* newObject = new Object(); if (!newObject->loadPalette(filePath+".data")) { newObject->loadDefaultPalette(); } editor->setObject(newObject); newObject->strCurrentFilePath = filePath; // ------- reads the XML file ------- bool ok = true; int prog = 0; QDomElement docElem = doc.documentElement(); if (docElem.isNull()) { return false; } if (docElem.tagName() == "document") { qDebug("Object Loader: start."); QDomNode tag = docElem.firstChild(); while (!tag.isNull()) { QDomElement element = tag.toElement(); // try to convert the node to an element. if (!element.isNull()) { prog += std::min(prog + 10, 100); progress.setValue(prog); if (element.tagName() == "editor") { qDebug(" Load editor"); loadDomElement(element, filePath); } else if (element.tagName() == "object") { qDebug(" Load object"); ok = newObject->loadDomElement(element, filePath); qDebug() << " filePath:" << filePath; } } tag = tag.nextSibling(); } } else { if (docElem.tagName() == "object" || docElem.tagName() == "MyOject") // old Pencil format (<=0.4.3) { ok = newObject->loadDomElement(docElem, filePath); } } // ------------------------------ if (ok) { editor->updateObject(); qDebug() << "Current File Path=" << newObject->strCurrentFilePath; setWindowTitle(newObject->strCurrentFilePath); // FIXME: need to free the old object. but delete object will crash app, don't know why. m_object = newObject; } progress.setValue(100); return ok; }
Object* FileManager::load( QString strFileName ) { if ( !QFile::exists( strFileName ) ) { qCDebug( mLog ) << "ERROR - File doesn't exist."; return cleanUpWithErrorCode( Status::FILE_NOT_FOUND ); } emit progressUpdated( 0.f ); Object* obj = new Object; obj->setFilePath( strFileName ); obj->createWorkingDir(); QString strMainXMLFile; QString strDataFolder; // Test file format: new zipped .pclx or old .pcl? bool oldFormat = isOldForamt( strFileName ); if ( oldFormat ) { qCDebug( mLog ) << "Recognized Old Pencil File Format (*.pcl) !"; strMainXMLFile = strFileName; strDataFolder = strMainXMLFile + "." + PFF_OLD_DATA_DIR; } else { qCDebug( mLog ) << "Recognized New zipped Pencil File Format (*.pclx) !"; unzip( strFileName, obj->workingDir() ); strMainXMLFile = QDir( obj->workingDir() ).filePath( PFF_XML_FILE_NAME ); strDataFolder = QDir( obj->workingDir() ).filePath( PFF_DATA_DIR ); } qDebug() << "XML=" << strMainXMLFile; qDebug() << "Data Folder=" << strDataFolder; qDebug() << "Working Folder=" << obj->workingDir(); obj->setDataDir( strDataFolder ); obj->setMainXMLFile( strMainXMLFile ); QFile file( strMainXMLFile ); if ( !file.open( QFile::ReadOnly ) ) { return cleanUpWithErrorCode( Status::ERROR_FILE_CANNOT_OPEN ); } qCDebug( mLog ) << "Checking main XML file..."; QDomDocument xmlDoc; if ( !xmlDoc.setContent( &file ) ) { return cleanUpWithErrorCode( Status::ERROR_INVALID_XML_FILE ); } QDomDocumentType type = xmlDoc.doctype(); if ( !( type.name() == "PencilDocument" || type.name() == "MyObject" ) ) { return cleanUpWithErrorCode( Status::ERROR_INVALID_PENCIL_FILE ); } QDomElement root = xmlDoc.documentElement(); if ( root.isNull() ) { return cleanUpWithErrorCode( Status::ERROR_INVALID_PENCIL_FILE ); } // Create object. qCDebug( mLog ) << "Start to load object.."; loadPalette( obj ); bool ok = true; if ( root.tagName() == "document" ) { ok = loadObject( obj, root ); } else if ( root.tagName() == "object" || root.tagName() == "MyOject" ) // old Pencil format (<=0.4.3) { ok = loadObjectOldWay( obj, root ); } if ( !ok ) { delete obj; return cleanUpWithErrorCode( Status::ERROR_INVALID_PENCIL_FILE ); } verifyObject( obj ); return obj; }
Object* ObjectSaveLoader::loadFromFile( QString strFilename ) { // ---- test before opening ---- if ( !isFileExists( strFilename ) ) { m_error = PencilError( PCL_ERROR_FILE_NOT_EXIST ); return NULL; } QString strMainXMLFilePath = strFilename; QStringList zippedFileList = JlCompress::getFileList( strFilename ); // -- Test file format: new zipped pclx or old pcl ? bool bIsOldPencilFile = zippedFileList.empty(); if ( !bIsOldPencilFile ) { strMainXMLFilePath = extractZipToTempFolder( strFilename ); qDebug() << "Recognized New zipped Pencil File Format !"; } else { qDebug() << "Recognized Old Pencil File Format !"; } // -- test before opening QScopedPointer<QFile> file( new QFile( strMainXMLFilePath ) ); if ( !file->open( QFile::ReadOnly ) ) { //m_strLastErrorMessage = tr("Cannot open file."); m_error = PencilError( PCL_ERROR_FILE_CANNOT_OPEN ); cleanUpTempFolder(); return NULL; } QDomDocument xmlDoc; if ( !xmlDoc.setContent( file.data() ) ) { //m_strLastErrorMessage = tr("This file is not a valid XML document."); m_error = PencilError( PCL_ERROR_INVALID_XML_FILE ); cleanUpTempFolder(); return NULL; } QDomDocumentType type = xmlDoc.doctype(); if ( type.name() != "PencilDocument" && type.name() != "MyObject" ) { //m_strLastErrorMessage = tr("This file is not a Pencil2D document."); m_error = PencilError( PCL_ERROR_INVALID_PENCIL_FILE ); cleanUpTempFolder(); return NULL; // this is not a Pencil document } Object* pObject = new Object(); QString strDataLayersDirPath; if ( bIsOldPencilFile ) { // ex. aaa.pcl => aaa.pcl.data strDataLayersDirPath = strMainXMLFilePath + "." + PFF_LAYERS_DIR; } else { QDir workingDir = QFileInfo( strMainXMLFilePath ).dir(); // get the parent folder workingDir.cd( PFF_LAYERS_DIR ); strDataLayersDirPath = workingDir.absolutePath(); } Object* newObject = pObject; if ( !newObject->loadPalette( strDataLayersDirPath ) ) { newObject->loadDefaultPalette(); } // ------- reads the XML file ------- bool ok = true; int prog = 0; QDomElement docElem = xmlDoc.documentElement(); if ( docElem.isNull() ) { return NULL; } if ( docElem.tagName() == "document" ) { qDebug( "Object Loader: start." ); QDomNode tag = docElem.firstChild(); while ( !tag.isNull() ) { QDomElement element = tag.toElement(); // try to convert the node to an element. if ( !element.isNull() ) { prog += std::min( prog + 10, 100 ); //progress.setValue(prog); emit progressValueChanged( prog ); if ( element.tagName() == "editor" ) { qDebug( " Load editor" ); //loadDomElement( element ); } else if ( element.tagName() == "object" ) { qDebug( " Load object" ); ok = newObject->loadDomElement( element, strDataLayersDirPath ); qDebug() << " dataDir:" << strDataLayersDirPath; } } tag = tag.nextSibling(); } } else { if ( docElem.tagName() == "object" || docElem.tagName() == "MyOject" ) // old Pencil format (<=0.4.3) { ok = newObject->loadDomElement( docElem, strFilename ); } } if ( ok ) { /* if (!openingTheOLDWAY) { removePFFTmpDirectory( tmpFilePath ); // --removes temporary decompression directory } */ } else { return NULL; } return pObject; }