void BufferManager::dropBuffer(Buffer* buffer) { if (_log->isDebug()) _log->debug(2, "dropBuffer(buffer: fileName %s)", buffer->fileName().c_str()); // Removes the file if the buffermanager does not have more buffers of the same file std::map<std::string, int*>::iterator it = _buffersByLog->find(buffer->fileName()); // If the file counter is zero it means there're no references to it and should be // deleted from disk (pe. commit), if the file is not referenced this will mean the // buffer comes from other buffermanager and should be removed. bool dropFile = false; if (it != _buffersByLog->end()) { int* count = it->second; if (*count <= 0) { dropFile = true; delete count; _buffersByLog->erase(it); } } else { dropFile = true; } if (dropFile) { std::string file = buffer->fileName(); std::string datadir = getSetting("DATA_DIR"); char* fullFilePath = combinePath(datadir.c_str(), file.c_str()); if (_log->isDebug()) _log->debug(2, "removing the log file: %s", fullFilePath); if (existFile(fullFilePath)) { if (!removeFile(fullFilePath)) { _log->error("An error ocurred removing the file: %s. Error Number: %d, Error description: %s", fullFilePath, errno, strerror(errno)); } } free(fullFilePath); } delete buffer; }
int main(int argc, char** arg) { _controller = new DBController(); char currentDir[256]; memset(currentDir, 0, 256); getcwd(currentDir, 256); printf("%s\n", currentDir); char* datadir = combinePath(currentDir, "datadir/"); boost::filesystem::remove_all(datadir); makeDir(datadir); setSetting("DATA_DIR", std::string(datadir)); _controller->initialize(datadir); /* testTransactionSimplest(); testTransaction(); testTransactionSimpleCommit(); testTransactionCommit(); testTransactionRollback(); testTransactionManager(); testTransactionMergedData(); */ _controller->shutdown(); free(datadir); return 0; }
void BufferManager::initialize(const char* file) { std::string controlFileName = std::string(file) + ".trc"; char* fullcontrolFileName = combinePath(_dataDir.c_str(), controlFileName.c_str()); std::string fileName = std::string(file); char* fullLogFileName = combinePath(_dataDir.c_str(), fileName.c_str()); _logFileName = strcpy(const_cast<char*>(fileName.c_str()), fileName.length()); bool existControl = existFile(fullcontrolFileName); char* flags; if (existControl) { flags = "rb+"; } else { flags = "wb+"; } _controlFile = (InputOutputStream*)new FileInputOutputStream(fullcontrolFileName, flags); if (_log->isDebug()) _log->debug(3, "_controlFile->acquireLock();"); _controlFile->acquireLock(); _controlFile->seek(0); bool existLogFile = existFile(fullLogFileName); if (existLogFile) { flags = "rb+"; } else { flags = "wb+"; } if (existControl) { _buffersSize = _controlFile->readLong(); loadBuffers(); } else { _controlFile->writeLong(_buffersSize); __int64 pos = _controlFile->currentPos(); _controlFile->writeInt(0); _controlFile->seek(pos); loadBuffers(); } if (_log->isDebug()) _log->debug(3, "_controlFile->releaseLock();"); _controlFile->releaseLock(); free(fullcontrolFileName); free(fullLogFileName); }
Buffer::Buffer(const BufferManager* manager, const char* file, __int64 offset, __int64 bufferLen, __int64 maxLen) { std::string path = getSetting("DATA_DIR"); char* fileName = combinePath(path.c_str(), file); _stream = new MMapInputOutputStream(fileName, offset, maxLen); _startOffset = offset; _bufferLength = bufferLen; _maxLength = maxLen; _currentPos = 0; _stream->seek(0); _lock = new Lock(); _fileName = new std::string(file); free(fileName); };
/*! Creates an implementation (cpp-file) for the form given in \a e. \sa createFormDecl(), createObjectImpl() */ void Ui3Reader::createFormImpl(const QDomElement &e) { QDomElement n; QDomNodeList nl; int i; QString objClass = getClassName(e); if (objClass.isEmpty()) return; QString objName = getObjectName(e); // generate local and local includes required QStringList globalIncludes, localIncludes; QStringList::Iterator it; QMap<QString, CustomInclude> customWidgetIncludes; // find additional slots and functions QStringList extraFuncts; QStringList extraFunctTyp; QStringList extraFunctSpecifier; nl = e.parentNode().toElement().elementsByTagName(QLatin1String("slot")); for (i = 0; i < (int) nl.length(); i++) { n = nl.item(i).toElement(); if (n.parentNode().toElement().tagName() != QLatin1String("slots") && n.parentNode().toElement().tagName() != QLatin1String("connections")) continue; if (n.attribute(QLatin1String("language"), QLatin1String("C++")) != QLatin1String("C++")) continue; QString functionName = n.firstChild().toText().data().trimmed(); if (functionName.endsWith(QLatin1Char(';'))) functionName.chop(1); extraFuncts += functionName; extraFunctTyp += n.attribute(QLatin1String("returnType"), QLatin1String("void")); extraFunctSpecifier += n.attribute(QLatin1String("specifier"), QLatin1String("virtual")); } nl = e.parentNode().toElement().elementsByTagName(QLatin1String("function")); for (i = 0; i < (int) nl.length(); i++) { n = nl.item(i).toElement(); if (n.parentNode().toElement().tagName() != QLatin1String("functions")) continue; if (n.attribute(QLatin1String("language"), QLatin1String("C++")) != QLatin1String("C++")) continue; QString functionName = n.firstChild().toText().data().trimmed(); if (functionName.endsWith(QLatin1Char(';'))) functionName.chop(1); extraFuncts += functionName; extraFunctTyp += n.attribute(QLatin1String("returnType"), QLatin1String("void")); extraFunctSpecifier += n.attribute(QLatin1String("specifier"), QLatin1String("virtual")); } // additional includes (local or global) and forward declaractions nl = e.parentNode().toElement().elementsByTagName(QLatin1String("include")); for (i = 0; i < (int) nl.length(); i++) { QDomElement n2 = nl.item(i).toElement(); QString s = n2.firstChild().toText().data(); if (n2.attribute(QLatin1String("location")) != QLatin1String("local")) { if (s.right(5) == QLatin1String(".ui.h") && !QFile::exists(s)) continue; if (n2.attribute(QLatin1String("impldecl"), QLatin1String("in implementation")) != QLatin1String("in implementation")) continue; globalIncludes += s; } } registerDatabases(e); dbConnections = unique(dbConnections); bool dbForm = false; if (dbForms[QLatin1String("(default)")].count()) dbForm = true; bool subDbForms = false; for (it = dbConnections.begin(); it != dbConnections.end(); ++it) { if (!(*it).isEmpty() && (*it) != QLatin1String("(default)")) { if (dbForms[(*it)].count()) { subDbForms = true; break; } } } // do the local includes afterwards, since global includes have priority on clashes for (i = 0; i < (int) nl.length(); i++) { QDomElement n2 = nl.item(i).toElement(); QString s = n2.firstChild().toText().data(); if (n2.attribute(QLatin1String("location")) == QLatin1String("local") && !globalIncludes.contains(s)) { if (s.right(5) == QLatin1String(".ui.h") && !QFile::exists(s)) continue; if (n2.attribute(QLatin1String("impldecl"), QLatin1String("in implementation")) != QLatin1String("in implementation")) continue; localIncludes += s; } } // additional custom widget headers nl = e.parentNode().toElement().elementsByTagName(QLatin1String("header")); for (i = 0; i < (int) nl.length(); i++) { QDomElement n2 = nl.item(i).toElement(); QString s = n2.firstChild().toText().data(); if (n2.attribute(QLatin1String("location")) != QLatin1String("local")) globalIncludes += s; else localIncludes += s; } out << "#include <qvariant.h>" << endl; // first for gcc 2.7.2 globalIncludes = unique(globalIncludes); for (it = globalIncludes.begin(); it != globalIncludes.end(); ++it) { if (!(*it).isEmpty()) out << "#include <" << fixHeaderName(*it) << '>' << endl; } if (externPixmaps) { out << "#include <qimage.h>" << endl; out << "#include <qpixmap.h>" << endl << endl; } /* Put local includes after all global includes */ localIncludes = unique(localIncludes); for (it = localIncludes.begin(); it != localIncludes.end(); ++it) { if (!(*it).isEmpty() && *it != QFileInfo(fileName + QLatin1String(".h")).fileName()) out << "#include \"" << fixHeaderName(*it) << '\"' << endl; } QString uiDotH = fileName + QLatin1String(".h"); if (QFile::exists(uiDotH)) { if (!outputFileName.isEmpty()) uiDotH = QString::fromUtf8(combinePath(uiDotH.ascii(), outputFileName.ascii())); out << "#include \"" << uiDotH << '\"' << endl; writeFunctImpl = false; } // register the object and unify its name objName = registerObject(objName); if (externPixmaps) { pixmapLoaderFunction = QLatin1String("QPixmap::fromMimeSource"); } // constructor if (objClass == QLatin1String("QDialog") || objClass == QLatin1String("QWizard")) { out << "/*" << endl; out << " * Constructs a " << nameOfClass << " as a child of 'parent', with the" << endl; out << " * name 'name' and widget flags set to 'f'." << endl; out << " *" << endl; out << " * The " << objClass.mid(1).toLower() << " will by default be modeless, unless you set 'modal' to" << endl; out << " * true to construct a modal " << objClass.mid(1).toLower() << '.' << endl; out << " */" << endl; out << nameOfClass << "::" << bareNameOfClass << "(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl)" << endl; out << " : " << objClass << "(parent, name, modal, fl)"; } else if (objClass == QLatin1String("QWidget")) { out << "/*" << endl; out << " * Constructs a " << nameOfClass << " as a child of 'parent', with the" << endl; out << " * name 'name' and widget flags set to 'f'." << endl; out << " */" << endl; out << nameOfClass << "::" << bareNameOfClass << "(QWidget* parent, const char* name, Qt::WindowFlags fl)" << endl; out << " : " << objClass << "(parent, name, fl)"; } else if (objClass == QLatin1String("QMainWindow") || objClass == QLatin1String("Q3MainWindow")) { out << "/*" << endl; out << " * Constructs a " << nameOfClass << " as a child of 'parent', with the" << endl; out << " * name 'name' and widget flags set to 'f'." << endl; out << " *" << endl; out << " */" << endl; out << nameOfClass << "::" << bareNameOfClass << "(QWidget* parent, const char* name, Qt::WindowFlags fl)" << endl; out << " : " << objClass << "(parent, name, fl)"; isMainWindow = true; } else { out << "/*" << endl; out << " * Constructs a " << nameOfClass << " which is a child of 'parent', with the" << endl; out << " * name 'name'.' " << endl; out << " */" << endl; out << nameOfClass << "::" << bareNameOfClass << "(QWidget* parent, const char* name)" << endl; out << " : " << objClass << "(parent, name)"; } out << endl; out << '{' << endl; // // setup the gui // out << indent << "setupUi(this);" << endl << endl; if (isMainWindow) out << indent << "(void)statusBar();" << endl; // database support dbConnections = unique(dbConnections); if (dbConnections.count()) out << endl; for (it = dbConnections.begin(); it != dbConnections.end(); ++it) { if (!(*it).isEmpty() && (*it) != QLatin1String("(default)")) { out << indent << (*it) << "Connection = QSqlDatabase::database(\"" <<(*it) << "\");" << endl; } } nl = e.parentNode().toElement().elementsByTagName(QLatin1String("widget")); for (i = 1; i < (int) nl.length(); i++) { // start at 1, 0 is the toplevel widget n = nl.item(i).toElement(); QString s = getClassName(n); if ((dbForm || subDbForms) && (s == QLatin1String("QDataBrowser") || s == QLatin1String("QDataView"))) { QString objName = getObjectName(n); QString tab = getDatabaseInfo(n, QLatin1String("table")); QString con = getDatabaseInfo(n, QLatin1String("connection")); out << indent << "QSqlForm* " << objName << "Form = new QSqlForm(this);" << endl; out << indent << objName << "Form->setObjectName(\"" << objName << "Form\");" << endl; QDomElement n2; for (n2 = n.firstChild().toElement(); !n2.isNull(); n2 = n2.nextSibling().toElement()) createFormImpl(n2, objName, con, tab); out << indent << objName << "->setForm(" << objName << "Form);" << endl; } } if (extraFuncts.contains(QLatin1String("init()"))) out << indent << "init();" << endl; // end of constructor out << '}' << endl; out << endl; // destructor out << "/*" << endl; out << " * Destroys the object and frees any allocated resources" << endl; out << " */" << endl; out << nameOfClass << "::~" << bareNameOfClass << "()" << endl; out << '{' << endl; if (extraFuncts.contains(QLatin1String("destroy()"))) out << indent << "destroy();" << endl; out << indent << "// no need to delete child widgets, Qt does it all for us" << endl; out << '}' << endl; out << endl; // handle application events if required bool needFontEventHandler = false; bool needSqlTableEventHandler = false; bool needSqlDataBrowserEventHandler = false; nl = e.elementsByTagName(QLatin1String("widget")); for (i = 0; i < (int) nl.length(); i++) { if (!DomTool::propertiesOfType(nl.item(i).toElement() , QLatin1String("font")).isEmpty()) needFontEventHandler = true; QString s = getClassName(nl.item(i).toElement()); if (s == QLatin1String("QDataTable") || s == QLatin1String("QDataBrowser")) { if (!isFrameworkCodeGenerated(nl.item(i).toElement())) continue; if (s == QLatin1String("QDataTable")) needSqlTableEventHandler = true; if (s == QLatin1String("QDataBrowser")) needSqlDataBrowserEventHandler = true; } if (needFontEventHandler && needSqlTableEventHandler && needSqlDataBrowserEventHandler) break; } out << "/*" << endl; out << " * Sets the strings of the subwidgets using the current" << endl; out << " * language." << endl; out << " */" << endl; out << "void " << nameOfClass << "::languageChange()" << endl; out << '{' << endl; out << " retranslateUi(this);" << endl; out << '}' << endl; out << endl; // create stubs for additional slots if necessary if (!extraFuncts.isEmpty() && writeFunctImpl) { it = extraFuncts.begin(); QStringList::Iterator it2 = extraFunctTyp.begin(); QStringList::Iterator it3 = extraFunctSpecifier.begin(); while (it != extraFuncts.end()) { QString type = fixDeclaration(*it2); if (type.isEmpty()) type = QLatin1String("void"); type = type.simplified(); QString fname = fixDeclaration(Parser::cleanArgs(*it)); if (!(*it3).startsWith(QLatin1String("pure"))) { // "pure virtual" or "pureVirtual" out << type << ' ' << nameOfClass << "::" << fname << endl; out << '{' << endl; if (*it != QLatin1String("init()") && *it != QLatin1String("destroy()")) { QRegExp numeric(QLatin1String("^(?:signed|unsigned|u?char|u?short|u?int" "|u?long|Q_U?INT(?:8|16|32)|Q_U?LONG|float" "|double)$")); QString retVal; /* We return some kind of dummy value to shut the compiler up. 1. If the type is 'void', we return nothing. 2. If the type is 'bool', we return 'false'. 3. If the type is 'unsigned long' or 'quint16' or 'double' or similar, we return '0'. 4. If the type is 'Foo *', we return '0'. 5. If the type is 'Foo &', we create a static variable of type 'Foo' and return it. 6. If the type is 'Foo', we assume there's a default constructor and use it. */ if (type != QLatin1String("void")) { QStringList toks = type.split(QLatin1String(" ")); bool isBasicNumericType = (toks.filter(numeric).count() == toks.count()); if (type == QLatin1String("bool")) { retVal = QLatin1String("false"); } else if (isBasicNumericType || type.endsWith(QLatin1Char('*'))) { retVal = QLatin1String("0"); } else if (type.endsWith(QLatin1Char('&'))) { do { type.chop(1); } while (type.endsWith(QLatin1Char(' '))); retVal = QLatin1String("uic_temp_var"); out << indent << "static " << type << ' ' << retVal << ';' << endl; } else { retVal = type + QLatin1String("()"); } } out << indent << "qWarning(\"" << nameOfClass << "::" << fname << ": Not implemented yet\");" << endl; if (!retVal.isEmpty()) out << indent << "return " << retVal << ';' << endl; } out << '}' << endl; out << endl; } ++it; ++it2; ++it3; } } }
int runMoc(int _argc, char **_argv) { bool autoInclude = true; Preprocessor pp; Moc moc; pp.macros["Q_MOC_RUN"]; pp.macros["__cplusplus"]; QByteArray filename; QByteArray output; FILE *in = 0; FILE *out = 0; bool ignoreConflictingOptions = false; QVector<QByteArray> argv; argv.resize(_argc - 1); for (int n = 1; n < _argc; ++n) argv[n - 1] = _argv[n]; int argc = argv.count(); for (int n = 0; n < argv.count(); ++n) { if (argv.at(n).startsWith('@')) { QByteArray optionsFile = argv.at(n); optionsFile.remove(0, 1); if (optionsFile.isEmpty()) error("The @ option requires an input file"); QFile f(QString::fromLatin1(optionsFile.constData())); if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) error("Cannot open options file specified with @"); argv.remove(n); while (!f.atEnd()) { QByteArray line = f.readLine().trimmed(); if (!line.isEmpty()) argv.insert(n++, line); } } } argc = argv.count(); for (int n = 0; n < argc; ++n) { QByteArray arg(argv[n]); if (arg[0] != '-') { if (filename.isEmpty()) { filename = arg; continue; } error("Too many input files specified"); } QByteArray opt = arg.mid(1); bool more = (opt.size() > 1); switch (opt[0]) { case 'o': // output redirection if (!more) { if (!(n < argc-1)) error("Missing output file name"); output = argv[++n]; } else output = opt.mid(1); break; case 'E': // only preprocessor pp.preprocessOnly = true; break; case 'i': // no #include statement if (more) error(); moc.noInclude = true; autoInclude = false; break; case 'f': // produce #include statement if (ignoreConflictingOptions) break; moc.noInclude = false; autoInclude = false; if (opt[1]) // -fsomething.h moc.includeFiles.append(opt.mid(1)); break; case 'p': // include file path if (ignoreConflictingOptions) break; if (!more) { if (!(n < argc-1)) error("Missing path name for the -p option."); moc.includePath = argv[++n]; } else { moc.includePath = opt.mid(1); } break; case 'I': // produce #include statement if (!more) { if (!(n < argc-1)) error("Missing path name for the -I option."); pp.includes += Preprocessor::IncludePath(argv[++n]); } else { pp.includes += Preprocessor::IncludePath(opt.mid(1)); } break; case 'F': // minimalistic framework support for the mac if (!more) { if (!(n < argc-1)) error("Missing path name for the -F option."); Preprocessor::IncludePath p(argv[++n]); p.isFrameworkPath = true; pp.includes += p; } else { Preprocessor::IncludePath p(opt.mid(1)); p.isFrameworkPath = true; pp.includes += p; } break; case 'D': // define macro { QByteArray name; QByteArray value("1"); if (!more) { if (n < argc-1) name = argv[++n]; } else name = opt.mid(1); int eq = name.indexOf('='); if (eq >= 0) { value = name.mid(eq + 1); name = name.left(eq); } if (name.isEmpty()) error("Missing macro name"); Macro macro; macro.symbols += Symbol(0, PP_IDENTIFIER, value); pp.macros.insert(name, macro); } break; case 'U': { QByteArray macro; if (!more) { if (n < argc-1) macro = argv[++n]; } else macro = opt.mid(1); if (macro.isEmpty()) error("Missing macro name"); pp.macros.remove(macro); } break; case 'v': // version number if (more && opt != "version") error(); fprintf(stderr, "Qt Meta Object Compiler version %d (Qt %s)\n", mocOutputRevision, QT_VERSION_STR); return 1; case 'n': // don't display warnings if (ignoreConflictingOptions) break; if (opt != "nw") error(); moc.displayWarnings = false; break; case 'h': // help if (more && opt != "help") error(); else error(0); // 0 means usage only break; case '-': if (more && arg == "--ignore-option-clashes") { // -- ignore all following moc specific options that conflict // with for example gcc, like -pthread conflicting with moc's // -p option. ignoreConflictingOptions = true; break; } // fall through default: error(); } } if (autoInclude) { int ppos = filename.lastIndexOf('.'); moc.noInclude = (ppos >= 0 && tolower(filename[ppos + 1]) != 'h' && tolower(filename[ppos + 1]) != QDir::separator().toLatin1() ); } if (moc.includeFiles.isEmpty()) { if (moc.includePath.isEmpty()) { if (filename.size()) { if (output.size()) moc.includeFiles.append(combinePath(filename, output)); else moc.includeFiles.append(filename); } } else { moc.includeFiles.append(combinePath(filename, filename)); } } if (filename.isEmpty()) { filename = "standard input"; in = stdin; } else { #if defined(_MSC_VER) && _MSC_VER >= 1400 if (fopen_s(&in, filename.data(), "rb")) { #else in = fopen(filename.data(), "rb"); if (!in) { #endif fprintf(stderr, "moc: %s: No such file\n", (const char*)filename); return 1; } moc.filename = filename; } moc.currentFilenames.push(filename); // 1. preprocess moc.symbols = pp.preprocessed(moc.filename, in); fclose(in); if (!pp.preprocessOnly) { // 2. parse moc.parse(); } // 3. and output meta object code if (output.size()) { // output file specified #if defined(_MSC_VER) && _MSC_VER >= 1400 if (fopen_s(&out, output.data(), "w")) #else out = fopen(output.data(), "w"); // create output file if (!out) #endif { fprintf(stderr, "moc: Cannot create %s\n", (const char*)output); return 1; } } else { // use stdout out = stdout; } if (pp.preprocessOnly) { fprintf(out, "%s\n", composePreprocessorOutput(moc.symbols).constData()); } else { if (moc.classList.isEmpty()) moc.warning("No relevant classes found. No output generated."); else moc.generate(out); } if (output.size()) fclose(out); return 0; } QT_END_NAMESPACE int main(int _argc, char **_argv) { return QT_PREPEND_NAMESPACE(runMoc)(_argc, _argv); }
/*! Creates an implementation (cpp-file) for the form given in \a e. \sa createFormDecl(), createObjectImpl() */ void Uic::createFormImpl( const QDomElement &e ) { QDomElement n; QDomNodeList nl; int i; QString objClass = getClassName( e ); if ( objClass.isEmpty() ) return; QString objName = getObjectName( e ); // generate local and local includes required QStringList globalIncludes, localIncludes; QStringList::Iterator it; QMap<QString, CustomInclude> customWidgetIncludes; // find additional slots and functions QStringList extraFuncts; QStringList extraFunctTyp; QStringList extraFunctSpecifier; nl = e.parentNode().toElement().elementsByTagName( "slot" ); for ( i = 0; i < (int) nl.length(); i++ ) { n = nl.item(i).toElement(); if ( n.parentNode().toElement().tagName() != "slots" && n.parentNode().toElement().tagName() != "connections" ) continue; if ( n.attribute( "language", "C++" ) != "C++" ) continue; QString functionName = n.firstChild().toText().data().stripWhiteSpace(); if ( functionName.endsWith( ";" ) ) functionName = functionName.left( functionName.length() - 1 ); extraFuncts += functionName; extraFunctTyp += n.attribute( "returnType", "void" ); extraFunctSpecifier += n.attribute( "specifier", "virtual" ); } nl = e.parentNode().toElement().elementsByTagName( "function" ); for ( i = 0; i < (int) nl.length(); i++ ) { n = nl.item(i).toElement(); if ( n.parentNode().toElement().tagName() != "functions" ) continue; if ( n.attribute( "language", "C++" ) != "C++" ) continue; QString functionName = n.firstChild().toText().data().stripWhiteSpace(); if ( functionName.endsWith( ";" ) ) functionName = functionName.left( functionName.length() - 1 ); extraFuncts += functionName; extraFunctTyp += n.attribute( "returnType", "void" ); extraFunctSpecifier += n.attribute( "specifier", "virtual" ); } for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) { if ( n.tagName() == "customwidgets" ) { QDomElement n2 = n.firstChild().toElement(); while ( !n2.isNull() ) { if ( n2.tagName() == "customwidget" ) { QDomElement n3 = n2.firstChild().toElement(); QString cl; WidgetDatabaseRecord *r = new WidgetDatabaseRecord; while ( !n3.isNull() ) { if ( n3.tagName() == "class" ) { cl = n3.firstChild().toText().data(); r->name = cl; } else if ( n3.tagName() == "header" ) { CustomInclude ci; ci.header = n3.firstChild().toText().data(); ci.location = n3.attribute( "location", "global" ); r->includeFile = ci.header; customWidgetIncludes.insert( cl, ci ); } WidgetDatabase::append( r ); n3 = n3.nextSibling().toElement(); } } n2 = n2.nextSibling().toElement(); } } } // additional includes (local or global) and forward declaractions nl = e.parentNode().toElement().elementsByTagName( "include" ); for ( i = 0; i < (int) nl.length(); i++ ) { QDomElement n2 = nl.item(i).toElement(); QString s = n2.firstChild().toText().data(); if ( n2.attribute( "location" ) != "local" ) { if ( s.right( 5 ) == ".ui.h" && !QFile::exists( s ) ) continue; if ( n2.attribute( "impldecl", "in implementation" ) != "in implementation" ) continue; globalIncludes += s; } } registerDatabases( e ); dbConnections = unique( dbConnections ); if ( dbConnections.count() ) globalIncludes += "qsqldatabase.h"; if ( dbCursors.count() ) globalIncludes += "qsqlcursor.h"; bool dbForm = FALSE; if ( dbForms[ "(default)" ].count() ) dbForm = TRUE; bool subDbForms = FALSE; for ( it = dbConnections.begin(); it != dbConnections.end(); ++it ) { if ( !(*it).isEmpty() && (*it) != "(default)" ) { if ( dbForms[ (*it) ].count() ) { subDbForms = TRUE; break; } } } if ( dbForm || subDbForms ) { globalIncludes += "qsqlform.h"; globalIncludes += "qsqlrecord.h"; } // do the local includes afterwards, since global includes have priority on clashes for ( i = 0; i < (int) nl.length(); i++ ) { QDomElement n2 = nl.item(i).toElement(); QString s = n2.firstChild().toText().data(); if ( n2.attribute( "location" ) == "local" &&!globalIncludes.contains( s ) ) { if ( s.right( 5 ) == ".ui.h" && !QFile::exists( s ) ) continue; if ( n2.attribute( "impldecl", "in implementation" ) != "in implementation" ) continue; localIncludes += s; } } // additional custom widget headers nl = e.parentNode().toElement().elementsByTagName( "header" ); for ( i = 0; i < (int) nl.length(); i++ ) { QDomElement n2 = nl.item(i).toElement(); QString s = n2.firstChild().toText().data(); if ( n2.attribute( "location" ) != "local" ) globalIncludes += s; else localIncludes += s; } // includes for child widgets for ( it = tags.begin(); it != tags.end(); ++it ) { nl = e.parentNode().toElement().elementsByTagName( *it ); for ( i = 1; i < (int) nl.length(); i++ ) { // start at 1, 0 is the toplevel widget QString name = getClassName( nl.item(i).toElement() ); if ( name == "Spacer" ) { globalIncludes += "qlayout.h"; globalIncludes += "qapplication.h"; continue; } if ( name.mid( 1 ) == "ListView" ) globalIncludes += "qheader.h"; if ( name != objClass ) { int wid = WidgetDatabase::idFromClassName( name ); QMap<QString, CustomInclude>::Iterator it = customWidgetIncludes.find( name ); if ( it == customWidgetIncludes.end() ) globalIncludes += WidgetDatabase::includeFile( wid ); } } } out << "#include <qvariant.h>" << endl; // first for gcc 2.7.2 globalIncludes = unique( globalIncludes ); for ( it = globalIncludes.begin(); it != globalIncludes.end(); ++it ) { if ( !(*it).isEmpty() ) out << "#include <" << *it << ">" << endl; } out << "#include <qlayout.h>" << endl; out << "#include <qtooltip.h>" << endl; out << "#include <qwhatsthis.h>" << endl; if ( objClass == "QMainWindow" ) { out << "#include <qaction.h>" << endl; out << "#include <qmenubar.h>" << endl; out << "#include <qpopupmenu.h>" << endl; out << "#include <qtoolbar.h>" << endl; } // find out what images are required QStringList requiredImages; static const char *imgTags[] = { "pixmap", "iconset", 0 }; for ( i = 0; imgTags[i] != 0; i++ ) { nl = e.parentNode().toElement().elementsByTagName( imgTags[i] ); for ( int j = 0; j < (int) nl.length(); j++ ) { QDomNode nn = nl.item(j); while ( nn.parentNode() != e.parentNode() ) nn = nn.parentNode(); if ( nn.nodeName() != "customwidgets" ) requiredImages += nl.item(j).firstChild().toText().data(); } } if ( !requiredImages.isEmpty() || externPixmaps ) { out << "#include <qimage.h>" << endl; out << "#include <qpixmap.h>" << endl << endl; } /* Put local includes after all global includes */ localIncludes = unique( localIncludes ); for ( it = localIncludes.begin(); it != localIncludes.end(); ++it ) { if ( !(*it).isEmpty() && *it != QFileInfo( fileName + ".h" ).fileName() ) out << "#include \"" << *it << "\"" << endl; } QString uiDotH = fileName + ".h"; if ( QFile::exists( uiDotH ) ) { if ( !outputFileName.isEmpty() ) uiDotH = combinePath( uiDotH, outputFileName ); out << "#include \"" << uiDotH << "\"" << endl; writeFunctImpl = FALSE; } // register the object and unify its name objName = registerObject( objName ); QStringList images; QStringList xpmImages; if ( pixmapLoaderFunction.isEmpty() && !externPixmaps ) { // create images for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) { if ( n.tagName() == "images" ) { nl = n.elementsByTagName( "image" ); for ( i = 0; i < (int) nl.length(); i++ ) { QString img = registerObject( nl.item(i).toElement().attribute("name") ); if ( !requiredImages.contains( img ) ) continue; QDomElement tmp = nl.item(i).firstChild().toElement(); if ( tmp.tagName() != "data" ) continue; QString format = tmp.attribute("format", "PNG" ); QString data = tmp.firstChild().toText().data(); if ( format == "XPM.GZ" ) { xpmImages += img; ulong length = tmp.attribute("length").toULong(); QByteArray baunzip = unzipXPM( data, length ); length = baunzip.size(); // shouldn't we test the initial 'length' against the // resulting 'length' to catch corrupt UIC files? int a = 0; int column = 0; bool inQuote = FALSE; out << "static const char* const " << img << "_data[] = { " << endl; while ( baunzip[a] != '\"' ) a++; for ( ; a < (int) length; a++ ) { out << baunzip[a]; if ( baunzip[a] == '\n' ) { column = 0; } else if ( baunzip[a] == '"' ) { inQuote = !inQuote; } if ( column++ >= 511 && inQuote ) { out << "\"\n\""; // be nice with MSVC & Co. column = 1; } } out << endl; } else { images += img; out << "static const unsigned char " << img << "_data[] = { " << endl; out << " "; int a ; for ( a = 0; a < (int) (data.length()/2)-1; a++ ) { out << "0x" << QString(data[2*a]) << QString(data[2*a+1]) << ","; if ( a % 12 == 11 ) out << endl << " "; else out << " "; } out << "0x" << QString(data[2*a]) << QString(data[2*a+1]) << endl; out << "};" << endl << endl; } } } } out << endl; } else if ( externPixmaps ) { pixmapLoaderFunction = "QPixmap::fromMimeSource"; } // constructor if ( objClass == "QDialog" || objClass == "QWizard" ) { out << "/*" << endl; out << " * Constructs a " << nameOfClass << " as a child of 'parent', with the" << endl; out << " * name 'name' and widget flags set to 'f'." << endl; out << " *" << endl; out << " * The " << objClass.mid(1).lower() << " will by default be modeless, unless you set 'modal' to" << endl; out << " * TRUE to construct a modal " << objClass.mid(1).lower() << "." << endl; out << " */" << endl; out << nameOfClass << "::" << bareNameOfClass << "( QWidget* parent, const char* name, bool modal, WFlags fl )" << endl; out << " : " << objClass << "( parent, name, modal, fl )"; } else if ( objClass == "QWidget" ) { out << "/*" << endl; out << " * Constructs a " << nameOfClass << " as a child of 'parent', with the" << endl; out << " * name 'name' and widget flags set to 'f'." << endl; out << " */" << endl; out << nameOfClass << "::" << bareNameOfClass << "( QWidget* parent, const char* name, WFlags fl )" << endl; out << " : " << objClass << "( parent, name, fl )"; } else if ( objClass == "QMainWindow" ) { out << "/*" << endl; out << " * Constructs a " << nameOfClass << " as a child of 'parent', with the" << endl; out << " * name 'name' and widget flags set to 'f'." << endl; out << " *" << endl; out << " */" << endl; out << nameOfClass << "::" << bareNameOfClass << "( QWidget* parent, const char* name, WFlags fl )" << endl; out << " : " << objClass << "( parent, name, fl )"; isMainWindow = TRUE; } else { out << "/*" << endl; out << " * Constructs a " << nameOfClass << " which is a child of 'parent', with the" << endl; out << " * name 'name'.' " << endl; out << " */" << endl; out << nameOfClass << "::" << bareNameOfClass << "( QWidget* parent, const char* name )" << endl; out << " : " << objClass << "( parent, name )"; } // create pixmaps for all images if ( !xpmImages.isEmpty() ) { for ( it = xpmImages.begin(); it != xpmImages.end(); ++it ) { out << "," << endl; out << indent << " " << *it << "( (const char **) " << (*it) << "_data )"; } } out << endl; out << "{" << endl; if ( isMainWindow ) out << indent << "(void)statusBar();" << endl; if ( !images.isEmpty() ) { out << indent << "QImage img;" << endl; for ( it = images.begin(); it != images.end(); ++it ) { out << indent << "img.loadFromData( " << (*it) << "_data, sizeof( " << (*it) << "_data ), \"PNG\" );" << endl; out << indent << (*it) << " = img;" << endl; } } // set the properties QSize geometry( 0, 0 ); for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) { if ( n.tagName() == "property" ) { bool stdset = stdsetdef; if ( n.hasAttribute( "stdset" ) ) stdset = toBool( n.attribute( "stdset" ) ); QString prop = n.attribute("name"); QDomElement n2 = n.firstChild().toElement(); QString value = setObjectProperty( objClass, QString::null, prop, n2, stdset ); if ( value.isEmpty() ) continue; if ( prop == "geometry" && n2.tagName() == "rect" ) { QDomElement n3 = n2.firstChild().toElement(); while ( !n3.isNull() ) { if ( n3.tagName() == "width" ) geometry.setWidth( n3.firstChild().toText().data().toInt() ); else if ( n3.tagName() == "height" ) geometry.setHeight( n3.firstChild().toText().data().toInt() ); n3 = n3.nextSibling().toElement(); } } else { QString call; if ( stdset ) { call = mkStdSet( prop ) + "( "; } else { call = "setProperty( \"" + prop + "\", "; } call += value + " );"; if ( n2.tagName() == "string" ) { trout << indent << call << endl; } else if ( prop == "name" ) { out << indent << "if ( !name )" << endl; out << "\t" << call << endl; } else { out << indent << call << endl; } } } } // create all children, some forms have special requirements if ( objClass == "QWizard" ) { for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) { if ( tags.contains( n.tagName() ) ) { QString page = createObjectImpl( n, objClass, "this" ); QString comment; QString label = DomTool::readAttribute( n, "title", "", comment ).toString(); out << indent << "addPage( " << page << ", QString(\"\") );" << endl; trout << indent << "setTitle( " << page << ", " << trcall( label, comment ) << " );" << endl; QVariant def( FALSE, 0 ); if ( DomTool::hasAttribute( n, "backEnabled" ) ) out << indent << "setBackEnabled( " << page << ", " << mkBool( DomTool::readAttribute( n, "backEnabled", def).toBool() ) << endl; if ( DomTool::hasAttribute( n, "nextEnabled" ) ) out << indent << "setNextEnabled( " << page << ", " << mkBool( DomTool::readAttribute( n, "nextEnabled", def).toBool() ) << endl; if ( DomTool::hasAttribute( n, "finishEnabled" ) ) out << indent << "setFinishEnabled( " << page << ", " << mkBool( DomTool::readAttribute( n, "finishEnabled", def).toBool() ) << " );" << endl; if ( DomTool::hasAttribute( n, "helpEnabled" ) ) out << indent << "setHelpEnabled( " << page << ", " << mkBool( DomTool::readAttribute( n, "helpEnabled", def).toBool() ) << endl; if ( DomTool::hasAttribute( n, "finish" ) ) out << indent << "setFinish( " << page << ", " << mkBool( DomTool::readAttribute( n, "finish", def).toBool() ) << endl; } } } else { // standard widgets for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) { if ( tags.contains( n.tagName() ) ) createObjectImpl( n, objName, "this" ); } } // database support dbConnections = unique( dbConnections ); if ( dbConnections.count() ) out << endl; for ( it = dbConnections.begin(); it != dbConnections.end(); ++it ) { if ( !(*it).isEmpty() && (*it) != "(default)") { out << indent << (*it) << "Connection = QSqlDatabase::database( \"" <<(*it) << "\" );" << endl; } } nl = e.parentNode().toElement().elementsByTagName( "widget" ); for ( i = 1; i < (int) nl.length(); i++ ) { // start at 1, 0 is the toplevel widget n = nl.item(i).toElement(); QString s = getClassName( n ); if ( (dbForm || subDbForms) && (s == "QDataBrowser" || s == "QDataView") ) { QString objName = getObjectName( n ); QString tab = getDatabaseInfo( n, "table" ); QString con = getDatabaseInfo( n, "connection" ); out << indent << "QSqlForm* " << objName << "Form = new QSqlForm( this, \"" << objName << "Form\" );" << endl; QDomElement n2; for ( n2 = n.firstChild().toElement(); !n2.isNull(); n2 = n2.nextSibling().toElement() ) createFormImpl( n2, objName, con, tab ); out << indent << objName << "->setForm( " << objName << "Form );" << endl; } } // actions, toolbars, menubar bool needEndl = FALSE; for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) { if ( n.tagName() == "actions" ) { if ( !needEndl ) out << endl << indent << "// actions" << endl; createActionImpl( n.firstChild().toElement(), "this" ); needEndl = TRUE; } } if ( needEndl ) out << endl; needEndl = FALSE; for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) { if ( n.tagName() == "toolbars" ) { if ( !needEndl ) out << endl << indent << "// toolbars" << endl; createToolbarImpl( n, objClass, objName ); needEndl = TRUE; } } if ( needEndl ) out << endl; needEndl = FALSE; for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) { if ( n.tagName() == "menubar" ) { if ( !needEndl ) out << endl << indent << "// menubar" << endl; createMenuBarImpl( n, objClass, objName ); needEndl = TRUE; } } if ( needEndl ) out << endl; out << indent << "languageChange();" << endl; // take minimumSizeHint() into account, for height-for-width widgets if ( !geometry.isNull() ) { out << indent << "resize( QSize(" << geometry.width() << ", " << geometry.height() << ").expandedTo(minimumSizeHint()) );" << endl; out << indent << "clearWState( WState_Polished );" << endl; } for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) { if ( n.tagName() == "connections" ) { // setup signals and slots connections out << endl << indent << "// signals and slots connections" << endl; nl = n.elementsByTagName( "connection" ); for ( i = 0; i < (int) nl.length(); i++ ) { QString sender, receiver, signal, slot; for ( QDomElement n2 = nl.item(i).firstChild().toElement(); !n2.isNull(); n2 = n2.nextSibling().toElement() ) { if ( n2.tagName() == "sender" ) sender = n2.firstChild().toText().data(); else if ( n2.tagName() == "receiver" ) receiver = n2.firstChild().toText().data(); else if ( n2.tagName() == "signal" ) signal = n2.firstChild().toText().data(); else if ( n2.tagName() == "slot" ) slot = n2.firstChild().toText().data(); } if ( sender.isEmpty() || receiver.isEmpty() || signal.isEmpty() || slot.isEmpty() ) continue; if ( sender[0] == '<' || receiver[0] == '<' || signal[0] == '<' || slot[0] == '<' ) continue; sender = registeredName( sender ); receiver = registeredName( receiver ); // translate formwindow name to "this" if ( sender == objName ) sender = "this"; if ( receiver == objName ) receiver = "this"; out << indent << "connect( " << sender << ", SIGNAL( " << signal << " ), " << receiver << ", SLOT( " << slot << " ) );" << endl; } } else if ( n.tagName() == "tabstops" ) { // setup tab order out << endl << indent << "// tab order" << endl; QString lastName; QDomElement n2 = n.firstChild().toElement(); while ( !n2.isNull() ) { if ( n2.tagName() == "tabstop" ) { QString name = n2.firstChild().toText().data(); name = registeredName( name ); if ( !lastName.isEmpty() ) out << indent << "setTabOrder( " << lastName << ", " << name << " );" << endl; lastName = name; } n2 = n2.nextSibling().toElement(); } } } // buddies bool firstBuddy = TRUE; for ( QValueList<Buddy>::Iterator buddy = buddies.begin(); buddy != buddies.end(); ++buddy ) { if ( isObjectRegistered( (*buddy).buddy ) ) { if ( firstBuddy ) { out << endl << indent << "// buddies" << endl; } out << indent << (*buddy).key << "->setBuddy( " << registeredName( (*buddy).buddy ) << " );" << endl; firstBuddy = FALSE; } } if ( extraFuncts.find( "init()" ) != extraFuncts.end() ) out << indent << "init();" << endl; // end of constructor out << "}" << endl; out << endl; // destructor out << "/*" << endl; out << " * Destroys the object and frees any allocated resources" << endl; out << " */" << endl; out << nameOfClass << "::~" << bareNameOfClass << "()" << endl; out << "{" << endl; if ( extraFuncts.find( "destroy()" ) != extraFuncts.end() ) out << indent << "destroy();" << endl; out << indent << "// no need to delete child widgets, Qt does it all for us" << endl; out << "}" << endl; out << endl; // handle application events if required bool needFontEventHandler = FALSE; bool needSqlTableEventHandler = FALSE; bool needSqlDataBrowserEventHandler = FALSE; nl = e.elementsByTagName( "widget" ); for ( i = 0; i < (int) nl.length(); i++ ) { if ( !DomTool::propertiesOfType( nl.item(i).toElement() , "font" ).isEmpty() ) needFontEventHandler = TRUE; QString s = getClassName( nl.item(i).toElement() ); if ( s == "QDataTable" || s == "QDataBrowser" ) { if ( !isFrameworkCodeGenerated( nl.item(i).toElement() ) ) continue; if ( s == "QDataTable" ) needSqlTableEventHandler = TRUE; if ( s == "QDataBrowser" ) needSqlDataBrowserEventHandler = TRUE; } if ( needFontEventHandler && needSqlTableEventHandler && needSqlDataBrowserEventHandler ) break; } if ( needFontEventHandler && FALSE ) { // indent = "\t"; // increase indentation for if-clause below out << "/*" << endl; out << " * Main event handler. Reimplemented to handle" << endl; out << " * application font changes"; out << " */" << endl; out << "bool " << nameOfClass << "::event( QEvent* ev )" << endl; out << "{" << endl; out << " bool ret = " << objClass << "::event( ev ); " << endl; if ( needFontEventHandler ) { indent += "\t"; out << " if ( ev->type() == QEvent::ApplicationFontChange ) {" << endl; for ( i = 0; i < (int) nl.length(); i++ ) { n = nl.item(i).toElement(); QStringList list = DomTool::propertiesOfType( n, "font" ); for ( it = list.begin(); it != list.end(); ++it ) createExclusiveProperty( n, *it ); } out << " }" << endl; indent = " "; } out << "}" << endl; out << endl; } if ( needSqlTableEventHandler || needSqlDataBrowserEventHandler ) { out << "/*" << endl; out << " * Widget polish. Reimplemented to handle" << endl; if ( needSqlTableEventHandler ) out << " * default data table initialization" << endl; if ( needSqlDataBrowserEventHandler ) out << " * default data browser initialization" << endl; out << " */" << endl; out << "void " << nameOfClass << "::polish()" << endl; out << "{" << endl; if ( needSqlTableEventHandler ) { for ( i = 0; i < (int) nl.length(); i++ ) { QString s = getClassName( nl.item(i).toElement() ); if ( s == "QDataTable" ) { n = nl.item(i).toElement(); QString c = getObjectName( n ); QString conn = getDatabaseInfo( n, "connection" ); QString tab = getDatabaseInfo( n, "table" ); if ( !( conn.isEmpty() || tab.isEmpty() || !isFrameworkCodeGenerated( nl.item(i).toElement() ) ) ) { out << indent << "if ( " << c << " ) {" << endl; out << indent << indent << "QSqlCursor* cursor = " << c << "->sqlCursor();" << endl; out << indent << indent << "if ( !cursor ) {" << endl; if ( conn == "(default)" ) out << indent << indent << indent << "cursor = new QSqlCursor( \"" << tab << "\" );" << endl; else out << indent << indent << indent << "cursor = new QSqlCursor( \"" << tab << "\", TRUE, " << conn << "Connection );" << endl; out << indent << indent << indent << "if ( " << c << "->isReadOnly() ) " << endl; out << indent << indent << indent << indent << "cursor->setMode( QSqlCursor::ReadOnly );" << endl; out << indent << indent << indent << c << "->setSqlCursor( cursor, FALSE, TRUE );" << endl; out << indent << indent << "}" << endl; out << indent << indent << "if ( !cursor->isActive() )" << endl; out << indent << indent << indent << c << "->refresh( QDataTable::RefreshAll );" << endl; out << indent << "}" << endl; } } } } if ( needSqlDataBrowserEventHandler ) { nl = e.elementsByTagName( "widget" ); for ( i = 0; i < (int) nl.length(); i++ ) { QString s = getClassName( nl.item(i).toElement() ); if ( s == "QDataBrowser" ) { QString obj = getObjectName( nl.item(i).toElement() ); QString tab = getDatabaseInfo( nl.item(i).toElement(), "table" ); QString conn = getDatabaseInfo( nl.item(i).toElement(), "connection" ); if ( !(tab.isEmpty() || !isFrameworkCodeGenerated( nl.item(i).toElement() ) ) ) { out << indent << "if ( " << obj << " ) {" << endl; out << indent << indent << "if ( !" << obj << "->sqlCursor() ) {" << endl; if ( conn == "(default)" ) out << indent << indent << indent << "QSqlCursor* cursor = new QSqlCursor( \"" << tab << "\" );" << endl; else out << indent << indent << indent << "QSqlCursor* cursor = new QSqlCursor( \"" << tab << "\", TRUE, " << conn << "Connection );" << endl; out << indent << indent << indent << obj << "->setSqlCursor( cursor, TRUE );" << endl; out << indent << indent << indent << obj << "->refresh();" << endl; out << indent << indent << indent << obj << "->first();" << endl; out << indent << indent << "}" << endl; out << indent << "}" << endl; } } } } out << indent << objClass << "::polish();" << endl; out << "}" << endl; out << endl; } out << "/*" << endl; out << " * Sets the strings of the subwidgets using the current" << endl; out << " * language." << endl; out << " */" << endl; out << "void " << nameOfClass << "::languageChange()" << endl; out << "{" << endl; out << languageChangeBody; out << "}" << endl; out << endl; // create stubs for additional slots if necessary if ( !extraFuncts.isEmpty() && writeFunctImpl ) { it = extraFuncts.begin(); QStringList::Iterator it2 = extraFunctTyp.begin(); QStringList::Iterator it3 = extraFunctSpecifier.begin(); while ( it != extraFuncts.end() ) { QString type = *it2; if ( type.isEmpty() ) type = "void"; type = type.simplifyWhiteSpace(); QString fname = Parser::cleanArgs( *it ); if ( !(*it3).startsWith("pure") ) { // "pure virtual" or "pureVirtual" out << type << " " << nameOfClass << "::" << fname << endl; out << "{" << endl; if ( *it != "init()" && *it != "destroy()" ) { QRegExp numeric( "^(?:signed|unsigned|u?char|u?short|u?int" "|u?long|Q_U?INT(?:8|16|32)|Q_U?LONG|float" "|double)$" ); QString retVal; /* We return some kind of dummy value to shut the compiler up. 1. If the type is 'void', we return nothing. 2. If the type is 'bool', we return 'FALSE'. 3. If the type is 'unsigned long' or 'Q_UINT16' or 'double' or similar, we return '0'. 4. If the type is 'Foo *', we return '0'. 5. If the type is 'Foo &', we create a static variable of type 'Foo' and return it. 6. If the type is 'Foo', we assume there's a default constructor and use it. */ if ( type != "void" ) { QStringList toks = QStringList::split( " ", type ); bool isBasicNumericType = ( toks.grep(numeric).count() == toks.count() ); if ( type == "bool" ) { retVal = "FALSE"; } else if ( isBasicNumericType || type.endsWith("*") ) { retVal = "0"; } else if ( type.endsWith("&") ) { do { type.truncate( type.length() - 1 ); } while ( type.endsWith(" ") ); retVal = "uic_temp_var"; out << indent << "static " << type << " " << retVal << ";" << endl; } else { retVal = type + "()"; } } out << indent << "qWarning( \"" << nameOfClass << "::" << fname << ": Not implemented yet\" );" << endl; if ( !retVal.isEmpty() ) out << indent << "return " << retVal << ";" << endl; } out << "}" << endl; out << endl; } ++it; ++it2; ++it3; } } }
String Page::mapRelativePath(String path, RGC::Allocator& a) { char *tmp = (char*) a.alloc(request->path.length() + path.length()); int l = combinePath(request->path.data(), request->path.length(), path.data(), path.length(), tmp); return {tmp,l}; }
const char *const combinePath(const char *const path, const char *const filename) noexcept { static thread_local char buff[256]; if (!combinePath(buff, sizeof(buff), path, filename)) return nullptr; return buff; }