00001 #include "projectfile.h"
00002 #include "../Data/project.h"
00003 #include <QMessageBox>
00004 #include "../Data/datadefinitions.h"
00005
00006 bool ProjectFile::readProject()
00007 {
00008 QDomDocument doc;
00009 QFile file(Project::path());
00010 qDebug()<<"after trying to open file: " << Project::path();
00011 if(!file.open(QIODevice::ReadOnly))
00012 {
00013 qDebug()<<"File's not readable";
00014 return false;
00015 }
00016
00017 QString errorMessage;
00018 int errorLine = 0;
00019 int errorColumn = 0;
00020 if(!doc.setContent(&file, true, &errorMessage, &errorLine, &errorColumn))
00021 {
00022 qDebug()<<"Couldn't read Xml files content";
00023 qDebug()<<"Message: " << errorMessage;
00024 qDebug()<<"Line: " << errorLine;
00025 qDebug()<<"Column: " << errorColumn;
00026 QMessageBox::critical(NULL, QObject::tr("Fehler"), QObject::tr("Das Projekt konnte aufgrund eines Fehlers beim Lesen nicht geöffnet werden!"));
00027 file.close();
00028 return false;
00029 }
00030 file.close();
00031
00032 QDomElement docElem = doc.documentElement();
00033
00034 QDomNode n = docElem.firstChild();
00035 while(!n.isNull())
00036 {
00037 QDomElement e = n.toElement();
00038 if(!e.isNull())
00039 {
00040 if(e.tagName() == "project")
00041 {
00042 if(!readProjectData(e.firstChild()))
00043 {
00044
00045 return false;
00046 }
00047 }
00048 else if(e.tagName() == "files")
00049 {
00050 readProjectFiles(e.firstChild());
00051 }
00052 else if(e.tagName() == "categories")
00053 {
00054 emit loadUserCategory(e);
00055 }
00056 else
00057 {
00058 qDebug()<<"What about me? :-(";
00059 }
00060 }
00061 n = n.nextSibling();
00062 }
00063 qDebug()<<"Finished reading xml file";
00064 return true;
00065 }
00066
00067 bool ProjectFile::readProjectData(QDomNode project)
00068 {
00069 while(!project.isNull())
00070 {
00071 QDomElement projectdata = project.toElement();
00072 if(projectdata.tagName() == "description")
00073 {
00074 Project::setDescription(projectdata.text());
00075 }
00076 else if(projectdata.tagName() == "highestFileID")
00077 {
00078 Project::setHighestFileID(projectdata.text().toInt());
00079 }
00080 else if(projectdata.tagName() == "ownerEmail")
00081 {
00082 Project::setOwnerEmail(projectdata.text());
00083 }
00084 else if(projectdata.tagName() == "ownerName")
00085 {
00086 Project::setOwnerName(projectdata.text());
00087 }
00088 else if(projectdata.tagName() == "title")
00089 {
00090 Project::setName(projectdata.text());
00091 }
00092 else if(projectdata.tagName() == "locked")
00093 {
00094 int locked = projectdata.text().toInt();
00095 if(locked == 1)
00096 {
00097 QMessageBox msgBox;
00098 msgBox.setIcon(QMessageBox::Critical);
00099 msgBox.setWindowTitle("Projekt bereits geöffnet!");
00100 msgBox.setText("Projekt bereits geöffnet!");
00101 msgBox.setInformativeText("Das Projekt ist bereits in einer anderen Allevo Instanz geöffnet oder wurde nicht ordnungsgemäß geschlossen (z.B. Programmabsturz). Sollte dies der Fall sein, dann bestätigen Sie mit Ja, um das Projekt trotzdem zu öffnen!");
00102 msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
00103 msgBox.setDefaultButton(QMessageBox::No);
00104 int ret = msgBox.exec();
00105 switch(ret)
00106 {
00107 case QMessageBox::Yes:
00108 Project::setLocked(false);
00109 break;
00110 case QMessageBox::No:
00111 Project::setLocked(true);
00112 return false;
00113 break;
00114 default:
00115 return false;
00116 break;
00117 }
00118 }
00119 else
00120 {
00121 Project::setLocked(locked);
00122 }
00123 }
00124 else if(projectdata.tagName() == "dateLastModification")
00125 {
00126 Project::setDateModified(QDateTime().fromString(projectdata.text(), "dd.MM.yyyy hh:mm:ss"));
00127 }
00128 else if(projectdata.tagName() == "dateCreation")
00129 {
00130 Project::setDateCreation(QDateTime().fromString(projectdata.text(), "dd.MM.yyyy hh:mm:ss"));
00131 }
00132 project = project.nextSibling();
00133 }
00134 return true;
00135 }
00136
00137 void ProjectFile::readProjectFiles(QDomNode files)
00138 {
00139 qDebug()<<"reading files";
00140 while(!files.isNull())
00141 {
00142 QDomElement file = files.toElement();
00143 if(file.tagName() == "file")
00144 {
00145 int fileid = file.attribute("fileid", "-1").toInt();
00146 QString type = file.attribute("type", "unknown");
00147 QString name = file.attribute("name", "unknown");
00148
00149 if(type == "costtype")
00150 {
00151 emit createCostTypeFile(fileid, name, files.toElement());
00152 }
00153 else if(type == "costcentre")
00154 {
00155 emit createCostCentreFile(fileid, name, files.toElement());
00156 }
00157 else if(type == "costunit")
00158 {
00159 emit createCostUnitFile(fileid, name, files.toElement());
00160 }
00161 }
00162 files = files.nextSibling();
00163 }
00164 }
00165
00166 void ProjectFile::readProjectCategories(QDomNode categories)
00167 {
00168 qDebug()<<"TODO: readprojectcategories";
00169 }
00170
00171 bool ProjectFile::writeProject(const QList<QDomElement> sheets, const QDomElement categories)
00172 {
00173 QDomDocument xml;
00174
00175 QDomElement root = xml.createElement(QCoreApplication::applicationName());
00176 root.setAttribute("program", QCoreApplication::organizationDomain());
00177 root.setAttribute("version", QCoreApplication::applicationVersion());
00178
00179 xml.appendChild(root);
00180 root.appendChild(Project::informationNode());
00181 root.appendChild(categories);
00182
00183 QDomElement files = xml.createElement("files");
00184 for(int i=0;i<sheets.size();i++)
00185 {
00186 files.appendChild(sheets.at(i));
00187 }
00188 root.appendChild(files);
00189
00190 QFile file(Project::path());
00191 if(!file.open(QIODevice::WriteOnly))
00192 {
00193 return false;
00194 }
00195
00196 QTextStream ts( &file );
00197 ts << xml.toString();
00198
00199 file.close();
00200 return true;
00201 }