diff --git a/SConstruct b/SConstruct index 5df6f96a..013375b7 100644 --- a/SConstruct +++ b/SConstruct @@ -37,6 +37,14 @@ def setup_config_variables(): if 'ZLIBPATH' in os.environ: zlibpath = os.environ['ZLIBPATH'] + git = 'git' + if 'GIT' in os.environ: + git = os.environ['GIT'] + + mercurial = 'hg' + if 'MERCURIAL' in os.environ: + hg = os.environ['HG'] + vars = Variables('scons_configure.py') vars.AddVariables( PathVariable('BOOSTPATH', 'Set to point to your boost directory', @@ -51,7 +59,13 @@ def setup_config_variables(): PathVariable('SEVENZIPPATH', 'Path to 7zip sources', sevenzippath, PathVariable.PathIsDir), PathVariable('ZLIBPATH', 'Path to zlib install', zlibpath, - PathVariable.PathIsDir) + PathVariable.PathIsDir), + PathVariable('GIT', 'Path to git executable', git, + PathVariable.PathIsFile), + PathVariable('MERCURIAL', 'Path to hg executable', mercurial, + PathVariable.PathIsFile), + PathVariable('IWYU', 'Path to include-what-you-use executable', None, + PathVariable.PathIsFile) ) return vars @@ -231,6 +245,157 @@ def DisableQtModules(self, *modules): for module in modules: self['CPPPATH'].remove(os.path.join('$QTDIR', 'include', 'QT' + module)) +def setup_IWYU(env): + import SCons.Defaults + import SCons.Builder + original_shared = SCons.Defaults.SharedObjectEmitter + original_static = SCons.Defaults.StaticObjectEmitter + + def DoIWYU(env, source, target): + for i in range(len(source)): + s = source[i] + dir, name = os.path.split(str(s)) # I'm sure theres a way of getting this from scons + # Don't bother looking at moc files and 7zip source + if not name.startswith('moc_') and \ + not dir.startswith(env['SEVENZIPPATH']): + # Put the .iwyu in the same place as the .obj + targ = os.path.splitext(str(target[i]))[0] + env.Depends(env.IWYU(targ + '.iwyu', s), target[i]) + + def shared_emitter(target, source, env): + DoIWYU(env, source, target) + return original_shared(target, source, env) + + def static_emitter(target, source, env): + DoIWYU(env, source, target) + return original_static(target, source, env) + + SCons.Defaults.SharedObjectEmitter = shared_emitter + SCons.Defaults.StaticObjectEmitter = static_emitter + + def emitter(target, source, env): + env.Depends(target, env['IWYU_MAPPING_FILE']) + env.Depends(target, env['IWYU_MASSAGE']) + return target, source + + def _concat_list(prefixes, list, suffixes, env, f=lambda x: x, target=None, source=None): + """ Creates a new list from 'list' by first interpolating each element + in the list using the 'env' dictionary and then calling f on the + list, and concatenate the 'prefix' and 'suffix' LISTS onto each element of the list. + A trailing space on the last element of 'prefix' or leading space on the + first element of 'suffix' will cause them to be put into separate list + elements rather than being concatenated. + """ + + if not list: + return list + + l = f(SCons.PathList.PathList(list).subst_path(env, target, source)) + if l is not None: + list = l + + # This bit replaces current concat_ixes + + result = [] + + def process_stringlist(s): + return [ str(env.subst(p, SCons.Subst.SUBST_RAW)) + for p in Flatten([s]) if p != '' ] + + # ensure that prefix and suffix are strings + prefixes = process_stringlist(prefixes) + prefix = '' + if len(prefixes) != 0: + if prefixes[-1][-1] != ' ': + prefix = prefixes.pop() + + suffixes = process_stringlist(suffixes) + suffix = '' + if len(suffixes) != 0: + if suffixes[-1][0] != ' ': + suffix = suffixes.pop(0) + + for x in list: + if isinstance(x, SCons.Node.FS.File): + result.append(x) + continue + x = str(x) + if x: + result.append(prefixes) + if prefix: + if x[:len(prefix)] != prefix: + x = prefix + x + result.append(x) + if suffix: + if x[-len(suffix):] != suffix: + result[-1] = result[-1] + suffix + result.append(suffixes) + return result + + env['_concat_list'] = _concat_list + # Note to self: command 2>&1 | other command appears to work as I would hope + # except it eats errors + iwyu = SCons.Builder.Builder( + action=[ + '$IWYU_MASSAGE $TARGET $IWYU $IWYU_FLAGS $IWYU_MAPPINGS $IWYU_COMCOM $SOURCE' + ], + emitter=emitter, + suffix='.iwyu', + src_suffix='.cpp') + + env.Append(BUILDERS={'IWYU': iwyu}) + + # Sigh - IWYU is a right bum as it doesn't recognise /I so I have to + # duplicate most of the usual stuff + + env['IWYU_FLAGS'] = [ + # This might turn down the output a bit. I hope + '-Xiwyu', '--transitive_includes_only', + # Seem to be needed for a windows build + '-D_MT', '-D_DLL', '-m32', + # This is something to do with clang, windows and boost headers + '-DBOOST_USE_WINDOWS_H', + # There's a lot of this, disabled for now + '-Wno-inconsistent-missing-override', + # Mark boost and Qt headers as system headers to disable a lot of noise. + # I'm sure there has to be a better way than saying 'prefix=Q' + '--system-header-prefix=Q', + '--system-header-prefix=boost/', + # Should be able to get this info from our setup really + '-fmsc-version=1800', '-D_MSC_VER=1800', + # clang and qt don't agree about these because clang says its gcc 4.2 + # and QT doesn't realise it's clang + '-DQ_COMPILER_INITIALIZER_LISTS', + '-DQ_COMPILER_DECLTYPE', + '-DQ_COMPILER_VARIADIC_TEMPLATES', + ] + if env['CONFIG'] == 'debug': + env['IWYU_FLAGS'] += [ '-D_DEBUG' ] + + env['IWYU_DEFPREFIX'] = '-D' + env['IWYU_DEFSUFFIX'] = '' + env['IWYU_CPPDEFFLAGS'] = '${_defines(IWYU_DEFPREFIX, CPPDEFINES, IWYU_DEFSUFFIX, __env__)}' + + env['IWYU_INCPREFIX'] = '-I' + env['IWYU_INCSUFFIX'] = '' + env['IWYU_CPPINCFLAGS'] = '$( ${_concat(IWYU_INCPREFIX, CPPPATH, IWYU_INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' + + env['IWYU_PCH_PREFIX'] = '-include' # Amazingly this works without a space + env['IWYU_PCH_SUFFIX'] = '' + env['IWYU_PCHFILES'] = '$( ${_concat(IWYU_PCH_PREFIX, PCHSTOP, IWYU_PCH_SUFFIX, __env__, target=TARGET, source=SOURCE)} $)' + + env['IWYU_COMCOM'] = '$IWYU_CPPDEFFLAGS $IWYU_CPPINCFLAGS $IWYU_PCHFILES $CCPDBFLAGS' + env['IWYU_MAPPING_PREFIX'] = ['-Xiwyu', '--mapping_file='] + env['IWYU_MAPPING_SUFFIX'] = '' + env['IWYU_MAPPINGS'] = '$( ${_concat_list(IWYU_MAPPING_PREFIX, IWYU_MAPPING_FILE, IWYU_MAPPING_SUFFIX, __env__, f=lambda l: [ str(x) for x in l], target=TARGET, source=SOURCE)} $)' + + env['IWYU_MAPPING_FILE'] = [ + env.File('#/modorganizer/qt5_4.imp'), + env.File('#/modorganizer/win.imp'), + env.File('#/modorganizer/mappings.imp') + ] + + env['IWYU_MASSAGE'] = env.File('#/modorganizer/massage_messages.py') # Create base environment vars = setup_config_variables() @@ -347,6 +512,11 @@ else: env.AppendUnique(CPPFLAGS = [ '/O2', '/MD' ]) env.AppendUnique(LINKFLAGS = [ '/OPT:REF', '/OPT:ICF' ]) +# Set up include what you use. Add this as an extra compile step. Note it +# doesn't currently generate an output file (use the output instead!). +if 'IWYU' in env: + setup_IWYU(env) + # /OPT:REF removes unreferenced code # for release, use /OPT:ICF (comdat folding: coalesce identical blocks of code) diff --git a/mappings.imp b/mappings.imp new file mode 100644 index 00000000..6af65e3c --- /dev/null +++ b/mappings.imp @@ -0,0 +1,30 @@ +[ + +# for boost??? +# These are probably correct but might need a revisit as if you look at the boost documentation pages, it +# can give you huge lists of alternate includes... + { symbol: [ "BOOST_FOREACH", "private", "", "public" ] }, + + { include: [ "@\"boost/bind/.*\"", "private", "", "public" ] }, + { include: [ "@\"boost/algorithm/string/.*\"", "private", "", "public" ] }, + { include: [ "@\"boost/assign/.*\"", "private", "", "public" ] }, + { include: [ "@\"boost/filesystem/.*\"", "private", "", "public" ] }, + { include: [ "@\"boost/format/.*\"", "private", "", "public" ] }, + { include: [ "@\"boost/function/.*\"", "private", "", "public" ] }, + { include: [ "@\"boost/local/.*\"", "private", "", "public" ] }, + { include: [ "@\"boost/python/.*\"", "private", "", "public" ] }, + { include: [ "@\"boost/signals2/.*\"", "private", "", "public" ] }, + { include: [ "\"boost/smart_ptr/scoped_array.hpp\"", "private", "", "public" ] }, + { include: [ "\"boost/smart_ptr/shared_ptr.hpp\"", "private", "", "public" ] }, + # this appears to be excessive + #{ include: [ "@\"boost/thread/.*\"", "private", "", "public" ] }, + +# And this is specific to us + { include: [ "\"appconfig.inc\"", "private", "\"appconfig.h\"", "public" ] }, + +] + +# Ones I don't yet know how to deal with +#include "boost/fusion/container/vector/vector10_fwd.hpp" // for fusion +#include "boost/iterator/iterator_facade.hpp" // for operator!= +#include "boost/iterator/iterator_facade.hpp" diff --git a/massage_messages.py b/massage_messages.py new file mode 100644 index 00000000..249068ba --- /dev/null +++ b/massage_messages.py @@ -0,0 +1,116 @@ +import fileinput +import re +import subprocess +import sys + + +""" + +source/organizer/aboutdialog.h should add these lines: +#include // for Q_OBJECT, slots +#include // for QString +class QListWidgetItem; +class QWidget; + +source/organizer/aboutdialog.h should remove these lines: +- #include // lines 25-25 +- #include // lines 28-28 +- #include // lines 27-27 +- class DownloadManager; // lines 47-47 + +The full include-list for source/organizer/aboutdialog.h: +#include // for QDialog +#include // for Q_OBJECT, slots +#include // for QString +#include // for map +class QListWidgetItem; +class QWidget; +namespace Ui { class AboutDialog; } // lines 31-31 +--- +""" +removing = None + +includes = dict + +foundline = 0 + +errors = False + +def process_next_line(line, outfile): + """ Read a line of output/error from include-what-you use + Turn clang errors into a form QT creator recognises + Raise warnings for unneeded includes + """ + global removing + global includes + global foundline + global errors + line = line.rstrip() + print >> outfile, line + if removing: + if line == '': + removing = None + print + return + else: + # Really we should stash these so that if we get a 'class xxx' in + # the add lines we can print it here. also we could do the case + # fixing. + m = re.match(r'- #include [<"](.*)[">] +// lines (.*)-', line) + if m: + # If there is an added line with the same class, print it here + print '%s(%s) : warning I0001: Unnecessary include of %s' %\ + (removing, m.group(2), m.group(1)) + foundline = m.group(1) + else: + m = re.match(r'- (.*) +// lines (.*)-', line) + if m: + print '%s(%s) : warning I0002: '\ + 'Unnecessary forward ref of %s' %\ + (removing, m.group(2), m.group(1)) + foundline = m.group(1) + else: + print '********* I got confused **********' + + if line.startswith('In file included from'): + line = re.sub(r'^(In file included from)(.*):(\d+):', + r' \2(\3) : \1 here', + line) + # Note; QT Creator seems to be unwilling to let you double click the + # line to select the code in question if you get a string of these, not + # sure why. + elif ': note:' in line: + line = ' ' + re.sub(r':(\d+):\d+: note:', r'(\1) : note:', line) + else: + # Replace clang :line:column: type: with ms (line) : type nnnn: + line = re.sub(r':(\d+):\d+: ([^:]*):', r'(\1) : \2 I1234:', line) + if ' : error I1234:' in line: + errors = True + + print line + if line.endswith(' should remove these lines:'): + removing = (line.split(' '))[0] + elif line.endswith(' should add these lines:'): + adding = (line.split(' '))[0] + +# also process the other lines + + # added lines should come after the first entry with a line number. + +outfile = open(sys.argv[1], 'w') +process = subprocess.Popen(sys.argv[2:], + stdout = subprocess.PIPE, stderr = subprocess.STDOUT) +while True: + output = process.stdout.readline() + if output == '' and process.poll() is not None: + break + if output: + process_next_line(output, outfile) + +rc = process.poll() +# The return code you get appears to be more to do with the amount of output +# generated than any real error, so instead we should error if any ': error:' +# lines are detected + +if errors: + sys.exit(1) diff --git a/qt5_4.imp b/qt5_4.imp new file mode 100644 index 00000000..22553b0e --- /dev/null +++ b/qt5_4.imp @@ -0,0 +1,2478 @@ +[ + +# Per le documentation, each class lives in it's own header file. These are the +# official header files (as far as I can determine, from a scan of the QT includes +# directory) +# It'd be nice if IWYU could be told to recognise X::y as coming from the same header as X + + { symbol: [ "ActiveQt", "private", "", "public" ] }, + { symbol: [ "ActiveQtDepends", "private", "", "public" ] }, + { symbol: [ "ActiveQtVersion", "private", "", "public" ] }, + { symbol: [ "Enginio", "private", "", "public" ] }, + { symbol: [ "EnginioDepends", "private", "", "public" ] }, + { symbol: [ "EnginioVersion", "private", "", "public" ] }, + { symbol: [ "QAbstractAnimation", "private", "", "public" ] }, + { symbol: [ "QAbstractAudioDeviceInfo", "private", "", "public" ] }, + { symbol: [ "QAbstractAudioInput", "private", "", "public" ] }, + { symbol: [ "QAbstractAudioOutput", "private", "", "public" ] }, + { symbol: [ "QAbstractButton", "private", "", "public" ] }, + { symbol: [ "QAbstractEventDispatcher", "private", "", "public" ] }, + { symbol: [ "QAbstractExtensionFactory", "private", "", "public" ] }, + { symbol: [ "QAbstractExtensionManager", "private", "", "public" ] }, + { symbol: [ "QAbstractFormBuilder", "private", "", "public" ] }, + { symbol: [ "QAbstractGraphicsShapeItem", "private", "", "public" ] }, + { symbol: [ "QAbstractItemDelegate", "private", "", "public" ] }, + { symbol: [ "QAbstractItemModel", "private", "", "public" ] }, + { symbol: [ "QAbstractItemView", "private", "", "public" ] }, + { symbol: [ "QAbstractListModel", "private", "", "public" ] }, + { symbol: [ "QAbstractMessageHandler", "private", "", "public" ] }, + { symbol: [ "QAbstractNativeEventFilter", "private", "", "public" ] }, + { symbol: [ "QAbstractNetworkCache", "private", "", "public" ] }, + { symbol: [ "QAbstractPlanarVideoBuffer", "private", "", "public" ] }, + { symbol: [ "QAbstractPrintDialog", "private", "", "public" ] }, + { symbol: [ "QAbstractProxyModel", "private", "", "public" ] }, + { symbol: [ "QAbstractScrollArea", "private", "", "public" ] }, + { symbol: [ "QAbstractSlider", "private", "", "public" ] }, + { symbol: [ "QAbstractSocket", "private", "", "public" ] }, + { symbol: [ "QAbstractSpinBox", "private", "", "public" ] }, + { symbol: [ "QAbstractState", "private", "", "public" ] }, + { symbol: [ "QAbstractTableModel", "private", "", "public" ] }, + { symbol: [ "QAbstractTextDocumentLayout", "private", "", "public" ] }, + { symbol: [ "QAbstractTransition", "private", "", "public" ] }, + { symbol: [ "QAbstractUndoItem", "private", "", "public" ] }, + { symbol: [ "QAbstractUriResolver", "private", "", "public" ] }, + { symbol: [ "QAbstractVideoBuffer", "private", "", "public" ] }, + { symbol: [ "QAbstractVideoSurface", "private", "", "public" ] }, + { symbol: [ "QAbstractXmlNodeModel", "private", "", "public" ] }, + { symbol: [ "QAbstractXmlReceiver", "private", "", "public" ] }, + { symbol: [ "QAccelerometer", "private", "", "public" ] }, + { symbol: [ "QAccelerometerFilter", "private", "", "public" ] }, + { symbol: [ "QAccelerometerReading", "private", "", "public" ] }, + { symbol: [ "QAccessible", "private", "", "public" ] }, + { symbol: [ "QAccessibleAbstractScrollArea", "private", "", "public" ] }, + { symbol: [ "QAccessibleAbstractSlider", "private", "", "public" ] }, + { symbol: [ "QAccessibleAbstractSpinBox", "private", "", "public" ] }, + { symbol: [ "QAccessibleActionInterface", "private", "", "public" ] }, + { symbol: [ "QAccessibleApplication", "private", "", "public" ] }, + { symbol: [ "QAccessibleBridge", "private", "", "public" ] }, + { symbol: [ "QAccessibleBridgePlugin", "private", "", "public" ] }, + { symbol: [ "QAccessibleButton", "private", "", "public" ] }, + { symbol: [ "QAccessibleCalendarWidget", "private", "", "public" ] }, + { symbol: [ "QAccessibleComboBox", "private", "", "public" ] }, + { symbol: [ "QAccessibleDial", "private", "", "public" ] }, + { symbol: [ "QAccessibleDialogButtonBox", "private", "", "public" ] }, + { symbol: [ "QAccessibleDisplay", "private", "", "public" ] }, + { symbol: [ "QAccessibleDockWidget", "private", "", "public" ] }, + { symbol: [ "QAccessibleDoubleSpinBox", "private", "", "public" ] }, + { symbol: [ "QAccessibleEditableTextInterface", "private", "", "public" ] }, + { symbol: [ "QAccessibleEvent", "private", "", "public" ] }, + { symbol: [ "QAccessibleGroupBox", "private", "", "public" ] }, + { symbol: [ "QAccessibleImageInterface", "private", "", "public" ] }, + { symbol: [ "QAccessibleInterface", "private", "", "public" ] }, + { symbol: [ "QAccessibleLineEdit", "private", "", "public" ] }, + { symbol: [ "QAccessibleMainWindow", "private", "", "public" ] }, + { symbol: [ "QAccessibleMdiArea", "private", "", "public" ] }, + { symbol: [ "QAccessibleMdiSubWindow", "private", "", "public" ] }, + { symbol: [ "QAccessibleMenu", "private", "", "public" ] }, + { symbol: [ "QAccessibleMenuBar", "private", "", "public" ] }, + { symbol: [ "QAccessibleMenuItem", "private", "", "public" ] }, + { symbol: [ "QAccessibleObject", "private", "", "public" ] }, + { symbol: [ "QAccessiblePlainTextEdit", "private", "", "public" ] }, + { symbol: [ "QAccessiblePlugin", "private", "", "public" ] }, + { symbol: [ "QAccessibleProgressBar", "private", "", "public" ] }, + { symbol: [ "QAccessibleScrollArea", "private", "", "public" ] }, + { symbol: [ "QAccessibleScrollBar", "private", "", "public" ] }, + { symbol: [ "QAccessibleSlider", "private", "", "public" ] }, + { symbol: [ "QAccessibleSpinBox", "private", "", "public" ] }, + { symbol: [ "QAccessibleStackedWidget", "private", "", "public" ] }, + { symbol: [ "QAccessibleStateChangeEvent", "private", "", "public" ] }, + { symbol: [ "QAccessibleTabBar", "private", "", "public" ] }, + { symbol: [ "QAccessibleTable", "private", "", "public" ] }, + { symbol: [ "QAccessibleTableCell", "private", "", "public" ] }, + { symbol: [ "QAccessibleTableCellInterface", "private", "", "public" ] }, + { symbol: [ "QAccessibleTableCornerButton", "private", "", "public" ] }, + { symbol: [ "QAccessibleTableHeaderCell", "private", "", "public" ] }, + { symbol: [ "QAccessibleTableInterface", "private", "", "public" ] }, + { symbol: [ "QAccessibleTableModelChangeEvent", "private", "", "public" ] }, + { symbol: [ "QAccessibleTextBrowser", "private", "", "public" ] }, + { symbol: [ "QAccessibleTextCursorEvent", "private", "", "public" ] }, + { symbol: [ "QAccessibleTextEdit", "private", "", "public" ] }, + { symbol: [ "QAccessibleTextInsertEvent", "private", "", "public" ] }, + { symbol: [ "QAccessibleTextInterface", "private", "", "public" ] }, + { symbol: [ "QAccessibleTextRemoveEvent", "private", "", "public" ] }, + { symbol: [ "QAccessibleTextSelectionEvent", "private", "", "public" ] }, + { symbol: [ "QAccessibleTextUpdateEvent", "private", "", "public" ] }, + { symbol: [ "QAccessibleTextWidget", "private", "", "public" ] }, + { symbol: [ "QAccessibleToolBox", "private", "", "public" ] }, + { symbol: [ "QAccessibleToolButton", "private", "", "public" ] }, + { symbol: [ "QAccessibleTree", "private", "", "public" ] }, + { symbol: [ "QAccessibleValueChangeEvent", "private", "", "public" ] }, + { symbol: [ "QAccessibleValueInterface", "private", "", "public" ] }, + { symbol: [ "QAccessibleWidget", "private", "", "public" ] }, + { symbol: [ "QAccessibleWindowContainer", "private", "", "public" ] }, + { symbol: [ "QAction", "private", "", "public" ] }, + { symbol: [ "QActionEvent", "private", "", "public" ] }, + { symbol: [ "QActionGroup", "private", "", "public" ] }, + { symbol: [ "QAltimeter", "private", "", "public" ] }, + { symbol: [ "QAltimeterFilter", "private", "", "public" ] }, + { symbol: [ "QAltimeterReading", "private", "", "public" ] }, + { symbol: [ "QAmbientLightFilter", "private", "", "public" ] }, + { symbol: [ "QAmbientLightReading", "private", "", "public" ] }, + { symbol: [ "QAmbientLightSensor", "private", "", "public" ] }, + { symbol: [ "QAmbientTemperatureFilter", "private", "", "public" ] }, + { symbol: [ "QAmbientTemperatureReading", "private", "", "public" ] }, + { symbol: [ "QAmbientTemperatureSensor", "private", "", "public" ] }, + { symbol: [ "QAnimationDriver", "private", "", "public" ] }, + { symbol: [ "QAnimationGroup", "private", "", "public" ] }, + { symbol: [ "QApplication", "private", "", "public" ] }, + { symbol: [ "QApplicationStateChangeEvent", "private", "", "public" ] }, + { symbol: [ "QArgument", "private", "", "public" ] }, + { symbol: [ "QArrayData", "private", "", "public" ] }, + { symbol: [ "QArrayDataPointer", "private", "", "public" ] }, + { symbol: [ "QArrayDataPointerRef", "private", "", "public" ] }, + { symbol: [ "QAssociativeIterable", "private", "", "public" ] }, + { symbol: [ "QAtomicInt", "private", "", "public" ] }, + { symbol: [ "QAtomicInteger", "private", "", "public" ] }, + { symbol: [ "QAtomicPointer", "private", "", "public" ] }, + { symbol: [ "QAudio", "private", "", "public" ] }, + { symbol: [ "QAudioBuffer", "private", "", "public" ] }, + { symbol: [ "QAudioDecoder", "private", "", "public" ] }, + { symbol: [ "QAudioDecoderControl", "private", "", "public" ] }, + { symbol: [ "QAudioDeviceInfo", "private", "", "public" ] }, + { symbol: [ "QAudioEncoderSettings", "private", "", "public" ] }, + { symbol: [ "QAudioEncoderSettingsControl", "private", "", "public" ] }, + { symbol: [ "QAudioFormat", "private", "", "public" ] }, + { symbol: [ "QAudioInput", "private", "", "public" ] }, + { symbol: [ "QAudioInputSelectorControl", "private", "", "public" ] }, + { symbol: [ "QAudioOutput", "private", "", "public" ] }, + { symbol: [ "QAudioOutputSelectorControl", "private", "", "public" ] }, + { symbol: [ "QAudioProbe", "private", "", "public" ] }, + { symbol: [ "QAudioRecorder", "private", "", "public" ] }, + { symbol: [ "QAudioSystemFactoryInterface", "private", "", "public" ] }, + { symbol: [ "QAudioSystemPlugin", "private", "", "public" ] }, + { symbol: [ "QAuthenticator", "private", "", "public" ] }, + { symbol: [ "QAxAggregated", "private", "", "public" ] }, + { symbol: [ "QAxBase", "private", "", "public" ] }, + { symbol: [ "QAxBindable", "private", "", "public" ] }, + { symbol: [ "QAxFactory", "private", "", "public" ] }, + { symbol: [ "QAxObject", "private", "", "public" ] }, + { symbol: [ "QAxScript", "private", "", "public" ] }, + { symbol: [ "QAxScriptEngine", "private", "", "public" ] }, + { symbol: [ "QAxScriptManager", "private", "", "public" ] }, + { symbol: [ "QAxSelect", "private", "", "public" ] }, + { symbol: [ "QAxWidget", "private", "", "public" ] }, + { symbol: [ "QBBSystemLocaleData", "private", "", "public" ] }, + { symbol: [ "QBackingStore", "private", "", "public" ] }, + { symbol: [ "QBasicMutex", "private", "", "public" ] }, + { symbol: [ "QBasicTimer", "private", "", "public" ] }, + { symbol: [ "QBitArray", "private", "", "public" ] }, + { symbol: [ "QBitRef", "private", "", "public" ] }, + { symbol: [ "QBitmap", "private", "", "public" ] }, + { symbol: [ "QBluetoothAddress", "private", "", "public" ] }, + { symbol: [ "QBluetoothDeviceDiscoveryAgent", "private", "", "public" ] }, + { symbol: [ "QBluetoothDeviceInfo", "private", "", "public" ] }, + { symbol: [ "QBluetoothHostInfo", "private", "", "public" ] }, + { symbol: [ "QBluetoothLocalDevice", "private", "", "public" ] }, + { symbol: [ "QBluetoothServer", "private", "", "public" ] }, + { symbol: [ "QBluetoothServiceDiscoveryAgent", "private", "", "public" ] }, + { symbol: [ "QBluetoothServiceInfo", "private", "", "public" ] }, + { symbol: [ "QBluetoothSocket", "private", "", "public" ] }, + { symbol: [ "QBluetoothTransferManager", "private", "", "public" ] }, + { symbol: [ "QBluetoothTransferReply", "private", "", "public" ] }, + { symbol: [ "QBluetoothTransferRequest", "private", "", "public" ] }, + { symbol: [ "QBluetoothUuid", "private", "", "public" ] }, + { symbol: [ "QBoxLayout", "private", "", "public" ] }, + { symbol: [ "QBrush", "private", "", "public" ] }, + { symbol: [ "QBrushData", "private", "", "public" ] }, + { symbol: [ "QBuffer", "private", "", "public" ] }, + { symbol: [ "QButtonGroup", "private", "", "public" ] }, + { symbol: [ "QByteArray", "private", "", "public" ] }, + { symbol: [ "QByteArrayData", "private", "", "public" ] }, + { symbol: [ "QByteArrayDataPtr", "private", "", "public" ] }, + { symbol: [ "QByteArrayList", "private", "", "public" ] }, + { symbol: [ "QByteArrayListIterator", "private", "", "public" ] }, + { symbol: [ "QByteArrayMatcher", "private", "", "public" ] }, + { symbol: [ "QByteRef", "private", "", "public" ] }, + { symbol: [ "QCache", "private", "", "public" ] }, + { symbol: [ "QCalendarWidget", "private", "", "public" ] }, + { symbol: [ "QCamera", "private", "", "public" ] }, + { symbol: [ "QCameraCaptureBufferFormatControl", "private", "", "public" ] }, + { symbol: [ "QCameraCaptureDestinationControl", "private", "", "public" ] }, + { symbol: [ "QCameraControl", "private", "", "public" ] }, + { symbol: [ "QCameraExposure", "private", "", "public" ] }, + { symbol: [ "QCameraExposureControl", "private", "", "public" ] }, + { symbol: [ "QCameraFeedbackControl", "private", "", "public" ] }, + { symbol: [ "QCameraFlashControl", "private", "", "public" ] }, + { symbol: [ "QCameraFocus", "private", "", "public" ] }, + { symbol: [ "QCameraFocusControl", "private", "", "public" ] }, + { symbol: [ "QCameraFocusZone", "private", "", "public" ] }, + { symbol: [ "QCameraFocusZoneList", "private", "", "public" ] }, + { symbol: [ "QCameraImageCapture", "private", "", "public" ] }, + { symbol: [ "QCameraImageCaptureControl", "private", "", "public" ] }, + { symbol: [ "QCameraImageProcessing", "private", "", "public" ] }, + { symbol: [ "QCameraImageProcessingControl", "private", "", "public" ] }, + { symbol: [ "QCameraInfo", "private", "", "public" ] }, + { symbol: [ "QCameraInfoControl", "private", "", "public" ] }, + { symbol: [ "QCameraLocksControl", "private", "", "public" ] }, + { symbol: [ "QCameraViewfinder", "private", "", "public" ] }, + { symbol: [ "QCameraViewfinderSettingsControl", "private", "", "public" ] }, + { symbol: [ "QCameraZoomControl", "private", "", "public" ] }, + { symbol: [ "QChar", "private", "", "public" ] }, + { symbol: [ "QCharRef", "private", "", "public" ] }, + { symbol: [ "QCheckBox", "private", "", "public" ] }, + { symbol: [ "QChildEvent", "private", "", "public" ] }, + { symbol: [ "QClipboard", "private", "", "public" ] }, + { symbol: [ "QCloseEvent", "private", "", "public" ] }, + { symbol: [ "QCocoaNativeContext", "private", "", "public" ] }, + { symbol: [ "QCollator", "private", "", "public" ] }, + { symbol: [ "QCollatorSortKey", "private", "", "public" ] }, + { symbol: [ "QColor", "private", "", "public" ] }, + { symbol: [ "QColorDialog", "private", "", "public" ] }, + { symbol: [ "QColormap", "private", "", "public" ] }, + { symbol: [ "QColumnView", "private", "", "public" ] }, + { symbol: [ "QComboBox", "private", "", "public" ] }, + { symbol: [ "QCommandLineOption", "private", "", "public" ] }, + { symbol: [ "QCommandLineParser", "private", "", "public" ] }, + { symbol: [ "QCommandLinkButton", "private", "", "public" ] }, + { symbol: [ "QCommonStyle", "private", "", "public" ] }, + { symbol: [ "QCompass", "private", "", "public" ] }, + { symbol: [ "QCompassFilter", "private", "", "public" ] }, + { symbol: [ "QCompassReading", "private", "", "public" ] }, + { symbol: [ "QCompleter", "private", "", "public" ] }, + { symbol: [ "QConicalGradient", "private", "", "public" ] }, + { symbol: [ "QContextMenuEvent", "private", "", "public" ] }, + { symbol: [ "QContiguousCache", "private", "", "public" ] }, + { symbol: [ "QContiguousCacheData", "private", "", "public" ] }, + { symbol: [ "QContiguousCacheTypedData", "private", "", "public" ] }, + { symbol: [ "QCoreApplication", "private", "", "public" ] }, + { symbol: [ "QCryptographicHash", "private", "", "public" ] }, + { symbol: [ "QCursor", "private", "", "public" ] }, + { symbol: [ "QDBusAbstractAdaptor", "private", "", "public" ] }, + { symbol: [ "QDBusAbstractInterface", "private", "", "public" ] }, + { symbol: [ "QDBusAbstractInterfaceBase", "private", "", "public" ] }, + { symbol: [ "QDBusArgument", "private", "", "public" ] }, + { symbol: [ "QDBusConnection", "private", "", "public" ] }, + { symbol: [ "QDBusConnectionInterface", "private", "", "public" ] }, + { symbol: [ "QDBusContext", "private", "", "public" ] }, + { symbol: [ "QDBusError", "private", "", "public" ] }, + { symbol: [ "QDBusInterface", "private", "", "public" ] }, + { symbol: [ "QDBusMessage", "private", "", "public" ] }, + { symbol: [ "QDBusMetaType", "private", "", "public" ] }, + { symbol: [ "QDBusObjectPath", "private", "", "public" ] }, + { symbol: [ "QDBusPendingCall", "private", "", "public" ] }, + { symbol: [ "QDBusPendingCallWatcher", "private", "", "public" ] }, + { symbol: [ "QDBusPendingReply", "private", "", "public" ] }, + { symbol: [ "QDBusPendingReplyData", "private", "", "public" ] }, + { symbol: [ "QDBusReply", "private", "", "public" ] }, + { symbol: [ "QDBusServer", "private", "", "public" ] }, + { symbol: [ "QDBusServiceWatcher", "private", "", "public" ] }, + { symbol: [ "QDBusSignature", "private", "", "public" ] }, + { symbol: [ "QDBusUnixFileDescriptor", "private", "", "public" ] }, + { symbol: [ "QDBusVariant", "private", "", "public" ] }, + { symbol: [ "QDBusVirtualObject", "private", "", "public" ] }, + { symbol: [ "QDataStream", "private", "", "public" ] }, + { symbol: [ "QDataWidgetMapper", "private", "", "public" ] }, + { symbol: [ "QDate", "private", "", "public" ] }, + { symbol: [ "QDateEdit", "private", "", "public" ] }, + { symbol: [ "QDateTime", "private", "", "public" ] }, + { symbol: [ "QDateTimeEdit", "private", "", "public" ] }, + { symbol: [ "QDebug", "private", "", "public" ] }, + { symbol: [ "QDebugStateSaver", "private", "", "public" ] }, + { symbol: [ "QDeclarativeAttachedPropertiesFunc", "private", "", "public" ] }, + { symbol: [ "QDeclarativeComponent", "private", "", "public" ] }, + { symbol: [ "QDeclarativeContext", "private", "", "public" ] }, + { symbol: [ "QDeclarativeDebuggingEnabler", "private", "", "public" ] }, + { symbol: [ "QDeclarativeEngine", "private", "", "public" ] }, + { symbol: [ "QDeclarativeError", "private", "", "public" ] }, + { symbol: [ "QDeclarativeExpression", "private", "", "public" ] }, + { symbol: [ "QDeclarativeExtensionInterface", "private", "", "public" ] }, + { symbol: [ "QDeclarativeExtensionPlugin", "private", "", "public" ] }, + { symbol: [ "QDeclarativeImageProvider", "private", "", "public" ] }, + { symbol: [ "QDeclarativeInfo", "private", "", "public" ] }, + { symbol: [ "QDeclarativeItem", "private", "", "public" ] }, + { symbol: [ "QDeclarativeListProperty", "private", "", "public" ] }, + { symbol: [ "QDeclarativeListReference", "private", "", "public" ] }, + { symbol: [ "QDeclarativeNetworkAccessManagerFactory", "private", "", "public" ] }, + { symbol: [ "QDeclarativeParserStatus", "private", "", "public" ] }, + { symbol: [ "QDeclarativeProperties", "private", "", "public" ] }, + { symbol: [ "QDeclarativeProperty", "private", "", "public" ] }, + { symbol: [ "QDeclarativePropertyMap", "private", "", "public" ] }, + { symbol: [ "QDeclarativePropertyValueInterceptor", "private", "", "public" ] }, + { symbol: [ "QDeclarativePropertyValueSource", "private", "", "public" ] }, + { symbol: [ "QDeclarativeScriptString", "private", "", "public" ] }, + { symbol: [ "QDeclarativeTypeInfo", "private", "", "public" ] }, + { symbol: [ "QDeclarativeView", "private", "", "public" ] }, + { symbol: [ "QDeferredDeleteEvent", "private", "", "public" ] }, + { symbol: [ "QDesignerActionEditorInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerComponents", "private", "", "public" ] }, + { symbol: [ "QDesignerContainerExtension", "private", "", "public" ] }, + { symbol: [ "QDesignerCustomWidgetCollectionInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerCustomWidgetInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerDnDItemInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerDynamicPropertySheetExtension", "private", "", "public" ] }, + { symbol: [ "QDesignerExportWidget", "private", "", "public" ] }, + { symbol: [ "QDesignerExtraInfoExtension", "private", "", "public" ] }, + { symbol: [ "QDesignerFormEditorInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerFormEditorPluginInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerFormWindowCursorInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerFormWindowInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerFormWindowManagerInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerFormWindowToolInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerIntegration", "private", "", "public" ] }, + { symbol: [ "QDesignerIntegrationInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerLanguageExtension", "private", "", "public" ] }, + { symbol: [ "QDesignerLayoutDecorationExtension", "private", "", "public" ] }, + { symbol: [ "QDesignerMemberSheetExtension", "private", "", "public" ] }, + { symbol: [ "QDesignerMetaDataBaseInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerMetaDataBaseItemInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerNewFormWidgetInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerObjectInspectorInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerOptionsPageInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerPromotionInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerPropertyEditorInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerPropertySheetExtension", "private", "", "public" ] }, + { symbol: [ "QDesignerResourceBrowserInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerSettingsInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerTaskMenuExtension", "private", "", "public" ] }, + { symbol: [ "QDesignerWidgetBoxInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerWidgetDataBaseInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerWidgetDataBaseItemInterface", "private", "", "public" ] }, + { symbol: [ "QDesignerWidgetFactoryInterface", "private", "", "public" ] }, + { symbol: [ "QDesktopServices", "private", "", "public" ] }, + { symbol: [ "QDesktopWidget", "private", "", "public" ] }, + { symbol: [ "QDial", "private", "", "public" ] }, + { symbol: [ "QDialog", "private", "", "public" ] }, + { symbol: [ "QDialogButtonBox", "private", "", "public" ] }, + { symbol: [ "QDir", "private", "", "public" ] }, + { symbol: [ "QDirIterator", "private", "", "public" ] }, + { symbol: [ "QDirModel", "private", "", "public" ] }, + { symbol: [ "QDistanceFilter", "private", "", "public" ] }, + { symbol: [ "QDistanceReading", "private", "", "public" ] }, + { symbol: [ "QDistanceSensor", "private", "", "public" ] }, + { symbol: [ "QDnsDomainNameRecord", "private", "", "public" ] }, + { symbol: [ "QDnsHostAddressRecord", "private", "", "public" ] }, + { symbol: [ "QDnsLookup", "private", "", "public" ] }, + { symbol: [ "QDnsMailExchangeRecord", "private", "", "public" ] }, + { symbol: [ "QDnsServiceRecord", "private", "", "public" ] }, + { symbol: [ "QDnsTextRecord", "private", "", "public" ] }, + { symbol: [ "QDockWidget", "private", "", "public" ] }, + { symbol: [ "QDomAttr", "private", "", "public" ] }, + { symbol: [ "QDomCDATASection", "private", "", "public" ] }, + { symbol: [ "QDomCharacterData", "private", "", "public" ] }, + { symbol: [ "QDomComment", "private", "", "public" ] }, + { symbol: [ "QDomDocument", "private", "", "public" ] }, + { symbol: [ "QDomDocumentFragment", "private", "", "public" ] }, + { symbol: [ "QDomDocumentType", "private", "", "public" ] }, + { symbol: [ "QDomElement", "private", "", "public" ] }, + { symbol: [ "QDomEntity", "private", "", "public" ] }, + { symbol: [ "QDomEntityReference", "private", "", "public" ] }, + { symbol: [ "QDomImplementation", "private", "", "public" ] }, + { symbol: [ "QDomNamedNodeMap", "private", "", "public" ] }, + { symbol: [ "QDomNode", "private", "", "public" ] }, + { symbol: [ "QDomNodeList", "private", "", "public" ] }, + { symbol: [ "QDomNotation", "private", "", "public" ] }, + { symbol: [ "QDomProcessingInstruction", "private", "", "public" ] }, + { symbol: [ "QDomText", "private", "", "public" ] }, + { symbol: [ "QDoubleSpinBox", "private", "", "public" ] }, + { symbol: [ "QDoubleValidator", "private", "", "public" ] }, + { symbol: [ "QDrag", "private", "", "public" ] }, + { symbol: [ "QDragEnterEvent", "private", "", "public" ] }, + { symbol: [ "QDragLeaveEvent", "private", "", "public" ] }, + { symbol: [ "QDragMoveEvent", "private", "", "public" ] }, + { symbol: [ "QDropEvent", "private", "", "public" ] }, + { symbol: [ "QDynamicPropertyChangeEvent", "private", "", "public" ] }, + { symbol: [ "QEGLNativeContext", "private", "", "public" ] }, + { symbol: [ "QEasingCurve", "private", "", "public" ] }, + { symbol: [ "QEglFSFunctions", "private", "", "public" ] }, + { symbol: [ "QElapsedTimer", "private", "", "public" ] }, + { symbol: [ "QEnableSharedFromThis", "private", "", "public" ] }, + { symbol: [ "QEnterEvent", "private", "", "public" ] }, + { symbol: [ "QErrorMessage", "private", "", "public" ] }, + { symbol: [ "QEvent", "private", "", "public" ] }, + { symbol: [ "QEventLoop", "private", "", "public" ] }, + { symbol: [ "QEventLoopLocker", "private", "", "public" ] }, + { symbol: [ "QEventSizeOfChecker", "private", "", "public" ] }, + { symbol: [ "QEventTransition", "private", "", "public" ] }, + { symbol: [ "QException", "private", "", "public" ] }, + { symbol: [ "QExplicitlySharedDataPointer", "private", "", "public" ] }, + { symbol: [ "QExposeEvent", "private", "", "public" ] }, + { symbol: [ "QExtensionFactory", "private", "", "public" ] }, + { symbol: [ "QExtensionManager", "private", "", "public" ] }, + { symbol: [ "QFactoryInterface", "private", "", "public" ] }, + { symbol: [ "QFile", "private", "", "public" ] }, + { symbol: [ "QFileDevice", "private", "", "public" ] }, + { symbol: [ "QFileDialog", "private", "", "public" ] }, + { symbol: [ "QFileIconProvider", "private", "", "public" ] }, + { symbol: [ "QFileInfo", "private", "", "public" ] }, + { symbol: [ "QFileInfoList", "private", "", "public" ] }, + { symbol: [ "QFileOpenEvent", "private", "", "public" ] }, + { symbol: [ "QFileSelector", "private", "", "public" ] }, + { symbol: [ "QFileSystemModel", "private", "", "public" ] }, + { symbol: [ "QFileSystemWatcher", "private", "", "public" ] }, + { symbol: [ "QFinalState", "private", "", "public" ] }, + { symbol: [ "QFlag", "private", "", "public" ] }, + { symbol: [ "QFlags", "private", "", "public" ] }, + { symbol: [ "QFocusEvent", "private", "", "public" ] }, + { symbol: [ "QFocusFrame", "private", "", "public" ] }, + { symbol: [ "QFont", "private", "", "public" ] }, + { symbol: [ "QFontComboBox", "private", "", "public" ] }, + { symbol: [ "QFontDatabase", "private", "", "public" ] }, + { symbol: [ "QFontDialog", "private", "", "public" ] }, + { symbol: [ "QFontInfo", "private", "", "public" ] }, + { symbol: [ "QFontMetrics", "private", "", "public" ] }, + { symbol: [ "QFontMetricsF", "private", "", "public" ] }, + { symbol: [ "QForeachContainer", "private", "", "public" ] }, + { symbol: [ "QFormBuilder", "private", "", "public" ] }, + { symbol: [ "QFormLayout", "private", "", "public" ] }, + { symbol: [ "QFrame", "private", "", "public" ] }, + { symbol: [ "QFunctionPointer", "private", "", "public" ] }, + { symbol: [ "QFuture", "private", "", "public" ] }, + { symbol: [ "QFutureInterface", "private", "", "public" ] }, + { symbol: [ "QFutureInterfaceBase", "private", "", "public" ] }, + { symbol: [ "QFutureIterator", "private", "", "public" ] }, + { symbol: [ "QFutureSynchronizer", "private", "", "public" ] }, + { symbol: [ "QFutureWatcher", "private", "", "public" ] }, + { symbol: [ "QFutureWatcherBase", "private", "", "public" ] }, + { symbol: [ "QGL", "private", "", "public" ] }, + { symbol: [ "QGLBuffer", "private", "", "public" ] }, + { symbol: [ "QGLColormap", "private", "", "public" ] }, + { symbol: [ "QGLContext", "private", "", "public" ] }, + { symbol: [ "QGLFormat", "private", "", "public" ] }, + { symbol: [ "QGLFramebufferObject", "private", "", "public" ] }, + { symbol: [ "QGLFramebufferObjectFormat", "private", "", "public" ] }, + { symbol: [ "QGLFunctions", "private", "", "public" ] }, + { symbol: [ "QGLFunctionsPrivate", "private", "", "public" ] }, + { symbol: [ "QGLPixelBuffer", "private", "", "public" ] }, + { symbol: [ "QGLShader", "private", "", "public" ] }, + { symbol: [ "QGLShaderProgram", "private", "", "public" ] }, + { symbol: [ "QGLWidget", "private", "", "public" ] }, + { symbol: [ "QGLXNativeContext", "private", "", "public" ] }, + { symbol: [ "QGenericArgument", "private", "", "public" ] }, + { symbol: [ "QGenericMatrix", "private", "", "public" ] }, + { symbol: [ "QGenericPlugin", "private", "", "public" ] }, + { symbol: [ "QGenericPluginFactory", "private", "", "public" ] }, + { symbol: [ "QGenericReturnArgument", "private", "", "public" ] }, + { symbol: [ "QGeoAddress", "private", "", "public" ] }, + { symbol: [ "QGeoAreaMonitorInfo", "private", "", "public" ] }, + { symbol: [ "QGeoAreaMonitorSource", "private", "", "public" ] }, + { symbol: [ "QGeoCircle", "private", "", "public" ] }, + { symbol: [ "QGeoCodeReply", "private", "", "public" ] }, + { symbol: [ "QGeoCodingManager", "private", "", "public" ] }, + { symbol: [ "QGeoCodingManagerEngine", "private", "", "public" ] }, + { symbol: [ "QGeoCoordinate", "private", "", "public" ] }, + { symbol: [ "QGeoLocation", "private", "", "public" ] }, + { symbol: [ "QGeoManeuver", "private", "", "public" ] }, + { symbol: [ "QGeoPositionInfo", "private", "", "public" ] }, + { symbol: [ "QGeoPositionInfoSource", "private", "", "public" ] }, + { symbol: [ "QGeoPositionInfoSourceFactory", "private", "", "public" ] }, + { symbol: [ "QGeoRectangle", "private", "", "public" ] }, + { symbol: [ "QGeoRoute", "private", "", "public" ] }, + { symbol: [ "QGeoRouteReply", "private", "", "public" ] }, + { symbol: [ "QGeoRouteRequest", "private", "", "public" ] }, + { symbol: [ "QGeoRouteSegment", "private", "", "public" ] }, + { symbol: [ "QGeoRoutingManager", "private", "", "public" ] }, + { symbol: [ "QGeoRoutingManagerEngine", "private", "", "public" ] }, + { symbol: [ "QGeoSatelliteInfo", "private", "", "public" ] }, + { symbol: [ "QGeoSatelliteInfoSource", "private", "", "public" ] }, + { symbol: [ "QGeoServiceProvider", "private", "", "public" ] }, + { symbol: [ "QGeoServiceProviderFactory", "private", "", "public" ] }, + { symbol: [ "QGeoShape", "private", "", "public" ] }, + { symbol: [ "QGesture", "private", "", "public" ] }, + { symbol: [ "QGestureEvent", "private", "", "public" ] }, + { symbol: [ "QGestureRecognizer", "private", "", "public" ] }, + { symbol: [ "QGlobalStatic", "private", "", "public" ] }, + { symbol: [ "QGlyphRun", "private", "", "public" ] }, + { symbol: [ "QGradient", "private", "", "public" ] }, + { symbol: [ "QGradientStop", "private", "", "public" ] }, + { symbol: [ "QGradientStops", "private", "", "public" ] }, + { symbol: [ "QGraphicsAnchor", "private", "", "public" ] }, + { symbol: [ "QGraphicsAnchorLayout", "private", "", "public" ] }, + { symbol: [ "QGraphicsBlurEffect", "private", "", "public" ] }, + { symbol: [ "QGraphicsColorizeEffect", "private", "", "public" ] }, + { symbol: [ "QGraphicsDropShadowEffect", "private", "", "public" ] }, + { symbol: [ "QGraphicsEffect", "private", "", "public" ] }, + { symbol: [ "QGraphicsEllipseItem", "private", "", "public" ] }, + { symbol: [ "QGraphicsGridLayout", "private", "", "public" ] }, + { symbol: [ "QGraphicsItem", "private", "", "public" ] }, + { symbol: [ "QGraphicsItemAnimation", "private", "", "public" ] }, + { symbol: [ "QGraphicsItemGroup", "private", "", "public" ] }, + { symbol: [ "QGraphicsLayout", "private", "", "public" ] }, + { symbol: [ "QGraphicsLayoutItem", "private", "", "public" ] }, + { symbol: [ "QGraphicsLineItem", "private", "", "public" ] }, + { symbol: [ "QGraphicsLinearLayout", "private", "", "public" ] }, + { symbol: [ "QGraphicsObject", "private", "", "public" ] }, + { symbol: [ "QGraphicsOpacityEffect", "private", "", "public" ] }, + { symbol: [ "QGraphicsPathItem", "private", "", "public" ] }, + { symbol: [ "QGraphicsPixmapItem", "private", "", "public" ] }, + { symbol: [ "QGraphicsPolygonItem", "private", "", "public" ] }, + { symbol: [ "QGraphicsProxyWidget", "private", "", "public" ] }, + { symbol: [ "QGraphicsRectItem", "private", "", "public" ] }, + { symbol: [ "QGraphicsRotation", "private", "", "public" ] }, + { symbol: [ "QGraphicsScale", "private", "", "public" ] }, + { symbol: [ "QGraphicsScene", "private", "", "public" ] }, + { symbol: [ "QGraphicsSceneContextMenuEvent", "private", "", "public" ] }, + { symbol: [ "QGraphicsSceneDragDropEvent", "private", "", "public" ] }, + { symbol: [ "QGraphicsSceneEvent", "private", "", "public" ] }, + { symbol: [ "QGraphicsSceneHelpEvent", "private", "", "public" ] }, + { symbol: [ "QGraphicsSceneHoverEvent", "private", "", "public" ] }, + { symbol: [ "QGraphicsSceneMouseEvent", "private", "", "public" ] }, + { symbol: [ "QGraphicsSceneMoveEvent", "private", "", "public" ] }, + { symbol: [ "QGraphicsSceneResizeEvent", "private", "", "public" ] }, + { symbol: [ "QGraphicsSceneWheelEvent", "private", "", "public" ] }, + { symbol: [ "QGraphicsSimpleTextItem", "private", "", "public" ] }, + { symbol: [ "QGraphicsSvgItem", "private", "", "public" ] }, + { symbol: [ "QGraphicsTextItem", "private", "", "public" ] }, + { symbol: [ "QGraphicsTransform", "private", "", "public" ] }, + { symbol: [ "QGraphicsVideoItem", "private", "", "public" ] }, + { symbol: [ "QGraphicsView", "private", "", "public" ] }, + { symbol: [ "QGraphicsWebView", "private", "", "public" ] }, + { symbol: [ "QGraphicsWidget", "private", "", "public" ] }, + { symbol: [ "QGridLayout", "private", "", "public" ] }, + { symbol: [ "QGroupBox", "private", "", "public" ] }, + { symbol: [ "QGuiApplication", "private", "", "public" ] }, + { symbol: [ "QGyroscope", "private", "", "public" ] }, + { symbol: [ "QGyroscopeFilter", "private", "", "public" ] }, + { symbol: [ "QGyroscopeReading", "private", "", "public" ] }, + { symbol: [ "QHBoxLayout", "private", "", "public" ] }, + { symbol: [ "QHash", "private", "", "public" ] }, + { symbol: [ "QHashData", "private", "", "public" ] }, + { symbol: [ "QHashDummyValue", "private", "", "public" ] }, + { symbol: [ "QHashIterator", "private", "", "public" ] }, + { symbol: [ "QHashNode", "private", "", "public" ] }, + { symbol: [ "QHeaderView", "private", "", "public" ] }, + { symbol: [ "QHelpContentItem", "private", "", "public" ] }, + { symbol: [ "QHelpContentModel", "private", "", "public" ] }, + { symbol: [ "QHelpContentWidget", "private", "", "public" ] }, + { symbol: [ "QHelpEngine", "private", "", "public" ] }, + { symbol: [ "QHelpEngineCore", "private", "", "public" ] }, + { symbol: [ "QHelpEvent", "private", "", "public" ] }, + { symbol: [ "QHelpGlobal", "private", "", "public" ] }, + { symbol: [ "QHelpIndexModel", "private", "", "public" ] }, + { symbol: [ "QHelpIndexWidget", "private", "", "public" ] }, + { symbol: [ "QHelpSearchEngine", "private", "", "public" ] }, + { symbol: [ "QHelpSearchQuery", "private", "", "public" ] }, + { symbol: [ "QHelpSearchQueryWidget", "private", "", "public" ] }, + { symbol: [ "QHelpSearchResultWidget", "private", "", "public" ] }, + { symbol: [ "QHideEvent", "private", "", "public" ] }, + { symbol: [ "QHistoryState", "private", "", "public" ] }, + { symbol: [ "QHolsterFilter", "private", "", "public" ] }, + { symbol: [ "QHolsterReading", "private", "", "public" ] }, + { symbol: [ "QHolsterSensor", "private", "", "public" ] }, + { symbol: [ "QHostAddress", "private", "", "public" ] }, + { symbol: [ "QHostInfo", "private", "", "public" ] }, + { symbol: [ "QHoverEvent", "private", "", "public" ] }, + { symbol: [ "QHttpMultiPart", "private", "", "public" ] }, + { symbol: [ "QHttpPart", "private", "", "public" ] }, + { symbol: [ "QIODevice", "private", "", "public" ] }, + { symbol: [ "QIPv6Address", "private", "", "public" ] }, + { symbol: [ "QIRProximityFilter", "private", "", "public" ] }, + { symbol: [ "QIRProximityReading", "private", "", "public" ] }, + { symbol: [ "QIRProximitySensor", "private", "", "public" ] }, + { symbol: [ "QIcon", "private", "", "public" ] }, + { symbol: [ "QIconDragEvent", "private", "", "public" ] }, + { symbol: [ "QIconEngine", "private", "", "public" ] }, + { symbol: [ "QIconEnginePlugin", "private", "", "public" ] }, + { symbol: [ "QIconEngineV2", "private", "", "public" ] }, + { symbol: [ "QIdentityProxyModel", "private", "", "public" ] }, + { symbol: [ "QImage", "private", "", "public" ] }, + { symbol: [ "QImageCleanupFunction", "private", "", "public" ] }, + { symbol: [ "QImageEncoderControl", "private", "", "public" ] }, + { symbol: [ "QImageEncoderSettings", "private", "", "public" ] }, + { symbol: [ "QImageIOHandler", "private", "", "public" ] }, + { symbol: [ "QImageIOPlugin", "private", "", "public" ] }, + { symbol: [ "QImageReader", "private", "", "public" ] }, + { symbol: [ "QImageTextKeyLang", "private", "", "public" ] }, + { symbol: [ "QImageWriter", "private", "", "public" ] }, + { symbol: [ "QIncompatibleFlag", "private", "", "public" ] }, + { symbol: [ "QInputDialog", "private", "", "public" ] }, + { symbol: [ "QInputEvent", "private", "", "public" ] }, + { symbol: [ "QInputMethod", "private", "", "public" ] }, + { symbol: [ "QInputMethodEvent", "private", "", "public" ] }, + { symbol: [ "QInputMethodQueryEvent", "private", "", "public" ] }, + { symbol: [ "QIntValidator", "private", "", "public" ] }, + { symbol: [ "QIntegerForSize", "private", "", "public" ] }, + { symbol: [ "QInternal", "private", "", "public" ] }, + { symbol: [ "QItemDelegate", "private", "", "public" ] }, + { symbol: [ "QItemEditorCreator", "private", "", "public" ] }, + { symbol: [ "QItemEditorCreatorBase", "private", "", "public" ] }, + { symbol: [ "QItemEditorFactory", "private", "", "public" ] }, + { symbol: [ "QItemSelection", "private", "", "public" ] }, + { symbol: [ "QItemSelectionModel", "private", "", "public" ] }, + { symbol: [ "QItemSelectionRange", "private", "", "public" ] }, + { symbol: [ "QJSEngine", "private", "", "public" ] }, + { symbol: [ "QJSValue", "private", "", "public" ] }, + { symbol: [ "QJSValueIterator", "private", "", "public" ] }, + { symbol: [ "QJSValueList", "private", "", "public" ] }, + { symbol: [ "QJsonArray", "private", "", "public" ] }, + { symbol: [ "QJsonDocument", "private", "", "public" ] }, + { symbol: [ "QJsonObject", "private", "", "public" ] }, + { symbol: [ "QJsonParseError", "private", "", "public" ] }, + { symbol: [ "QJsonValue", "private", "", "public" ] }, + { symbol: [ "QJsonValuePtr", "private", "", "public" ] }, + { symbol: [ "QJsonValueRef", "private", "", "public" ] }, + { symbol: [ "QJsonValueRefPtr", "private", "", "public" ] }, + { symbol: [ "QKeyEvent", "private", "", "public" ] }, + { symbol: [ "QKeyEventTransition", "private", "", "public" ] }, + { symbol: [ "QKeySequence", "private", "", "public" ] }, + { symbol: [ "QKeySequenceEdit", "private", "", "public" ] }, + { symbol: [ "QLCDNumber", "private", "", "public" ] }, + { symbol: [ "QLabel", "private", "", "public" ] }, + { symbol: [ "QLatin1Char", "private", "", "public" ] }, + { symbol: [ "QLatin1Literal", "private", "", "public" ] }, + { symbol: [ "QLatin1String", "private", "", "public" ] }, + { symbol: [ "QLayout", "private", "", "public" ] }, + { symbol: [ "QLayoutItem", "private", "", "public" ] }, + { symbol: [ "QLibrary", "private", "", "public" ] }, + { symbol: [ "QLibraryInfo", "private", "", "public" ] }, + { symbol: [ "QLightFilter", "private", "", "public" ] }, + { symbol: [ "QLightReading", "private", "", "public" ] }, + { symbol: [ "QLightSensor", "private", "", "public" ] }, + { symbol: [ "QLine", "private", "", "public" ] }, + { symbol: [ "QLineEdit", "private", "", "public" ] }, + { symbol: [ "QLineF", "private", "", "public" ] }, + { symbol: [ "QLinearGradient", "private", "", "public" ] }, + { symbol: [ "QLinkedList", "private", "", "public" ] }, + { symbol: [ "QLinkedListData", "private", "", "public" ] }, + { symbol: [ "QLinkedListIterator", "private", "", "public" ] }, + { symbol: [ "QLinkedListNode", "private", "", "public" ] }, + { symbol: [ "QList", "private", "", "public" ] }, + { symbol: [ "QListData", "private", "", "public" ] }, + { symbol: [ "QListIterator", "private", "", "public" ] }, + { symbol: [ "QListSpecialMethods", "private", "", "public" ] }, + { symbol: [ "QListView", "private", "", "public" ] }, + { symbol: [ "QListWidget", "private", "", "public" ] }, + { symbol: [ "QListWidgetItem", "private", "", "public" ] }, + { symbol: [ "QLocalServer", "private", "", "public" ] }, + { symbol: [ "QLocalSocket", "private", "", "public" ] }, + { symbol: [ "QLocale", "private", "", "public" ] }, + { symbol: [ "QLocation", "private", "", "public" ] }, + { symbol: [ "QLockFile", "private", "", "public" ] }, + { symbol: [ "QLockFile", "private", "", "public" ] }, + { symbol: [ "QLoggingCategory", "private", "", "public" ] }, + { symbol: [ "QLowEnergyCharacteristic", "private", "", "public" ] }, + { symbol: [ "QLowEnergyController", "private", "", "public" ] }, + { symbol: [ "QLowEnergyDescriptor", "private", "", "public" ] }, + { symbol: [ "QLowEnergyHandle", "private", "", "public" ] }, + { symbol: [ "QLowEnergyService", "private", "", "public" ] }, + { symbol: [ "QMacCocoaViewContainer", "private", "", "public" ] }, + { symbol: [ "QMacNativeWidget", "private", "", "public" ] }, + { symbol: [ "QMagnetometer", "private", "", "public" ] }, + { symbol: [ "QMagnetometerFilter", "private", "", "public" ] }, + { symbol: [ "QMagnetometerReading", "private", "", "public" ] }, + { symbol: [ "QMainWindow", "private", "", "public" ] }, + { symbol: [ "QMap", "private", "", "public" ] }, + { symbol: [ "QMapData", "private", "", "public" ] }, + { symbol: [ "QMapDataBase", "private", "", "public" ] }, + { symbol: [ "QMapIterator", "private", "", "public" ] }, + { symbol: [ "QMapNode", "private", "", "public" ] }, + { symbol: [ "QMapNodeBase", "private", "", "public" ] }, + { symbol: [ "QMargins", "private", "", "public" ] }, + { symbol: [ "QMarginsF", "private", "", "public" ] }, + { symbol: [ "QMaskGenerator", "private", "", "public" ] }, + { symbol: [ "QMatrix", "private", "", "public" ] }, + { symbol: [ "QMatrix2x2", "private", "", "public" ] }, + { symbol: [ "QMatrix2x3", "private", "", "public" ] }, + { symbol: [ "QMatrix2x4", "private", "", "public" ] }, + { symbol: [ "QMatrix3x2", "private", "", "public" ] }, + { symbol: [ "QMatrix3x3", "private", "", "public" ] }, + { symbol: [ "QMatrix3x4", "private", "", "public" ] }, + { symbol: [ "QMatrix4x2", "private", "", "public" ] }, + { symbol: [ "QMatrix4x3", "private", "", "public" ] }, + { symbol: [ "QMatrix4x4", "private", "", "public" ] }, + { symbol: [ "QMdiArea", "private", "", "public" ] }, + { symbol: [ "QMdiSubWindow", "private", "", "public" ] }, + { symbol: [ "QMediaAudioProbeControl", "private", "", "public" ] }, + { symbol: [ "QMediaAvailabilityControl", "private", "", "public" ] }, + { symbol: [ "QMediaBindableInterface", "private", "", "public" ] }, + { symbol: [ "QMediaContainerControl", "private", "", "public" ] }, + { symbol: [ "QMediaContent", "private", "", "public" ] }, + { symbol: [ "QMediaControl", "private", "", "public" ] }, + { symbol: [ "QMediaGaplessPlaybackControl", "private", "", "public" ] }, + { symbol: [ "QMediaMetaData", "private", "", "public" ] }, + { symbol: [ "QMediaNetworkAccessControl", "private", "", "public" ] }, + { symbol: [ "QMediaObject", "private", "", "public" ] }, + { symbol: [ "QMediaPlayer", "private", "", "public" ] }, + { symbol: [ "QMediaPlayerControl", "private", "", "public" ] }, + { symbol: [ "QMediaPlaylist", "private", "", "public" ] }, + { symbol: [ "QMediaRecorder", "private", "", "public" ] }, + { symbol: [ "QMediaRecorderControl", "private", "", "public" ] }, + { symbol: [ "QMediaResource", "private", "", "public" ] }, + { symbol: [ "QMediaResourceList", "private", "", "public" ] }, + { symbol: [ "QMediaService", "private", "", "public" ] }, + { symbol: [ "QMediaServiceCameraInfoInterface", "private", "", "public" ] }, + { symbol: [ "QMediaServiceDefaultDeviceInterface", "private", "", "public" ] }, + { symbol: [ "QMediaServiceFeaturesInterface", "private", "", "public" ] }, + { symbol: [ "QMediaServiceProviderFactoryInterface", "private", "", "public" ] }, + { symbol: [ "QMediaServiceProviderHint", "private", "", "public" ] }, + { symbol: [ "QMediaServiceProviderPlugin", "private", "", "public" ] }, + { symbol: [ "QMediaServiceSupportedDevicesInterface", "private", "", "public" ] }, + { symbol: [ "QMediaServiceSupportedFormatsInterface", "private", "", "public" ] }, + { symbol: [ "QMediaStreamsControl", "private", "", "public" ] }, + { symbol: [ "QMediaTimeInterval", "private", "", "public" ] }, + { symbol: [ "QMediaTimeRange", "private", "", "public" ] }, + { symbol: [ "QMediaVideoProbeControl", "private", "", "public" ] }, + { symbol: [ "QMenu", "private", "", "public" ] }, + { symbol: [ "QMenuBar", "private", "", "public" ] }, + { symbol: [ "QMessageAuthenticationCode", "private", "", "public" ] }, + { symbol: [ "QMessageBox", "private", "", "public" ] }, + { symbol: [ "QMessageLogContext", "private", "", "public" ] }, + { symbol: [ "QMessageLogger", "private", "", "public" ] }, + { symbol: [ "QMetaClassInfo", "private", "", "public" ] }, + { symbol: [ "QMetaDataReaderControl", "private", "", "public" ] }, + { symbol: [ "QMetaDataWriterControl", "private", "", "public" ] }, + { symbol: [ "QMetaEnum", "private", "", "public" ] }, + { symbol: [ "QMetaMethod", "private", "", "public" ] }, + { symbol: [ "QMetaObject", "private", "", "public" ] }, + { symbol: [ "QMetaProperty", "private", "", "public" ] }, + { symbol: [ "QMetaType", "private", "", "public" ] }, + { symbol: [ "QMetaTypeId", "private", "", "public" ] }, + { symbol: [ "QMetaTypeId2", "private", "", "public" ] }, + { symbol: [ "QMetaTypeIdQObject", "private", "", "public" ] }, + { symbol: [ "QMimeData", "private", "", "public" ] }, + { symbol: [ "QMimeDatabase", "private", "", "public" ] }, + { symbol: [ "QMimeType", "private", "", "public" ] }, + { symbol: [ "QModelIndex", "private", "", "public" ] }, + { symbol: [ "QModelIndexList", "private", "", "public" ] }, + { symbol: [ "QMouseEvent", "private", "", "public" ] }, + { symbol: [ "QMouseEventTransition", "private", "", "public" ] }, + { symbol: [ "QMoveEvent", "private", "", "public" ] }, + { symbol: [ "QMovie", "private", "", "public" ] }, + { symbol: [ "QMultiHash", "private", "", "public" ] }, + { symbol: [ "QMultiMap", "private", "", "public" ] }, + { symbol: [ "QMultimedia", "private", "", "public" ] }, + { symbol: [ "QMutableByteArrayListIterator", "private", "", "public" ] }, + { symbol: [ "QMutableFutureIterator", "private", "", "public" ] }, + { symbol: [ "QMutableHashIterator", "private", "", "public" ] }, + { symbol: [ "QMutableLinkedListIterator", "private", "", "public" ] }, + { symbol: [ "QMutableListIterator", "private", "", "public" ] }, + { symbol: [ "QMutableMapIterator", "private", "", "public" ] }, + { symbol: [ "QMutableSetIterator", "private", "", "public" ] }, + { symbol: [ "QMutableStringListIterator", "private", "", "public" ] }, + { symbol: [ "QMutableVectorIterator", "private", "", "public" ] }, + { symbol: [ "QMutex", "private", "", "public" ] }, + { symbol: [ "QMutexLocker", "private", "", "public" ] }, + { symbol: [ "QNativeGestureEvent", "private", "", "public" ] }, + { symbol: [ "QNdefFilter", "private", "", "public" ] }, + { symbol: [ "QNdefMessage", "private", "", "public" ] }, + { symbol: [ "QNdefNfcIconRecord", "private", "", "public" ] }, + { symbol: [ "QNdefNfcSmartPosterRecord", "private", "", "public" ] }, + { symbol: [ "QNdefNfcTextRecord", "private", "", "public" ] }, + { symbol: [ "QNdefNfcUriRecord", "private", "", "public" ] }, + { symbol: [ "QNdefRecord", "private", "", "public" ] }, + { symbol: [ "QNearFieldManager", "private", "", "public" ] }, + { symbol: [ "QNearFieldShareManager", "private", "", "public" ] }, + { symbol: [ "QNearFieldShareTarget", "private", "", "public" ] }, + { symbol: [ "QNearFieldTarget", "private", "", "public" ] }, + { symbol: [ "QNetworkAccessManager", "private", "", "public" ] }, + { symbol: [ "QNetworkAddressEntry", "private", "", "public" ] }, + { symbol: [ "QNetworkCacheMetaData", "private", "", "public" ] }, + { symbol: [ "QNetworkConfiguration", "private", "", "public" ] }, + { symbol: [ "QNetworkConfigurationManager", "private", "", "public" ] }, + { symbol: [ "QNetworkCookie", "private", "", "public" ] }, + { symbol: [ "QNetworkCookieJar", "private", "", "public" ] }, + { symbol: [ "QNetworkDiskCache", "private", "", "public" ] }, + { symbol: [ "QNetworkInterface", "private", "", "public" ] }, + { symbol: [ "QNetworkProxy", "private", "", "public" ] }, + { symbol: [ "QNetworkProxyFactory", "private", "", "public" ] }, + { symbol: [ "QNetworkProxyQuery", "private", "", "public" ] }, + { symbol: [ "QNetworkReply", "private", "", "public" ] }, + { symbol: [ "QNetworkRequest", "private", "", "public" ] }, + { symbol: [ "QNetworkSession", "private", "", "public" ] }, + { symbol: [ "QNmeaPositionInfoSource", "private", "", "public" ] }, + { symbol: [ "QNoDebug", "private", "", "public" ] }, + { symbol: [ "QObject", "private", "", "public" ] }, + { symbol: [ "QObjectCleanupHandler", "private", "", "public" ] }, + { symbol: [ "QObjectData", "private", "", "public" ] }, + { symbol: [ "QObjectList", "private", "", "public" ] }, + { symbol: [ "QObjectUserData", "private", "", "public" ] }, + { symbol: [ "QOffscreenSurface", "private", "", "public" ] }, + { symbol: [ "QOpenGLBuffer", "private", "", "public" ] }, + { symbol: [ "QOpenGLContext", "private", "", "public" ] }, + { symbol: [ "QOpenGLContextGroup", "private", "", "public" ] }, + { symbol: [ "QOpenGLDebugLogger", "private", "", "public" ] }, + { symbol: [ "QOpenGLDebugMessage", "private", "", "public" ] }, + { symbol: [ "QOpenGLExtensions", "private", "", "public" ] }, + { symbol: [ "QOpenGLFramebufferObject", "private", "", "public" ] }, + { symbol: [ "QOpenGLFramebufferObjectFormat", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctionsPrivate", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_1_0", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_1_1", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_1_2", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_1_3", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_1_4", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_1_5", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_2_0", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_2_1", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_3_0", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_3_1", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_3_2_Compatibility", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_3_2_Core", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_3_3_Compatibility", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_3_3_Core", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_4_0_Compatibility", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_4_0_Core", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_4_1_Compatibility", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_4_1_Core", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_4_2_Compatibility", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_4_2_Core", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_4_3_Compatibility", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_4_3_Core", "private", "", "public" ] }, + { symbol: [ "QOpenGLFunctions_ES2", "private", "", "public" ] }, + { symbol: [ "QOpenGLPaintDevice", "private", "", "public" ] }, + { symbol: [ "QOpenGLPixelTransferOptions", "private", "", "public" ] }, + { symbol: [ "QOpenGLShader", "private", "", "public" ] }, + { symbol: [ "QOpenGLShaderProgram", "private", "", "public" ] }, + { symbol: [ "QOpenGLTexture", "private", "", "public" ] }, + { symbol: [ "QOpenGLTimeMonitor", "private", "", "public" ] }, + { symbol: [ "QOpenGLTimerQuery", "private", "", "public" ] }, + { symbol: [ "QOpenGLVersionFunctions", "private", "", "public" ] }, + { symbol: [ "QOpenGLVersionProfile", "private", "", "public" ] }, + { symbol: [ "QOpenGLVertexArrayObject", "private", "", "public" ] }, + { symbol: [ "QOpenGLWidget", "private", "", "public" ] }, + { symbol: [ "QOpenGLWindow", "private", "", "public" ] }, + { symbol: [ "QOrientationFilter", "private", "", "public" ] }, + { symbol: [ "QOrientationReading", "private", "", "public" ] }, + { symbol: [ "QOrientationSensor", "private", "", "public" ] }, + { symbol: [ "QPageLayout", "private", "", "public" ] }, + { symbol: [ "QPageSetupDialog", "private", "", "public" ] }, + { symbol: [ "QPageSize", "private", "", "public" ] }, + { symbol: [ "QPagedPaintDevice", "private", "", "public" ] }, + { symbol: [ "QPaintDevice", "private", "", "public" ] }, + { symbol: [ "QPaintDeviceWindow", "private", "", "public" ] }, + { symbol: [ "QPaintEngine", "private", "", "public" ] }, + { symbol: [ "QPaintEngineState", "private", "", "public" ] }, + { symbol: [ "QPaintEvent", "private", "", "public" ] }, + { symbol: [ "QPainter", "private", "", "public" ] }, + { symbol: [ "QPainterPath", "private", "", "public" ] }, + { symbol: [ "QPainterPathStroker", "private", "", "public" ] }, + { symbol: [ "QPair", "private", "", "public" ] }, + { symbol: [ "QPalette", "private", "", "public" ] }, + { symbol: [ "QPanGesture", "private", "", "public" ] }, + { symbol: [ "QParallelAnimationGroup", "private", "", "public" ] }, + { symbol: [ "QPauseAnimation", "private", "", "public" ] }, + { symbol: [ "QPdfWriter", "private", "", "public" ] }, + { symbol: [ "QPen", "private", "", "public" ] }, + { symbol: [ "QPersistentModelIndex", "private", "", "public" ] }, + { symbol: [ "QPicture", "private", "", "public" ] }, + { symbol: [ "QPictureFormatPlugin", "private", "", "public" ] }, + { symbol: [ "QPictureIO", "private", "", "public" ] }, + { symbol: [ "QPinchGesture", "private", "", "public" ] }, + { symbol: [ "QPixelFormat", "private", "", "public" ] }, + { symbol: [ "QPixmap", "private", "", "public" ] }, + { symbol: [ "QPixmapCache", "private", "", "public" ] }, + { symbol: [ "QPlace", "private", "", "public" ] }, + { symbol: [ "QPlaceAttribute", "private", "", "public" ] }, + { symbol: [ "QPlaceCategory", "private", "", "public" ] }, + { symbol: [ "QPlaceContactDetail", "private", "", "public" ] }, + { symbol: [ "QPlaceContent", "private", "", "public" ] }, + { symbol: [ "QPlaceContentReply", "private", "", "public" ] }, + { symbol: [ "QPlaceContentRequest", "private", "", "public" ] }, + { symbol: [ "QPlaceDetailsReply", "private", "", "public" ] }, + { symbol: [ "QPlaceEditorial", "private", "", "public" ] }, + { symbol: [ "QPlaceIcon", "private", "", "public" ] }, + { symbol: [ "QPlaceIdReply", "private", "", "public" ] }, + { symbol: [ "QPlaceImage", "private", "", "public" ] }, + { symbol: [ "QPlaceManager", "private", "", "public" ] }, + { symbol: [ "QPlaceManagerEngine", "private", "", "public" ] }, + { symbol: [ "QPlaceMatchReply", "private", "", "public" ] }, + { symbol: [ "QPlaceMatchRequest", "private", "", "public" ] }, + { symbol: [ "QPlaceProposedSearchResult", "private", "", "public" ] }, + { symbol: [ "QPlaceRatings", "private", "", "public" ] }, + { symbol: [ "QPlaceReply", "private", "", "public" ] }, + { symbol: [ "QPlaceResult", "private", "", "public" ] }, + { symbol: [ "QPlaceReview", "private", "", "public" ] }, + { symbol: [ "QPlaceSearchReply", "private", "", "public" ] }, + { symbol: [ "QPlaceSearchRequest", "private", "", "public" ] }, + { symbol: [ "QPlaceSearchResult", "private", "", "public" ] }, + { symbol: [ "QPlaceSearchSuggestionReply", "private", "", "public" ] }, + { symbol: [ "QPlaceSupplier", "private", "", "public" ] }, + { symbol: [ "QPlaceUser", "private", "", "public" ] }, + { symbol: [ "QPlainTextDocumentLayout", "private", "", "public" ] }, + { symbol: [ "QPlainTextEdit", "private", "", "public" ] }, + { symbol: [ "QPluginLoader", "private", "", "public" ] }, + { symbol: [ "QPoint", "private", "", "public" ] }, + { symbol: [ "QPointF", "private", "", "public" ] }, + { symbol: [ "QPointer", "private", "", "public" ] }, + { symbol: [ "QPolygon", "private", "", "public" ] }, + { symbol: [ "QPolygonF", "private", "", "public" ] }, + { symbol: [ "QPressureFilter", "private", "", "public" ] }, + { symbol: [ "QPressureReading", "private", "", "public" ] }, + { symbol: [ "QPressureSensor", "private", "", "public" ] }, + { symbol: [ "QPrintDialog", "private", "", "public" ] }, + { symbol: [ "QPrintEngine", "private", "", "public" ] }, + { symbol: [ "QPrintPreviewDialog", "private", "", "public" ] }, + { symbol: [ "QPrintPreviewWidget", "private", "", "public" ] }, + { symbol: [ "QPrinter", "private", "", "public" ] }, + { symbol: [ "QPrinterInfo", "private", "", "public" ] }, + { symbol: [ "QProcess", "private", "", "public" ] }, + { symbol: [ "QProcessEnvironment", "private", "", "public" ] }, + { symbol: [ "QProgressBar", "private", "", "public" ] }, + { symbol: [ "QProgressDialog", "private", "", "public" ] }, + { symbol: [ "QPropertyAnimation", "private", "", "public" ] }, + { symbol: [ "QProximityFilter", "private", "", "public" ] }, + { symbol: [ "QProximityReading", "private", "", "public" ] }, + { symbol: [ "QProximitySensor", "private", "", "public" ] }, + { symbol: [ "QProxyStyle", "private", "", "public" ] }, + { symbol: [ "QPushButton", "private", "", "public" ] }, + { symbol: [ "QQmlAbstractUrlInterceptor", "private", "", "public" ] }, + { symbol: [ "QQmlApplicationEngine", "private", "", "public" ] }, + { symbol: [ "QQmlAttachedPropertiesFunc", "private", "", "public" ] }, + { symbol: [ "QQmlComponent", "private", "", "public" ] }, + { symbol: [ "QQmlContext", "private", "", "public" ] }, + { symbol: [ "QQmlDebuggingEnabler", "private", "", "public" ] }, + { symbol: [ "QQmlEngine", "private", "", "public" ] }, + { symbol: [ "QQmlError", "private", "", "public" ] }, + { symbol: [ "QQmlExpression", "private", "", "public" ] }, + { symbol: [ "QQmlExtensionInterface", "private", "", "public" ] }, + { symbol: [ "QQmlExtensionPlugin", "private", "", "public" ] }, + { symbol: [ "QQmlFile", "private", "", "public" ] }, + { symbol: [ "QQmlFileSelector", "private", "", "public" ] }, + { symbol: [ "QQmlImageProviderBase", "private", "", "public" ] }, + { symbol: [ "QQmlIncubationController", "private", "", "public" ] }, + { symbol: [ "QQmlIncubator", "private", "", "public" ] }, + { symbol: [ "QQmlInfo", "private", "", "public" ] }, + { symbol: [ "QQmlListProperty", "private", "", "public" ] }, + { symbol: [ "QQmlListReference", "private", "", "public" ] }, + { symbol: [ "QQmlNdefRecord", "private", "", "public" ] }, + { symbol: [ "QQmlNetworkAccessManagerFactory", "private", "", "public" ] }, + { symbol: [ "QQmlParserStatus", "private", "", "public" ] }, + { symbol: [ "QQmlProperties", "private", "", "public" ] }, + { symbol: [ "QQmlProperty", "private", "", "public" ] }, + { symbol: [ "QQmlPropertyMap", "private", "", "public" ] }, + { symbol: [ "QQmlPropertyValueSource", "private", "", "public" ] }, + { symbol: [ "QQmlScriptString", "private", "", "public" ] }, + { symbol: [ "QQmlTypeInfo", "private", "", "public" ] }, + { symbol: [ "QQmlTypesExtensionInterface", "private", "", "public" ] }, + { symbol: [ "QQmlWebChannel", "private", "", "public" ] }, + { symbol: [ "QQuaternion", "private", "", "public" ] }, + { symbol: [ "QQueue", "private", "", "public" ] }, + { symbol: [ "QQuickFramebufferObject", "private", "", "public" ] }, + { symbol: [ "QQuickImageProvider", "private", "", "public" ] }, + { symbol: [ "QQuickItem", "private", "", "public" ] }, + { symbol: [ "QQuickItemGrabResult", "private", "", "public" ] }, + { symbol: [ "QQuickPaintedItem", "private", "", "public" ] }, + { symbol: [ "QQuickRenderControl", "private", "", "public" ] }, + { symbol: [ "QQuickTextDocument", "private", "", "public" ] }, + { symbol: [ "QQuickTextureFactory", "private", "", "public" ] }, + { symbol: [ "QQuickTransform", "private", "", "public" ] }, + { symbol: [ "QQuickView", "private", "", "public" ] }, + { symbol: [ "QQuickWidget", "private", "", "public" ] }, + { symbol: [ "QQuickWindow", "private", "", "public" ] }, + { symbol: [ "QRadialGradient", "private", "", "public" ] }, + { symbol: [ "QRadioButton", "private", "", "public" ] }, + { symbol: [ "QRadioData", "private", "", "public" ] }, + { symbol: [ "QRadioDataControl", "private", "", "public" ] }, + { symbol: [ "QRadioTuner", "private", "", "public" ] }, + { symbol: [ "QRadioTunerControl", "private", "", "public" ] }, + { symbol: [ "QRasterWindow", "private", "", "public" ] }, + { symbol: [ "QRawFont", "private", "", "public" ] }, + { symbol: [ "QReadLocker", "private", "", "public" ] }, + { symbol: [ "QReadWriteLock", "private", "", "public" ] }, + { symbol: [ "QRect", "private", "", "public" ] }, + { symbol: [ "QRectF", "private", "", "public" ] }, + { symbol: [ "QRegExp", "private", "", "public" ] }, + { symbol: [ "QRegExpValidator", "private", "", "public" ] }, + { symbol: [ "QRegion", "private", "", "public" ] }, + { symbol: [ "QRegularExpression", "private", "", "public" ] }, + { symbol: [ "QRegularExpressionMatch", "private", "", "public" ] }, + { symbol: [ "QRegularExpressionMatchIterator", "private", "", "public" ] }, + { symbol: [ "QRegularExpressionValidator", "private", "", "public" ] }, + { symbol: [ "QResizeEvent", "private", "", "public" ] }, + { symbol: [ "QResource", "private", "", "public" ] }, + { symbol: [ "QReturnArgument", "private", "", "public" ] }, + { symbol: [ "QRgb", "private", "", "public" ] }, + { symbol: [ "QRotationFilter", "private", "", "public" ] }, + { symbol: [ "QRotationReading", "private", "", "public" ] }, + { symbol: [ "QRotationSensor", "private", "", "public" ] }, + { symbol: [ "QRubberBand", "private", "", "public" ] }, + { symbol: [ "QRunnable", "private", "", "public" ] }, + { symbol: [ "QSGAbstractRenderer", "private", "", "public" ] }, + { symbol: [ "QSGBasicGeometryNode", "private", "", "public" ] }, + { symbol: [ "QSGClipNode", "private", "", "public" ] }, + { symbol: [ "QSGDynamicTexture", "private", "", "public" ] }, + { symbol: [ "QSGEngine", "private", "", "public" ] }, + { symbol: [ "QSGFlatColorMaterial", "private", "", "public" ] }, + { symbol: [ "QSGGeometry", "private", "", "public" ] }, + { symbol: [ "QSGGeometryNode", "private", "", "public" ] }, + { symbol: [ "QSGMaterial", "private", "", "public" ] }, + { symbol: [ "QSGMaterialShader", "private", "", "public" ] }, + { symbol: [ "QSGMaterialType", "private", "", "public" ] }, + { symbol: [ "QSGNode", "private", "", "public" ] }, + { symbol: [ "QSGNodeVisitor", "private", "", "public" ] }, + { symbol: [ "QSGOpacityNode", "private", "", "public" ] }, + { symbol: [ "QSGOpaqueTextureMaterial", "private", "", "public" ] }, + { symbol: [ "QSGRootNode", "private", "", "public" ] }, + { symbol: [ "QSGSimpleMaterial", "private", "", "public" ] }, + { symbol: [ "QSGSimpleMaterialComparableMaterial", "private", "", "public" ] }, + { symbol: [ "QSGSimpleMaterialShader", "private", "", "public" ] }, + { symbol: [ "QSGSimpleRectNode", "private", "", "public" ] }, + { symbol: [ "QSGSimpleTextureNode", "private", "", "public" ] }, + { symbol: [ "QSGTexture", "private", "", "public" ] }, + { symbol: [ "QSGTextureMaterial", "private", "", "public" ] }, + { symbol: [ "QSGTextureProvider", "private", "", "public" ] }, + { symbol: [ "QSGTransformNode", "private", "", "public" ] }, + { symbol: [ "QSGVertexColorMaterial", "private", "", "public" ] }, + { symbol: [ "QSGVideoNodeFactory_I420", "private", "", "public" ] }, + { symbol: [ "QSGVideoNodeFactory_RGB", "private", "", "public" ] }, + { symbol: [ "QSGVideoNodeFactory_Texture", "private", "", "public" ] }, + { symbol: [ "QSGVideoNode_I420", "private", "", "public" ] }, + { symbol: [ "QSGVideoNode_RGB", "private", "", "public" ] }, + { symbol: [ "QSGVideoNode_Texture", "private", "", "public" ] }, + { symbol: [ "QSaveFile", "private", "", "public" ] }, + { symbol: [ "QScopedArrayPointer", "private", "", "public" ] }, + { symbol: [ "QScopedPointer", "private", "", "public" ] }, + { symbol: [ "QScopedPointerArrayDeleter", "private", "", "public" ] }, + { symbol: [ "QScopedPointerDeleteLater", "private", "", "public" ] }, + { symbol: [ "QScopedPointerDeleter", "private", "", "public" ] }, + { symbol: [ "QScopedPointerObjectDeleteLater", "private", "", "public" ] }, + { symbol: [ "QScopedPointerPodDeleter", "private", "", "public" ] }, + { symbol: [ "QScopedValueRollback", "private", "", "public" ] }, + { symbol: [ "QScreen", "private", "", "public" ] }, + { symbol: [ "QScreenOrientationChangeEvent", "private", "", "public" ] }, + { symbol: [ "QScriptClass", "private", "", "public" ] }, + { symbol: [ "QScriptClassPropertyIterator", "private", "", "public" ] }, + { symbol: [ "QScriptContext", "private", "", "public" ] }, + { symbol: [ "QScriptContextInfo", "private", "", "public" ] }, + { symbol: [ "QScriptContextInfoList", "private", "", "public" ] }, + { symbol: [ "QScriptEngine", "private", "", "public" ] }, + { symbol: [ "QScriptEngineAgent", "private", "", "public" ] }, + { symbol: [ "QScriptEngineDebugger", "private", "", "public" ] }, + { symbol: [ "QScriptExtensionInterface", "private", "", "public" ] }, + { symbol: [ "QScriptExtensionPlugin", "private", "", "public" ] }, + { symbol: [ "QScriptProgram", "private", "", "public" ] }, + { symbol: [ "QScriptString", "private", "", "public" ] }, + { symbol: [ "QScriptSyntaxCheckResult", "private", "", "public" ] }, + { symbol: [ "QScriptValue", "private", "", "public" ] }, + { symbol: [ "QScriptValueIterator", "private", "", "public" ] }, + { symbol: [ "QScriptValueList", "private", "", "public" ] }, + { symbol: [ "QScriptable", "private", "", "public" ] }, + { symbol: [ "QScrollArea", "private", "", "public" ] }, + { symbol: [ "QScrollBar", "private", "", "public" ] }, + { symbol: [ "QScrollEvent", "private", "", "public" ] }, + { symbol: [ "QScrollPrepareEvent", "private", "", "public" ] }, + { symbol: [ "QScroller", "private", "", "public" ] }, + { symbol: [ "QScrollerProperties", "private", "", "public" ] }, + { symbol: [ "QSemaphore", "private", "", "public" ] }, + { symbol: [ "QSensor", "private", "", "public" ] }, + { symbol: [ "QSensorBackend", "private", "", "public" ] }, + { symbol: [ "QSensorBackendFactory", "private", "", "public" ] }, + { symbol: [ "QSensorChangesInterface", "private", "", "public" ] }, + { symbol: [ "QSensorFilter", "private", "", "public" ] }, + { symbol: [ "QSensorGesture", "private", "", "public" ] }, + { symbol: [ "QSensorGestureManager", "private", "", "public" ] }, + { symbol: [ "QSensorGesturePluginInterface", "private", "", "public" ] }, + { symbol: [ "QSensorGestureRecognizer", "private", "", "public" ] }, + { symbol: [ "QSensorManager", "private", "", "public" ] }, + { symbol: [ "QSensorPluginInterface", "private", "", "public" ] }, + { symbol: [ "QSensorReading", "private", "", "public" ] }, + { symbol: [ "QSequentialAnimationGroup", "private", "", "public" ] }, + { symbol: [ "QSequentialIterable", "private", "", "public" ] }, + { symbol: [ "QSerialPort", "private", "", "public" ] }, + { symbol: [ "QSerialPortInfo", "private", "", "public" ] }, + { symbol: [ "QSessionManager", "private", "", "public" ] }, + { symbol: [ "QSet", "private", "", "public" ] }, + { symbol: [ "QSetIterator", "private", "", "public" ] }, + { symbol: [ "QSettings", "private", "", "public" ] }, + { symbol: [ "QSharedData", "private", "", "public" ] }, + { symbol: [ "QSharedDataPointer", "private", "", "public" ] }, + { symbol: [ "QSharedMemory", "private", "", "public" ] }, + { symbol: [ "QSharedPointer", "private", "", "public" ] }, + { symbol: [ "QShortcut", "private", "", "public" ] }, + { symbol: [ "QShortcutEvent", "private", "", "public" ] }, + { symbol: [ "QShowEvent", "private", "", "public" ] }, + { symbol: [ "QSignalBlocker", "private", "", "public" ] }, + { symbol: [ "QSignalMapper", "private", "", "public" ] }, + { symbol: [ "QSignalSpy", "private", "", "public" ] }, + { symbol: [ "QSignalTransition", "private", "", "public" ] }, + { symbol: [ "QSimpleXmlNodeModel", "private", "", "public" ] }, + { symbol: [ "QSize", "private", "", "public" ] }, + { symbol: [ "QSizeF", "private", "", "public" ] }, + { symbol: [ "QSizeGrip", "private", "", "public" ] }, + { symbol: [ "QSizePolicy", "private", "", "public" ] }, + { symbol: [ "QSlider", "private", "", "public" ] }, + { symbol: [ "QSocketNotifier", "private", "", "public" ] }, + { symbol: [ "QSortFilterProxyModel", "private", "", "public" ] }, + { symbol: [ "QSound", "private", "", "public" ] }, + { symbol: [ "QSoundEffect", "private", "", "public" ] }, + { symbol: [ "QSourceLocation", "private", "", "public" ] }, + { symbol: [ "QSpacerItem", "private", "", "public" ] }, + { symbol: [ "QSpinBox", "private", "", "public" ] }, + { symbol: [ "QSplashScreen", "private", "", "public" ] }, + { symbol: [ "QSplitter", "private", "", "public" ] }, + { symbol: [ "QSplitterHandle", "private", "", "public" ] }, + { symbol: [ "QSpontaneKeyEvent", "private", "", "public" ] }, + { symbol: [ "QSql", "private", "", "public" ] }, + { symbol: [ "QSqlDatabase", "private", "", "public" ] }, + { symbol: [ "QSqlDriver", "private", "", "public" ] }, + { symbol: [ "QSqlDriverCreator", "private", "", "public" ] }, + { symbol: [ "QSqlDriverCreatorBase", "private", "", "public" ] }, + { symbol: [ "QSqlDriverPlugin", "private", "", "public" ] }, + { symbol: [ "QSqlError", "private", "", "public" ] }, + { symbol: [ "QSqlField", "private", "", "public" ] }, + { symbol: [ "QSqlIndex", "private", "", "public" ] }, + { symbol: [ "QSqlQuery", "private", "", "public" ] }, + { symbol: [ "QSqlQueryModel", "private", "", "public" ] }, + { symbol: [ "QSqlRecord", "private", "", "public" ] }, + { symbol: [ "QSqlRelation", "private", "", "public" ] }, + { symbol: [ "QSqlRelationalDelegate", "private", "", "public" ] }, + { symbol: [ "QSqlRelationalTableModel", "private", "", "public" ] }, + { symbol: [ "QSqlResult", "private", "", "public" ] }, + { symbol: [ "QSqlTableModel", "private", "", "public" ] }, + { symbol: [ "QSsl", "private", "", "public" ] }, + { symbol: [ "QSslCertificate", "private", "", "public" ] }, + { symbol: [ "QSslCertificateExtension", "private", "", "public" ] }, + { symbol: [ "QSslCipher", "private", "", "public" ] }, + { symbol: [ "QSslConfiguration", "private", "", "public" ] }, + { symbol: [ "QSslError", "private", "", "public" ] }, + { symbol: [ "QSslKey", "private", "", "public" ] }, + { symbol: [ "QSslSocket", "private", "", "public" ] }, + { symbol: [ "QStack", "private", "", "public" ] }, + { symbol: [ "QStackedLayout", "private", "", "public" ] }, + { symbol: [ "QStackedWidget", "private", "", "public" ] }, + { symbol: [ "QStandardItem", "private", "", "public" ] }, + { symbol: [ "QStandardItemEditorCreator", "private", "", "public" ] }, + { symbol: [ "QStandardItemModel", "private", "", "public" ] }, + { symbol: [ "QStandardPaths", "private", "", "public" ] }, + { symbol: [ "QState", "private", "", "public" ] }, + { symbol: [ "QStateMachine", "private", "", "public" ] }, + { symbol: [ "QStaticArrayData", "private", "", "public" ] }, + { symbol: [ "QStaticAssertFailure", "private", "", "public" ] }, + { symbol: [ "QStaticByteArrayData", "private", "", "public" ] }, + { symbol: [ "QStaticPlugin", "private", "", "public" ] }, + { symbol: [ "QStaticStringData", "private", "", "public" ] }, + { symbol: [ "QStaticText", "private", "", "public" ] }, + { symbol: [ "QStatusBar", "private", "", "public" ] }, + { symbol: [ "QStatusTipEvent", "private", "", "public" ] }, + { symbol: [ "QStorageInfo", "private", "", "public" ] }, + { symbol: [ "QString", "private", "", "public" ] }, + { symbol: [ "QStringBuilder", "private", "", "public" ] }, + { symbol: [ "QStringData", "private", "", "public" ] }, + { symbol: [ "QStringDataPtr", "private", "", "public" ] }, + { symbol: [ "QStringList", "private", "", "public" ] }, + { symbol: [ "QStringListIterator", "private", "", "public" ] }, + { symbol: [ "QStringListModel", "private", "", "public" ] }, + { symbol: [ "QStringMatcher", "private", "", "public" ] }, + { symbol: [ "QStringRef", "private", "", "public" ] }, + { symbol: [ "QStyle", "private", "", "public" ] }, + { symbol: [ "QStyleFactory", "private", "", "public" ] }, + { symbol: [ "QStyleHintReturn", "private", "", "public" ] }, + { symbol: [ "QStyleHintReturnMask", "private", "", "public" ] }, + { symbol: [ "QStyleHintReturnVariant", "private", "", "public" ] }, + { symbol: [ "QStyleHints", "private", "", "public" ] }, + { symbol: [ "QStyleOption", "private", "", "public" ] }, + { symbol: [ "QStyleOptionButton", "private", "", "public" ] }, + { symbol: [ "QStyleOptionComboBox", "private", "", "public" ] }, + { symbol: [ "QStyleOptionComplex", "private", "", "public" ] }, + { symbol: [ "QStyleOptionDockWidget", "private", "", "public" ] }, + { symbol: [ "QStyleOptionDockWidgetV2", "private", "", "public" ] }, + { symbol: [ "QStyleOptionFocusRect", "private", "", "public" ] }, + { symbol: [ "QStyleOptionFrame", "private", "", "public" ] }, + { symbol: [ "QStyleOptionFrameV2", "private", "", "public" ] }, + { symbol: [ "QStyleOptionFrameV3", "private", "", "public" ] }, + { symbol: [ "QStyleOptionGraphicsItem", "private", "", "public" ] }, + { symbol: [ "QStyleOptionGroupBox", "private", "", "public" ] }, + { symbol: [ "QStyleOptionHeader", "private", "", "public" ] }, + { symbol: [ "QStyleOptionMenuItem", "private", "", "public" ] }, + { symbol: [ "QStyleOptionProgressBar", "private", "", "public" ] }, + { symbol: [ "QStyleOptionProgressBarV2", "private", "", "public" ] }, + { symbol: [ "QStyleOptionRubberBand", "private", "", "public" ] }, + { symbol: [ "QStyleOptionSizeGrip", "private", "", "public" ] }, + { symbol: [ "QStyleOptionSlider", "private", "", "public" ] }, + { symbol: [ "QStyleOptionSpinBox", "private", "", "public" ] }, + { symbol: [ "QStyleOptionTab", "private", "", "public" ] }, + { symbol: [ "QStyleOptionTabBarBase", "private", "", "public" ] }, + { symbol: [ "QStyleOptionTabBarBaseV2", "private", "", "public" ] }, + { symbol: [ "QStyleOptionTabV2", "private", "", "public" ] }, + { symbol: [ "QStyleOptionTabV3", "private", "", "public" ] }, + { symbol: [ "QStyleOptionTabWidgetFrame", "private", "", "public" ] }, + { symbol: [ "QStyleOptionTabWidgetFrameV2", "private", "", "public" ] }, + { symbol: [ "QStyleOptionTitleBar", "private", "", "public" ] }, + { symbol: [ "QStyleOptionToolBar", "private", "", "public" ] }, + { symbol: [ "QStyleOptionToolBox", "private", "", "public" ] }, + { symbol: [ "QStyleOptionToolBoxV2", "private", "", "public" ] }, + { symbol: [ "QStyleOptionToolButton", "private", "", "public" ] }, + { symbol: [ "QStyleOptionViewItem", "private", "", "public" ] }, + { symbol: [ "QStyleOptionViewItemV2", "private", "", "public" ] }, + { symbol: [ "QStyleOptionViewItemV3", "private", "", "public" ] }, + { symbol: [ "QStyleOptionViewItemV4", "private", "", "public" ] }, + { symbol: [ "QStylePainter", "private", "", "public" ] }, + { symbol: [ "QStylePlugin", "private", "", "public" ] }, + { symbol: [ "QStyledItemDelegate", "private", "", "public" ] }, + { symbol: [ "QSurface", "private", "", "public" ] }, + { symbol: [ "QSurfaceFormat", "private", "", "public" ] }, + { symbol: [ "QSvgGenerator", "private", "", "public" ] }, + { symbol: [ "QSvgRenderer", "private", "", "public" ] }, + { symbol: [ "QSvgWidget", "private", "", "public" ] }, + { symbol: [ "QSwipeGesture", "private", "", "public" ] }, + { symbol: [ "QSyntaxHighlighter", "private", "", "public" ] }, + { symbol: [ "QSysInfo", "private", "", "public" ] }, + { symbol: [ "QSystemSemaphore", "private", "", "public" ] }, + { symbol: [ "QSystemTrayIcon", "private", "", "public" ] }, + { symbol: [ "QTabBar", "private", "", "public" ] }, + { symbol: [ "QTabWidget", "private", "", "public" ] }, + { symbol: [ "QTableView", "private", "", "public" ] }, + { symbol: [ "QTableWidget", "private", "", "public" ] }, + { symbol: [ "QTableWidgetItem", "private", "", "public" ] }, + { symbol: [ "QTableWidgetSelectionRange", "private", "", "public" ] }, + { symbol: [ "QTabletEvent", "private", "", "public" ] }, + { symbol: [ "QTapAndHoldGesture", "private", "", "public" ] }, + { symbol: [ "QTapFilter", "private", "", "public" ] }, + { symbol: [ "QTapGesture", "private", "", "public" ] }, + { symbol: [ "QTapReading", "private", "", "public" ] }, + { symbol: [ "QTapSensor", "private", "", "public" ] }, + { symbol: [ "QTcpServer", "private", "", "public" ] }, + { symbol: [ "QTcpSocket", "private", "", "public" ] }, + { symbol: [ "QTemporaryDir", "private", "", "public" ] }, + { symbol: [ "QTemporaryFile", "private", "", "public" ] }, + { symbol: [ "QTest", "private", "", "public" ] }, + { symbol: [ "QTestAccessibility", "private", "", "public" ] }, + { symbol: [ "QTestData", "private", "", "public" ] }, + { symbol: [ "QTestDelayEvent", "private", "", "public" ] }, + { symbol: [ "QTestEvent", "private", "", "public" ] }, + { symbol: [ "QTestEventList", "private", "", "public" ] }, + { symbol: [ "QTestEventLoop", "private", "", "public" ] }, + { symbol: [ "QTestKeyClicksEvent", "private", "", "public" ] }, + { symbol: [ "QTestKeyEvent", "private", "", "public" ] }, + { symbol: [ "QTestMouseEvent", "private", "", "public" ] }, + { symbol: [ "QTextBlock", "private", "", "public" ] }, + { symbol: [ "QTextBlockFormat", "private", "", "public" ] }, + { symbol: [ "QTextBlockGroup", "private", "", "public" ] }, + { symbol: [ "QTextBlockUserData", "private", "", "public" ] }, + { symbol: [ "QTextBoundaryFinder", "private", "", "public" ] }, + { symbol: [ "QTextBrowser", "private", "", "public" ] }, + { symbol: [ "QTextCharFormat", "private", "", "public" ] }, + { symbol: [ "QTextCodec", "private", "", "public" ] }, + { symbol: [ "QTextCursor", "private", "", "public" ] }, + { symbol: [ "QTextDecoder", "private", "", "public" ] }, + { symbol: [ "QTextDocument", "private", "", "public" ] }, + { symbol: [ "QTextDocumentFragment", "private", "", "public" ] }, + { symbol: [ "QTextDocumentWriter", "private", "", "public" ] }, + { symbol: [ "QTextEdit", "private", "", "public" ] }, + { symbol: [ "QTextEncoder", "private", "", "public" ] }, + { symbol: [ "QTextFormat", "private", "", "public" ] }, + { symbol: [ "QTextFragment", "private", "", "public" ] }, + { symbol: [ "QTextFrame", "private", "", "public" ] }, + { symbol: [ "QTextFrameFormat", "private", "", "public" ] }, + { symbol: [ "QTextFrameLayoutData", "private", "", "public" ] }, + { symbol: [ "QTextImageFormat", "private", "", "public" ] }, + { symbol: [ "QTextInlineObject", "private", "", "public" ] }, + { symbol: [ "QTextItem", "private", "", "public" ] }, + { symbol: [ "QTextLayout", "private", "", "public" ] }, + { symbol: [ "QTextLength", "private", "", "public" ] }, + { symbol: [ "QTextLine", "private", "", "public" ] }, + { symbol: [ "QTextList", "private", "", "public" ] }, + { symbol: [ "QTextListFormat", "private", "", "public" ] }, + { symbol: [ "QTextObject", "private", "", "public" ] }, + { symbol: [ "QTextObjectInterface", "private", "", "public" ] }, + { symbol: [ "QTextOption", "private", "", "public" ] }, + { symbol: [ "QTextStream", "private", "", "public" ] }, + { symbol: [ "QTextStreamFunction", "private", "", "public" ] }, + { symbol: [ "QTextStreamManipulator", "private", "", "public" ] }, + { symbol: [ "QTextTable", "private", "", "public" ] }, + { symbol: [ "QTextTableCell", "private", "", "public" ] }, + { symbol: [ "QTextTableCellFormat", "private", "", "public" ] }, + { symbol: [ "QTextTableFormat", "private", "", "public" ] }, + { symbol: [ "QThread", "private", "", "public" ] }, + { symbol: [ "QThreadPool", "private", "", "public" ] }, + { symbol: [ "QThreadStorage", "private", "", "public" ] }, + { symbol: [ "QThreadStorageData", "private", "", "public" ] }, + { symbol: [ "QTileRules", "private", "", "public" ] }, + { symbol: [ "QTiltFilter", "private", "", "public" ] }, + { symbol: [ "QTiltReading", "private", "", "public" ] }, + { symbol: [ "QTiltSensor", "private", "", "public" ] }, + { symbol: [ "QTime", "private", "", "public" ] }, + { symbol: [ "QTimeEdit", "private", "", "public" ] }, + { symbol: [ "QTimeLine", "private", "", "public" ] }, + { symbol: [ "QTimeZone", "private", "", "public" ] }, + { symbol: [ "QTimer", "private", "", "public" ] }, + { symbol: [ "QTimerEvent", "private", "", "public" ] }, + { symbol: [ "QToolBar", "private", "", "public" ] }, + { symbol: [ "QToolBarChangeEvent", "private", "", "public" ] }, + { symbol: [ "QToolBox", "private", "", "public" ] }, + { symbol: [ "QToolButton", "private", "", "public" ] }, + { symbol: [ "QToolTip", "private", "", "public" ] }, + { symbol: [ "QTouchDevice", "private", "", "public" ] }, + { symbol: [ "QTouchEvent", "private", "", "public" ] }, + { symbol: [ "QTransform", "private", "", "public" ] }, + { symbol: [ "QTranslator", "private", "", "public" ] }, + { symbol: [ "QTreeView", "private", "", "public" ] }, + { symbol: [ "QTreeWidget", "private", "", "public" ] }, + { symbol: [ "QTreeWidgetItem", "private", "", "public" ] }, + { symbol: [ "QTreeWidgetItemIterator", "private", "", "public" ] }, + { symbol: [ "QTypeInfo", "private", "", "public" ] }, + { symbol: [ "QTypeInfoMerger", "private", "", "public" ] }, + { symbol: [ "QUdpSocket", "private", "", "public" ] }, + { symbol: [ "QUiLoader", "private", "", "public" ] }, + { symbol: [ "QUndoCommand", "private", "", "public" ] }, + { symbol: [ "QUndoGroup", "private", "", "public" ] }, + { symbol: [ "QUndoStack", "private", "", "public" ] }, + { symbol: [ "QUndoView", "private", "", "public" ] }, + { symbol: [ "QUnhandledException", "private", "", "public" ] }, + { symbol: [ "QUrl", "private", "", "public" ] }, + { symbol: [ "QUrlQuery", "private", "", "public" ] }, + { symbol: [ "QUrlTwoFlags", "private", "", "public" ] }, + { symbol: [ "QUuid", "private", "", "public" ] }, + { symbol: [ "QVBoxLayout", "private", "", "public" ] }, + { symbol: [ "QValidator", "private", "", "public" ] }, + { symbol: [ "QVarLengthArray", "private", "", "public" ] }, + { symbol: [ "QVariant", "private", "", "public" ] }, + { symbol: [ "QVariantAnimation", "private", "", "public" ] }, + { symbol: [ "QVariantComparisonHelper", "private", "", "public" ] }, + { symbol: [ "QVariantHash", "private", "", "public" ] }, + { symbol: [ "QVariantList", "private", "", "public" ] }, + { symbol: [ "QVariantMap", "private", "", "public" ] }, + { symbol: [ "QVector", "private", "", "public" ] }, + { symbol: [ "QVector2D", "private", "", "public" ] }, + { symbol: [ "QVector3D", "private", "", "public" ] }, + { symbol: [ "QVector4D", "private", "", "public" ] }, + { symbol: [ "QVectorIterator", "private", "", "public" ] }, + { symbol: [ "QVideoDeviceSelectorControl", "private", "", "public" ] }, + { symbol: [ "QVideoEncoderSettings", "private", "", "public" ] }, + { symbol: [ "QVideoEncoderSettingsControl", "private", "", "public" ] }, + { symbol: [ "QVideoFrame", "private", "", "public" ] }, + { symbol: [ "QVideoProbe", "private", "", "public" ] }, + { symbol: [ "QVideoRendererControl", "private", "", "public" ] }, + { symbol: [ "QVideoSurfaceFormat", "private", "", "public" ] }, + { symbol: [ "QVideoWidget", "private", "", "public" ] }, + { symbol: [ "QVideoWidgetControl", "private", "", "public" ] }, + { symbol: [ "QVideoWindowControl", "private", "", "public" ] }, + { symbol: [ "QWGLNativeContext", "private", "", "public" ] }, + { symbol: [ "QWaitCondition", "private", "", "public" ] }, + { symbol: [ "QWeakPointer", "private", "", "public" ] }, + { symbol: [ "QWebChannel", "private", "", "public" ] }, + { symbol: [ "QWebChannelAbstractTransport", "private", "", "public" ] }, + { symbol: [ "QWebDatabase", "private", "", "public" ] }, + { symbol: [ "QWebElement", "private", "", "public" ] }, + { symbol: [ "QWebElementCollection", "private", "", "public" ] }, + { symbol: [ "QWebFrame", "private", "", "public" ] }, + { symbol: [ "QWebFullScreenVideoHandler", "private", "", "public" ] }, + { symbol: [ "QWebHapticFeedbackPlayer", "private", "", "public" ] }, + { symbol: [ "QWebHistory", "private", "", "public" ] }, + { symbol: [ "QWebHistoryInterface", "private", "", "public" ] }, + { symbol: [ "QWebHistoryItem", "private", "", "public" ] }, + { symbol: [ "QWebHitTestResult", "private", "", "public" ] }, + { symbol: [ "QWebInspector", "private", "", "public" ] }, + { symbol: [ "QWebKitPlatformPlugin", "private", "", "public" ] }, + { symbol: [ "QWebNotificationData", "private", "", "public" ] }, + { symbol: [ "QWebNotificationPresenter", "private", "", "public" ] }, + { symbol: [ "QWebPage", "private", "", "public" ] }, + { symbol: [ "QWebPluginFactory", "private", "", "public" ] }, + { symbol: [ "QWebSecurityOrigin", "private", "", "public" ] }, + { symbol: [ "QWebSelectData", "private", "", "public" ] }, + { symbol: [ "QWebSelectMethod", "private", "", "public" ] }, + { symbol: [ "QWebSettings", "private", "", "public" ] }, + { symbol: [ "QWebSocket", "private", "", "public" ] }, + { symbol: [ "QWebSocketCorsAuthenticator", "private", "", "public" ] }, + { symbol: [ "QWebSocketServer", "private", "", "public" ] }, + { symbol: [ "QWebSpellChecker", "private", "", "public" ] }, + { symbol: [ "QWebTouchModifier", "private", "", "public" ] }, + { symbol: [ "QWebView", "private", "", "public" ] }, + { symbol: [ "QWhatsThis", "private", "", "public" ] }, + { symbol: [ "QWhatsThisClickedEvent", "private", "", "public" ] }, + { symbol: [ "QWheelEvent", "private", "", "public" ] }, + { symbol: [ "QWidget", "private", "", "public" ] }, + { symbol: [ "QWidgetAction", "private", "", "public" ] }, + { symbol: [ "QWidgetData", "private", "", "public" ] }, + { symbol: [ "QWidgetItem", "private", "", "public" ] }, + { symbol: [ "QWidgetItemV2", "private", "", "public" ] }, + { symbol: [ "QWidgetList", "private", "", "public" ] }, + { symbol: [ "QWidgetMapper", "private", "", "public" ] }, + { symbol: [ "QWidgetSet", "private", "", "public" ] }, + { symbol: [ "QWinColorizationChangeEvent", "private", "", "public" ] }, + { symbol: [ "QWinCompositionChangeEvent", "private", "", "public" ] }, + { symbol: [ "QWinEvent", "private", "", "public" ] }, + { symbol: [ "QWinEventNotifier", "private", "", "public" ] }, + { symbol: [ "QWinEventNotifier", "private", "", "public" ] }, + { symbol: [ "QWinJumpList", "private", "", "public" ] }, + { symbol: [ "QWinJumpListCategory", "private", "", "public" ] }, + { symbol: [ "QWinJumpListItem", "private", "", "public" ] }, + { symbol: [ "QWinMime", "private", "", "public" ] }, + { symbol: [ "QWinTaskbarButton", "private", "", "public" ] }, + { symbol: [ "QWinTaskbarProgress", "private", "", "public" ] }, + { symbol: [ "QWinThumbnailToolBar", "private", "", "public" ] }, + { symbol: [ "QWinThumbnailToolButton", "private", "", "public" ] }, + { symbol: [ "QWindow", "private", "", "public" ] }, + { symbol: [ "QWindowList", "private", "", "public" ] }, + { symbol: [ "QWindowStateChangeEvent", "private", "", "public" ] }, + { symbol: [ "QWizard", "private", "", "public" ] }, + { symbol: [ "QWizardPage", "private", "", "public" ] }, + { symbol: [ "QWriteLocker", "private", "", "public" ] }, + { symbol: [ "QXcbWindowFunctions", "private", "", "public" ] }, + { symbol: [ "QXmlAttributes", "private", "", "public" ] }, + { symbol: [ "QXmlContentHandler", "private", "", "public" ] }, + { symbol: [ "QXmlDTDHandler", "private", "", "public" ] }, + { symbol: [ "QXmlDeclHandler", "private", "", "public" ] }, + { symbol: [ "QXmlDefaultHandler", "private", "", "public" ] }, + { symbol: [ "QXmlEntityResolver", "private", "", "public" ] }, + { symbol: [ "QXmlErrorHandler", "private", "", "public" ] }, + { symbol: [ "QXmlFormatter", "private", "", "public" ] }, + { symbol: [ "QXmlInputSource", "private", "", "public" ] }, + { symbol: [ "QXmlItem", "private", "", "public" ] }, + { symbol: [ "QXmlLexicalHandler", "private", "", "public" ] }, + { symbol: [ "QXmlLocator", "private", "", "public" ] }, + { symbol: [ "QXmlName", "private", "", "public" ] }, + { symbol: [ "QXmlNamePool", "private", "", "public" ] }, + { symbol: [ "QXmlNamespaceSupport", "private", "", "public" ] }, + { symbol: [ "QXmlNodeModelIndex", "private", "", "public" ] }, + { symbol: [ "QXmlParseException", "private", "", "public" ] }, + { symbol: [ "QXmlQuery", "private", "", "public" ] }, + { symbol: [ "QXmlReader", "private", "", "public" ] }, + { symbol: [ "QXmlResultItems", "private", "", "public" ] }, + { symbol: [ "QXmlSchema", "private", "", "public" ] }, + { symbol: [ "QXmlSchemaValidator", "private", "", "public" ] }, + { symbol: [ "QXmlSerializer", "private", "", "public" ] }, + { symbol: [ "QXmlSimpleReader", "private", "", "public" ] }, + { symbol: [ "QXmlStreamAttribute", "private", "", "public" ] }, + { symbol: [ "QXmlStreamAttributes", "private", "", "public" ] }, + { symbol: [ "QXmlStreamEntityDeclaration", "private", "", "public" ] }, + { symbol: [ "QXmlStreamEntityDeclarations", "private", "", "public" ] }, + { symbol: [ "QXmlStreamEntityResolver", "private", "", "public" ] }, + { symbol: [ "QXmlStreamNamespaceDeclaration", "private", "", "public" ] }, + { symbol: [ "QXmlStreamNamespaceDeclarations", "private", "", "public" ] }, + { symbol: [ "QXmlStreamNotationDeclaration", "private", "", "public" ] }, + { symbol: [ "QXmlStreamNotationDeclarations", "private", "", "public" ] }, + { symbol: [ "QXmlStreamReader", "private", "", "public" ] }, + { symbol: [ "QXmlStreamStringRef", "private", "", "public" ] }, + { symbol: [ "QXmlStreamWriter", "private", "", "public" ] }, + { symbol: [ "Q_IPV6ADDR", "private", "", "public" ] }, + { symbol: [ "Q_PID", "private", "", "public" ] }, + { symbol: [ "Qt", "private", "", "public" ] }, + { symbol: [ "QtAlgorithms", "private", "", "public" ] }, + { symbol: [ "QtBluetooth", "private", "", "public" ] }, + { symbol: [ "QtBluetoothDepends", "private", "", "public" ] }, + { symbol: [ "QtBluetoothVersion", "private", "", "public" ] }, + { symbol: [ "QtCLucene", "private", "", "public" ] }, + { symbol: [ "QtCLuceneDepends", "private", "", "public" ] }, + { symbol: [ "QtCLuceneVersion", "private", "", "public" ] }, + { symbol: [ "QtCleanUpFunction", "private", "", "public" ] }, + { symbol: [ "QtConcurrent", "private", "", "public" ] }, + { symbol: [ "QtConcurrentDepends", "private", "", "public" ] }, + { symbol: [ "QtConcurrentFilter", "private", "", "public" ] }, + { symbol: [ "QtConcurrentMap", "private", "", "public" ] }, + { symbol: [ "QtConcurrentRun", "private", "", "public" ] }, + { symbol: [ "QtConcurrentVersion", "private", "", "public" ] }, + { symbol: [ "QtConfig", "private", "", "public" ] }, + { symbol: [ "QtContainerFwd", "private", "", "public" ] }, + { symbol: [ "QtCore", "private", "", "public" ] }, + { symbol: [ "QtCoreDepends", "private", "", "public" ] }, + { symbol: [ "QtCoreVersion", "private", "", "public" ] }, + { symbol: [ "QtDBus", "private", "", "public" ] }, + { symbol: [ "QtDBusDepends", "private", "", "public" ] }, + { symbol: [ "QtDBusVersion", "private", "", "public" ] }, + { symbol: [ "QtDebug", "private", "", "public" ] }, + { symbol: [ "QtDeclarative", "private", "", "public" ] }, + { symbol: [ "QtDeclarativeDepends", "private", "", "public" ] }, + { symbol: [ "QtDeclarativeVersion", "private", "", "public" ] }, + { symbol: [ "QtDesigner", "private", "", "public" ] }, + { symbol: [ "QtDesignerComponents", "private", "", "public" ] }, + { symbol: [ "QtDesignerComponentsDepends", "private", "", "public" ] }, + { symbol: [ "QtDesignerComponentsVersion", "private", "", "public" ] }, + { symbol: [ "QtDesignerDepends", "private", "", "public" ] }, + { symbol: [ "QtDesignerVersion", "private", "", "public" ] }, + { symbol: [ "QtEndian", "private", "", "public" ] }, + { symbol: [ "QtEvents", "private", "", "public" ] }, + { symbol: [ "QtGlobal", "private", "", "public" ] }, + { symbol: [ "QtGui", "private", "", "public" ] }, + { symbol: [ "QtGuiDepends", "private", "", "public" ] }, + { symbol: [ "QtGuiVersion", "private", "", "public" ] }, + { symbol: [ "QtHelp", "private", "", "public" ] }, + { symbol: [ "QtHelpDepends", "private", "", "public" ] }, + { symbol: [ "QtHelpVersion", "private", "", "public" ] }, + { symbol: [ "QtLocation", "private", "", "public" ] }, + { symbol: [ "QtLocationDepends", "private", "", "public" ] }, + { symbol: [ "QtLocationVersion", "private", "", "public" ] }, + { symbol: [ "QtMath", "private", "", "public" ] }, + { symbol: [ "QtMessageHandler", "private", "", "public" ] }, + { symbol: [ "QtMsgHandler", "private", "", "public" ] }, + { symbol: [ "QtMultimedia", "private", "", "public" ] }, + { symbol: [ "QtMultimediaDepends", "private", "", "public" ] }, + { symbol: [ "QtMultimediaQuick_p", "private", "", "public" ] }, + { symbol: [ "QtMultimediaQuick_pDepends", "private", "", "public" ] }, + { symbol: [ "QtMultimediaQuick_pVersion", "private", "", "public" ] }, + { symbol: [ "QtMultimediaVersion", "private", "", "public" ] }, + { symbol: [ "QtMultimediaWidgets", "private", "", "public" ] }, + { symbol: [ "QtMultimediaWidgetsDepends", "private", "", "public" ] }, + { symbol: [ "QtMultimediaWidgetsVersion", "private", "", "public" ] }, + { symbol: [ "QtNetwork", "private", "", "public" ] }, + { symbol: [ "QtNetworkDepends", "private", "", "public" ] }, + { symbol: [ "QtNetworkVersion", "private", "", "public" ] }, + { symbol: [ "QtNfc", "private", "", "public" ] }, + { symbol: [ "QtNfcDepends", "private", "", "public" ] }, + { symbol: [ "QtNfcVersion", "private", "", "public" ] }, + { symbol: [ "QtNumeric", "private", "", "public" ] }, + { symbol: [ "QtOpenGL", "private", "", "public" ] }, + { symbol: [ "QtOpenGLDepends", "private", "", "public" ] }, + { symbol: [ "QtOpenGLExtensions", "private", "", "public" ] }, + { symbol: [ "QtOpenGLExtensionsDepends", "private", "", "public" ] }, + { symbol: [ "QtOpenGLExtensionsVersion", "private", "", "public" ] }, + { symbol: [ "QtOpenGLVersion", "private", "", "public" ] }, + { symbol: [ "QtPlatformHeaders", "private", "", "public" ] }, + { symbol: [ "QtPlatformHeadersDepends", "private", "", "public" ] }, + { symbol: [ "QtPlatformHeadersVersion", "private", "", "public" ] }, + { symbol: [ "QtPlatformSupport", "private", "", "public" ] }, + { symbol: [ "QtPlatformSupportDepends", "private", "", "public" ] }, + { symbol: [ "QtPlatformSupportVersion", "private", "", "public" ] }, + { symbol: [ "QtPlugin", "private", "", "public" ] }, + { symbol: [ "QtPluginInstanceFunction", "private", "", "public" ] }, + { symbol: [ "QtPluginMetaDataFunction", "private", "", "public" ] }, + { symbol: [ "QtPositioning", "private", "", "public" ] }, + { symbol: [ "QtPositioningDepends", "private", "", "public" ] }, + { symbol: [ "QtPositioningVersion", "private", "", "public" ] }, + { symbol: [ "QtPrintSupport", "private", "", "public" ] }, + { symbol: [ "QtPrintSupportDepends", "private", "", "public" ] }, + { symbol: [ "QtPrintSupportVersion", "private", "", "public" ] }, + { symbol: [ "QtQml", "private", "", "public" ] }, + { symbol: [ "QtQmlDepends", "private", "", "public" ] }, + { symbol: [ "QtQmlVersion", "private", "", "public" ] }, + { symbol: [ "QtQuick", "private", "", "public" ] }, + { symbol: [ "QtQuickDepends", "private", "", "public" ] }, + { symbol: [ "QtQuickParticles", "private", "", "public" ] }, + { symbol: [ "QtQuickParticlesDepends", "private", "", "public" ] }, + { symbol: [ "QtQuickParticlesVersion", "private", "", "public" ] }, + { symbol: [ "QtQuickTest", "private", "", "public" ] }, + { symbol: [ "QtQuickTestDepends", "private", "", "public" ] }, + { symbol: [ "QtQuickTestVersion", "private", "", "public" ] }, + { symbol: [ "QtQuickVersion", "private", "", "public" ] }, + { symbol: [ "QtQuickWidgets", "private", "", "public" ] }, + { symbol: [ "QtQuickWidgetsDepends", "private", "", "public" ] }, + { symbol: [ "QtQuickWidgetsVersion", "private", "", "public" ] }, + { symbol: [ "QtScript", "private", "", "public" ] }, + { symbol: [ "QtScriptDepends", "private", "", "public" ] }, + { symbol: [ "QtScriptTools", "private", "", "public" ] }, + { symbol: [ "QtScriptToolsDepends", "private", "", "public" ] }, + { symbol: [ "QtScriptToolsVersion", "private", "", "public" ] }, + { symbol: [ "QtScriptVersion", "private", "", "public" ] }, + { symbol: [ "QtSensors", "private", "", "public" ] }, + { symbol: [ "QtSensorsDepends", "private", "", "public" ] }, + { symbol: [ "QtSensorsVersion", "private", "", "public" ] }, + { symbol: [ "QtSerialPort", "private", "", "public" ] }, + { symbol: [ "QtSerialPortDepends", "private", "", "public" ] }, + { symbol: [ "QtSerialPortVersion", "private", "", "public" ] }, + { symbol: [ "QtSql", "private", "", "public" ] }, + { symbol: [ "QtSqlDepends", "private", "", "public" ] }, + { symbol: [ "QtSqlVersion", "private", "", "public" ] }, + { symbol: [ "QtSvg", "private", "", "public" ] }, + { symbol: [ "QtSvgDepends", "private", "", "public" ] }, + { symbol: [ "QtSvgVersion", "private", "", "public" ] }, + { symbol: [ "QtTest", "private", "", "public" ] }, + { symbol: [ "QtTestDepends", "private", "", "public" ] }, + { symbol: [ "QtTestGui", "private", "", "public" ] }, + { symbol: [ "QtTestVersion", "private", "", "public" ] }, + { symbol: [ "QtTestWidgets", "private", "", "public" ] }, + { symbol: [ "QtUiTools", "private", "", "public" ] }, + { symbol: [ "QtUiToolsDepends", "private", "", "public" ] }, + { symbol: [ "QtUiToolsVersion", "private", "", "public" ] }, + { symbol: [ "QtWebChannel", "private", "", "public" ] }, + { symbol: [ "QtWebChannelDepends", "private", "", "public" ] }, + { symbol: [ "QtWebChannelVersion", "private", "", "public" ] }, + { symbol: [ "QtWebKit", "private", "", "public" ] }, + { symbol: [ "QtWebKitDepends", "private", "", "public" ] }, + { symbol: [ "QtWebKitVersion", "private", "", "public" ] }, + { symbol: [ "QtWebKitWidgets", "private", "", "public" ] }, + { symbol: [ "QtWebKitWidgetsDepends", "private", "", "public" ] }, + { symbol: [ "QtWebKitWidgetsVersion", "private", "", "public" ] }, + { symbol: [ "QtWebSockets", "private", "", "public" ] }, + { symbol: [ "QtWebSocketsDepends", "private", "", "public" ] }, + { symbol: [ "QtWebSocketsVersion", "private", "", "public" ] }, + { symbol: [ "QtWidgets", "private", "", "public" ] }, + { symbol: [ "QtWidgetsDepends", "private", "", "public" ] }, + { symbol: [ "QtWidgetsVersion", "private", "", "public" ] }, + { symbol: [ "QtWin", "private", "", "public" ] }, + { symbol: [ "QtWinExtras", "private", "", "public" ] }, + { symbol: [ "QtWinExtrasDepends", "private", "", "public" ] }, + { symbol: [ "QtWinExtrasVersion", "private", "", "public" ] }, + { symbol: [ "QtXml", "private", "", "public" ] }, + { symbol: [ "QtXmlDepends", "private", "", "public" ] }, + { symbol: [ "QtXmlPatterns", "private", "", "public" ] }, + { symbol: [ "QtXmlPatternsDepends", "private", "", "public" ] }, + { symbol: [ "QtXmlPatternsVersion", "private", "", "public" ] }, + { symbol: [ "QtXmlVersion", "private", "", "public" ] }, + +## other things not picked up by the above + #{ symbol: [ "qobject_cast", "private", "", "public" ] }, + #{ symbol: [ "qApp", "private", "", "public" ] }, + #{ symbol: [ "qHash", "private", "", "public" ] }, + +# This is necessary because QList::toSet ends up in QSet which is wrong. See note +# at top as to why this shouldn't be necessary + + { symbol: [ "QList::toSet", "private", "", "public" ] }, + +# Even if IWYU recognised A::B as coming from a.h, we'd still need a lot of these for +# free operators + +# Generated with +# perl -le "use File::Find;use File::Basename; sub wanted { $x = lc $_. '.h'; print ' { include: [ -@\-('.basename($File::Find::dir).'/)?'.$x.'\--, -private-, -<'.$_.'>-, -public- ] },' if -e $x } find(\&wanted, '.')" +# on windows + + { include: [ "@\"(ActiveQt/)?activeqtversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(ActiveQt/)?qaxaggregated\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(ActiveQt/)?qaxbase\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(ActiveQt/)?qaxbindable\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(ActiveQt/)?qaxfactory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(ActiveQt/)?qaxobject\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(ActiveQt/)?qaxscript\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(ActiveQt/)?qaxselect\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(ActiveQt/)?qaxwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(Enginio/)?enginio\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(Enginio/)?enginioversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qbluetoothaddress\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qbluetoothdevicediscoveryagent\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qbluetoothdeviceinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qbluetoothhostinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qbluetoothlocaldevice\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qbluetoothserver\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qbluetoothservicediscoveryagent\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qbluetoothserviceinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qbluetoothsocket\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qbluetoothtransfermanager\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qbluetoothtransferreply\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qbluetoothtransferrequest\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qbluetoothuuid\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qlowenergycharacteristic\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qlowenergycontroller\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qlowenergydescriptor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qlowenergyservice\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtBluetooth/)?qtbluetoothversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCLucene/)?qtcluceneversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtConcurrent/)?qtconcurrentfilter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtConcurrent/)?qtconcurrentmap\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtConcurrent/)?qtconcurrentrun\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtConcurrent/)?qtconcurrentversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qabstractanimation\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qabstracteventdispatcher\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qabstractitemmodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qabstractnativeeventfilter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qabstractproxymodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qabstractstate\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qabstracttransition\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qanimationgroup\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qarraydata\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qarraydatapointer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qbasictimer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qbitarray\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qbuffer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qbytearray\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qbytearraylist\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qbytearraymatcher\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qcache\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qchar\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qcollator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qcommandlineoption\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qcommandlineparser\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qcontiguouscache\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qcoreapplication\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qcryptographichash\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qdatastream\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qdatetime\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qdebug\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qdir\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qdiriterator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qeasingcurve\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qelapsedtimer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qeventloop\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qeventtransition\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qexception\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qfactoryinterface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qfile\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qfiledevice\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qfileinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qfileselector\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qfilesystemwatcher\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qfinalstate\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qflags\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qfuture\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qfutureinterface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qfuturesynchronizer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qfuturewatcher\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qglobalstatic\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qhash\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qhistorystate\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qidentityproxymodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qiodevice\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qitemselectionmodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qjsonarray\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qjsondocument\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qjsonobject\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qjsonvalue\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qlibrary\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qlibraryinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qline\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qlinkedlist\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qlist\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qlocale\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qlockfile\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qloggingcategory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qmap\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qmargins\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qmessageauthenticationcode\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qmetaobject\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qmetatype\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qmimedata\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qmimedatabase\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qmimetype\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qmutex\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qobject\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qobjectcleanuphandler\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qpair\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qparallelanimationgroup\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qpauseanimation\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qpluginloader\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qpoint\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qpointer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qprocess\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qpropertyanimation\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qqueue\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qreadwritelock\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qrect\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qregexp\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qregularexpression\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qresource\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qrunnable\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsavefile\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qscopedpointer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qscopedvaluerollback\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsemaphore\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsequentialanimationgroup\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qset\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsettings\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qshareddata\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsharedmemory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsharedpointer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsignalmapper\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsignaltransition\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsize\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsocketnotifier\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsortfilterproxymodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qstack\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qstandardpaths\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qstate\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qstatemachine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qstorageinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qstring\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qstringbuilder\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qstringlist\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qstringlistmodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qstringmatcher\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsysinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsystemsemaphore\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qtcoreversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qtemporarydir\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qtemporaryfile\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qtextboundaryfinder\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qtextcodec\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qtextstream\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qthread\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qthreadpool\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qthreadstorage\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qtimeline\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qtimer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qtimezone\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qtranslator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qtypeinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qurl\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qurlquery\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?quuid\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qvariant\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qvariantanimation\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qvarlengtharray\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qvector\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qwaitcondition\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qwineventnotifier\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbusabstractadaptor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbusabstractinterface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbusargument\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbusconnection\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbusconnectioninterface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbuscontext\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbuserror\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbusinterface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbusmessage\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbusmetatype\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbuspendingcall\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbuspendingreply\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbusreply\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbusserver\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbusservicewatcher\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbusunixfiledescriptor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qdbusvirtualobject\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDBus/)?qtdbusversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativecomponent\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativecontext\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativeengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativeerror\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativeexpression\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativeextensioninterface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativeextensionplugin\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativeimageprovider\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativeinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativeitem\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativenetworkaccessmanagerfactory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativeparserstatus\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativeproperty\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativepropertymap\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativepropertyvalueinterceptor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativepropertyvaluesource\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativescriptstring\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qdeclarativeview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDeclarative/)?qtdeclarativeversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDesigner/)?qdesignerexportwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDesigner/)?qextensionmanager\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDesigner/)?qtdesignerversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtDesignerComponents/)?qtdesignercomponentsversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qabstracttextdocumentlayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qaccessible\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qaccessiblebridge\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qaccessibleobject\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qaccessibleplugin\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qbackingstore\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qbitmap\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qbrush\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qclipboard\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qcolor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qcursor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qdesktopservices\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qdrag\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qfont\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qfontdatabase\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qfontinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qfontmetrics\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qgenericmatrix\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qgenericplugin\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qgenericpluginfactory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qglyphrun\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qguiapplication\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qicon\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qiconengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qiconengineplugin\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qimage\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qimageiohandler\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qimagereader\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qimagewriter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qinputmethod\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qkeysequence\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qmatrix4x4\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qmatrix\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qmovie\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qoffscreensurface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglbuffer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglcontext\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglframebufferobject\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_1_0\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_1_1\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_1_2\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_1_3\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_1_4\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_1_5\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_2_0\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_2_1\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_3_0\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_3_1\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_3_2_compatibility\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_3_2_core\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_3_3_compatibility\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_3_3_core\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_4_0_compatibility\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_4_0_core\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_4_1_compatibility\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_4_1_core\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_4_2_compatibility\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_4_2_core\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_4_3_compatibility\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_4_3_core\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglfunctions_es2\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglpaintdevice\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglpixeltransferoptions\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglshaderprogram\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopengltexture\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopengltimerquery\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglversionfunctions\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglvertexarrayobject\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qopenglwindow\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpagedpaintdevice\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpagelayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpagesize\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpaintdevice\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpaintdevicewindow\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpaintengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpainter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpainterpath\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpalette\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpdfwriter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpen\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpicture\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpictureformatplugin\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpixelformat\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpixmap\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpixmapcache\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpolygon\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qquaternion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qrasterwindow\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qrawfont\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qregion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qrgb\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qscreen\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qsessionmanager\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qstandarditemmodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qstatictext\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qstylehints\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qsurface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qsurfaceformat\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qsyntaxhighlighter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qtextcursor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qtextdocument\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qtextdocumentfragment\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qtextdocumentwriter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qtextformat\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qtextlayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qtextlist\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qtextobject\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qtextoption\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qtexttable\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qtguiversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qtouchdevice\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qtransform\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qvalidator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qvector2d\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qvector3d\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qvector4d\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qwindow\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtHelp/)?qhelpcontentwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtHelp/)?qhelpengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtHelp/)?qhelpenginecore\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtHelp/)?qhelpindexwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtHelp/)?qhelpsearchengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtHelp/)?qhelpsearchquerywidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtHelp/)?qhelpsearchresultwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtHelp/)?qthelpversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qgeocodereply\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qgeocodingmanager\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qgeocodingmanagerengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qgeomaneuver\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qgeoroute\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qgeoroutereply\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qgeorouterequest\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qgeoroutesegment\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qgeoroutingmanager\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qgeoroutingmanagerengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qgeoserviceprovider\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qgeoserviceproviderfactory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qlocation\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplace\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplaceattribute\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacecategory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacecontactdetail\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacecontent\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacecontentreply\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacecontentrequest\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacedetailsreply\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplaceeditorial\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplaceicon\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplaceidreply\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplaceimage\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacemanager\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacemanagerengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacematchreply\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacematchrequest\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplaceproposedsearchresult\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplaceratings\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacereply\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplaceresult\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacereview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacesearchreply\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacesearchrequest\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacesearchresult\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacesearchsuggestionreply\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplacesupplier\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qplaceuser\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtLocation/)?qtlocationversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qabstractvideobuffer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qabstractvideosurface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudio\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudiobuffer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudiodecoder\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudiodecodercontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudiodeviceinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudioencodersettingscontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudioformat\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudioinput\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudioinputselectorcontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudiooutput\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudiooutputselectorcontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudioprobe\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudiorecorder\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qaudiosystemplugin\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcamera\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcameracapturebufferformatcontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcameracapturedestinationcontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcameracontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcameraexposure\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcameraexposurecontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcamerafeedbackcontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcameraflashcontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcamerafocus\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcamerafocuscontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcameraimagecapture\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcameraimagecapturecontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcameraimageprocessing\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcameraimageprocessingcontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcamerainfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcamerainfocontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcameralockscontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcameraviewfindersettingscontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qcamerazoomcontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qimageencodercontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediaaudioprobecontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediaavailabilitycontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediabindableinterface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediacontainercontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediacontent\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediacontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediagaplessplaybackcontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediametadata\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmedianetworkaccesscontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediaobject\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediaplayer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediaplayercontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediaplaylist\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediarecorder\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediarecordercontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediaresource\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediaservice\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediaserviceproviderplugin\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediastreamscontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediatimerange\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmediavideoprobecontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmetadatareadercontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmetadatawritercontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qmultimedia\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qradiodata\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qradiodatacontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qradiotuner\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qradiotunercontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qsound\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qsoundeffect\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qtmultimediaversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qvideodeviceselectorcontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qvideoencodersettingscontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qvideoframe\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qvideoprobe\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qvideorenderercontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qvideosurfaceformat\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimedia/)?qvideowindowcontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimediaQuick_p/)?qsgvideonode_i420\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimediaQuick_p/)?qsgvideonode_rgb\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimediaQuick_p/)?qsgvideonode_texture\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimediaQuick_p/)?qtmultimediaquick_pversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimediaWidgets/)?qcameraviewfinder\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimediaWidgets/)?qgraphicsvideoitem\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimediaWidgets/)?qtmultimediawidgetsversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimediaWidgets/)?qvideowidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtMultimediaWidgets/)?qvideowidgetcontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qabstractnetworkcache\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qabstractsocket\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qauthenticator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qdnslookup\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qhostaddress\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qhostinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qhttpmultipart\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qlocalserver\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qlocalsocket\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qnetworkaccessmanager\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qnetworkconfiguration\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qnetworkcookie\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qnetworkcookiejar\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qnetworkdiskcache\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qnetworkinterface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qnetworkproxy\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qnetworkreply\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qnetworkrequest\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qnetworksession\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qssl\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qsslcertificate\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qsslcertificateextension\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qsslcipher\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qsslconfiguration\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qsslerror\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qsslkey\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qsslsocket\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qtcpserver\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qtcpsocket\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qtnetworkversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qudpsocket\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNfc/)?qndeffilter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNfc/)?qndefmessage\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNfc/)?qndefnfcsmartposterrecord\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNfc/)?qndefnfctextrecord\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNfc/)?qndefnfcurirecord\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNfc/)?qndefrecord\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNfc/)?qnearfieldmanager\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNfc/)?qnearfieldsharemanager\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNfc/)?qnearfieldsharetarget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNfc/)?qnearfieldtarget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNfc/)?qqmlndefrecord\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNfc/)?qtnfcversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtOpenGL/)?qgl\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtOpenGL/)?qglbuffer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtOpenGL/)?qglcolormap\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtOpenGL/)?qglframebufferobject\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtOpenGL/)?qglfunctions\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtOpenGL/)?qglpixelbuffer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtOpenGL/)?qglshaderprogram\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtOpenGL/)?qtopenglversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtOpenGLExtensions/)?qopenglextensions\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtOpenGLExtensions/)?qtopenglextensionsversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPlatformHeaders/)?qcocoanativecontext\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPlatformHeaders/)?qeglfsfunctions\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPlatformHeaders/)?qeglnativecontext\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPlatformHeaders/)?qglxnativecontext\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPlatformHeaders/)?qtplatformheadersversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPlatformHeaders/)?qwglnativecontext\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPlatformHeaders/)?qxcbwindowfunctions\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPlatformSupport/)?qtplatformsupportversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qgeoaddress\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qgeoareamonitorinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qgeoareamonitorsource\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qgeocircle\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qgeocoordinate\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qgeolocation\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qgeopositioninfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qgeopositioninfosource\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qgeopositioninfosourcefactory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qgeorectangle\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qgeosatelliteinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qgeosatelliteinfosource\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qgeoshape\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qnmeapositioninfosource\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPositioning/)?qtpositioningversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPrintSupport/)?qabstractprintdialog\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPrintSupport/)?qpagesetupdialog\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPrintSupport/)?qprintdialog\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPrintSupport/)?qprintengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPrintSupport/)?qprinter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPrintSupport/)?qprinterinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPrintSupport/)?qprintpreviewdialog\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPrintSupport/)?qprintpreviewwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtPrintSupport/)?qtprintsupportversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qjsengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qjsvalue\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qjsvalueiterator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlabstracturlinterceptor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlapplicationengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlcomponent\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlcontext\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlerror\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlexpression\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlextensioninterface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlextensionplugin\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlfile\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlfileselector\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlincubator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlnetworkaccessmanagerfactory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlparserstatus\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlproperty\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlpropertymap\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlpropertyvaluesource\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qqmlscriptstring\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQml/)?qtqmlversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qquickframebufferobject\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qquickimageprovider\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qquickitem\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qquickitemgrabresult\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qquickpainteditem\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qquickrendercontrol\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qquicktextdocument\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qquickview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qquickwindow\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qsgabstractrenderer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qsgengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qsgflatcolormaterial\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qsggeometry\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qsgmaterial\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qsgnode\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qsgsimplematerial\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qsgsimplerectnode\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qsgsimpletexturenode\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qsgtexture\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qsgtexturematerial\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qsgtextureprovider\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qsgvertexcolormaterial\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuick/)?qtquickversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuickParticles/)?qtquickparticlesversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuickTest/)?qtquicktestversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuickWidgets/)?qquickwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtQuickWidgets/)?qtquickwidgetsversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qscriptable\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qscriptclass\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qscriptclasspropertyiterator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qscriptcontext\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qscriptcontextinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qscriptengine\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qscriptengineagent\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qscriptextensioninterface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qscriptextensionplugin\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qscriptprogram\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qscriptstring\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qscriptvalue\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qscriptvalueiterator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScript/)?qtscriptversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScriptTools/)?qscriptenginedebugger\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtScriptTools/)?qtscripttoolsversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qaccelerometer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qaltimeter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qambientlightsensor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qambienttemperaturesensor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qcompass\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qdistancesensor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qgyroscope\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qholstersensor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qirproximitysensor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qlightsensor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qmagnetometer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qorientationsensor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qpressuresensor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qproximitysensor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qrotationsensor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qsensor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qsensorbackend\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qsensorgesture\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qsensorgesturemanager\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qsensorgestureplugininterface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qsensorgesturerecognizer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qsensormanager\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qtapsensor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qtiltsensor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSensors/)?qtsensorsversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSerialPort/)?qlockfile\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSerialPort/)?qserialport\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSerialPort/)?qserialportinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSerialPort/)?qtserialportversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSerialPort/)?qwineventnotifier\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsql\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsqldatabase\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsqldriver\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsqldriverplugin\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsqlerror\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsqlfield\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsqlindex\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsqlquery\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsqlquerymodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsqlrecord\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsqlrelationaldelegate\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsqlrelationaltablemodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsqlresult\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qsqltablemodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSql/)?qtsqlversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSvg/)?qgraphicssvgitem\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSvg/)?qsvggenerator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSvg/)?qsvgrenderer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSvg/)?qsvgwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtSvg/)?qtsvgversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtTest/)?qsignalspy\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtTest/)?qtest\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtTest/)?qtestdata\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtTest/)?qtestevent\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtTest/)?qtesteventloop\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtTest/)?qttestversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtUiTools/)?qtuitoolsversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtUiTools/)?quiloader\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebChannel/)?qqmlwebchannel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebChannel/)?qtwebchannelversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebChannel/)?qwebchannel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebChannel/)?qwebchannelabstracttransport\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKit/)?qtwebkitversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKit/)?qwebdatabase\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKit/)?qwebelement\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKit/)?qwebhistory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKit/)?qwebhistoryinterface\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKit/)?qwebkitplatformplugin\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKit/)?qwebpluginfactory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKit/)?qwebsecurityorigin\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKit/)?qwebsettings\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKitWidgets/)?qgraphicswebview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKitWidgets/)?qtwebkitwidgetsversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKitWidgets/)?qwebframe\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKitWidgets/)?qwebinspector\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKitWidgets/)?qwebpage\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebKitWidgets/)?qwebview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebSockets/)?qmaskgenerator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebSockets/)?qtwebsocketsversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebSockets/)?qwebsocket\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebSockets/)?qwebsocketcorsauthenticator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWebSockets/)?qwebsocketserver\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qabstractbutton\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qabstractitemdelegate\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qabstractitemview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qabstractscrollarea\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qabstractslider\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qabstractspinbox\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qaccessiblemenu\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qaccessiblewidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qaction\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qactiongroup\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qapplication\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qboxlayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qbuttongroup\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qcalendarwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qcheckbox\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qcolordialog\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qcolormap\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qcolumnview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qcombobox\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qcommandlinkbutton\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qcommonstyle\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qcompleter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qdatawidgetmapper\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qdatetimeedit\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qdesktopwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qdial\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qdialog\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qdialogbuttonbox\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qdirmodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qdockwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qerrormessage\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qfiledialog\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qfileiconprovider\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qfilesystemmodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qfocusframe\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qfontcombobox\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qfontdialog\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qformlayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qframe\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgesture\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgesturerecognizer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicsanchorlayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicseffect\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicsgridlayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicsitem\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicsitemanimation\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicslayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicslayoutitem\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicslinearlayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicsproxywidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicsscene\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicssceneevent\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicstransform\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicsview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgraphicswidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgridlayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qgroupbox\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qheaderview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qinputdialog\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qitemdelegate\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qitemeditorfactory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qkeyeventtransition\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qkeysequenceedit\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qlabel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qlayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qlayoutitem\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qlcdnumber\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qlineedit\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qlistview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qlistwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qmainwindow\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qmdiarea\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qmdisubwindow\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qmenu\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qmenubar\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qmessagebox\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qmouseeventtransition\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qopenglwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qplaintextedit\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qprogressbar\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qprogressdialog\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qproxystyle\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qpushbutton\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qradiobutton\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qrubberband\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qscrollarea\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qscrollbar\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qscroller\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qscrollerproperties\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qshortcut\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qsizegrip\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qsizepolicy\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qslider\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qspinbox\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qsplashscreen\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qsplitter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qstackedlayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qstackedwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qstatusbar\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qstyle\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qstyleditemdelegate\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qstylefactory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qstyleoption\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qstylepainter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qstyleplugin\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qsystemtrayicon\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtabbar\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtableview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtablewidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtabwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtextbrowser\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtextedit\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtoolbar\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtoolbox\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtoolbutton\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtooltip\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtreeview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtreewidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtreewidgetitemiterator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtwidgetsversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qundogroup\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qundostack\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qundoview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qwhatsthis\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qwidgetaction\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qwizard\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWinExtras/)?qtwinextrasversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWinExtras/)?qwinevent\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWinExtras/)?qwinjumplist\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWinExtras/)?qwinjumplistcategory\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWinExtras/)?qwinjumplistitem\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWinExtras/)?qwinmime\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWinExtras/)?qwintaskbarbutton\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWinExtras/)?qwintaskbarprogress\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWinExtras/)?qwinthumbnailtoolbar\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWinExtras/)?qwinthumbnailtoolbutton\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXml/)?qtxmlversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qabstractmessagehandler\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qabstracturiresolver\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qabstractxmlnodemodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qabstractxmlreceiver\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qsimplexmlnodemodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qsourcelocation\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qtxmlpatternsversion\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qxmlformatter\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qxmlname\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qxmlnamepool\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qxmlquery\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qxmlresultitems\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qxmlschema\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qxmlschemavalidator\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtXmlPatterns/)?qxmlserializer\\.h\"", "private", "", "public" ] }, + +# And lastly, things stored in difficult places + { include: [ "@\"(QtCore/)?qobjectdefs\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qglobal\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qnamespace\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qlogging\\.h\"", "private", "", "public" ] }, #qDebug, qWarning, etc + { include: [ "@\"(QtCore/)?qalgorithms\\.h\"", "private", "", "public" ] }, #qSort, etc + { include: [ "@\"(QtWinExtras/)?qwinfunctions\\.h\"", "private", "", "public" ] }, # for fromHICON + +# These ones are just madness. For instance, why with the above do we get +# #include "QtCore/qcoreevent.h" // for QEvent (ptr only), etc + { include: [ "@\"(QtCore/)?qcoreevent\\.h\"", "private", "", "public" ] }, + +# These ones seem spurious +#include "QtCore/qtypetraits.h" // for remove_reference<>::type +#include "QtCore/qsharedpointer_impl.h" // for swap +#include "QtCore/qatomic_msvc.h" + +] diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 86d1e4c8..3c786868 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -66,7 +66,6 @@ SET(organizer_SRCS moapplication.cpp profileinputdialog.cpp icondelegate.cpp - gameinfoimpl.cpp csvbuilder.cpp savetextasdialog.cpp qtgroupingproxy.cpp @@ -160,7 +159,6 @@ SET(organizer_HDRS moapplication.h profileinputdialog.h icondelegate.h - gameinfoimpl.h csvbuilder.h savetextasdialog.h qtgroupingproxy.h diff --git a/src/SConscript b/src/SConscript index 194df9aa..6de7cb62 100644 --- a/src/SConscript +++ b/src/SConscript @@ -67,7 +67,6 @@ env.Uic(env.Glob('*.ui')) env.RequireLibraries('uibase', 'shared', 'bsatk', 'esptk') - env.AppendUnique(LIBS = [ 'shell32', 'user32', @@ -96,6 +95,12 @@ env['CPPPATH'] += [ '${BOOSTPATH}', ] +#########################FUDGE############################### +env['CPPPATH'] += [ + '../plugins/gameGamebryo', + ] +############################################################# + env.AppendUnique(CPPDEFINES = [ '_UNICODE', '_CRT_SECURE_NO_WARNINGS', @@ -118,8 +123,9 @@ env.AppendUnique(LINKFLAGS = [ # modeltest is optional and it doesn't compile anyway... cpp_files = [ - x for x in Glob('*.cpp') - if x.name != 'modeltest.cpp' and x.name != 'aboutdialog.cpp' + x for x in env.Glob('*.cpp', source = True) + if x.name != 'modeltest.cpp' and x.name != 'aboutdialog.cpp' and \ + not x.name.startswith('moc_') # I think this is a strange bug ] about_env = env.Clone() diff --git a/src/bbcode.cpp b/src/bbcode.cpp index 0f9170d4..56369538 100644 --- a/src/bbcode.cpp +++ b/src/bbcode.cpp @@ -21,8 +21,6 @@ along with Mod Organizer. If not, see . #include #include -#include -#include namespace BBCode { @@ -80,7 +78,7 @@ public: if (tagName == "color") { QString color = tagIter->second.first.cap(1); QString content = tagIter->second.first.cap(2); - if (color.at(0) == "#") { + if (color.at(0) == '#') { return temp.replace(tagIter->second.first, QString("%2").arg(color, content)); } else { auto colIter = m_ColorMap.find(color.toLower()); diff --git a/src/browserdialog.cpp b/src/browserdialog.cpp index c382c112..e5f0f21d 100644 --- a/src/browserdialog.cpp +++ b/src/browserdialog.cpp @@ -18,18 +18,16 @@ along with Mod Organizer. If not, see . */ #include "browserdialog.h" + #include "ui_browserdialog.h" #include "browserview.h" - #include "messagedialog.h" #include "report.h" #include "persistentcookiejar.h" -#include "json.h" - #include -#include #include "settings.h" + #include #include #include diff --git a/src/browserview.h b/src/browserview.h index f8b132b8..6a89752a 100644 --- a/src/browserview.h +++ b/src/browserview.h @@ -21,9 +21,11 @@ along with Mod Organizer. If not, see . #define NEXUSVIEW_H +class QEvent; +class QUrl; +class QWidget; #include #include -#include /** * @brief web view used to display a nexus page diff --git a/src/categories.cpp b/src/categories.cpp index 400cc74b..59291a49 100644 --- a/src/categories.cpp +++ b/src/categories.cpp @@ -18,9 +18,10 @@ along with Mod Organizer. If not, see . */ #include "categories.h" + #include #include -#include + #include #include #include @@ -29,7 +30,6 @@ along with Mod Organizer. If not, see . using namespace MOBase; -using namespace MOShared; CategoryFactory* CategoryFactory::s_Instance = nullptr; diff --git a/src/directoryrefresher.cpp b/src/directoryrefresher.cpp index c253f384..f50a717e 100644 --- a/src/directoryrefresher.cpp +++ b/src/directoryrefresher.cpp @@ -18,10 +18,13 @@ along with Mod Organizer. If not, see . */ #include "directoryrefresher.h" + +#include "iplugingame.h" #include "utility.h" #include "report.h" #include "modinfo.h" -#include + +#include #include #include @@ -141,7 +144,9 @@ void DirectoryRefresher::refresh() m_DirectoryStructure = new DirectoryEntry(L"data", nullptr, 0); - std::wstring dataDirectory = GameInfo::instance().getGameDirectory() + L"\\data"; + IPluginGame const *game = qApp->property("managed_game").value(); + + std::wstring dataDirectory = QDir::toNativeSeparators(game->dataDirectory().absolutePath()).toStdWString(); m_DirectoryStructure->addFromOrigin(L"data", dataDirectory, 0); // TODO what was the point of having the priority in this tuple? the list is already sorted by priority diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index 0cc45183..cbc1ba45 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -18,18 +18,19 @@ along with Mod Organizer. If not, see . */ #include "downloadmanager.h" + #include "nxmurl.h" #include "nexusinterface.h" #include "nxmaccessmanager.h" -#include +#include "iplugingame.h" #include #include #include "utility.h" -#include "json.h" #include "selectiondialog.h" #include "bbcode.h" #include #include + #include #include #include @@ -38,6 +39,7 @@ along with Mod Organizer. If not, see . #include #include #include + #include #include @@ -448,7 +450,7 @@ void DownloadManager::addNXMDownload(const QString &url) { NXMUrl nxmInfo(url); - QString managedGame = ToQString(MOShared::GameInfo::instance().getGameShortName()); + QString managedGame = m_ManagedGame->getGameShortName(); qDebug("add nxm download: %s", qPrintable(url)); if (nxmInfo.game().compare(managedGame, Qt::CaseInsensitive) != 0) { qDebug("download requested for wrong game (game: %s, url: %s)", qPrintable(managedGame), qPrintable(nxmInfo.game())); @@ -1242,13 +1244,14 @@ int DownloadManager::startDownloadURLs(const QStringList &urls) return m_ActiveDownloads.size() - 1; } +/* This doesn't appear to be used by anything int DownloadManager::startDownloadNexusFile(int modID, int fileID) { int newID = m_ActiveDownloads.size(); addNXMDownload(QString("nxm://%1/mods/%2/files/%3").arg(ToQString(MOShared::GameInfo::instance().getGameName())).arg(modID).arg(fileID)); return newID; } - +*/ QString DownloadManager::downloadPath(int id) { return getFilePath(id); @@ -1468,3 +1471,7 @@ void DownloadManager::directoryChanged(const QString&) refreshList(); } +void DownloadManager::managedGameChanged(MOBase::IPluginGame const *managedGame) +{ + m_ManagedGame = managedGame; +} diff --git a/src/downloadmanager.h b/src/downloadmanager.h index 57bd592d..54db4648 100644 --- a/src/downloadmanager.h +++ b/src/downloadmanager.h @@ -35,6 +35,7 @@ along with Mod Organizer. If not, see . #include #include +namespace MOBase { class IPluginGame; } class NexusInterface; @@ -328,7 +329,9 @@ public: virtual int startDownloadURLs(const QStringList &urls); + /* This doesn't appear to be used anywhere virtual int startDownloadNexusFile(int modID, int fileID); + */ virtual QString downloadPath(int id); /** @@ -414,6 +417,8 @@ public slots: void nxmRequestFailed(int modID, int fileID, QVariant userData, int requestID, const QString &errorString); + void managedGameChanged(MOBase::IPluginGame const *gamePlugin); + private slots: void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); @@ -501,6 +506,7 @@ private: QRegExp m_DateExpression; + MOBase::IPluginGame const *m_ManagedGame; }; diff --git a/src/executableslist.cpp b/src/executableslist.cpp index 12e3d7aa..a4511ade 100644 --- a/src/executableslist.cpp +++ b/src/executableslist.cpp @@ -18,16 +18,18 @@ along with Mod Organizer. If not, see . */ #include "executableslist.h" -#include + +#include "iplugingame.h" +#include "utility.h" + #include #include #include -#include "utility.h" + #include using namespace MOBase; -using namespace MOShared; ExecutablesList::ExecutablesList() @@ -38,7 +40,7 @@ ExecutablesList::~ExecutablesList() { } -void ExecutablesList::init(IPluginGame *game) +void ExecutablesList::init(IPluginGame const *game) { Q_ASSERT(game != nullptr); m_Executables.clear(); diff --git a/src/executableslist.h b/src/executableslist.h index b4054bcc..3d5ba0ed 100644 --- a/src/executableslist.h +++ b/src/executableslist.h @@ -20,13 +20,14 @@ along with Mod Organizer. If not, see . #ifndef EXECUTABLESLIST_H #define EXECUTABLESLIST_H +#include "executableinfo.h" #include + #include #include -#include -#include +namespace MOBase { class IPluginGame; } /*! * @brief Information about an executable @@ -78,7 +79,7 @@ public: /** * @brief initialise the list with the executables preconfigured for this game **/ - void init(MOBase::IPluginGame *game); + void init(MOBase::IPluginGame const *game); /** * @brief find an executable by its name diff --git a/src/gameinfoimpl.cpp b/src/gameinfoimpl.cpp deleted file mode 100644 index 98b0fddf..00000000 --- a/src/gameinfoimpl.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* -Copyright (C) 2012 Sebastian Herbord. All rights reserved. - -This file is part of Mod Organizer. - -Mod Organizer is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Mod Organizer is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Mod Organizer. If not, see . -*/ - -#include "gameinfoimpl.h" -#include "gameinfo.h" -#include - -#include -#include - - -using namespace MOBase; -using namespace MOShared; - - -GameInfoImpl::GameInfoImpl() -{ -} - -IGameInfo::Type GameInfoImpl::type() const -{ - switch (GameInfo::instance().getType()) { - case GameInfo::TYPE_OBLIVION: return IGameInfo::TYPE_OBLIVION; - case GameInfo::TYPE_FALLOUT3: return IGameInfo::TYPE_FALLOUT3; - case GameInfo::TYPE_FALLOUTNV: return IGameInfo::TYPE_FALLOUTNV; - case GameInfo::TYPE_SKYRIM: return IGameInfo::TYPE_SKYRIM; - default: throw MyException(QObject::tr("invalid game type %1").arg(GameInfo::instance().getType())); - } -} - - -QString GameInfoImpl::path() const -{ - return QDir::fromNativeSeparators(ToQString(GameInfo::instance().getGameDirectory())); -} - -QString GameInfoImpl::binaryName() const -{ - return ToQString(GameInfo::instance().getBinaryName()); -} - -namespace { - -QString GetAppVersion(std::wstring const &app_name) -{ - DWORD handle; - DWORD info_len = ::GetFileVersionInfoSizeW(app_name.c_str(), &handle); - if (info_len == 0) { - qDebug("GetFileVersionInfoSizeW Error %d", ::GetLastError()); - return ""; - } - - std::vector buff(info_len); - if( ! ::GetFileVersionInfoW(app_name.c_str(), handle, info_len, buff.data())) { - qDebug("GetFileVersionInfoW Error %d", ::GetLastError()); - return ""; - } - - VS_FIXEDFILEINFO *pFileInfo; - UINT buf_len; - if ( ! ::VerQueryValueW(buff.data(), L"\\", reinterpret_cast(&pFileInfo), &buf_len)) { - qDebug("VerQueryValueW Error %d", ::GetLastError()); - return ""; - } - return QString("%1.%2.%3.%4").arg(HIWORD(pFileInfo->dwFileVersionMS)) - .arg(LOWORD(pFileInfo->dwFileVersionMS)) - .arg(HIWORD(pFileInfo->dwFileVersionLS)) - .arg(LOWORD(pFileInfo->dwFileVersionLS)); -} - -} - -QString GameInfoImpl::version() const -{ - std::wstring dir = GameInfo::instance().getGameDirectory(); - std::wstring exec = GameInfo::instance().getBinaryName(); - std::wstring target = L"\\\\?\\" + dir + L"\\" + exec; - return GetAppVersion(target.c_str()); -} - -QString GameInfoImpl::extenderVersion() const -{ - std::wstring dir = GameInfo::instance().getGameDirectory(); - std::wstring exec = GameInfo::instance().getExtenderName(); - std::wstring target = L"\\\\?\\" + dir + L"\\" + exec; - return GetAppVersion(target.c_str()); -} diff --git a/src/gameinfoimpl.h b/src/gameinfoimpl.h deleted file mode 100644 index b7ac78c5..00000000 --- a/src/gameinfoimpl.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -Copyright (C) 2012 Sebastian Herbord. All rights reserved. - -This file is part of Mod Organizer. - -Mod Organizer is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Mod Organizer is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Mod Organizer. If not, see . -*/ - -#ifndef GAMEINFOIMPL_H -#define GAMEINFOIMPL_H - - -#include -#include - - -class GameInfoImpl : public MOBase::IGameInfo -{ -public: - GameInfoImpl(); - - virtual Type type() const; - virtual QString path() const; - virtual QString binaryName() const; - virtual QString version() const; - virtual QString extenderVersion() const; - -}; - -#endif // GAMEINFOIMPL_H diff --git a/src/helper.h b/src/helper.h index 36f10db1..410e2527 100644 --- a/src/helper.h +++ b/src/helper.h @@ -21,7 +21,7 @@ along with Mod Organizer. If not, see . #define HELPER_H -#include +#include /** diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index 9fb9bdbb..7b1f3f37 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -18,6 +18,7 @@ along with Mod Organizer. If not, see . */ #include "installationmanager.h" + #include "utility.h" #include "report.h" #include "categories.h" @@ -32,9 +33,9 @@ along with Mod Organizer. If not, see . #include "modinfo.h" #include #include -#include #include #include + #include #include #include @@ -42,11 +43,13 @@ along with Mod Organizer. If not, see . #include #include #include -#include #include #include #include #include + +#include + #include #include diff --git a/src/loadmechanism.cpp b/src/loadmechanism.cpp index 4d06bea9..47587467 100644 --- a/src/loadmechanism.cpp +++ b/src/loadmechanism.cpp @@ -56,7 +56,7 @@ void LoadMechanism::writeHintFile(const QDir &targetDirectory) } -void LoadMechanism::removeHintFile(QDir &targetDirectory) +void LoadMechanism::removeHintFile(QDir targetDirectory) { targetDirectory.remove("mo_path.txt"); } @@ -64,7 +64,8 @@ void LoadMechanism::removeHintFile(QDir &targetDirectory) bool LoadMechanism::isDirectLoadingSupported() { - IPluginGame *game = qApp->property("managed_game").value(); + //FIXME: Seriously? isn't there a 'do i need steam' thing? + IPluginGame const *game = qApp->property("managed_game").value(); if (game->gameName().compare("oblivion", Qt::CaseInsensitive) == 0) { // oblivion can be loaded directly if it's not the steam variant return !game->gameDirectory().exists("steam_api.dll"); @@ -76,13 +77,11 @@ bool LoadMechanism::isDirectLoadingSupported() bool LoadMechanism::isScriptExtenderSupported() { - IPluginGame *game = qApp->property("managed_game").value(); + IPluginGame const *game = qApp->property("managed_game").value(); ScriptExtender *extender = game->feature(); // test if there even is an extender for the managed game and if so whether it's installed - return (extender != nullptr) - && (game->gameDirectory().exists(extender->name() + "_loader.exe") - || game->gameDirectory().exists(extender->name() + "_steam_loader.dll")); + return extender != nullptr && extender->isInstalled(); } bool LoadMechanism::isProxyDLLSupported() @@ -92,7 +91,7 @@ bool LoadMechanism::isProxyDLLSupported() // plus: the proxy dll hasn't been working for at least the whole 1.12.x versions of MO and // noone reported it so why maintain an unused feature? return false; -/* IPluginGame *game = qApp->property("managed_game").value(); +/* IPluginGame const *game = qApp->property("managed_game").value(); return game->gameDirectory().exists(QString::fromStdWString(AppConfig::proxyDLLTarget()));*/ } @@ -124,7 +123,7 @@ bool LoadMechanism::hashIdentical(const QString &fileNameLHS, const QString &fil void LoadMechanism::deactivateScriptExtender() { try { - IPluginGame *game = qApp->property("managed_game").value(); + IPluginGame const *game = qApp->property("managed_game").value(); ScriptExtender *extender = game->feature(); if (extender == nullptr) { throw MyException(QObject::tr("game doesn't support a script extender")); @@ -150,7 +149,7 @@ void LoadMechanism::deactivateScriptExtender() void LoadMechanism::deactivateProxyDLL() { try { - IPluginGame *game = qApp->property("managed_game").value(); + IPluginGame const *game = qApp->property("managed_game").value(); QString targetPath = game->gameDirectory().absoluteFilePath(QString::fromStdWString(AppConfig::proxyDLLTarget())); @@ -179,7 +178,7 @@ void LoadMechanism::deactivateProxyDLL() void LoadMechanism::activateScriptExtender() { try { - IPluginGame *game = qApp->property("managed_game").value(); + IPluginGame const *game = qApp->property("managed_game").value(); ScriptExtender *extender = game->feature(); if (extender == nullptr) { throw MyException(QObject::tr("game doesn't support a script extender")); @@ -219,7 +218,7 @@ void LoadMechanism::activateScriptExtender() void LoadMechanism::activateProxyDLL() { try { - IPluginGame *game = qApp->property("managed_game").value(); + IPluginGame const *game = qApp->property("managed_game").value(); QString targetPath = game->gameDirectory().absoluteFilePath(QString::fromStdWString(AppConfig::proxyDLLTarget())); diff --git a/src/loadmechanism.h b/src/loadmechanism.h index 43a8dd6c..c04473ab 100644 --- a/src/loadmechanism.h +++ b/src/loadmechanism.h @@ -91,7 +91,7 @@ private: void writeHintFile(const QDir &targetDirectory); // remove the hint file if it exists. does nothing if the file doesn't exist - void removeHintFile(QDir &targetDirectory); + void removeHintFile(QDir targetDirectory); // compare the two files by md5-hash, returns true if they are identical bool hashIdentical(const QString &fileNameLHS, const QString &fileNameRHS); diff --git a/src/main.cpp b/src/main.cpp index 773bfc16..353e7202 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -26,21 +26,16 @@ along with Mod Organizer. If not, see . #define WIN32_LEAN_AND_MEAN #include #include -#include + #include #include #include #include -#include #include "mainwindow.h" #include #include "modlist.h" #include "profile.h" #include "gameinfo.h" -#include "fallout3info.h" -#include "falloutnvinfo.h" -#include "oblivioninfo.h" -#include "skyriminfo.h" #include "spawn.h" #include "executableslist.h" #include "singleinstance.h" @@ -51,11 +46,9 @@ along with Mod Organizer. If not, see . #include "moapplication.h" #include "tutorialmanager.h" #include "nxmaccessmanager.h" -#include -#include #include #include -#include + #include #include #include @@ -77,6 +70,14 @@ along with Mod Organizer. If not, see . #include #include +#include + +#include + +#include +#include +#include + #pragma comment(linker, "/manifestDependency:\"name='dlls' processorArchitecture='x86' version='1.0.0.0' type='win32' \"") @@ -86,7 +87,8 @@ using namespace MOShared; bool createAndMakeWritable(const std::wstring &subPath) { - QString fullPath = qApp->property("dataPath").toString() + "/" + QString::fromStdWString(subPath); + QString const dataPath = qApp->property("dataPath").toString(); + QString fullPath = dataPath + "/" + QString::fromStdWString(subPath); if (!QDir(fullPath).exists()) { QDir().mkdir(fullPath); @@ -100,7 +102,7 @@ bool createAndMakeWritable(const std::wstring &subPath) "will be made writable for the current user account). You will be asked to run " "\"helper.exe\" with administrative rights."), QMessageBox::Yes | QMessageBox::Cancel) == QMessageBox::Yes) { - if (!Helper::init(GameInfo::instance().getOrganizerDirectory())) { + if (!Helper::init(dataPath.toStdWString())) { return false; } } else { @@ -329,6 +331,124 @@ QString determineProfile(QStringList &arguments, const QSettings &settings) return selectedProfileName; } +MOBase::IPluginGame *selectGame(QSettings &settings, QDir const &gamePath, MOBase::IPluginGame *game) +{ + settings.setValue("gameName", game->gameName()); + //Sadly, hookdll needs gamePath in order to run. So following code block is + //commented out + /*if (gamePath == game->gameDirectory()) { + settings.remove("gamePath"); + } else*/ { + QString gameDir = gamePath.absolutePath(); + game->setGamePath(gameDir); + settings.setValue("gamePath", QDir::toNativeSeparators(gameDir).toUtf8().constData()); + } + return game; //Woot +} + + +MOBase::IPluginGame *determineCurrentGame(QString const &moPath, QSettings &settings, PluginContainer const &plugins) +{ + //Determine what game we are running where. Be very paranoid in case the + //user has done something odd. + //If the game name has been set up, use that. + QString gameName = settings.value("gameName", "").toString(); + if (!gameName.isEmpty()) { + MOBase::IPluginGame *game = plugins.managedGame(gameName); + if (game == nullptr) { + reportError(QObject::tr("Plugin to handle %1 no longer installed").arg(gameName)); + return nullptr; + } + QString gamePath = QString::fromUtf8(settings.value("gamePath", "").toByteArray()); + if (gamePath == "") { + gamePath = game->gameDirectory().absolutePath(); + } + QDir gameDir(gamePath); + if (game->looksValid(gameDir)) { + return selectGame(settings, gameDir, game); + } + } + + //gameName wasn't set, or otherwise can't be found. Try looking through all + //the plugins using the gamePath + QString gamePath = QString::fromUtf8(settings.value("gamePath", "").toByteArray()); + if (!gamePath.isEmpty()) { + QDir gameDir(gamePath); + //Look to see if one of the installed games binary file exists in the current + //game directory. + for (IPluginGame * const game : plugins.plugins()) { + if (game->looksValid(gameDir)) { + return selectGame(settings, gameDir, game); + } + } + } + + //OK, we are in a new setup or existing info is useless. + //See if MO has been installed inside a game directory + for (IPluginGame * const game : plugins.plugins()) { + if (game->isInstalled() && moPath.startsWith(game->gameDirectory().absolutePath())) { + //Found it. + return selectGame(settings, game->gameDirectory(), game); + } + } + + //Try walking up the directory tree to see if MO has been installed inside a game + { + QDir gameDir(moPath); + do { + //Look to see if one of the installed games binary file exists in the current + //directory. + for (IPluginGame * const game : plugins.plugins()) { + if (game->looksValid(gameDir)) { + return selectGame(settings, gameDir, game); + } + } + //OK, chop off the last directory and try again + } while (gameDir.cdUp()); + } + + //Then try a selection dialogue. + if (!gamePath.isEmpty() || !gameName.isEmpty()) { + reportError(QObject::tr("Could not use configuration settings for game \"%1\", path \"%2\"."). + arg(gameName).arg(gamePath)); + } + + SelectionDialog selection(QObject::tr("Please select the game to manage"), nullptr, QSize(32, 32)); + + for (IPluginGame *game : plugins.plugins()) { + if (game->isInstalled()) { + QString path = game->gameDirectory().absolutePath(); + selection.addChoice(game->gameIcon(), game->gameName(), path, QVariant::fromValue(game)); + } + } + + selection.addChoice(QString("Browse..."), QString(), QVariant::fromValue(static_cast(nullptr))); + + while (selection.exec() != QDialog::Rejected) { + IPluginGame * game = selection.getChoiceData().value(); + if (game != nullptr) { + return selectGame(settings, game->gameDirectory(), game); + } + + gamePath = QFileDialog::getExistingDirectory( + nullptr, QObject::tr("Please select the game to manage"), QString(), + QFileDialog::ShowDirsOnly); + + if (!gamePath.isEmpty()) { + QDir gameDir(gamePath); + for (IPluginGame * const game : plugins.plugins()) { + if (game->looksValid(gameDir)) { + return selectGame(settings, gameDir, game); + } + } + reportError(QObject::tr("No game identified in \"%1\". The directory is required to contain " + "the game binary and its launcher.").arg(gamePath)); + } + } + + return nullptr; +} + int main(int argc, char *argv[]) { MOApplication application(argc, argv); @@ -341,7 +461,7 @@ int main(int argc, char *argv[]) instanceID = instanceFile.readAll().trimmed(); } - QString dataPath = + QString const dataPath = instanceID.isEmpty() ? application.applicationDirPath() : QDir::fromNativeSeparators( QStandardPaths::writableLocation(QStandardPaths::DataLocation) @@ -373,7 +493,7 @@ int main(int argc, char *argv[]) QSplashScreen splash(pixmap); try { - if (!bootstrap()) { // requires gameinfo to be initialised! + if (!bootstrap()) { return -1; } @@ -442,63 +562,19 @@ int main(int argc, char *argv[]) PluginContainer pluginContainer(&organizer); pluginContainer.loadPlugins(); - QString gamePath = QString::fromUtf8(settings.value("gamePath", "").toByteArray()); - bool done = false; - while (!done) { - if (!GameInfo::init(ToWString(application.applicationDirPath()), ToWString(dataPath), ToWString(QDir::toNativeSeparators(gamePath)))) { - if (!gamePath.isEmpty()) { - reportError(QObject::tr("No game identified in \"%1\". The directory is required to contain " - "the game binary and its launcher.").arg(gamePath)); - } - SelectionDialog selection(QObject::tr("Please select the game to manage"), nullptr, QSize(32, 32)); - - for (const IPluginGame * const game : pluginContainer.plugins()) { - if (game->isInstalled()) { - QString path = game->gameDirectory().absolutePath(); - selection.addChoice(game->gameIcon(), game->gameName(), path, path); - } - } - - selection.addChoice(QString("Browse..."), QString(), QString()); - - if (selection.exec() == QDialog::Rejected) { - gamePath = ""; - done = true; - } else { - gamePath = QDir::cleanPath(selection.getChoiceData().toString()); - if (gamePath.isEmpty()) { - gamePath = QFileDialog::getExistingDirectory( - nullptr, QObject::tr("Please select the game to manage"), QString(), - QFileDialog::ShowDirsOnly); - qDebug() << "manually selected path " << gamePath; - } - } - } else { - done = true; - gamePath = ToQString(GameInfo::instance().getGameDirectory()); - } - } - - if (gamePath.isEmpty()) { - // game not found and user canceled - return -1; - } else if (gamePath.length() != 0) { - // user selected a folder and game was initialised with it - qDebug("game path: %s", qPrintable(gamePath)); - settings.setValue("gamePath", gamePath.toUtf8().constData()); - } - - organizer.setManagedGame(ToQString(GameInfo::instance().getGameName()), gamePath); - - organizer.createDefaultProfile(); - - if (pluginContainer.managedGame(ToQString(GameInfo::instance().getGameName())) == nullptr) { - reportError(QObject::tr("Plugin to handle %1 not installed").arg(ToQString(GameInfo::instance().getGameName()))); + MOBase::IPluginGame *game = determineCurrentGame(application.applicationDirPath(), settings, pluginContainer); + if (game == nullptr) { return 1; } - IPluginGame *game = organizer.managedGame(); + organizer.setManagedGame(game); + //*sigh just for making it work + GameInfo::init(application.applicationDirPath().toStdWString(), game->gameDirectory().absolutePath().toStdWString()); + + organizer.createDefaultProfile(); + + //See the pragma - we apparently don't use this so not sure why we check it if (!settings.contains("game_edition")) { QStringList editions = game->gameVariants(); if (editions.size() > 1) { @@ -518,7 +594,7 @@ int main(int argc, char *argv[]) #pragma message("edition isn't used?") - qDebug("managing game at %s", qPrintable(QDir::toNativeSeparators(gamePath))); + qDebug("managing game at %s", qPrintable(QDir::toNativeSeparators(game->gameDirectory().absolutePath()))); organizer.updateExecutablesList(settings); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9982e928..f30e46f1 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -19,6 +19,7 @@ along with Mod Organizer. If not, see . #include "mainwindow.h" #include "ui_mainwindow.h" + #include "spawn.h" #include "report.h" #include "modlist.h" @@ -52,17 +53,18 @@ along with Mod Organizer. If not, see . #include "credentialsdialog.h" #include "selectiondialog.h" #include "csvbuilder.h" -#include "gameinfoimpl.h" #include "savetextasdialog.h" #include "problemsdialog.h" #include "previewdialog.h" #include "browserdialog.h" #include "aboutdialog.h" #include "safewritefile.h" -#include "organizerproxy.h" +//? +//#include "isavegame.h" +//#include "savegameinfo.h" +//? #include "nxmaccessmanager.h" #include -#include #include #include #include @@ -71,15 +73,12 @@ along with Mod Organizer. If not, see . #include #include #include -#include -#include -#include -#include +#include + #include #include #include #include -#include #include #include #include @@ -101,10 +100,6 @@ along with Mod Organizer. If not, see . #include #include #include -#include -#include -#include -#include #include #include #include @@ -119,7 +114,7 @@ along with Mod Organizer. If not, see . #endif #include #include -#include + #ifndef Q_MOC_RUN #include #include @@ -127,8 +122,19 @@ along with Mod Organizer. If not, see . #include #include #endif + +#include +#include +#include +#include + +#include #include #include +#include +#include +#include +#include #ifdef TEST_MODELS #include "modeltest.h" @@ -154,7 +160,6 @@ MainWindow::MainWindow(const QString &exeName , m_ModListGroupingProxy(nullptr) , m_ModListSortProxy(nullptr) , m_OldExecutableIndex(-1) - , m_GamePath(ToQString(GameInfo::instance().getGameDirectory())) , m_CategoryFactory(CategoryFactory::instance()) , m_ContextItem(nullptr) , m_ContextAction(nullptr) @@ -359,7 +364,7 @@ MainWindow::~MainWindow() void MainWindow::updateWindowTitle(const QString &accountName, bool premium) { QString title = QString("%1 Mod Organizer v%2").arg( - ToQString(GameInfo::instance().getGameName()), + m_OrganizerCore.managedGame()->gameName(), m_OrganizerCore.getVersion().displayString()); if (accountName.isEmpty()) { @@ -827,7 +832,8 @@ void MainWindow::setBrowserGeometry(const QByteArray &geometry) SaveGameGamebryo *MainWindow::getSaveGame(const QString &name) { - return new SaveGameGamebryo(this, name); + IPluginGame const *game = m_OrganizerCore.managedGame(); + return new SaveGameGamebryo(this, name, game); } @@ -1032,9 +1038,9 @@ void MainWindow::on_profileBox_currentIndexChanged(int index) if (ui->profileBox->currentIndex() == 0) { ui->profileBox->setCurrentIndex(previousIndex); - ProfilesDialog(ui->profileBox->currentText(), this).exec(); + ProfilesDialog(ui->profileBox->currentText(), m_OrganizerCore.managedGame(), this).exec(); while (!refreshProfiles()) { - ProfilesDialog(ui->profileBox->currentText(), this).exec(); + ProfilesDialog(ui->profileBox->currentText(), m_OrganizerCore.managedGame(), this).exec(); } } else { activateSelectedProfile(); @@ -1259,9 +1265,11 @@ QDir MainWindow::currentSavesDir() const savesDir.setPath(m_OrganizerCore.currentProfile()->absolutePath() + "/saves"); } else { wchar_t path[MAX_PATH]; - ::GetPrivateProfileStringW(L"General", L"SLocalSavePath", L"Saves", - path, MAX_PATH, - (ToWString(m_OrganizerCore.currentProfile()->absolutePath()) + L"\\" + GameInfo::instance().getIniFileNames().at(0)).c_str()); + ::GetPrivateProfileStringW( + L"General", L"SLocalSavePath", L"Saves", + path, MAX_PATH, + ToWString(m_OrganizerCore.currentProfile()->absolutePath() + "/" + + m_OrganizerCore.managedGame()->getIniFiles()[0]).c_str()); savesDir.setPath(m_OrganizerCore.managedGame()->documentsDirectory().absoluteFilePath(QString::fromWCharArray(path))); } @@ -1332,8 +1340,7 @@ void MainWindow::updateBSAList(const QStringList &defaultArchives, const QString std::vector> items; - IPluginGame *gamePlugin = qApp->property("managed_game").value(); - BSAInvalidation *invalidation = gamePlugin->feature(); + BSAInvalidation *invalidation = m_OrganizerCore.managedGame()->feature(); std::vector files = m_OrganizerCore.directoryStructure()->getFiles(); QStringList plugins = m_OrganizerCore.findFiles("", [] (const QString &fileName) -> bool { @@ -1819,16 +1826,18 @@ void MainWindow::on_actionInstallMod_triggered() void MainWindow::on_actionAdd_Profile_triggered() { - bool repeat = true; - while (repeat) { - ProfilesDialog profilesDialog(m_GamePath, this); + for (;;) { + //Note: Calling this with an invalid profile name. Not quite sure why + ProfilesDialog profilesDialog(m_OrganizerCore.managedGame()->gameDirectory().absolutePath(), + m_OrganizerCore.managedGame(), + this); // workaround: need to disable monitoring of the saves directory, otherwise the active // profile directory is locked stopMonitorSaves(); profilesDialog.exec(); refreshSaveList(); // since the save list may now be outdated we have to refresh it completely if (refreshProfiles() && !profilesDialog.failed()) { - repeat = false; + break; } } // addProfile(); @@ -2525,7 +2534,7 @@ void MainWindow::visitOnNexus_clicked() { int modID = m_OrganizerCore.modList()->data(m_OrganizerCore.modList()->index(m_ContextRow, 0), Qt::UserRole).toInt(); if (modID > 0) { - linkClicked(QString("%1/mods/%2").arg(ToQString(GameInfo::instance().getNexusPage(false))).arg(modID)); + nexusLinkActivated(NexusInterface::instance()->getModURL(modID)); } else { MessageDialog::showMessage(tr("Nexus ID for this Mod is unknown"), this); } @@ -3111,6 +3120,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) } break; } } + std::vector flags = info->getFlags(); if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_INVALID) != flags.end()) { menu->addAction(tr("Ignore missing data"), this, SLOT(ignoreMissingData_clicked())); @@ -3120,9 +3130,9 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Visit on Nexus"), this, SLOT(visitOnNexus_clicked())); } + //If a URL is specified which is not the game's URL, pop up 'visit web page' if (info->getURL() != "" && - !GameInfo::instance().isValidModURL(info->getNexusID(), - info->getURL().toStdWString())) { + !NexusInterface::instance()->isModURL(info->getNexusID(), info->getURL())) { menu->addAction(tr("Visit web page"), this, SLOT(visitWebPage_clicked())); } @@ -3188,7 +3198,7 @@ void MainWindow::deleteSavegame_clicked() foreach (const QModelIndex &idx, selectedIndexes) { QString name = idx.data().toString(); - SaveGame *save = new SaveGame(this, idx.data(Qt::UserRole).toString()); + SaveGame *save = new SaveGame(this, idx.data(Qt::UserRole).toString(), m_OrganizerCore.managedGame()); if (count < 10) { savesMsgLabel += "
  • " + QFileInfo(name).completeBaseName() + "
  • "; @@ -3244,9 +3254,9 @@ void MainWindow::fixMods_clicked() // search in data { - QDir dataDir(m_GamePath + "/data"); + QDir dataDir(m_OrganizerCore.managedGame()->dataDirectory()); QStringList esps = dataDir.entryList(espFilter); - foreach (const QString &esp, esps) { + for (const QString &esp : esps) { std::map >::iterator iter = missingPlugins.find(esp); if (iter != missingPlugins.end()) { iter->second.push_back(""); @@ -3260,7 +3270,7 @@ void MainWindow::fixMods_clicked() ModInfo::Ptr modInfo = ModInfo::getByIndex(modIndex); QStringList esps = QDir(modInfo->absolutePath()).entryList(espFilter); - foreach (const QString &esp, esps) { + for (const QString &esp : esps) { std::map >::iterator iter = missingPlugins.find(esp); if (iter != missingPlugins.end()) { iter->second.push_back(modInfo->name()); @@ -3272,7 +3282,7 @@ void MainWindow::fixMods_clicked() { QDir overwriteDir(qApp->property("dataPath").toString() + "/" + QString::fromStdWString(AppConfig::overwritePath())); QStringList esps = overwriteDir.entryList(espFilter); - foreach (const QString &esp, esps) { + for (const QString &esp : esps) { std::map >::iterator iter = missingPlugins.find(esp); if (iter != missingPlugins.end()) { iter->second.push_back(""); @@ -3436,7 +3446,9 @@ void MainWindow::on_actionSettings_triggered() void MainWindow::on_actionNexus_triggered() { - ::ShellExecuteW(nullptr, L"open", GameInfo::instance().getNexusPage(false).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"open", + NexusInterface::instance()->getGameURL().toStdWString().c_str(), + nullptr, nullptr, SW_SHOWNORMAL); } @@ -3830,9 +3842,11 @@ void MainWindow::on_actionUpdate_triggered() void MainWindow::on_actionEndorseMO_triggered() { if (QMessageBox::question(this, tr("Endorse Mod Organizer"), - tr("Do you want to endorse Mod Organizer on %1 now?").arg(ToQString(GameInfo::instance().getNexusPage())), + tr("Do you want to endorse Mod Organizer on %1 now?").arg( + NexusInterface::instance()->getGameURL()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - NexusInterface::instance()->requestToggleEndorsement(GameInfo::instance().getNexusModID(), true, this, QVariant(), QString()); + NexusInterface::instance()->requestToggleEndorsement( + m_OrganizerCore.managedGame()->getNexusModOrganizerID(), true, this, QVariant(), QString()); } } @@ -3896,7 +3910,7 @@ void MainWindow::nxmUpdatesAvailable(const std::vector &modIDs, QVariant us QVariantList resultList = resultData.toList(); for (auto iter = resultList.begin(); iter != resultList.end(); ++iter) { QVariantMap result = iter->toMap(); - if (result["id"].toInt() == GameInfo::instance().getNexusModID()) { + if (result["id"].toInt() == m_OrganizerCore.managedGame()->getNexusModOrganizerID()) { if (!result["voted_by_user"].toBool()) { ui->actionEndorseMO->setVisible(true); } @@ -4412,8 +4426,8 @@ void MainWindow::on_bossButton_clicked() parameters << "--unattended" << "--stdout" << "--noreport" - << "--game" << ToQString(GameInfo::instance().getGameShortName()) - << "--gamePath" << QString("\"%1\"").arg(ToQString(GameInfo::instance().getGameDirectory())) + << "--game" << m_OrganizerCore.managedGame()->getGameShortName() + << "--gamePath" << QString("\"%1\"").arg(m_OrganizerCore.managedGame()->gameDirectory().absolutePath()) << "--out" << outPath; if (m_DidUpdateMasterList) { @@ -4546,12 +4560,12 @@ void MainWindow::on_bossButton_clicked() // if the game specifies load order by file time, our own load order file needs to be removed because it's outdated. // refreshESPList will then use the file time as the load order. - if (GameInfo::instance().getLoadOrderMechanism() == GameInfo::TYPE_FILETIME) { + if (m_OrganizerCore.managedGame()->getLoadOrderMechanism() == IPluginGame::LoadOrderMechanism::FileTime) { qDebug("removing loadorder.txt"); QFile::remove(m_OrganizerCore.currentProfile()->getLoadOrderFileName()); } m_OrganizerCore.refreshESPList(); - if (GameInfo::instance().getLoadOrderMechanism() == GameInfo::TYPE_FILETIME) { + if (m_OrganizerCore.managedGame()->getLoadOrderMechanism() == IPluginGame::LoadOrderMechanism::FileTime) { // the load order should have been retrieved from file time, now save it to our own format m_OrganizerCore.savePluginList(); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 3c7f2258..0cdea807 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -285,15 +285,11 @@ private: int m_OldExecutableIndex; - QString m_GamePath; - int m_ContextRow; QPersistentModelIndex m_ContextIdx; QTreeWidgetItem *m_ContextItem; QAction *m_ContextAction; - //int m_SelectedSaveGame; - CategoryFactory &m_CategoryFactory; int m_ModsToUpdate; diff --git a/src/modinfo.cpp b/src/modinfo.cpp index fe5098e8..8bc767c5 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -28,10 +28,14 @@ along with Mod Organizer. If not, see . #include "categories.h" #include "modinfodialog.h" #include "overwriteinfodialog.h" -#include "json.h" #include "filenamestring.h" #include "versioninfo.h" +#include +#include +#include +#include + #include #include #include @@ -197,7 +201,10 @@ unsigned int ModInfo::findMod(const boost::function &filter } -void ModInfo::updateFromDisc(const QString &modDirectory, DirectoryEntry **directoryStructure, bool displayForeign) +void ModInfo::updateFromDisc(const QString &modDirectory, + DirectoryEntry **directoryStructure, + bool displayForeign, + MOBase::IPluginGame const *game) { QMutexLocker lock(&s_Mutex); s_Collection.clear(); @@ -213,19 +220,25 @@ void ModInfo::updateFromDisc(const QString &modDirectory, DirectoryEntry **direc } { // list plugins in the data directory and make a foreign-managed mod out of each - std::vector dlcPlugins = GameInfo::instance().getDLCPlugins(); - QDir dataDir(QDir::fromNativeSeparators(ToQString(GameInfo::instance().getGameDirectory())) + "/data"); - foreach (const QFileInfo &file, dataDir.entryInfoList(QStringList() << "*.esp" << "*.esm")) { - if ((file.baseName() != "Update") // hide update - && (file.baseName() != ToQString(GameInfo::instance().getGameName())) // hide the game esp + QStringList dlcPlugins = game->getDLCPlugins(); + QStringList mainPlugins = game->getPrimaryPlugins(); + QDir dataDir(game->dataDirectory()); + for (const QString &file : dataDir.entryList({ "*.esp", "*.esm" })) { + if (std::find_if(mainPlugins.begin(), mainPlugins.end(), + [&file](QString const &p) { + return p.compare(file, Qt::CaseInsensitive) == 0; }) == mainPlugins.end() && (displayForeign // show non-dlc bundles only if the user wants them - || std::find(dlcPlugins.begin(), dlcPlugins.end(), ToWString(file.fileName())) != dlcPlugins.end())) { + || std::find_if(dlcPlugins.begin(), dlcPlugins.end(), + [&file](QString const &p) { + return p.compare(file, Qt::CaseInsensitive) == 0; }) != dlcPlugins.end())) { + + QFileInfo f(file); //Just so I can get a basename... QStringList archives; - foreach (const QString archiveName, dataDir.entryList(QStringList() << file.baseName() + "*.bsa")) { + for (const QString &archiveName : dataDir.entryList({ f.baseName() + "*.bsa" })) { archives.append(dataDir.absoluteFilePath(archiveName)); } - createFromPlugin(file.fileName(), archives, directoryStructure); + createFromPlugin(file, archives, directoryStructure); } } } @@ -275,7 +288,10 @@ int ModInfo::checkAllForUpdate(QObject *receiver) int result = 0; std::vector modIDs; - modIDs.push_back(GameInfo::instance().getNexusModID()); + //I ought to store this, it's used elsewhere + IPluginGame const *game = qApp->property("managed_game").value(); + + modIDs.push_back(game->getNexusModOrganizerID()); for (const ModInfo::Ptr &mod : s_Collection) { if (mod->canBeUpdated()) { diff --git a/src/modinfo.h b/src/modinfo.h index 7d305c11..ae22ccd8 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -22,6 +22,7 @@ along with Mod Organizer. If not, see . #include "imodinterface.h" #include "versioninfo.h" +//#include class QDateTime; class QDir; @@ -36,6 +37,7 @@ class QDir; #include #include +namespace MOBase { class IPluginGame; } namespace MOShared { class DirectoryEntry; } /** @@ -104,7 +106,10 @@ public: /** * @brief read the mod directory and Mod ModInfo objects for all subdirectories **/ - static void updateFromDisc(const QString &modDirectory, MOShared::DirectoryEntry **directoryStructure, bool displayForeign); + static void updateFromDisc(const QString &modDirectory, + MOShared::DirectoryEntry **directoryStructure, + bool displayForeign, + MOBase::IPluginGame const *game); static void clear() { s_Collection.clear(); s_ModsByName.clear(); s_ModsByModID.clear(); } diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 35da228b..feaac2d4 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -20,6 +20,8 @@ along with Mod Organizer. If not, see . #include "modinfodialog.h" #include "ui_modinfodialog.h" +#include "iplugingame.h" +#include "nexusinterface.h" #include "report.h" #include "utility.h" #include "messagedialog.h" @@ -27,7 +29,6 @@ along with Mod Organizer. If not, see . #include "questionboxmemory.h" #include "settings.h" #include "categories.h" -#include #include #include @@ -36,10 +37,12 @@ along with Mod Organizer. If not, see . #include #include #include -#include -#include #include +#include + +#include + using namespace MOBase; using namespace MOShared; @@ -688,7 +691,9 @@ void ModInfoDialog::on_visitNexusLabel_linkActivated(const QString &link) void ModInfoDialog::linkClicked(const QUrl &url) { - if (url.toString().startsWith(ToQString(GameInfo::instance().getNexusPage(false)))) { + //Ideally we'd ask the mod for the game and the web service then pass the game + //and URL to the web service + if (NexusInterface::instance()->isURLGameRelated(url)) { this->close(); emit nexusLinkActivated(url.toString()); } else { @@ -832,12 +837,11 @@ void ModInfoDialog::activateNexusTab() QLineEdit *modIDEdit = findChild("modIDEdit"); int modID = modIDEdit->text().toInt(); if (modID != 0) { - QString nexusLink = QString("%1/downloads/file.php?id=%2").arg(ToQString(GameInfo::instance().getNexusPage(false))).arg(modID); + QString nexusLink = NexusInterface::instance()->getModURL(modID); QLabel *visitNexusLabel = findChild("visitNexusLabel"); visitNexusLabel->setText(tr("Visit on Nexus").arg(nexusLink)); visitNexusLabel->setToolTip(nexusLink); - if (m_ModInfo->getNexusDescription().isEmpty() || QDateTime::currentDateTime() > m_ModInfo->getLastNexusQuery().addDays(1)) { refreshNexusData(modID); diff --git a/src/modinfoforeign.cpp b/src/modinfoforeign.cpp index c0e769c9..4dbe034b 100644 --- a/src/modinfoforeign.cpp +++ b/src/modinfoforeign.cpp @@ -1,8 +1,10 @@ #include "modinfoforeign.h" -#include "gameinfo.h" +#include "iplugingame.h" #include "utility.h" +#include + using namespace MOBase; using namespace MOShared; @@ -18,7 +20,9 @@ QDateTime ModInfoForeign::creationTime() const QString ModInfoForeign::absolutePath() const { - return QDir::fromNativeSeparators(ToQString(GameInfo::instance().getGameDirectory())) + "/data"; + //I ought to store this, it's used elsewhere + IPluginGame const *game = qApp->property("managed_game").value(); + return game->dataDirectory().absolutePath(); } std::vector ModInfoForeign::getFlags() const diff --git a/src/modinfoforeign.h b/src/modinfoforeign.h index b8ff2671..b35c099b 100644 --- a/src/modinfoforeign.h +++ b/src/modinfoforeign.h @@ -35,7 +35,7 @@ public: virtual QString notes() const { return ""; } virtual QDateTime creationTime() const; virtual QString absolutePath() const; - virtual MOBase::VersionInfo getNewestVersion() const { return ""; } + virtual MOBase::VersionInfo getNewestVersion() const { return QString(); } virtual QString getInstallationFile() const { return ""; } virtual int getNexusID() const { return -1; } virtual std::vector getIniTweaks() const { return std::vector(); } diff --git a/src/modinfooverwrite.h b/src/modinfooverwrite.h index 9184a90c..b6cdfb43 100644 --- a/src/modinfooverwrite.h +++ b/src/modinfooverwrite.h @@ -37,7 +37,7 @@ public: virtual QString notes() const { return ""; } virtual QDateTime creationTime() const { return QDateTime(); } virtual QString absolutePath() const; - virtual MOBase::VersionInfo getNewestVersion() const { return ""; } + virtual MOBase::VersionInfo getNewestVersion() const { return QString(); } virtual QString getInstallationFile() const { return ""; } virtual int getFixedPriority() const { return INT_MAX; } virtual int getNexusID() const { return -1; } diff --git a/src/modlist.cpp b/src/modlist.cpp index 197250a3..9d7f32c8 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -24,15 +24,14 @@ along with Mod Organizer. If not, see . #include "qtgroupingproxy.h" #include "viewmarkingscrollbar.h" #include "modlistsortproxy.h" -#include #include #include #include + #include #include #include #include -#include #include #include #include @@ -44,7 +43,9 @@ along with Mod Organizer. If not, see . #include #include #include + #include +#include #include diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp index 25f3d1b4..26a74ef6 100644 --- a/src/nexusinterface.cpp +++ b/src/nexusinterface.cpp @@ -18,14 +18,18 @@ along with Mod Organizer. If not, see . */ #include "nexusinterface.h" + +#include "iplugingame.h" #include "nxmaccessmanager.h" #include "json.h" #include "selectiondialog.h" -#include #include -#include #include +#include + +#include + using namespace MOBase; using namespace MOShared; @@ -33,34 +37,33 @@ using namespace MOShared; NexusBridge::NexusBridge(const QString &subModule) : m_Interface(NexusInterface::instance()) - , m_Url() // lazy initialized , m_SubModule(subModule) { } void NexusBridge::requestDescription(int modID, QVariant userData) { - m_RequestIDs.insert(m_Interface->requestDescription(modID, this, userData, m_SubModule, url())); + m_RequestIDs.insert(m_Interface->requestDescription(modID, this, userData, m_SubModule)); } void NexusBridge::requestFiles(int modID, QVariant userData) { - m_RequestIDs.insert(m_Interface->requestFiles(modID, this, userData, m_SubModule, url())); + m_RequestIDs.insert(m_Interface->requestFiles(modID, this, userData, m_SubModule)); } void NexusBridge::requestFileInfo(int modID, int fileID, QVariant userData) { - m_RequestIDs.insert(m_Interface->requestFileInfo(modID, fileID, this, userData, m_SubModule, url())); + m_RequestIDs.insert(m_Interface->requestFileInfo(modID, fileID, this, userData, m_SubModule)); } void NexusBridge::requestDownloadURL(int modID, int fileID, QVariant userData) { - m_RequestIDs.insert(m_Interface->requestDownloadURL(modID, fileID, this, userData, m_SubModule, url())); + m_RequestIDs.insert(m_Interface->requestDownloadURL(modID, fileID, this, userData, m_SubModule)); } void NexusBridge::requestToggleEndorsement(int modID, bool endorse, QVariant userData) { - m_RequestIDs.insert(m_Interface->requestToggleEndorsement(modID, endorse, this, userData, m_SubModule, url())); + m_RequestIDs.insert(m_Interface->requestToggleEndorsement(modID, endorse, this, userData, m_SubModule)); } void NexusBridge::nxmDescriptionAvailable(int modID, QVariant userData, QVariant resultData, int requestID) @@ -136,13 +139,6 @@ void NexusBridge::nxmRequestFailed(int modID, int fileID, QVariant userData, int } } -QString NexusBridge::url() { - if (m_Url.isEmpty()) { - m_Url = MOBase::ToQString(MOShared::GameInfo::instance().getNexusInfoUrl()); - } - return m_Url; -} - QAtomicInt NexusInterface::NXMRequestInfo::s_NextID(0); @@ -218,8 +214,8 @@ void NexusInterface::interpretNexusFileName(const QString &fileName, QString &mo QString r3Highlight(fileName); r3Highlight.insert(result.position(3) + result.length(3), "* ").insert(result.position(3), " *"); - selection.addChoice(candidate.c_str(), r3Highlight, strtol(candidate.c_str(), nullptr, 10)); - selection.addChoice(candidate2.c_str() + offset, r2Highlight, abs(strtol(candidate2.c_str() + offset, nullptr, 10))); + selection.addChoice(candidate.c_str(), r3Highlight, static_cast(strtol(candidate.c_str(), nullptr, 10))); + selection.addChoice(candidate2.c_str() + offset, r2Highlight, static_cast(abs(strtol(candidate2.c_str() + offset, nullptr, 10)))); if (selection.exec() == QDialog::Accepted) { modID = selection.getChoiceData().toInt(); } else { @@ -245,12 +241,43 @@ void NexusInterface::interpretNexusFileName(const QString &fileName, QString &mo } } +bool NexusInterface::isURLGameRelated(const QUrl &url) const +{ + QString const name(url.toString()); + return name.startsWith(getGameURL() + "/") || + name.startsWith(getOldModsURL() + "/"); +} + +QString NexusInterface::getGameURL() const +{ + return "http://www.nexusmods.com/" + m_Game->getGameShortName().toLower(); +} + +QString NexusInterface::getOldModsURL() const +{ + return "http://" + m_Game->getGameShortName().toLower() + ".nexusmods.com/mods"; +} + + +QString NexusInterface::getModURL(int modID) const +{ + return QString("%1/mods/%2").arg(getGameURL()).arg(modID); +} + +bool NexusInterface::isModURL(int modID, QString const &url) const +{ + if (url == getModURL(modID)) { + return true; + } + //Try the alternate (old style) mod name + QString alt = QString("%1/%2").arg(getOldModsURL()).arg(modID); + return alt == url; +} int NexusInterface::requestDescription(int modID, QObject *receiver, QVariant userData, - const QString &subModule, const QString &url, int nexusGameId) + const QString &subModule, MOBase::IPluginGame const *game) { - NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_DESCRIPTION, userData, subModule, url, - nexusGameId == -1 ? GameInfo::instance().getNexusGameID() : nexusGameId); + NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_DESCRIPTION, userData, subModule, game); m_RequestQueue.enqueue(requestInfo); connect(this, SIGNAL(nxmDescriptionAvailable(int,QVariant,QVariant,int)), @@ -265,9 +292,9 @@ int NexusInterface::requestDescription(int modID, QObject *receiver, QVariant us int NexusInterface::requestUpdates(const std::vector &modIDs, QObject *receiver, QVariant userData, - const QString &subModule, const QString &url) + const QString &subModule, MOBase::IPluginGame const *game) { - NXMRequestInfo requestInfo(modIDs, NXMRequestInfo::TYPE_GETUPDATES, userData, subModule, url, GameInfo::instance().getNexusGameID()); + NXMRequestInfo requestInfo(modIDs, NXMRequestInfo::TYPE_GETUPDATES, userData, subModule, game); m_RequestQueue.enqueue(requestInfo); connect(this, SIGNAL(nxmUpdatesAvailable(std::vector,QVariant,QVariant,int)), @@ -301,9 +328,9 @@ void NexusInterface::fakeFiles() int NexusInterface::requestFiles(int modID, QObject *receiver, QVariant userData, - const QString &subModule, const QString &url) + const QString &subModule, MOBase::IPluginGame const *game) { - NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_FILES, userData, subModule, url, GameInfo::instance().getNexusGameID()); + NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_FILES, userData, subModule, game); m_RequestQueue.enqueue(requestInfo); connect(this, SIGNAL(nxmFilesAvailable(int,QVariant,QVariant,int)), receiver, SLOT(nxmFilesAvailable(int,QVariant,QVariant,int)), Qt::UniqueConnection); @@ -321,9 +348,9 @@ int NexusInterface::requestFiles(int modID, QObject *receiver, QVariant userData int NexusInterface::requestFileInfo(int modID, int fileID, QObject *receiver, QVariant userData, const QString &subModule, - const QString &url) + MOBase::IPluginGame const *game) { - NXMRequestInfo requestInfo(modID, fileID, NXMRequestInfo::TYPE_FILEINFO, userData, subModule, url, GameInfo::instance().getNexusGameID()); + NXMRequestInfo requestInfo(modID, fileID, NXMRequestInfo::TYPE_FILEINFO, userData, subModule, game); m_RequestQueue.enqueue(requestInfo); connect(this, SIGNAL(nxmFileInfoAvailable(int,int,QVariant,QVariant,int)), @@ -338,9 +365,9 @@ int NexusInterface::requestFileInfo(int modID, int fileID, QObject *receiver, QV int NexusInterface::requestDownloadURL(int modID, int fileID, QObject *receiver, QVariant userData, - const QString &subModule, const QString &url) + const QString &subModule, MOBase::IPluginGame const *game) { - NXMRequestInfo requestInfo(modID, fileID, NXMRequestInfo::TYPE_DOWNLOADURL, userData, subModule, url, GameInfo::instance().getNexusGameID()); + NXMRequestInfo requestInfo(modID, fileID, NXMRequestInfo::TYPE_DOWNLOADURL, userData, subModule, game); m_RequestQueue.enqueue(requestInfo); connect(this, SIGNAL(nxmDownloadURLsAvailable(int,int,QVariant,QVariant,int)), @@ -355,9 +382,9 @@ int NexusInterface::requestDownloadURL(int modID, int fileID, QObject *receiver, int NexusInterface::requestToggleEndorsement(int modID, bool endorse, QObject *receiver, QVariant userData, - const QString &subModule, const QString &url) + const QString &subModule, MOBase::IPluginGame const *game) { - NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_TOGGLEENDORSEMENT, userData, subModule, url, GameInfo::instance().getNexusGameID()); + NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_TOGGLEENDORSEMENT, userData, subModule, game); requestInfo.m_Endorse = endorse; m_RequestQueue.enqueue(requestInfo); @@ -558,13 +585,24 @@ void NexusInterface::requestTimeout() } } +void NexusInterface::managedGameChanged(IPluginGame const *game) +{ + m_Game = game; +} + +namespace { + QString get_management_url(MOBase::IPluginGame const *game) + { + return "http://nmm.nexusmods.com/" + game->getGameShortName().toLower(); + } +} NexusInterface::NXMRequestInfo::NXMRequestInfo(int modID , NexusInterface::NXMRequestInfo::Type type , QVariant userData , const QString &subModule - , const QString &url - , int nexusGameId) + , MOBase::IPluginGame const *game + ) : m_ModID(modID) , m_FileID(0) , m_Reply(nullptr) @@ -573,9 +611,9 @@ NexusInterface::NXMRequestInfo::NXMRequestInfo(int modID , m_Timeout(nullptr) , m_Reroute(false) , m_ID(s_NextID.fetchAndAddAcquire(1)) - , m_URL(url) + , m_URL(get_management_url(game)) , m_SubModule(subModule) - , m_NexusGameID(nexusGameId) + , m_NexusGameID(game->getNexusGameID()) , m_Endorse(false) {} @@ -583,8 +621,8 @@ NexusInterface::NXMRequestInfo::NXMRequestInfo(std::vector modIDList , NexusInterface::NXMRequestInfo::Type type , QVariant userData , const QString &subModule - , const QString &url - , int nexusGameId) + , MOBase::IPluginGame const *game + ) : m_ModID(-1) , m_ModIDList(modIDList) , m_FileID(0) @@ -594,9 +632,9 @@ NexusInterface::NXMRequestInfo::NXMRequestInfo(std::vector modIDList , m_Timeout(nullptr) , m_Reroute(false) , m_ID(s_NextID.fetchAndAddAcquire(1)) - , m_URL(url) + , m_URL(get_management_url(game)) , m_SubModule(subModule) - , m_NexusGameID(nexusGameId) + , m_NexusGameID(game->getNexusGameID()) , m_Endorse(false) {} @@ -605,8 +643,8 @@ NexusInterface::NXMRequestInfo::NXMRequestInfo(int modID , NexusInterface::NXMRequestInfo::Type type , QVariant userData , const QString &subModule - , const QString &url - , int nexusGameId) + , MOBase::IPluginGame const *game + ) : m_ModID(modID) , m_FileID(fileID) , m_Reply(nullptr) @@ -615,8 +653,8 @@ NexusInterface::NXMRequestInfo::NXMRequestInfo(int modID , m_Timeout(nullptr) , m_Reroute(false) , m_ID(s_NextID.fetchAndAddAcquire(1)) - , m_URL(url) + , m_URL(get_management_url(game)) , m_SubModule(subModule) - , m_NexusGameID(nexusGameId) + , m_NexusGameID(game->getNexusGameID()) , m_Endorse(false) {} diff --git a/src/nexusinterface.h b/src/nexusinterface.h index c0ee50cd..c9a81134 100644 --- a/src/nexusinterface.h +++ b/src/nexusinterface.h @@ -20,20 +20,20 @@ along with Mod Organizer. If not, see . #ifndef NEXUSINTERFACE_H #define NEXUSINTERFACE_H - - #include -#include #include #include + #include #include #include #include #include + #include #include +namespace MOBase { class IPluginGame; } class NexusInterface; class NXMAccessManager; @@ -106,14 +106,9 @@ public slots: void nxmEndorsementToggled(int modID, QVariant userData, QVariant resultData, int requestID); void nxmRequestFailed(int modID, int fileID, QVariant userData, int requestID, const QString &errorMessage); -private: - - QString url(); - private: NexusInterface *m_Interface; - QString m_Url; QString m_SubModule; std::set m_RequestIDs; @@ -147,29 +142,67 @@ public: */ void cleanup(); + /** + * @brief request description for a mod + * + * @param modID id of the mod caller is interested in (assumed to be for the current game) + * @param receiver the object to receive the result asynchronously via a signal (nxmDescriptionAvailable) + * @param userData user data to be returned with the result + * @return int an id to identify the request + **/ + int requestDescription(int modID, QObject *receiver, QVariant userData, const QString &subModule) + { + return requestDescription(modID, receiver, userData, subModule, m_Game); + } + /** * @brief request description for a mod * * @param modID id of the mod caller is interested in * @param receiver the object to receive the result asynchronously via a signal (nxmDescriptionAvailable) * @param userData user data to be returned with the result - * @param url the url to request from + * @param game Game with which the mod is associated * @return int an id to identify the request **/ int requestDescription(int modID, QObject *receiver, QVariant userData, const QString &subModule, - const QString &url = MOBase::ToQString(MOShared::GameInfo::instance().getNexusInfoUrl()), - int nexusGameId = -1); + MOBase::IPluginGame const *game); + + /** + * @brief request nexus descriptions for multiple mods at once + * @param modIDs a list of ids of mods the caller is interested in (assumed to be for the current game) + * @param receiver the object to receive the result asynchronously via a signal (nxmDescriptionAvailable) + * @param userData user data to be returned with the result + * @return int an id to identify the request + */ + int requestUpdates(const std::vector &modIDs, QObject *receiver, QVariant userData, const QString &subModule) + { + return requestUpdates(modIDs, receiver, userData, subModule, m_Game); + } /** * @brief request nexus descriptions for multiple mods at once * @param modIDs a list of ids of mods the caller is interested in * @param receiver the object to receive the result asynchronously via a signal (nxmDescriptionAvailable) * @param userData user data to be returned with the result - * @param url the url to request from + * @param game the game with which the mods are associated * @return int an id to identify the request */ int requestUpdates(const std::vector &modIDs, QObject *receiver, QVariant userData, const QString &subModule, - const QString &url = MOBase::ToQString(MOShared::GameInfo::instance().getNexusInfoUrl())); + MOBase::IPluginGame const *game); + + /** + * @brief request a list of the files belonging to a mod + * + * @param modID id of the mod caller is interested in (assumed to be for the current game) + * @param receiver the object to receive the result asynchronously via a signal (nxmFilesAvailable) + * @param userData user data to be returned with the result + * @return int an id to identify the request + **/ + int requestFiles(int modID, QObject *receiver, QVariant userData, const QString &subModule) + { + return requestFiles(modID, receiver, userData, subModule, m_Game); + } + /** * @brief request a list of the files belonging to a mod @@ -177,24 +210,52 @@ public: * @param modID id of the mod caller is interested in * @param receiver the object to receive the result asynchronously via a signal (nxmFilesAvailable) * @param userData user data to be returned with the result - * @param url the url to request from + * @param game the game with which the mods are associated * @return int an id to identify the request **/ int requestFiles(int modID, QObject *receiver, QVariant userData, const QString &subModule, - const QString &url = MOBase::ToQString(MOShared::GameInfo::instance().getNexusInfoUrl())); + MOBase::IPluginGame const *game); /** * @brief request info about a single file of a mod * - * @param modID id of the mod caller is interested in + * @param modID id of the mod caller is interested in (assumed to be for the current game) * @param fileID id of the file the caller is interested in * @param receiver the object to receive the result asynchronously via a signal (nxmFilesAvailable) * @param userData user data to be returned with the result - * @param url the url to request from + * @return int an id to identify the request + **/ + int requestFileInfo(int modID, int fileID, QObject *receiver, QVariant userData, const QString &subModule) + { + return requestFileInfo(modID, fileID, receiver, userData, subModule, m_Game); + } + + /** + * @brief request info about a single file of a mod + * + * @param modID id of the mod caller is interested in (assumed to be for the current game) + * @param fileID id of the file the caller is interested in + * @param receiver the object to receive the result asynchronously via a signal (nxmFilesAvailable) + * @param userData user data to be returned with the result + * @param game the game with which the mods are associated * @return int an id to identify the request **/ int requestFileInfo(int modID, int fileID, QObject *receiver, QVariant userData, const QString &subModule, - const QString &url = MOBase::ToQString(MOShared::GameInfo::instance().getNexusInfoUrl())); + MOBase::IPluginGame const *game); + + /** + * @brief request the download url of a file + * + * @param modID id of the mod caller is interested in (assumed to be for the current game) + * @param fileID id of the file the caller is interested in + * @param receiver the object to receive the result asynchronously via a signal (nxmFilesAvailable) + * @param userData user data to be returned with the result + * @return int an id to identify the request + **/ + int requestDownloadURL(int modID, int fileID, QObject *receiver, QVariant userData, const QString &subModule) + { + return requestDownloadURL(modID, fileID, receiver, userData, subModule, m_Game); + } /** * @brief request the download url of a file @@ -203,11 +264,23 @@ public: * @param fileID id of the file the caller is interested in * @param receiver the object to receive the result asynchronously via a signal (nxmFilesAvailable) * @param userData user data to be returned with the result - * @param url the url to request from + * @param game the game with which the mods are associated * @return int an id to identify the request **/ - int requestDownloadURL(int modID, int fileID, QObject *receiver, QVariant userData, const QString &subModule, - const QString &url = MOBase::ToQString(MOShared::GameInfo::instance().getNexusInfoUrl())); + int requestDownloadURL(int modID, int fileID, QObject *receiver, QVariant userData, const QString &subModule, MOBase::IPluginGame const *game); + + /** + * @brief toggle endorsement state of the mod + * @param modID id of the mod (assumed to be for the current game) + * @param endorse true if the mod should be endorsed, false for un-endorse + * @param receiver the object to receive the result asynchronously via a signal (nxmFilesAvailable) + * @param userData user data to be returned with the result + * @return int an id to identify the request + */ + int requestToggleEndorsement(int modID, bool endorse, QObject *receiver, QVariant userData, const QString &subModule) + { + return requestToggleEndorsement(modID, endorse, receiver, userData, subModule, m_Game); + } /** * @brief toggle endorsement state of the mod @@ -215,11 +288,11 @@ public: * @param endorse true if the mod should be endorsed, false for un-endorse * @param receiver the object to receive the result asynchronously via a signal (nxmFilesAvailable) * @param userData user data to be returned with the result - * @param url the url to request from + * @param game the game with which the mods are associated * @return int an id to identify the request */ int requestToggleEndorsement(int modID, bool endorse, QObject *receiver, QVariant userData, const QString &subModule, - const QString &url = MOBase::ToQString(MOShared::GameInfo::instance().getNexusInfoUrl())); + MOBase::IPluginGame const *game); /** * @param directory the directory to store cache files @@ -247,6 +320,39 @@ public: */ static void interpretNexusFileName(const QString &fileName, QString &modName, int &modID, bool query); + /** + * @brief get the currently managed game + */ + MOBase::IPluginGame const *managedGame() const; + + /** + * @brief see if the passed URL is related to the current game + * + * Arguably, this should optionally take a gameplugin pointer + */ + bool isURLGameRelated(QUrl const &url) const; + + /** + * @brief Get the nexus page for the current game + * + * Arguably, this should optionally take a gameplugin pointer + */ + QString getGameURL() const; + + /** + * @brief Get the URL for the mod web page + * @param modID + */ + QString getModURL(int modID) const; + + /** + * @brief Checks if the specified URL might correspond to a nexus mod + * @param modID + * @param url + * @return + */ + bool isModURL(int modID, QString const &url) const; + signals: void requestNXMDownload(const QString &url); @@ -261,6 +367,9 @@ signals: void nxmEndorsementToggled(int modID, QVariant userData, QVariant resultData, int requestID); void nxmRequestFailed(int modID, int fileID, QVariant userData, int requestID, const QString &errorString); +public slots: + void managedGameChanged(MOBase::IPluginGame const *game); + private slots: void requestFinished(); @@ -295,9 +404,9 @@ private: int m_ID; int m_Endorse; - NXMRequestInfo(int modID, Type type, QVariant userData, const QString &subModule, const QString &url, int nexusGameId); - NXMRequestInfo(std::vector modIDList, Type type, QVariant userData, const QString &subModule, const QString &url, int nexusGameId); - NXMRequestInfo(int modID, int fileID, Type type, QVariant userData, const QString &subModule, const QString &url, int nexusGameId); + NXMRequestInfo(int modID, Type type, QVariant userData, const QString &subModule, MOBase::IPluginGame const *game); + NXMRequestInfo(std::vector modIDList, Type type, QVariant userData, const QString &subModule, MOBase::IPluginGame const *game); + NXMRequestInfo(int modID, int fileID, Type type, QVariant userData, const QString &subModule, MOBase::IPluginGame const *game); private: static QAtomicInt s_NextID; @@ -311,6 +420,7 @@ private: void nextRequest(); void requestFinished(std::list::iterator iter); bool requiresLogin(const NXMRequestInfo &info); + QString getOldModsURL() const; private: @@ -324,6 +434,8 @@ private: MOBase::VersionInfo m_MOVersion; QString m_NMMVersion; + MOBase::IPluginGame const *m_Game; + }; #endif // NEXUSINTERFACE_H diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp index 0763bb71..7d0dacc2 100644 --- a/src/nxmaccessmanager.cpp +++ b/src/nxmaccessmanager.cpp @@ -18,6 +18,8 @@ along with Mod Organizer. If not, see . */ #include "nxmaccessmanager.h" + +#include "iplugingame.h" #include "nxmurl.h" #include "report.h" #include "utility.h" @@ -25,7 +27,6 @@ along with Mod Organizer. If not, see . #include "persistentcookiejar.h" #include "settings.h" #include -#include #include #include #include @@ -39,10 +40,11 @@ along with Mod Organizer. If not, see . #include #include - using namespace MOBase; -using namespace MOShared; +namespace { + QString const Nexus_Management_URL("http://nmm.nexusmods.com"); +} // unfortunately Nexus doesn't seem to document these states, all I know is all these listed // are considered premium (27 should be lifetime premium) @@ -96,8 +98,7 @@ QNetworkReply *NXMAccessManager::createRequest( void NXMAccessManager::showCookies() const { - QUrl url(ToQString(GameInfo::instance().getNexusPage()) + "/"); - + QUrl url(Nexus_Management_URL + "/"); for (const QNetworkCookie &cookie : cookieJar()->cookiesForUrl(url)) { qDebug("%s - %s (expires: %s)", cookie.name().constData(), cookie.value().constData(), @@ -110,7 +111,7 @@ void NXMAccessManager::startLoginCheck() { if (hasLoginCookies()) { qDebug("validating login cookies"); - QNetworkRequest request(ToQString(GameInfo::instance().getNexusPage()) + "/Sessions/?Validate"); + QNetworkRequest request(Nexus_Management_URL + "/Sessions/?Validate"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); request.setRawHeader("User-Agent", userAgent().toUtf8()); @@ -127,9 +128,8 @@ void NXMAccessManager::startLoginCheck() void NXMAccessManager::retrieveCredentials() { qDebug("retrieving credentials"); - QNetworkRequest request(ToQString(GameInfo::instance().getNexusPage()) - + QString("/Core/Libs/Flamework/Entities/User?GetCredentials&game_id=%1" - ).arg(GameInfo::instance().getNexusGameID())); + + QNetworkRequest request(Nexus_Management_URL + "/Core/Libs/Flamework/Entities/User?GetCredentials"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); request.setRawHeader("User-Agent", userAgent().toUtf8()); @@ -224,8 +224,9 @@ QString NXMAccessManager::userAgent(const QString &subModule) const void NXMAccessManager::pageLogin() { qDebug("logging %s in on Nexus", qPrintable(m_Username)); - QString requestString = (ToQString(GameInfo::instance().getNexusPage()) + "/Sessions/?Login&uri=%1") - .arg(QString(QUrl::toPercentEncoding(ToQString(GameInfo::instance().getNexusPage())))); + + QString requestString = (Nexus_Management_URL + "/Sessions/?Login&uri=%1") + .arg(QString(QUrl::toPercentEncoding(Nexus_Management_URL))); QNetworkRequest request(requestString); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); @@ -289,15 +290,14 @@ void NXMAccessManager::loginError(QNetworkReply::NetworkError) bool NXMAccessManager::hasLoginCookies() const { - bool sidCookie = false; - QUrl url(ToQString(GameInfo::instance().getNexusPage()) + "/"); + QUrl url(Nexus_Management_URL + "/"); QList cookies = cookieJar()->cookiesForUrl(url); for (const QNetworkCookie &cookie : cookies) { if (cookie.name() == "sid") { - sidCookie = true; + return true; } } - return sidCookie; + return false; } @@ -338,4 +338,3 @@ void NXMAccessManager::loginChecked() m_LoginReply->deleteLater(); m_LoginReply = nullptr; } - diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h index a03dbe36..82bd2bd5 100644 --- a/src/nxmaccessmanager.h +++ b/src/nxmaccessmanager.h @@ -27,6 +27,7 @@ along with Mod Organizer. If not, see . #include #include +namespace MOBase { class IPluginGame; } /** * @brief access manager extended to handle nxm links @@ -84,8 +85,6 @@ private slots: void loginError(QNetworkReply::NetworkError errorCode); void loginTimeout(); -public slots: - protected: virtual QNetworkReply *createRequest( diff --git a/src/organizer.pro b/src/organizer.pro index adc606fb..1284aa40 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -70,7 +70,6 @@ SOURCES += \ moapplication.cpp \ profileinputdialog.cpp \ icondelegate.cpp \ - gameinfoimpl.cpp \ csvbuilder.cpp \ savetextasdialog.cpp \ qtgroupingproxy.cpp \ @@ -150,7 +149,6 @@ HEADERS += \ moapplication.h \ profileinputdialog.h \ icondelegate.h \ - gameinfoimpl.h \ csvbuilder.h \ savetextasdialog.h \ qtgroupingproxy.h \ @@ -244,6 +242,10 @@ INCLUDEPATH += "E:/Visual Leak Detector/include" LIBS += -L"E:/Visual Leak Detector/lib/Win32" #DEFINES += LEAK_CHECK_WITH_VLD +#########################FUDGE############################### +INCLUDEPATH += ../plugins/gameGamebryo +############################################################# + # custom leak detection #LIBS += -lDbgHelp @@ -365,10 +367,10 @@ CONFIG(debug, debug|release) { } OTHER_FILES += \ - SConscript + SConscript \ + CMakeLists.txt DISTFILES += \ tutorials/tutorial_primer_main.js \ tutorials/Tooltip.qml \ - tutorials/TooltipArea.qml \ - SConscript + tutorials/TooltipArea.qml diff --git a/src/organizercore.cpp b/src/organizercore.cpp index a9284e97..06a6dba4 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -1,6 +1,7 @@ #include "organizercore.h" + +#include "iplugingame.h" #include "mainwindow.h" -#include "gameinfoimpl.h" #include "messagedialog.h" #include "logbuffer.h" #include "credentialsdialog.h" @@ -19,11 +20,14 @@ #include #include #include + #include #include #include #include + #include + #include @@ -118,8 +122,7 @@ QStringList toStringList(InputIterator current, InputIterator end) OrganizerCore::OrganizerCore(const QSettings &initSettings) - : m_GameInfo(new GameInfoImpl()) - , m_UserInterface(nullptr) + : m_UserInterface(nullptr) , m_PluginContainer(nullptr) , m_GameName() , m_CurrentProfile(nullptr) @@ -159,7 +162,11 @@ OrganizerCore::OrganizerCore(const QSettings &initSettings) connect(NexusInterface::instance()->getAccessManager(), SIGNAL(loginSuccessful(bool)), this, SLOT(loginSuccessful(bool))); connect(NexusInterface::instance()->getAccessManager(), SIGNAL(loginFailed(QString)), this, SLOT(loginFailed(QString))); - connect(this, SIGNAL(managedGameChanged(MOBase::IPluginGame*)), &m_Settings, SLOT(managedGameChanged(MOBase::IPluginGame*))); + //This seems awfully imperative + connect(this, SIGNAL(managedGameChanged(MOBase::IPluginGame const *)), &m_Settings, SLOT(managedGameChanged(MOBase::IPluginGame const *))); + connect(this, SIGNAL(managedGameChanged(MOBase::IPluginGame const *)), &m_DownloadManager, SLOT(managedGameChanged(MOBase::IPluginGame const *))); + connect(this, SIGNAL(managedGameChanged(MOBase::IPluginGame const *)), &m_PluginList, SLOT(managedGameChanged(MOBase::IPluginGame const *))); + connect(this, SIGNAL(managedGameChanged(MOBase::IPluginGame const *)), NexusInterface::instance(), SLOT(managedGameChanged(MOBase::IPluginGame const *))); connect(&m_PluginList, &PluginList::writePluginsList, &m_PluginListsWriter, &DelayedFileWriterBase::write); @@ -186,7 +193,6 @@ OrganizerCore::~OrganizerCore() m_ModList.setProfile(nullptr); NexusInterface::instance()->cleanup(); - delete m_GameInfo; delete m_DirectoryStructure; } @@ -322,7 +328,7 @@ void OrganizerCore::updateExecutablesList(QSettings &settings) return; } - m_ExecutablesList.init(m_PluginContainer->managedGame(ToQString(GameInfo::instance().getGameName()))); + m_ExecutablesList.init(managedGame()); qDebug("setting up configured executables"); @@ -350,7 +356,7 @@ void OrganizerCore::updateExecutablesList(QSettings &settings) settings.endArray(); // TODO this has nothing to do with executables list move to an appropriate function! - ModInfo::updateFromDisc(m_Settings.getModDirectory(), &m_DirectoryStructure, m_Settings.displayForeign()); + ModInfo::updateFromDisc(m_Settings.getModDirectory(), &m_DirectoryStructure, m_Settings.displayForeign(), managedGame()); } void OrganizerCore::setUserInterface(IUserInterface *userInterface, QWidget *widget) @@ -393,6 +399,14 @@ void OrganizerCore::connectPlugins(PluginContainer *container) m_GamePlugin = m_PluginContainer->managedGame(m_GameName); emit managedGameChanged(m_GamePlugin); } + //Do this the hard way + for (const IPluginGame * const game : container->plugins()) { + QString n = game->getGameShortName(); + if (game->getGameShortName() == "Skyrim") { + m_Updater.setNexusDownload(game); + break; + } + } } void OrganizerCore::disconnectPlugins() @@ -408,15 +422,12 @@ void OrganizerCore::disconnectPlugins() m_PluginContainer = nullptr; } -void OrganizerCore::setManagedGame(const QString &gameName, const QString &gamePath) +void OrganizerCore::setManagedGame(MOBase::IPluginGame const *game) { - m_GameName = gameName; - if (m_PluginContainer != nullptr) { - m_GamePlugin = m_PluginContainer->managedGame(m_GameName); - m_GamePlugin->setGamePath(gamePath); - qApp->setProperty("managed_game", QVariant::fromValue(m_GamePlugin)); - emit managedGameChanged(m_GamePlugin); - } + m_GameName = game->gameName(); + m_GamePlugin = game; + qApp->setProperty("managed_game", QVariant::fromValue(m_GamePlugin)); + emit managedGameChanged(m_GamePlugin); } Settings &OrganizerCore::settings() @@ -555,11 +566,6 @@ void OrganizerCore::setCurrentProfile(const QString &profileName) refreshDirectoryStructure(); } -MOBase::IGameInfo &OrganizerCore::gameInfo() const -{ - return *m_GameInfo; -} - MOBase::IModRepositoryBridge *OrganizerCore::createNexusBridge() const { return new NexusBridge(); @@ -593,14 +599,10 @@ MOBase::VersionInfo OrganizerCore::appVersion() const return m_Updater.getVersion(); } -MOBase::IModInterface *OrganizerCore::getMod(const QString &name) +MOBase::IModInterface *OrganizerCore::getMod(const QString &name) const { unsigned int index = ModInfo::getIndex(name); - if (index == UINT_MAX) { - return nullptr; - } else { - return ModInfo::getByIndex(index).data(); - } + return index == UINT_MAX ? nullptr : ModInfo::getByIndex(index).data(); } MOBase::IModInterface *OrganizerCore::createMod(GuessedValue &name) @@ -930,12 +932,12 @@ void OrganizerCore::spawnBinary(const QFileInfo &binary, const QString &argument refreshDirectoryStructure(); // need to remove our stored load order because it may be outdated if a foreign tool changed the // file time. After removing that file, refreshESPList will use the file time as the order - if (GameInfo::instance().getLoadOrderMechanism() == GameInfo::TYPE_FILETIME) { + if (managedGame()->getLoadOrderMechanism() == IPluginGame::LoadOrderMechanism::FileTime) { qDebug("removing loadorder.txt"); QFile::remove(m_CurrentProfile->getLoadOrderFileName()); } refreshESPList(); - if (GameInfo::instance().getLoadOrderMechanism() == GameInfo::TYPE_FILETIME) { + if (managedGame()->getLoadOrderMechanism() == IPluginGame::LoadOrderMechanism::FileTime) { // the load order should have been retrieved from file time, now save it to our own format savePluginList(); } @@ -961,7 +963,10 @@ HANDLE OrganizerCore::spawnBinaryDirect(const QFileInfo &binary, const QString & ::SetEnvironmentVariableW(L"SteamAPPId", ToWString(m_Settings.getSteamAppID()).c_str()); } - if ((GameInfo::instance().requiresSteam()) + + //This could possibly be extracted somewhere else but it's probably for when + //we have more than one provider of game registration. + if (QFileInfo(managedGame()->gameDirectory().absoluteFilePath("steam_api.dll")).exists() && (m_Settings.getLoadMechanism() == LoadMechanism::LOAD_MODORGANIZER)) { if (!testForSteam()) { QWidget *window = qApp->activeWindow(); @@ -1017,7 +1022,7 @@ HANDLE OrganizerCore::startApplication(const QString &executable, const QStringL binary = QFileInfo(executable); if (binary.isRelative()) { // relative path, should be relative to game directory - binary = QFileInfo(QDir::fromNativeSeparators(ToQString(GameInfo::instance().getGameDirectory())) + "/" + executable); + binary = QFileInfo(managedGame()->gameDirectory().absoluteFilePath(executable)); } if (cwd.length() == 0) { currentDirectory = binary.absolutePath(); @@ -1133,7 +1138,7 @@ void OrganizerCore::refreshModList(bool saveChanges) if (saveChanges) { m_CurrentProfile->modlistWriter().writeImmediately(true); } - ModInfo::updateFromDisc(m_Settings.getModDirectory(), &m_DirectoryStructure, m_Settings.displayForeign()); + ModInfo::updateFromDisc(m_Settings.getModDirectory(), &m_DirectoryStructure, m_Settings.displayForeign(), managedGame()); m_CurrentProfile->refreshModStatus(); @@ -1314,7 +1319,7 @@ PluginListSortProxy *OrganizerCore::createPluginListProxyModel() return result; } -IPluginGame *OrganizerCore::managedGame() const +IPluginGame const *OrganizerCore::managedGame() const { return m_GamePlugin; } @@ -1375,7 +1380,7 @@ void OrganizerCore::directory_refreshed() void OrganizerCore::profileRefresh() { // have to refresh mods twice (again in refreshModList), otherwise the refresh isn't complete. Not sure why - ModInfo::updateFromDisc(m_Settings.getModDirectory(), &m_DirectoryStructure, m_Settings.displayForeign()); + ModInfo::updateFromDisc(m_Settings.getModDirectory(), &m_DirectoryStructure, m_Settings.displayForeign(), managedGame()); m_CurrentProfile->refreshModStatus(); refreshModList(); @@ -1571,10 +1576,10 @@ void OrganizerCore::prepareStart() { storeSettings(); } +/* std::vector> OrganizerCore::fileMapping() { - IPluginGame *game = qApp->property("managed_game").value(); - return fileMapping(game->dataDirectory().absolutePath(), + return fileMapping(managedGame()->dataDirectory().absolutePath(), directoryStructure(), directoryStructure()); } @@ -1610,4 +1615,4 @@ std::vector> OrganizerCore::fileMapping( return result; } - +*/ diff --git a/src/organizercore.h b/src/organizercore.h index 85f0e0c4..5cfbaca4 100644 --- a/src/organizercore.h +++ b/src/organizercore.h @@ -73,7 +73,7 @@ public: void connectPlugins(PluginContainer *container); void disconnectPlugins(); - void setManagedGame(const QString &gameName, const QString &gamePath); + void setManagedGame(const MOBase::IPluginGame *game); void updateExecutablesList(QSettings &settings); @@ -99,7 +99,7 @@ public: ModListSortProxy *createModListProxyModel(); PluginListSortProxy *createPluginListProxyModel(); - MOBase::IPluginGame *managedGame() const; + MOBase::IPluginGame const *managedGame() const; bool isArchivesInit() const { return m_ArchivesInit; } @@ -126,13 +126,12 @@ public: MOBase::DelayedFileWriter &pluginsWriter() { return m_PluginListsWriter; } public: - MOBase::IGameInfo &gameInfo() const; MOBase::IModRepositoryBridge *createNexusBridge() const; QString profileName() const; QString profilePath() const; QString downloadsPath() const; MOBase::VersionInfo appVersion() const; - MOBase::IModInterface *getMod(const QString &name); + MOBase::IModInterface *getMod(const QString &name) const; MOBase::IModInterface *createMod(MOBase::GuessedValue &name); bool removeMod(MOBase::IModInterface *mod); void modDataChanged(MOBase::IModInterface *mod); @@ -157,7 +156,7 @@ public: bool onFinishedRun(const std::function &func); void refreshModList(bool saveChanges = true); - std::vector > fileMapping(); + //std::vector > fileMapping(); public: // IPluginDiagnose interface @@ -194,7 +193,7 @@ signals: */ void modInstalled(const QString &modName); - void managedGameChanged(MOBase::IPluginGame *gamePlugin); + void managedGameChanged(MOBase::IPluginGame const *gamePlugin); private: @@ -210,9 +209,11 @@ private: bool testForSteam(); - std::vector> fileMapping(const QString &dataPath, + /* + * std::vector> fileMapping(const QString &dataPath, const MOShared::DirectoryEntry *base, const MOShared::DirectoryEntry *directoryEntry); +*/ private slots: @@ -229,12 +230,10 @@ private: private: - MOBase::IGameInfo *m_GameInfo; - IUserInterface *m_UserInterface; PluginContainer *m_PluginContainer; QString m_GameName; - MOBase::IPluginGame *m_GamePlugin; + MOBase::IPluginGame const *m_GamePlugin; Profile *m_CurrentProfile; diff --git a/src/organizerproxy.cpp b/src/organizerproxy.cpp index 095cb0bb..ba07c154 100644 --- a/src/organizerproxy.cpp +++ b/src/organizerproxy.cpp @@ -1,7 +1,8 @@ #include "organizerproxy.h" -#include + #include +#include using namespace MOBase; using namespace MOShared; @@ -13,11 +14,6 @@ OrganizerProxy::OrganizerProxy(OrganizerCore *organizer, const QString &pluginNa { } -IGameInfo &OrganizerProxy::gameInfo() const -{ - return m_Proxied->gameInfo(); -} - IModRepositoryBridge *OrganizerProxy::createNexusBridge() const { return new NexusBridge(m_PluginName); @@ -40,7 +36,7 @@ QString OrganizerProxy::downloadsPath() const QString OrganizerProxy::overwritePath() const { - return QDir::fromNativeSeparators(ToQString(GameInfo::instance().getOrganizerDirectory())) + return QDir::fromNativeSeparators(qApp->property("dataPath").toString()) + "/" + ToQString(AppConfig::overwritePath()); } @@ -50,7 +46,7 @@ VersionInfo OrganizerProxy::appVersion() const return m_Proxied->appVersion(); } -IModInterface *OrganizerProxy::getMod(const QString &name) +IModInterface *OrganizerProxy::getMod(const QString &name) const { return m_Proxied->getMod(name); } @@ -155,17 +151,22 @@ QList OrganizerProxy::findFileInfos(const QString return m_Proxied->findFileInfos(path, filter); } -MOBase::IDownloadManager *OrganizerProxy::downloadManager() +MOBase::IDownloadManager *OrganizerProxy::downloadManager() const { return m_Proxied->downloadManager(); } -MOBase::IPluginList *OrganizerProxy::pluginList() +MOBase::IPluginList *OrganizerProxy::pluginList() const { return m_Proxied->pluginList(); } -MOBase::IModList *OrganizerProxy::modList() +MOBase::IModList *OrganizerProxy::modList() const { return m_Proxied->modList(); } + +MOBase::IPluginGame const *OrganizerProxy::managedGame() const +{ + return m_Proxied->managedGame(); +} diff --git a/src/organizerproxy.h b/src/organizerproxy.h index fb502a7f..62a35498 100644 --- a/src/organizerproxy.h +++ b/src/organizerproxy.h @@ -12,14 +12,13 @@ public: OrganizerProxy(OrganizerCore *organizer, const QString &pluginName); - virtual MOBase::IGameInfo &gameInfo() const; virtual MOBase::IModRepositoryBridge *createNexusBridge() const; virtual QString profileName() const; virtual QString profilePath() const; virtual QString downloadsPath() const; virtual QString overwritePath() const; virtual MOBase::VersionInfo appVersion() const; - virtual MOBase::IModInterface *getMod(const QString &name); + virtual MOBase::IModInterface *getMod(const QString &name) const; virtual MOBase::IModInterface *createMod(MOBase::GuessedValue &name); virtual bool removeMod(MOBase::IModInterface *mod); virtual void modDataChanged(MOBase::IModInterface *mod); @@ -35,9 +34,9 @@ public: virtual QStringList getFileOrigins(const QString &fileName) const; virtual QList findFileInfos(const QString &path, const std::function &filter) const; - virtual MOBase::IDownloadManager *downloadManager(); - virtual MOBase::IPluginList *pluginList(); - virtual MOBase::IModList *modList(); + virtual MOBase::IDownloadManager *downloadManager() const; + virtual MOBase::IPluginList *pluginList() const; + virtual MOBase::IModList *modList() const; virtual HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", const QString &profile = ""); virtual bool waitForApplication(HANDLE handle, LPDWORD exitCode = nullptr) const; virtual void refreshModList(bool saveChanges); @@ -46,6 +45,7 @@ public: virtual bool onFinishedRun(const std::function &func); virtual bool onModInstalled(const std::function &func); + virtual MOBase::IPluginGame const *managedGame() const; private: diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index e7d493a7..7a609374 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -24,7 +24,6 @@ along with Mod Organizer. If not, see . #include "scopeguard.h" #include "modinfo.h" #include -#include #include #include #include @@ -128,7 +127,7 @@ void PluginList::refresh(const QString &profileName m_ESPsByPriority.clear(); m_ESPs.clear(); - QStringList primaryPlugins = qApp->property("managed_game").value()->getPrimaryPlugins(); + QStringList primaryPlugins = m_GamePlugin->getPrimaryPlugins(); m_CurrentProfile = profileName; @@ -313,7 +312,7 @@ bool PluginList::readLoadOrder(const QString &fileName) int priority = 0; - QStringList primaryPlugins = qApp->property("managed_game").value()->getPrimaryPlugins(); + QStringList primaryPlugins = m_GamePlugin->getPrimaryPlugins(); for (const QString &plugin : primaryPlugins) { if (availableESPs.find(plugin) != availableESPs.end()) { m_ESPLoadOrder[plugin] = priority++; @@ -504,7 +503,7 @@ void PluginList::saveTo(const QString &pluginFileName bool PluginList::saveLoadOrder(DirectoryEntry &directoryStructure) { - if (GameInfo::instance().getLoadOrderMechanism() != GameInfo::TYPE_FILETIME) { + if (m_GamePlugin->getLoadOrderMechanism() != IPluginGame::LoadOrderMechanism::FileTime) { // nothing to do return true; } @@ -1210,3 +1209,8 @@ PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled, m_IsDummy = false; } } + +void PluginList::managedGameChanged(IPluginGame const *gamePlugin) +{ + m_GamePlugin = gamePlugin; +} diff --git a/src/pluginlist.h b/src/pluginlist.h index f8972f05..9fe6eeac 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -22,16 +22,20 @@ along with Mod Organizer. If not, see . #include #include +namespace MOBase { class IPluginGame; } + #include #include #include #include + #pragma warning(push) #pragma warning(disable: 4100) #ifndef Q_MOC_RUN #include #include #endif + #include #include @@ -253,6 +257,12 @@ public slots: **/ void disableAll(); + /** + * @brief The currently managed game has changed + * @param gamePlugin + */ + void managedGameChanged(MOBase::IPluginGame const *gamePlugin); + signals: /** @@ -337,6 +347,8 @@ private: QTemporaryFile m_TempFile; + MOBase::IPluginGame const *m_GamePlugin; + }; #pragma warning(pop) diff --git a/src/profile.cpp b/src/profile.cpp index b990fbc1..77f6ebd1 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -18,7 +18,7 @@ along with Mod Organizer. If not, see . */ #include "profile.h" -#include "gameinfo.h" + #include "windows_error.h" #include "modinfo.h" #include "safewritefile.h" @@ -30,26 +30,22 @@ along with Mod Organizer. If not, see . #include #include #include + #include #include #include #include + #include +#include #define WIN32_LEAN_AND_MEAN #include #include -#include using namespace MOBase; using namespace MOShared; - -Profile::Profile() - : m_ModListWriter(std::bind(&Profile::writeModlistNow, this)) -{ -} - void Profile::touchFile(QString fileName) { QFile modList(m_Directory.filePath(fileName)); @@ -58,7 +54,7 @@ void Profile::touchFile(QString fileName) } } -Profile::Profile(const QString &name, IPluginGame *gamePlugin, bool useDefaultSettings) +Profile::Profile(const QString &name, IPluginGame const *gamePlugin, bool useDefaultSettings) : m_ModListWriter(std::bind(&Profile::writeModlistNow, this)) , m_GamePlugin(gamePlugin) { @@ -99,8 +95,9 @@ Profile::Profile(const QString &name, IPluginGame *gamePlugin, bool useDefaultSe } -Profile::Profile(const QDir &directory, IPluginGame *gamePlugin) +Profile::Profile(const QDir &directory, IPluginGame const *gamePlugin) : m_Directory(directory) + , m_GamePlugin(gamePlugin) , m_ModListWriter(std::bind(&Profile::writeModlistNow, this)) { assert(gamePlugin != nullptr); @@ -125,6 +122,8 @@ Profile::Profile(const QDir &directory, IPluginGame *gamePlugin) Profile::Profile(const Profile &reference) : m_Directory(reference.m_Directory) , m_ModListWriter(std::bind(&Profile::writeModlistNow, this)) + , m_GamePlugin(reference.m_GamePlugin) + { refreshModStatus(); } @@ -486,7 +485,7 @@ void Profile::setModPriority(unsigned int index, int &newPriority) m_ModListWriter.write(); } -Profile *Profile::createPtrFrom(const QString &name, const Profile &reference, MOBase::IPluginGame *gamePlugin) +Profile *Profile::createPtrFrom(const QString &name, const Profile &reference, MOBase::IPluginGame const *gamePlugin) { QString profileDirectory = qApp->property("dataPath").toString() + "/" + QString::fromStdWString(AppConfig::profilesPath()) + "/" + name; reference.copyFilesTo(profileDirectory); @@ -568,10 +567,8 @@ void Profile::mergeTweaks(ModInfo::Ptr modInfo, const QString &tweakedIni) const bool Profile::invalidationActive(bool *supported) const { - IPluginGame *gamePlugin = qApp->property("managed_game").value(); - - BSAInvalidation *invalidation = gamePlugin->feature(); - DataArchives *dataArchives = gamePlugin->feature(); + BSAInvalidation *invalidation = m_GamePlugin->feature(); + DataArchives *dataArchives = m_GamePlugin->feature(); if ((invalidation != nullptr) && (dataArchives != nullptr)) { if (supported != nullptr) { @@ -593,9 +590,7 @@ bool Profile::invalidationActive(bool *supported) const void Profile::deactivateInvalidation() { - IPluginGame *gamePlugin = qApp->property("managed_game").value(); - - BSAInvalidation *invalidation = gamePlugin->feature(); + BSAInvalidation *invalidation = m_GamePlugin->feature(); if (invalidation != nullptr) { invalidation->deactivate(this); @@ -605,9 +600,7 @@ void Profile::deactivateInvalidation() void Profile::activateInvalidation() { - IPluginGame *gamePlugin = qApp->property("managed_game").value(); - - BSAInvalidation *invalidation = gamePlugin->feature(); + BSAInvalidation *invalidation = m_GamePlugin->feature(); if (invalidation != nullptr) { invalidation->activate(this); @@ -681,8 +674,7 @@ QString Profile::getDeleterFileName() const QString Profile::getIniFileName() const { - std::wstring primaryIniFile = *(GameInfo::instance().getIniFileNames().begin()); - return m_Directory.absoluteFilePath(ToQString(primaryIniFile)); + return m_Directory.absoluteFilePath(m_GamePlugin->getIniFiles()[0]); } QString Profile::getProfileTweaks() const diff --git a/src/profile.h b/src/profile.h index 342b6fa0..b306e0c5 100644 --- a/src/profile.h +++ b/src/profile.h @@ -24,17 +24,16 @@ along with Mod Organizer. If not, see . #include "modinfo.h" #include #include + #include #include -#include #include + #include #include -namespace MOBase { - class IPluginGame; -} +namespace MOBase { class IPluginGame; } /** * @brief represents a profile @@ -50,12 +49,6 @@ public: public: - /** - * @brief default constructor - * @todo This constructor initialised nothing, the resulting object is not usable - **/ - Profile(); - /** * @brief constructor * @@ -64,7 +57,8 @@ public: * @param name name of the new profile * @param filter save game filter. Defaults to <no filter>. **/ - Profile(const QString &name, MOBase::IPluginGame *gamePlugin, bool useDefaultSettings); + Profile(const QString &name, MOBase::IPluginGame const *gamePlugin, bool useDefaultSettings); + /** * @brief constructor * @@ -73,7 +67,7 @@ public: * invoking this should always produce a working profile * @param directory directory to read the profile from **/ - Profile(const QDir &directory, MOBase::IPluginGame *gamePlugin); + Profile(const QDir &directory, MOBase::IPluginGame const *gamePlugin); Profile(const Profile &reference); @@ -88,7 +82,7 @@ public: * @param name of the new profile * @param reference profile to copy from **/ - static Profile *createPtrFrom(const QString &name, const Profile &reference, MOBase::IPluginGame *gamePlugin); + static Profile *createPtrFrom(const QString &name, const Profile &reference, MOBase::IPluginGame const *gamePlugin); MOBase::DelayedFileWriter &modlistWriter() { return m_ModListWriter; } @@ -308,7 +302,7 @@ private: QDir m_Directory; - MOBase::IPluginGame *m_GamePlugin; + MOBase::IPluginGame const * const m_GamePlugin; mutable QByteArray m_LastModlistHash; std::vector m_ModStatus; @@ -319,7 +313,5 @@ private: }; -Q_DECLARE_METATYPE(Profile) - #endif // PROFILE_H diff --git a/src/profilesdialog.cpp b/src/profilesdialog.cpp index 58be5448..b21aee53 100644 --- a/src/profilesdialog.cpp +++ b/src/profilesdialog.cpp @@ -42,10 +42,11 @@ using namespace MOShared; Q_DECLARE_METATYPE(Profile::Ptr) -ProfilesDialog::ProfilesDialog(const QString &profileName, QWidget *parent) +ProfilesDialog::ProfilesDialog(const QString &profileName, MOBase::IPluginGame const *game, QWidget *parent) : TutorableDialog("Profiles", parent) , ui(new Ui::ProfilesDialog) , m_FailState(false) + , m_Game(game) { ui->setupUi(this); @@ -65,7 +66,6 @@ ProfilesDialog::ProfilesDialog(const QString &profileName, QWidget *parent) QCheckBox *invalidationBox = findChild("invalidationBox"); - IPluginGame *game = qApp->property("managed_game").value(); BSAInvalidation *invalidation = game->feature(); if (invalidation == nullptr) { @@ -104,7 +104,7 @@ QListWidgetItem *ProfilesDialog::addItem(const QString &name) QDir profileDir(name); QListWidgetItem *newItem = new QListWidgetItem(profileDir.dirName(), m_ProfilesList); try { - newItem->setData(Qt::UserRole, QVariant::fromValue(Profile::Ptr(new Profile(profileDir, qApp->property("managed_game").value())))); + newItem->setData(Qt::UserRole, QVariant::fromValue(Profile::Ptr(new Profile(profileDir, m_Game)))); m_FailState = false; } catch (const std::exception& e) { reportError(tr("failed to create profile: %1").arg(e.what())); @@ -117,7 +117,7 @@ void ProfilesDialog::createProfile(const QString &name, bool useDefaultSettings) try { QListWidget *profilesList = findChild("profilesList"); QListWidgetItem *newItem = new QListWidgetItem(name, profilesList); - newItem->setData(Qt::UserRole, QVariant::fromValue(Profile::Ptr(new Profile(name, qApp->property("managed_game").value(), useDefaultSettings)))); + newItem->setData(Qt::UserRole, QVariant::fromValue(Profile::Ptr(new Profile(name, m_Game, useDefaultSettings)))); profilesList->addItem(newItem); m_FailState = false; } catch (const std::exception&) { @@ -131,7 +131,7 @@ void ProfilesDialog::createProfile(const QString &name, const Profile &reference try { QListWidget *profilesList = findChild("profilesList"); QListWidgetItem *newItem = new QListWidgetItem(name, profilesList); - newItem->setData(Qt::UserRole, QVariant::fromValue(Profile::Ptr(Profile::createPtrFrom(name, reference, qApp->property("managed_game").value())))); + newItem->setData(Qt::UserRole, QVariant::fromValue(Profile::Ptr(Profile::createPtrFrom(name, reference, m_Game)))); profilesList->addItem(newItem); m_FailState = false; } catch (const std::exception&) { @@ -324,6 +324,6 @@ void ProfilesDialog::on_localSavesBox_stateChanged(int state) void ProfilesDialog::on_transferButton_clicked() { const Profile::Ptr currentProfile = m_ProfilesList->currentItem()->data(Qt::UserRole).value(); - TransferSavesDialog transferDialog(*currentProfile, qApp->property("managed_game").value(), this); + TransferSavesDialog transferDialog(*currentProfile, m_Game, this); transferDialog.exec(); } diff --git a/src/profilesdialog.h b/src/profilesdialog.h index 6dd0c1d4..26476883 100644 --- a/src/profilesdialog.h +++ b/src/profilesdialog.h @@ -50,7 +50,7 @@ public: * @param parent parent widget * @todo the game path could be retrieved from GameInfo just as easily **/ - explicit ProfilesDialog(const QString &profileName, QWidget *parent = 0); + explicit ProfilesDialog(const QString &profileName, MOBase::IPluginGame const *game, QWidget *parent = 0); ~ProfilesDialog(); /** @@ -93,7 +93,7 @@ private: Ui::ProfilesDialog *ui; QListWidget *m_ProfilesList; bool m_FailState; - + MOBase::IPluginGame const *m_Game; }; #endif // PROFILESDIALOG_H diff --git a/src/savegame.cpp b/src/savegame.cpp index 1cdabb2d..2b125575 100644 --- a/src/savegame.cpp +++ b/src/savegame.cpp @@ -18,50 +18,28 @@ along with Mod Organizer. If not, see . */ #include "savegame.h" -#include -#include -#include -#include + +#include "iplugingame.h" +#include "scriptextender.h" +#include "utility.h" + +#include #include -#include +#include +#include + #include -#include "gameinfo.h" +#include +using namespace MOBase; -SaveGame::SaveGame(QObject *parent) - : QObject(parent), m_FileName(), m_PCName(), m_PCLevel(0), m_PCLocation(), m_SaveNumber(0), m_Screenshot() +SaveGame::SaveGame(QObject *parent, const QString &filename, const MOBase::IPluginGame *game) + : QObject(parent) + , m_FileName(filename) + , m_Game(game) { } - -SaveGame::SaveGame(QObject *parent, const QString &filename) - : QObject(parent), m_FileName(filename), m_PCName(), m_PCLevel(0), m_PCLocation(), m_SaveNumber(0), m_Screenshot() -{ -} - - -SaveGame::SaveGame(const SaveGame& reference) - : m_FileName(reference.m_FileName), m_PCName(reference.m_PCName), m_PCLevel(reference.m_PCLevel), - m_PCLocation(reference.m_PCLocation), m_SaveNumber(reference.m_SaveNumber), - m_Screenshot(reference.m_Screenshot) -{ -} - - -SaveGame& SaveGame::operator=(const SaveGame &reference) -{ - if (&reference != this) { - m_FileName = reference.m_FileName; - m_PCName = reference.m_PCName; - m_PCLevel = reference.m_PCLevel; - m_PCLocation = reference.m_PCLocation; - m_SaveNumber = reference.m_SaveNumber; - m_Screenshot = reference.m_Screenshot; - } - return *this; -} - - SaveGame::~SaveGame() { } @@ -69,11 +47,14 @@ SaveGame::~SaveGame() QStringList SaveGame::attachedFiles() const { QStringList result; - foreach (const std::wstring &ext, MOShared::GameInfo::instance().getSavegameAttachmentExtensions()) { - QFileInfo fi(fileName()); - fi.setFile(fi.canonicalPath() + "/" + fi.completeBaseName() + "." + MOBase::ToQString(ext)); - if (fi.exists()) { - result.append(fi.filePath()); + ScriptExtender const *extender = m_Game->feature(); + if (extender != nullptr) { + for (QString const &ext : extender->saveGameAttachmentExtensions()) { + QFileInfo fi(fileName()); + fi.setFile(fi.canonicalPath() + "/" + fi.completeBaseName() + "." + ext); + if (fi.exists()) { + result.append(fi.filePath()); + } } } @@ -86,21 +67,3 @@ QStringList SaveGame::saveFiles() const result.append(fileName()); return result; } - - -void SaveGame::setCreationTime(const QString &fileName) -{ - QFileInfo creationTime(fileName); - QDateTime modified = creationTime.lastModified(); - memset(&m_CreationTime, 0, sizeof(SYSTEMTIME)); - - m_CreationTime.wDay = static_cast(modified.date().day()); - m_CreationTime.wDayOfWeek = static_cast(modified.date().dayOfWeek()); - m_CreationTime.wMonth = static_cast(modified.date().month()); - m_CreationTime.wYear =static_cast( modified.date().year()); - - m_CreationTime.wHour = static_cast(modified.time().hour()); - m_CreationTime.wMinute = static_cast(modified.time().minute()); - m_CreationTime.wSecond = static_cast(modified.time().second()); - m_CreationTime.wMilliseconds = static_cast(modified.time().msec()); -} diff --git a/src/savegame.h b/src/savegame.h index 1fd2f7ab..d1bf4691 100644 --- a/src/savegame.h +++ b/src/savegame.h @@ -31,6 +31,7 @@ along with Mod Organizer. If not, see . #define WIN32_LEAN_AND_MEAN #include +namespace MOBase { class IPluginGame; } /** * @brief represents a single save game @@ -41,23 +42,14 @@ Q_OBJECT public: - /** - * @brief construct an empty object - **/ - SaveGame(QObject *parent = 0); - /** * @brief construct a save game and immediately read out information from the file * * @param filename absolute path of the save game file **/ - SaveGame(QObject *parent, const QString &filename); + SaveGame(QObject *parent, const QString &filename, MOBase::IPluginGame const *game); - SaveGame(const SaveGame& reference); - - SaveGame& operator=(const SaveGame &reference); - - ~SaveGame(); + virtual ~SaveGame(); /** * @brief read out information from a savegame @@ -111,10 +103,6 @@ public: **/ const QImage &screenshot() const { return m_Screenshot; } -private: - - void setCreationTime(const QString &fileName); - protected: QString m_FileName; @@ -125,6 +113,8 @@ protected: SYSTEMTIME m_CreationTime; QImage m_Screenshot; +private: + MOBase::IPluginGame const * const m_Game; }; diff --git a/src/savegamegamebryo.cpp b/src/savegamegamebryo.cpp index 7b012e22..68ed30af 100644 --- a/src/savegamegamebryo.cpp +++ b/src/savegamegamebryo.cpp @@ -18,321 +18,49 @@ along with Mod Organizer. If not, see . */ #include "savegamegamebyro.h" -#include "gameinfo.h" -#include -#include -#include -#include -#include + +#include "isavegame.h" +#include "savegameinfo.h" +#include "iplugingame.h" +#include "gamebryosavegame.h" + #include +#include + +using namespace MOBase; -using namespace MOShared; - - -template -static void FileRead(QFile &file, T &value) +SaveGameGamebryo::SaveGameGamebryo(QObject *parent, const QString &fileName, IPluginGame const *game) + : SaveGame(parent, fileName, game) + , m_Plugins() { - int read = file.read(reinterpret_cast(&value), sizeof(T)); - if (read != sizeof(T)) { - throw std::runtime_error("unexpected end of file"); + SaveGameInfo const *info = game->feature(); + if (info != nullptr) { + ISaveGame const *save = info->getSaveGameInfo(fileName); + m_Save = save; + + //Kludgery + GamebryoSaveGame const *s = dynamic_cast(save); + m_PCName = s->getPCName(); + m_PCLevel = s->getPCLevel(); + m_PCLocation = s->getPCLocation(); + m_SaveNumber = s->getSaveNumber(); + + QDateTime modified = s->getCreationTime(); + memset(&m_CreationTime, 0, sizeof(SYSTEMTIME)); + + m_CreationTime.wDay = static_cast(modified.date().day()); + m_CreationTime.wDayOfWeek = static_cast(modified.date().dayOfWeek()); + m_CreationTime.wMonth = static_cast(modified.date().month()); + m_CreationTime.wYear =static_cast( modified.date().year()); + + m_CreationTime.wHour = static_cast(modified.time().hour()); + m_CreationTime.wMinute = static_cast(modified.time().minute()); + m_CreationTime.wSecond = static_cast(modified.time().second()); + m_CreationTime.wMilliseconds = static_cast(modified.time().msec()); + + m_Screenshot = s->getScreenshot(); + + m_Plugins = s->getPlugins(); } } - - -template -static void FileSkip(QFile &file, int count = 1) -{ - char ignore[sizeof(T)]; - for (int i = 0; i < count; ++i) { - if (file.read(ignore, sizeof(T)) != sizeof(T)) { - throw std::runtime_error("unexpected end of file"); - } - } -} - - -static QString ReadBString(QFile &file) -{ - char buffer[256]; - file.read(buffer, 1); // size including zero termination - unsigned char size = buffer[0]; - file.read(buffer, size); - return QString::fromLatin1(buffer, size); -} - - -static QString ReadFOSString(QFile &file, bool delimiter) -{ - union { - char lengthBuffer[2]; - unsigned short length; - }; - - file.read(lengthBuffer, 2); - if (delimiter) { - FileSkip(file); // 0x7c - } - char *buffer = new char[length]; - file.read(buffer, length); - - QString result = QString::fromLatin1(buffer, length); - delete [] buffer; - - return result; -} - - -SaveGameGamebryo::SaveGameGamebryo(QObject *parent) - : SaveGame(parent), m_Plugins() -{ -} - - -SaveGameGamebryo::SaveGameGamebryo(QObject *parent, const QString &fileName) - : SaveGame(parent, fileName), m_Plugins() -{ - readFile(fileName); -} - - -SaveGameGamebryo::SaveGameGamebryo(const SaveGameGamebryo& reference) - : SaveGame(reference), m_Plugins(reference.m_Plugins) -{ -} - - -SaveGameGamebryo& SaveGameGamebryo::operator=(const SaveGameGamebryo &reference) -{ - if (&reference != this) { - SaveGame::operator =(reference); - m_Plugins = reference.m_Plugins; - } - return *this; -} - - -SaveGameGamebryo::~SaveGameGamebryo() -{ -} - - - - - -void SaveGameGamebryo::readSkyrimFile(QFile &saveFile) -{ - char fileID[14]; - - saveFile.read(fileID, 13); - fileID[13] = '\0'; - if (strncmp(fileID, "TESV_SAVEGAME", 13) != 0) { - throw std::runtime_error(QObject::tr("wrong file format").toUtf8().constData()); - } - - FileSkip(saveFile); // header size - FileSkip(saveFile); // header version, -> 8 - FileRead(saveFile, m_SaveNumber); - - m_PCName = ReadFOSString(saveFile, false); - - unsigned long temp; - FileRead(saveFile, temp); // player level - m_PCLevel = static_cast(temp); - - m_PCLocation = ReadFOSString(saveFile, false); - ReadFOSString(saveFile, false); // playtime as ascii hhh.mm.ss - ReadFOSString(saveFile, false); // race name (i.e. BretonRace) - - - FileSkip(saveFile); // ??? - FileSkip(saveFile, 2); // ??? - FileSkip(saveFile, 8); // filetime - -// FileSkip(saveFile, 18); // ??? 18 bytes of data. not completely random, maybe a time stamp? maybe - - unsigned long width, height; - FileRead(saveFile, width); // 320 - FileRead(saveFile, height); // 192 - - QScopedArrayPointer buffer(new unsigned char[width * height * 3]); - saveFile.read(reinterpret_cast(buffer.data()), width * height * 3); - // why do I have to copy here? without the copy, the buffer seems to get deleted after the - // temporary vanishes, but Qts implicit sharing should handle that? - m_Screenshot = QImage(buffer.data(), width, height, QImage::Format_RGB888).copy(); - - FileSkip(saveFile); // form version - FileSkip(saveFile); // plugin info size - - unsigned char pluginCount; - FileRead(saveFile, pluginCount); - - for (int i = 0; i < pluginCount; ++i) { - m_Plugins.push_back(ReadFOSString(saveFile, false)); - } -} - - -void SaveGameGamebryo::readESSFile(QFile &saveFile) -{ - char fileID[13]; - unsigned char versionMinor; - unsigned long headerVersion, saveHeaderSize; -// *** format is different for fallout! - saveFile.read(fileID, 12); - fileID[12] = '\0'; - FileSkip(saveFile); FileRead(saveFile, versionMinor); - FileSkip(saveFile); // modified time - FileRead(saveFile, headerVersion); FileRead(saveFile, saveHeaderSize); - - if (strncmp(fileID, "TES4SAVEGAME", 12) != 0) { - throw std::runtime_error(QObject::tr("wrong file format").toUtf8().constData()); - } - - FileRead(saveFile, m_SaveNumber); - - m_PCName = ReadBString(saveFile); - - FileRead(saveFile, m_PCLevel); - m_PCLocation = ReadBString(saveFile); - FileSkip(saveFile); // game days - FileSkip(saveFile); // game ticks - FileRead(saveFile, m_CreationTime); - - unsigned long size; - FileRead(saveFile, size); // screenshot size - - unsigned long width, height; - FileRead(saveFile, width); FileRead(saveFile, height); - QScopedArrayPointer buffer(new unsigned char[width * height * 3]); - saveFile.read(reinterpret_cast(buffer.data()), width * height * 3); - // why do I have to copy here? without the copy, the buffer seems to get deleted after the - // temporary vanishes, but Qts implicit sharing should handle that? - m_Screenshot = QImage(buffer.data(), width, height, QImage::Format_RGB888).copy(); - - unsigned char pluginCount; - FileRead(saveFile, pluginCount); - - for (int i = 0; i < pluginCount; ++i) { - QString name = ReadBString(saveFile); - m_Plugins.push_back(name); - } -} - - -void SaveGameGamebryo::readFOSFile(QFile &saveFile, bool newVegas) -{ - char fileID[13]; - saveFile.read(fileID, 12); - // the signature is only 11 characters, the 12th is random? - fileID[11] = '\0'; - - if (strncmp(fileID, "FO3SAVEGAME", 11) != 0) { - throw std::runtime_error(QObject::tr("wrong file format").toUtf8().constData()); - } - - char ignore = 0x00; - while (ignore != 0x7c) { - FileRead(saveFile, ignore); // unknown - } - if (newVegas) { - ignore = 0x00; - // in new vegas there is another block of uninteresting (?) information - FileSkip(saveFile); // 0x7c - while (ignore != 0x7c) { - FileRead(saveFile, ignore); // unknown - } - } - - unsigned long width, height; - FileRead(saveFile, width); - FileSkip(saveFile); // 0x7c - FileRead(saveFile, height); - FileSkip(saveFile); // 0x7c - - FileRead(saveFile, m_SaveNumber); - FileSkip(saveFile); // 0x7c - - m_PCName = ReadFOSString(saveFile, true); - FileSkip(saveFile); // 0x7c - - ReadFOSString(saveFile, true); - FileSkip(saveFile); // 0x7c - - long Level; - FileRead(saveFile, Level); - m_PCLevel = Level; - FileSkip(saveFile); // 0x7c - - m_PCLocation = ReadFOSString(saveFile, true); - FileSkip(saveFile); // 0x7c - - ReadFOSString(saveFile, true); // playtime - - FileSkip(saveFile); - - QScopedArrayPointer buffer(new unsigned char[width * height * 3]); - saveFile.read(reinterpret_cast(buffer.data()), width * height * 3); - // why do I have to copy here? without the copy, the buffer seems to get deleted after the - // temporary vanishes, but Qts implicit sharing should handle that? - m_Screenshot = QImage(buffer.data(), width, height, QImage::Format_RGB888).scaledToWidth(256); - - FileSkip(saveFile, 5); // unknown - - unsigned char pluginCount = 0; - FileRead(saveFile, pluginCount); - FileSkip(saveFile); // 0x7c - - for (int i = 0; i < pluginCount; ++i) { - QString name = ReadFOSString(saveFile, true); - m_Plugins.push_back(name); - FileSkip(saveFile); // 0x7c - } -} - - -void SaveGameGamebryo::setCreationTime(const QString &fileName) -{ - QFileInfo creationTime(fileName); - QDateTime modified = creationTime.lastModified(); - memset(&m_CreationTime, 0, sizeof(SYSTEMTIME)); - - m_CreationTime.wDay = static_cast(modified.date().day()); - m_CreationTime.wDayOfWeek = static_cast(modified.date().dayOfWeek()); - m_CreationTime.wMonth = static_cast(modified.date().month()); - m_CreationTime.wYear =static_cast( modified.date().year()); - - m_CreationTime.wHour = static_cast(modified.time().hour()); - m_CreationTime.wMinute = static_cast(modified.time().minute()); - m_CreationTime.wSecond = static_cast(modified.time().second()); - m_CreationTime.wMilliseconds = static_cast(modified.time().msec()); -} - - -void SaveGameGamebryo::readFile(const QString &fileName) -{ - m_FileName = fileName; - QFile saveFile(fileName); - if (!saveFile.open(QIODevice::ReadOnly)) { - throw std::runtime_error(QObject::tr("failed to open %1").arg(fileName).toUtf8().constData()); - } - switch (GameInfo::instance().getType()) { - case GameInfo::TYPE_FALLOUT3: { - setCreationTime(fileName); - readFOSFile(saveFile, false); - } break; - case GameInfo::TYPE_FALLOUTNV: { - setCreationTime(fileName); - readFOSFile(saveFile, true); - } break; - case GameInfo::TYPE_OBLIVION: { - readESSFile(saveFile); - } break; - case GameInfo::TYPE_SKYRIM: { - setCreationTime(fileName); - readSkyrimFile(saveFile); - } break; - } - - saveFile.close(); -} diff --git a/src/savegamegamebyro.h b/src/savegamegamebyro.h index e08e1044..bce08018 100644 --- a/src/savegamegamebyro.h +++ b/src/savegamegamebyro.h @@ -20,17 +20,13 @@ along with Mod Organizer. If not, see . #ifndef SAVEGAMEGAMEBRYO_H #define SAVEGAMEGAMEBRYO_H - #include "savegame.h" -#include -#include #include -#include - -#define WIN32_LEAN_AND_MEAN -#include +#include +#include +namespace MOBase { class IPluginGame; class ISaveGame; } /** * @brief represents a single save game @@ -41,31 +37,21 @@ Q_OBJECT public: - /** - * @brief construct an empty object - **/ - SaveGameGamebryo(QObject *parent = 0); - /** * @brief construct a save game and immediately read out information from the file * * @param filename absolute path of the save game file **/ - SaveGameGamebryo(QObject *parent, const QString &filename); + SaveGameGamebryo(QObject *parent, const QString &filename, MOBase::IPluginGame const *game); + /* SaveGameGamebryo(const SaveGameGamebryo &reference); SaveGameGamebryo &operator=(const SaveGameGamebryo &reference); ~SaveGameGamebryo(); - - /** - * @brief read out information from a savegame - * - * @param fileName absolute path of the save game file - **/ - virtual void readFile(const QString &fileName); + */ /** * @return number of plugins that were enabled when the save game was created @@ -80,22 +66,12 @@ public: **/ const QString &plugin(int index) const { return m_Plugins.at(index); } - private: - void readESSFile(QFile &saveFile); - void readFOSFile(QFile &saveFile, bool newVegas); - void readSkyrimFile(QFile &saveFile); - - void setCreationTime(const QString &fileName); - -private: - - std::vector m_Plugins; + QStringList m_Plugins; + //Note: This isn't owned by us so safe to copy + MOBase::ISaveGame const *m_Save; }; -Q_DECLARE_METATYPE(SaveGameGamebryo) -Q_DECLARE_METATYPE(SaveGameGamebryo*) - #endif // SAVEGAMEGAMEBRYO_H diff --git a/src/selfupdater.cpp b/src/selfupdater.cpp index 5cd6cf36..11478fbc 100644 --- a/src/selfupdater.cpp +++ b/src/selfupdater.cpp @@ -18,16 +18,18 @@ along with Mod Organizer. If not, see . */ #include "selfupdater.h" + #include "utility.h" #include "installationmanager.h" +#include "iplugingame.h" #include "messagedialog.h" #include "downloadmanager.h" #include "nexusinterface.h" #include "nxmaccessmanager.h" #include -#include -#include #include +#include + #include #include #include @@ -35,7 +37,6 @@ along with Mod Organizer. If not, see . #include #include #include -#include #include @@ -62,6 +63,7 @@ SelfUpdater::SelfUpdater(NexusInterface *nexusInterface) , m_UpdateRequestID(-1) , m_Reply(nullptr) , m_Attempts(3) + , m_NexusDownload(nullptr) { QLibrary archiveLib("dlls\\archive.dll"); if (!archiveLib.load()) { @@ -101,12 +103,10 @@ void SelfUpdater::testForUpdate() emit updateAvailable(); return; } - - if (m_UpdateRequestID == -1) { + if (m_UpdateRequestID == -1 && m_NexusDownload != nullptr) { m_UpdateRequestID = m_Interface->requestDescription( - SkyrimInfo::getNexusModIDStatic(), this, QVariant(), - QString(), ToQString(SkyrimInfo::getNexusInfoUrlStatic()), - SkyrimInfo::getNexusGameIDStatic()); + m_NexusDownload->getNexusModOrganizerID(), this, QVariant(), + QString(), m_NexusDownload); } } @@ -123,9 +123,9 @@ void SelfUpdater::startUpdate() if (QMessageBox::question(m_Parent, tr("Update"), tr("An update is available (newest version: %1), do you want to install it?").arg(m_NewestVersion), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - m_UpdateRequestID = m_Interface->requestFiles(SkyrimInfo::getNexusModIDStatic(), - this, m_NewestVersion, - ToQString(SkyrimInfo::getNexusInfoUrlStatic())); + m_UpdateRequestID = m_Interface->requestFiles(m_NexusDownload->getNexusModOrganizerID(), + this, m_NewestVersion, "", + m_NexusDownload); } } } @@ -159,7 +159,7 @@ void SelfUpdater::download(const QString &downloadLink, const QString &fileName) QNetworkRequest request(dlUrl); m_Canceled = false; m_Reply = accessManager->get(request); - m_UpdateFile.setFileName(QDir::fromNativeSeparators(ToQString(GameInfo::instance().getOrganizerDirectory()).append("\\").append(fileName))); + m_UpdateFile.setFileName(QDir::fromNativeSeparators(qApp->property("dataPath").toString()).append("/").append(fileName)); m_UpdateFile.open(QIODevice::WriteOnly); showProgress(); @@ -243,7 +243,7 @@ void SelfUpdater::downloadCancel() void SelfUpdater::installUpdate() { - const QString mopath = QDir::fromNativeSeparators(ToQString(GameInfo::instance().getOrganizerDirectory())); + const QString mopath = QDir::fromNativeSeparators(qApp->property("dataPath").toString()); QString backupPath = mopath + "/update_backup"; QDir().mkdir(backupPath); @@ -280,9 +280,7 @@ void SelfUpdater::installUpdate() } // now unpack the archive into the mo directory - if (!m_ArchiveHandler->extract(QString::fromStdWString(GameInfo::instance().getOrganizerDirectory()), - nullptr, - nullptr, + if (!m_ArchiveHandler->extract(mopath, nullptr, nullptr, new MethodCallback(this, &SelfUpdater::report7ZipError))) { throw std::runtime_error("extracting failed"); } @@ -418,18 +416,18 @@ void SelfUpdater::nxmFilesAvailable(int, QVariant userData, QVariant resultData, if (updateFileID != -1) { qDebug("update available: %d", updateFileID); - m_UpdateRequestID = m_Interface->requestDownloadURL(SkyrimInfo::getNexusModIDStatic(), - updateFileID, this, updateFileName, - ToQString(SkyrimInfo::getNexusInfoUrlStatic())); + m_UpdateRequestID = m_Interface->requestDownloadURL(m_NexusDownload->getNexusModOrganizerID(), + updateFileID, this, updateFileName, "", + m_NexusDownload); } else if (mainFileID != -1) { qDebug("full download required: %d", mainFileID); if (QMessageBox::question(m_Parent, tr("Update"), tr("No incremental update available for this version, " "the complete package needs to be downloaded (%1 kB)").arg(mainFileSize), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) { - m_UpdateRequestID = m_Interface->requestDownloadURL(SkyrimInfo::getNexusModIDStatic(), - mainFileID, this, mainFileName, - ToQString(SkyrimInfo::getNexusInfoUrlStatic())); + m_UpdateRequestID = m_Interface->requestDownloadURL(m_NexusDownload->getNexusModOrganizerID(), + mainFileID, this, mainFileName, "", + m_NexusDownload); } } else { qCritical("no file for update found"); @@ -473,3 +471,9 @@ void SelfUpdater::nxmDownloadURLsAvailable(int, int, QVariant userData, QVariant } } } + +/** Set the game check for updates */ +void SelfUpdater::setNexusDownload(MOBase::IPluginGame const *game) +{ + m_NexusDownload = game; +} diff --git a/src/selfupdater.h b/src/selfupdater.h index f804f63c..446778fb 100644 --- a/src/selfupdater.h +++ b/src/selfupdater.h @@ -29,6 +29,7 @@ along with Mod Organizer. If not, see . #include #include +namespace MOBase { class IPluginGame; } class NexusInterface; @@ -83,6 +84,9 @@ public: **/ MOBase::VersionInfo getVersion() const { return m_MOVersion; } + /** Set the game check for updates */ + void setNexusDownload(MOBase::IPluginGame const *game); + public slots: /** @@ -143,6 +147,7 @@ private: Archive *m_ArchiveHandler; + MOBase::IPluginGame const *m_NexusDownload; }; diff --git a/src/settings.cpp b/src/settings.cpp index 4c2a34c8..479dd3ab 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -22,26 +22,22 @@ along with Mod Organizer. If not, see . #include "settingsdialog.h" #include "utility.h" #include "helper.h" -#include "json.h" #include #include #include #include #include -#include -#include -#include #include -#include #include +#include +#include +#include +#include #include - using namespace MOBase; -using namespace MOShared; - template class QListWidgetItemEx : public QListWidgetItem { @@ -112,7 +108,7 @@ void Settings::registerAsNXMHandler(bool force) std::wstring nxmPath = ToWString(QCoreApplication::applicationDirPath() + "/nxmhandler.exe"); std::wstring executable = ToWString(QCoreApplication::applicationFilePath()); std::wstring mode = force ? L"forcereg" : L"reg"; - std::wstring parameters = mode + L" " + GameInfo::instance().getGameShortName() + L" \"" + executable + L"\""; + std::wstring parameters = mode + L" " + m_GamePlugin->getGameShortName().toStdWString() + L" \"" + executable + L"\""; HINSTANCE res = ::ShellExecuteW(nullptr, L"open", nxmPath.c_str(), parameters.c_str(), nullptr, SW_SHOWNORMAL); if ((int)res <= 32) { QMessageBox::critical(nullptr, tr("Failed"), @@ -120,7 +116,7 @@ void Settings::registerAsNXMHandler(bool force) } } -void Settings::managedGameChanged(IPluginGame *gamePlugin) +void Settings::managedGameChanged(IPluginGame const *gamePlugin) { m_GamePlugin = gamePlugin; } diff --git a/src/settings.h b/src/settings.h index def1dc5c..1ee16e76 100644 --- a/src/settings.h +++ b/src/settings.h @@ -299,7 +299,7 @@ public: public slots: - void managedGameChanged(MOBase::IPluginGame *gamePlugin); + void managedGameChanged(MOBase::IPluginGame const *gamePlugin); private: @@ -328,7 +328,7 @@ private: }; /** Display/store the configuration in the 'general' tab of the settings dialogue */ - class GeneralTab : SettingsTab + class GeneralTab : public SettingsTab { public: GeneralTab(Settings *m_parent, SettingsDialog &m_dialog); @@ -347,7 +347,7 @@ private: }; /** Display/store the configuration in the 'nexus' tab of the settings dialogue */ - class NexusTab : SettingsTab + class NexusTab : public SettingsTab { public: NexusTab(Settings *m_parent, SettingsDialog &m_dialog); @@ -365,7 +365,7 @@ private: }; /** Display/store the configuration in the 'steam' tab of the settings dialogue */ - class SteamTab : SettingsTab + class SteamTab : public SettingsTab { public: SteamTab(Settings *m_parent, SettingsDialog &m_dialog); @@ -378,7 +378,7 @@ private: }; /** Display/store the configuration in the 'plugins' tab of the settings dialogue */ - class PluginsTab : SettingsTab + class PluginsTab : public SettingsTab { public: PluginsTab(Settings *m_parent, SettingsDialog &m_dialog); @@ -391,7 +391,7 @@ private: }; /** Display/store the configuration in the 'workarounds' tab of the settings dialogue */ - class WorkaroundsTab : SettingsTab + class WorkaroundsTab : public SettingsTab { public: WorkaroundsTab(Settings *m_parent, SettingsDialog &m_dialog); @@ -420,7 +420,7 @@ private: static Settings *s_Instance; - MOBase::IPluginGame *m_GamePlugin; + MOBase::IPluginGame const *m_GamePlugin; QSettings m_Settings; diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index 765858f5..8bc1dbc6 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -18,22 +18,24 @@ along with Mod Organizer. If not, see . */ #include "settingsdialog.h" + #include "ui_settingsdialog.h" #include "categoriesdialog.h" #include "helper.h" #include "noeditdelegate.h" -#include +#include "iplugingame.h" +#include "settings.h" + #include #include #include #include + #define WIN32_LEAN_AND_MEAN #include -#include "settings.h" using namespace MOBase; -using namespace MOShared; SettingsDialog::SettingsDialog(QWidget *parent) @@ -87,7 +89,11 @@ void SettingsDialog::on_categoriesBtn_clicked() void SettingsDialog::on_bsaDateBtn_clicked() { - Helper::backdateBSAs(GameInfo::instance().getOrganizerDirectory(), GameInfo::instance().getGameDirectory().append(L"\\data")); + IPluginGame const *game = qApp->property("managed_game").value(); + QDir dir = game->dataDirectory(); + + Helper::backdateBSAs(qApp->property("dataPath").toString().toStdWString(), + dir.absolutePath().toStdWString()); } void SettingsDialog::on_browseDownloadDirBtn_clicked() diff --git a/src/shared/fallout3info.cpp b/src/shared/fallout3info.cpp index f0776a7d..797d68ec 100644 --- a/src/shared/fallout3info.cpp +++ b/src/shared/fallout3info.cpp @@ -30,8 +30,8 @@ along with Mod Organizer. If not, see . namespace MOShared { -Fallout3Info::Fallout3Info(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gameDirectory) - : GameInfo(moDirectory, moDataDirectory, gameDirectory) +Fallout3Info::Fallout3Info(const std::wstring &gameDirectory) + : GameInfo(gameDirectory) { identifyMyGamesDirectory(L"fallout3"); } @@ -63,21 +63,6 @@ std::wstring Fallout3Info::getRegPathStatic() } -std::vector Fallout3Info::getDLCPlugins() const -{ - return boost::assign::list_of (L"ThePitt.esm") - (L"Anchorage.esm") - (L"BrokenSteel.esm") - (L"PointLookout.esm") - (L"Zeta.esm") - ; -} - -std::vector Fallout3Info::getSavegameAttachmentExtensions() const -{ - return std::vector(); -} - std::vector Fallout3Info::getIniFileNames() const { return boost::assign::list_of(L"fallout.ini")(L"falloutprefs.ini"); @@ -88,25 +73,6 @@ std::wstring Fallout3Info::getReferenceDataFile() const return L"Fallout - Meshes.bsa"; } -std::wstring Fallout3Info::getNexusPage(bool nmmScheme) const -{ - if (nmmScheme) { - return L"http://nmm.nexusmods.com/fallout3"; - } else { - return L"http://www.nexusmods.com/fallout3"; - } -} - -std::wstring Fallout3Info::getNexusInfoUrlStatic() -{ - return L"http://nmm.nexusmods.com/fallout3"; -} - -int Fallout3Info::getNexusModIDStatic() -{ - return 16348; -} - bool Fallout3Info::rerouteToProfile(const wchar_t *fileName, const wchar_t*) const { static LPCWSTR profileFiles[] = { L"fallout.ini", L"falloutprefs.ini", L"plugins.txt", nullptr }; @@ -119,9 +85,4 @@ bool Fallout3Info::rerouteToProfile(const wchar_t *fileName, const wchar_t*) con return false; } -bool Fallout3Info::isValidModURL(int modID, const std::wstring &url) const -{ - return GameInfo::isValidModURL(modID, url, L"http://fallout3.nexusmods.com"); -} - } // namespace MOShared diff --git a/src/shared/fallout3info.h b/src/shared/fallout3info.h index fb60d6ae..5cf98e3b 100644 --- a/src/shared/fallout3info.h +++ b/src/shared/fallout3info.h @@ -36,38 +36,19 @@ public: static std::wstring getRegPathStatic(); virtual std::wstring getRegPath() const { return getRegPathStatic(); } - virtual std::wstring getBinaryName() const { return L"Fallout3.exe"; } - virtual std::wstring getExtenderName() const { return L"fose_loader.exe"; } - - virtual GameInfo::Type getType() const { return TYPE_FALLOUT3; } - - virtual std::wstring getGameName() const { return L"Fallout 3"; } - virtual std::wstring getGameShortName() const { return L"Fallout3"; } - - virtual std::vector getDLCPlugins() const; - virtual std::vector getSavegameAttachmentExtensions() const; // file name of this games ini (no path) virtual std::vector getIniFileNames() const; virtual std::wstring getReferenceDataFile() const; - virtual std::wstring getNexusPage(bool nmmScheme = true) const; - static std::wstring getNexusInfoUrlStatic(); - virtual std::wstring getNexusInfoUrl() const { return getNexusInfoUrlStatic(); } - static int getNexusModIDStatic(); - virtual int getNexusModID() const { return getNexusModIDStatic(); } - virtual int getNexusGameID() const { return 120; } - virtual bool rerouteToProfile(const wchar_t *fileName, const wchar_t *fullPath) const; virtual std::wstring archiveListKey() const { return L"SArchiveList"; } - virtual bool isValidModURL(int modID, std::wstring const &url) const; - private: - Fallout3Info(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gameDirectory); + Fallout3Info(const std::wstring &gameDirectory); static bool identifyGame(const std::wstring &searchPath); diff --git a/src/shared/falloutnvinfo.cpp b/src/shared/falloutnvinfo.cpp index f6de72e3..6347224d 100644 --- a/src/shared/falloutnvinfo.cpp +++ b/src/shared/falloutnvinfo.cpp @@ -31,8 +31,8 @@ along with Mod Organizer. If not, see . namespace MOShared { -FalloutNVInfo::FalloutNVInfo(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gameDirectory) - : GameInfo(moDirectory, moDataDirectory, gameDirectory) +FalloutNVInfo::FalloutNVInfo(const std::wstring &gameDirectory) + : GameInfo(gameDirectory) { identifyMyGamesDirectory(L"falloutnv"); } @@ -63,25 +63,6 @@ std::wstring FalloutNVInfo::getRegPathStatic() } } -std::vector FalloutNVInfo::getDLCPlugins() const -{ - return boost::assign::list_of (L"DeadMoney.esm") - (L"HonestHearts.esm") - (L"OldWorldBlues.esm") - (L"LonesomeRoad.esm") - (L"GunRunnersArsenal.esm") - (L"CaravanPack.esm") - (L"ClassicPack.esm") - (L"MercenaryPack.esm") - (L"TribalPack.esm") - ; -} - -std::vector FalloutNVInfo::getSavegameAttachmentExtensions() const -{ - return std::vector(); -} - std::vector FalloutNVInfo::getIniFileNames() const { return boost::assign::list_of(L"fallout.ini")(L"falloutprefs.ini"); @@ -92,28 +73,6 @@ std::wstring FalloutNVInfo::getReferenceDataFile() const return L"Fallout - Meshes.bsa"; } -std::wstring FalloutNVInfo::getNexusPage(bool nmmScheme) const -{ - if (nmmScheme) { - return L"http://nmm.nexusmods.com/newvegas"; - } else { - return L"http://www.nexusmods.com/newvegas"; - } -} - - -std::wstring FalloutNVInfo::getNexusInfoUrlStatic() -{ - return L"http://nmm.nexusmods.com/newvegas"; -} - - -int FalloutNVInfo::getNexusModIDStatic() -{ - return 42572; -} - - bool FalloutNVInfo::rerouteToProfile(const wchar_t *fileName, const wchar_t*) const { static LPCWSTR profileFiles[] = { L"fallout.ini", L"falloutprefs.ini", L"plugins.txt", nullptr }; @@ -126,9 +85,4 @@ bool FalloutNVInfo::rerouteToProfile(const wchar_t *fileName, const wchar_t*) co return false; } -bool FalloutNVInfo::isValidModURL(int modID, std::wstring const &url) const -{ - return GameInfo::isValidModURL(modID, url, L"http://newvegas.nexusmods.com"); -} - } // namespace MOShared diff --git a/src/shared/falloutnvinfo.h b/src/shared/falloutnvinfo.h index 65f17013..04c13c7d 100644 --- a/src/shared/falloutnvinfo.h +++ b/src/shared/falloutnvinfo.h @@ -37,38 +37,19 @@ public: static std::wstring getRegPathStatic(); virtual std::wstring getRegPath() const { return getRegPathStatic(); } - virtual std::wstring getBinaryName() const { return L"FalloutNV.exe"; } - virtual std::wstring getExtenderName() const { return L"nvse_loader.exe"; } - - virtual GameInfo::Type getType() const { return TYPE_FALLOUTNV; } - - virtual std::wstring getGameName() const { return L"New Vegas"; } - virtual std::wstring getGameShortName() const { return L"FalloutNV"; } - - virtual std::vector getDLCPlugins() const; - virtual std::vector getSavegameAttachmentExtensions() const; // file name of this games ini (no path) virtual std::vector getIniFileNames() const; virtual std::wstring getReferenceDataFile() const; - virtual std::wstring getNexusPage(bool nmmScheme = true) const; - static std::wstring getNexusInfoUrlStatic(); - virtual std::wstring getNexusInfoUrl() const { return getNexusInfoUrlStatic(); } - static int getNexusModIDStatic(); - virtual int getNexusModID() const { return getNexusModIDStatic(); } - virtual int getNexusGameID() const { return 130; } - virtual bool rerouteToProfile(const wchar_t *fileName, const wchar_t *fullPath) const; virtual std::wstring archiveListKey() const { return L"SArchiveList"; } - virtual bool isValidModURL(int modID, const std::wstring &url) const; - private: - FalloutNVInfo(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gameDirectory); + FalloutNVInfo(const std::wstring &gameDirectory); static bool identifyGame(const std::wstring &searchPath); }; diff --git a/src/shared/gameinfo.cpp b/src/shared/gameinfo.cpp index 5338c069..5c13a520 100644 --- a/src/shared/gameinfo.cpp +++ b/src/shared/gameinfo.cpp @@ -40,8 +40,8 @@ namespace MOShared { GameInfo* GameInfo::s_Instance = nullptr; -GameInfo::GameInfo(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gameDirectory) - : m_GameDirectory(gameDirectory), m_OrganizerDirectory(moDirectory), m_OrganizerDataDirectory(moDataDirectory) +GameInfo::GameInfo(const std::wstring &gameDirectory) + : m_GameDirectory(gameDirectory) { atexit(&cleanup); } @@ -86,50 +86,36 @@ void GameInfo::identifyMyGamesDirectory(const std::wstring &file) } } -bool GameInfo::isValidModURL(int modID, const std::wstring &url, const std::wstring &alt) const -{ - std::wostringstream os; - os << getNexusPage(false) << "/mods/" << modID; - if (url == os.str()) { - return true; - } - os.clear(); - os.str(L""); - os << alt << "/mods/" << modID; - return url == os.str(); -} - - -bool GameInfo::identifyGame(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &searchPath) +bool GameInfo::identifyGame(const std::wstring &searchPath) { if (OblivionInfo::identifyGame(searchPath)) { - s_Instance = new OblivionInfo(moDirectory, moDataDirectory, searchPath); + s_Instance = new OblivionInfo(searchPath); } else if (Fallout3Info::identifyGame(searchPath)) { - s_Instance = new Fallout3Info(moDirectory, moDataDirectory, searchPath); + s_Instance = new Fallout3Info(searchPath); } else if (FalloutNVInfo::identifyGame(searchPath)) { - s_Instance = new FalloutNVInfo(moDirectory, moDataDirectory, searchPath); + s_Instance = new FalloutNVInfo(searchPath); } else if (SkyrimInfo::identifyGame(searchPath)) { - s_Instance = new SkyrimInfo(moDirectory, moDataDirectory, searchPath); + s_Instance = new SkyrimInfo(searchPath); } return s_Instance != nullptr; } -bool GameInfo::init(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gamePath) +bool GameInfo::init(const std::wstring &moDirectory, const std::wstring &gamePath) { if (s_Instance == nullptr) { if (gamePath.length() == 0) { // search upward in the directory until a recognized game-binary is found std::wstring searchPath(moDirectory); - while (!identifyGame(moDirectory, moDataDirectory, searchPath)) { + while (!identifyGame(searchPath)) { size_t lastSep = searchPath.find_last_of(L"/\\"); if (lastSep == std::string::npos) { return false; } searchPath.erase(lastSep); } - } else if (!identifyGame(moDirectory, moDataDirectory, gamePath)) { + } else if (!identifyGame(gamePath)) { return false; } } @@ -148,24 +134,6 @@ std::wstring GameInfo::getGameDirectory() const return m_GameDirectory; } -bool GameInfo::requiresSteam() const -{ - return FileExists(getGameDirectory() + L"\\steam_api.dll"); -} - -std::wstring GameInfo::getLocalAppFolder() const -{ - wchar_t localAppFolder[MAX_PATH]; - memset(localAppFolder, '\0', MAX_PATH * sizeof(wchar_t)); - - if (::SHGetFolderPathW(nullptr, CSIDL_LOCAL_APPDATA, nullptr, SHGFP_TYPE_CURRENT, localAppFolder) == S_OK) { - return localAppFolder; - } else { - // fallback: try the registry - return getSpecialPath(L"Local AppData"); - } -} - std::wstring GameInfo::getSpecialPath(LPCWSTR name) const { HKEY key; diff --git a/src/shared/gameinfo.h b/src/shared/gameinfo.h index 55cd024a..7bc86d3a 100644 --- a/src/shared/gameinfo.h +++ b/src/shared/gameinfo.h @@ -38,84 +38,43 @@ namespace MOShared { class GameInfo { -public: - - enum Type { - TYPE_OBLIVION, - TYPE_FALLOUT3, - TYPE_FALLOUTNV, - TYPE_SKYRIM - }; - - enum LoadOrderMechanism { - TYPE_FILETIME, - TYPE_PLUGINSTXT - }; - public: virtual ~GameInfo() {} - std::wstring getOrganizerDirectory() const { return m_OrganizerDirectory; } + //**USED IN HOOKDLL and at startup to set up for hookdll to work + // initialise with the path to the mo directory (needs to be where hook.dll is stored). This + // needs to be called before the instance can be retrieved + static bool init(const std::wstring &moDirectory, const std::wstring &gamePath = L""); - virtual std::wstring getRegPath() const = 0; - virtual std::wstring getBinaryName() const = 0; - virtual std::wstring getExtenderName() const = 0; - - virtual GameInfo::Type getType() const = 0; - - virtual std::wstring getGameName() const = 0; - virtual std::wstring getGameShortName() const = 0; - - /// determine the load order mechanism used by this game. this may throw an - /// exception if the mechanism can't be determined - virtual LoadOrderMechanism getLoadOrderMechanism() const { return TYPE_FILETIME; } + //**USED ONLY IN HOOKDLL + static GameInfo& instance(); + //**USED ONLY IN HOOKDLL virtual std::wstring getGameDirectory() const; - virtual bool requiresSteam() const; - - // get a list of file extensions for additional files belonging to a save game - virtual std::vector getSavegameAttachmentExtensions() const = 0; - - // get a set of esp/esm files that are part of known dlcs - virtual std::vector getDLCPlugins() const = 0; + //**USED ONLY IN HOOKDLL + virtual std::wstring getRegPath() const = 0; + //**USED ONLY IN HOOKDLL // file name of this games ini file(s) virtual std::vector getIniFileNames() const = 0; + //**USED ONLY IN HOOKDLL virtual std::wstring getReferenceDataFile() const = 0; - virtual std::wstring getNexusPage(bool nmmScheme = true) const = 0; - virtual std::wstring getNexusInfoUrl() const = 0; - virtual int getNexusModID() const = 0; - virtual int getNexusGameID() const = 0; - + //**USED ONLY IN HOOKDLL virtual bool rerouteToProfile(const wchar_t *fileName, const wchar_t *fullPath) const = 0; - virtual bool isValidModURL(int modID, std::wstring const &url) const = 0; - -public: - - // initialise with the path to the mo directory (needs to be where hook.dll is stored). This - // needs to be called before the instance can be retrieved - static bool init(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gamePath = L""); - - static GameInfo& instance(); - protected: - GameInfo(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gameDirectory); + GameInfo(const std::wstring &gameDirectory); - std::wstring getLocalAppFolder() const; - const std::wstring &getMyGamesDirectory() const { return m_MyGamesDirectory; } void identifyMyGamesDirectory(const std::wstring &file); - bool isValidModURL(int modID, const std::wstring &url, const std::wstring &alt) const; - private: - static bool identifyGame(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &searchPath); + static bool identifyGame(const std::wstring &searchPath); std::wstring getSpecialPath(LPCWSTR name) const; static void cleanup(); @@ -127,8 +86,6 @@ private: std::wstring m_MyGamesDirectory; std::wstring m_GameDirectory; - std::wstring m_OrganizerDirectory; - std::wstring m_OrganizerDataDirectory; }; diff --git a/src/shared/oblivioninfo.cpp b/src/shared/oblivioninfo.cpp index 730c186b..b50f1daa 100644 --- a/src/shared/oblivioninfo.cpp +++ b/src/shared/oblivioninfo.cpp @@ -31,8 +31,8 @@ along with Mod Organizer. If not, see . namespace MOShared { -OblivionInfo::OblivionInfo(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gameDirectory) - : GameInfo(moDirectory, moDataDirectory, gameDirectory) +OblivionInfo::OblivionInfo(const std::wstring &gameDirectory) + : GameInfo(gameDirectory) { identifyMyGamesDirectory(L"oblivion"); } @@ -63,54 +63,11 @@ std::wstring OblivionInfo::getRegPathStatic() } } -std::vector OblivionInfo::getDLCPlugins() const -{ - return boost::assign::list_of (L"DLCShiveringIsles.esp") - (L"Knights.esp") - (L"DLCFrostcrag.esp") - (L"DLCSpellTomes.esp") - (L"DLCMehrunesRazor.esp") - (L"DLCOrrery.esp") - (L"DLCSpellTomes.esp") - (L"DLCThievesDen.esp") - (L"DLCVileLair.esp") - (L"DLCHorseArmor.esp") - ; -} - - -std::vector OblivionInfo::getSavegameAttachmentExtensions() const -{ - return boost::assign::list_of(L"obse"); -} - - std::vector OblivionInfo::getIniFileNames() const { return boost::assign::list_of(L"oblivion.ini")(L"oblivionprefs.ini"); } -std::wstring OblivionInfo::getNexusPage(bool nmmScheme) const -{ - if (nmmScheme) { - return L"http://nmm.nexusmods.com/oblivion"; - } else { - return L"http://www.nexusmods.com/oblivion"; - } -} - - -std::wstring OblivionInfo::getNexusInfoUrlStatic() -{ - return L"http://nmm.nexusmods.com/oblivion"; -} - - -int OblivionInfo::getNexusModIDStatic() -{ - return 38277; -} - bool OblivionInfo::rerouteToProfile(const wchar_t *fileName, const wchar_t*) const { static LPCWSTR profileFiles[] = { L"oblivion.ini", L"oblivionprefs.ini", L"plugins.txt", nullptr }; @@ -128,9 +85,4 @@ std::wstring OblivionInfo::getReferenceDataFile() const return L"Oblivion - Meshes.bsa"; } -bool OblivionInfo::isValidModURL(int modID, const std::wstring &url) const -{ - return GameInfo::isValidModURL(modID, url, L"http://oblivion.nexusmods.com"); -} - } // namespace MOShared diff --git a/src/shared/oblivioninfo.h b/src/shared/oblivioninfo.h index 74e3fec6..bf0b2707 100644 --- a/src/shared/oblivioninfo.h +++ b/src/shared/oblivioninfo.h @@ -35,38 +35,19 @@ public: static std::wstring getRegPathStatic(); virtual std::wstring getRegPath() const { return getRegPathStatic(); } - virtual std::wstring getBinaryName() const { return L"Oblivion.exe"; } - virtual std::wstring getExtenderName() const { return L"obse_loader.exe"; } - - virtual GameInfo::Type getType() const { return TYPE_OBLIVION; } - - virtual std::wstring getGameName() const { return L"Oblivion"; } - virtual std::wstring getGameShortName() const { return L"Oblivion"; } - - virtual std::vector getDLCPlugins() const; - virtual std::vector getSavegameAttachmentExtensions() const; // file name of this games ini (no path) virtual std::vector getIniFileNames() const; virtual std::wstring getReferenceDataFile() const; - virtual std::wstring getNexusPage(bool nmmScheme = true) const; - static std::wstring getNexusInfoUrlStatic(); - virtual std::wstring getNexusInfoUrl() const { return getNexusInfoUrlStatic(); } - static int getNexusModIDStatic(); - virtual int getNexusModID() const { return getNexusModIDStatic(); } - virtual int getNexusGameID() const { return 101; } - virtual bool rerouteToProfile(const wchar_t *fileName, const wchar_t *fullPath) const; virtual std::wstring archiveListKey() const { return L"SArchiveList"; } - virtual bool isValidModURL(int modID, std::wstring const &url) const; - private: - OblivionInfo(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gameDirectory); + OblivionInfo(const std::wstring &gameDirectory); static bool identifyGame(const std::wstring &searchPath); diff --git a/src/shared/skyriminfo.cpp b/src/shared/skyriminfo.cpp index 7c85fe10..9662e66d 100644 --- a/src/shared/skyriminfo.cpp +++ b/src/shared/skyriminfo.cpp @@ -33,8 +33,8 @@ along with Mod Organizer. If not, see . namespace MOShared { -SkyrimInfo::SkyrimInfo(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gameDirectory) - : GameInfo(moDirectory, moDataDirectory, gameDirectory) +SkyrimInfo::SkyrimInfo(const std::wstring &gameDirectory) + : GameInfo(gameDirectory) { identifyMyGamesDirectory(L"skyrim"); @@ -73,40 +73,6 @@ std::wstring SkyrimInfo::getRegPathStatic() } } -GameInfo::LoadOrderMechanism SkyrimInfo::getLoadOrderMechanism() const -{ - std::wstring fileName = getGameDirectory() + L"\\TESV.exe"; - - try { - VS_FIXEDFILEINFO versionInfo = GetFileVersion(fileName); - if ((versionInfo.dwFileVersionMS > 0x10004) || // version >= 1.5.x? - ((versionInfo.dwFileVersionMS == 0x10004) && (versionInfo.dwFileVersionLS >= 0x1A0000))) { // version >= ?.4.26 - return TYPE_PLUGINSTXT; - } else { - return TYPE_FILETIME; - } - } catch (const std::exception &e) { - log("TESV.exe is invalid: %s", e.what()); - return TYPE_FILETIME; - } -} - -std::vector SkyrimInfo::getDLCPlugins() const -{ - return boost::assign::list_of (L"Dawnguard.esm") - (L"Dragonborn.esm") - (L"HearthFires.esm") - (L"HighResTexturePack01.esp") - (L"HighResTexturePack02.esp") - (L"HighResTexturePack03.esp") - ; -} - -std::vector SkyrimInfo::getSavegameAttachmentExtensions() const -{ - return boost::assign::list_of(L"skse"); -} - std::vector SkyrimInfo::getIniFileNames() const { return boost::assign::list_of(L"skyrim.ini")(L"skyrimprefs.ini"); @@ -117,28 +83,6 @@ std::wstring SkyrimInfo::getReferenceDataFile() const return L"Skyrim - Meshes.bsa"; } - -std::wstring SkyrimInfo::getNexusPage(bool nmmScheme) const -{ - if (nmmScheme) { - return L"http://nmm.nexusmods.com/skyrim"; - } else { - return L"http://www.nexusmods.com/skyrim"; - } -} - - -std::wstring SkyrimInfo::getNexusInfoUrlStatic() -{ - return L"http://nmm.nexusmods.com/skyrim"; -} - - -int SkyrimInfo::getNexusModIDStatic() -{ - return 1334; -} - bool SkyrimInfo::rerouteToProfile(const wchar_t *fileName, const wchar_t *fullPath) const { static LPCWSTR profileFiles[] = { L"skyrim.ini", L"skyrimprefs.ini", L"loadorder.txt", nullptr }; @@ -157,10 +101,4 @@ bool SkyrimInfo::rerouteToProfile(const wchar_t *fileName, const wchar_t *fullPa return false; } -bool SkyrimInfo::isValidModURL(int modID, const std::wstring &url) const -{ - return GameInfo::isValidModURL(modID, url, L"http://skyrim.nexusmods.com"); -} - - } // namespace MOShared diff --git a/src/shared/skyriminfo.h b/src/shared/skyriminfo.h index 538fffb4..bd329403 100644 --- a/src/shared/skyriminfo.h +++ b/src/shared/skyriminfo.h @@ -37,41 +37,17 @@ public: static std::wstring getRegPathStatic(); virtual std::wstring getRegPath() const { return getRegPathStatic(); } - virtual std::wstring getBinaryName() const { return L"TESV.exe"; } - virtual std::wstring getExtenderName() const { return L"skse_loader.exe"; } - - virtual GameInfo::Type getType() const { return TYPE_SKYRIM; } - - virtual std::wstring getGameName() const { return L"Skyrim"; } - virtual std::wstring getGameShortName() const { return L"Skyrim"; } - - virtual LoadOrderMechanism getLoadOrderMechanism() const; - - virtual std::vector getDLCPlugins() const; - - virtual std::vector getSavegameAttachmentExtensions() const; // file name of this games ini (no path) virtual std::vector getIniFileNames() const; virtual std::wstring getReferenceDataFile() const; - virtual std::wstring getNexusPage(bool nmmScheme = true) const; - - static std::wstring getNexusInfoUrlStatic(); - virtual std::wstring getNexusInfoUrl() const { return getNexusInfoUrlStatic(); } - static int getNexusModIDStatic(); - virtual int getNexusModID() const { return getNexusModIDStatic(); } - static int getNexusGameIDStatic() { return 110; } - virtual int getNexusGameID() const { return getNexusGameIDStatic(); } - virtual bool rerouteToProfile(const wchar_t *fileName, const wchar_t *fullPath) const; - virtual bool isValidModURL(int modID, std::wstring const &url) const; - private: - SkyrimInfo(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gameDirectory); + SkyrimInfo(const std::wstring &gameDirectory); static bool identifyGame(const std::wstring &searchPath); diff --git a/src/shared/stackdata.cpp b/src/shared/stackdata.cpp index 6c5a0968..b336593a 100644 --- a/src/shared/stackdata.cpp +++ b/src/shared/stackdata.cpp @@ -24,7 +24,7 @@ static void initDbgIfNecess() firstCall = false; } if (!::SymInitialize(process, NULL, TRUE)) { - printf("failed to initialize symbols: %d", ::GetLastError()); + printf("failed to initialize symbols: %lu", ::GetLastError()); } initialized.insert(::GetCurrentProcessId()); } @@ -99,7 +99,8 @@ void StackData::initTrace() { CONTEXT context; std::memset(&context, 0, sizeof(CONTEXT)); context.ContextFlags = CONTEXT_CONTROL; -#if BOOST_ARCH_X86_64 + //Why only for 64 bit? +#if BOOST_ARCH_X86_64 || defined(__clang__) ::RtlCaptureContext(&context); #else __asm diff --git a/src/spawn.cpp b/src/spawn.cpp index c79714bb..49e89a8b 100644 --- a/src/spawn.cpp +++ b/src/spawn.cpp @@ -18,18 +18,20 @@ along with Mod Organizer. If not, see . */ #include "spawn.h" + #include "report.h" #include "utility.h" -#include -#include #include #include -#include #include #include + #include #include +#include + +#include using namespace MOBase; using namespace MOShared; diff --git a/src/syncoverwritedialog.cpp b/src/syncoverwritedialog.cpp index 0e3e98d7..aeed0a55 100644 --- a/src/syncoverwritedialog.cpp +++ b/src/syncoverwritedialog.cpp @@ -18,10 +18,11 @@ along with Mod Organizer. If not, see . */ #include "syncoverwritedialog.h" + #include "ui_syncoverwritedialog.h" #include #include -#include + #include #include #include diff --git a/src/transfersavesdialog.cpp b/src/transfersavesdialog.cpp index 73267f75..48fc4548 100644 --- a/src/transfersavesdialog.cpp +++ b/src/transfersavesdialog.cpp @@ -18,12 +18,15 @@ along with Mod Organizer. If not, see . */ #include "transfersavesdialog.h" + #include "ui_transfersavesdialog.h" +#include "iplugingame.h" #include "savegamegamebyro.h" #include "utility.h" -#include + #include #include + #include #include @@ -32,7 +35,7 @@ using namespace MOBase; using namespace MOShared; -TransferSavesDialog::TransferSavesDialog(const Profile &profile, IPluginGame *gamePlugin, QWidget *parent) +TransferSavesDialog::TransferSavesDialog(const Profile &profile, IPluginGame const *gamePlugin, QWidget *parent) : TutorableDialog("TransferSaves", parent) , ui(new Ui::TransferSavesDialog) , m_Profile(profile) @@ -60,7 +63,7 @@ void TransferSavesDialog::refreshGlobalSaves() QStringList files = savesDir.entryList(QDir::Files, QDir::Time); for (const QString &filename : files) { - SaveGameGamebryo *save = new SaveGameGamebryo(this, savesDir.absoluteFilePath(filename)); + SaveGameGamebryo *save = new SaveGameGamebryo(this, savesDir.absoluteFilePath(filename), m_GamePlugin); save->setParent(this); m_GlobalSaves.push_back(save); } @@ -78,7 +81,7 @@ void TransferSavesDialog::refreshLocalSaves() QStringList files = savesDir.entryList(QDir::Files, QDir::Time); foreach (const QString &filename, files) { - SaveGameGamebryo *save = new SaveGameGamebryo(this, savesDir.absoluteFilePath(filename)); + SaveGameGamebryo *save = new SaveGameGamebryo(this, savesDir.absoluteFilePath(filename), m_GamePlugin); save->setParent(this); m_LocalSaves.push_back(save); } diff --git a/src/transfersavesdialog.h b/src/transfersavesdialog.h index b9265b6a..e2c556b4 100644 --- a/src/transfersavesdialog.h +++ b/src/transfersavesdialog.h @@ -22,11 +22,9 @@ along with Mod Organizer. If not, see . #include "tutorabledialog.h" #include "profile.h" -#include -namespace Ui { -class TransferSavesDialog; -} +namespace Ui { class TransferSavesDialog; } +namespace MOBase { class IPluginGame; } class SaveGame; @@ -35,7 +33,7 @@ class TransferSavesDialog : public MOBase::TutorableDialog Q_OBJECT public: - explicit TransferSavesDialog(const Profile &profile, MOBase::IPluginGame *gamePlugin, QWidget *parent = 0); + explicit TransferSavesDialog(const Profile &profile, MOBase::IPluginGame const *gamePlugin, QWidget *parent = 0); ~TransferSavesDialog(); private slots: @@ -76,7 +74,7 @@ private: Profile m_Profile; - MOBase::IPluginGame *m_GamePlugin; + MOBase::IPluginGame const *m_GamePlugin; std::vector m_GlobalSaves; std::vector m_LocalSaves; diff --git a/win.imp b/win.imp new file mode 100644 index 00000000..cbecdc43 --- /dev/null +++ b/win.imp @@ -0,0 +1,83 @@ +[ + # Microsft visual C? + + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + + { include: [ "", "private", "", "public" ] }, + +# Windows +# Looks like the documentation says the 1st char is u/c the rest are l/c + +# You have to be kidding me. ULONG is defined in winsmcrd.h? + { symbol: [ "ULONG", "private", "", "private" ] }, + + { include: [ "", "private", "", "private" ] }, # Stringapiset.h + { include: [ "", "private", "", "public" ] }, + +# These are all in windef.h apparently. Which m/s then says 'use Windows.h' + { include: [ "", "private", "", "private" ] }, # or in winnt apparently + { include: [ "", "private", "", "private" ] }, + { include: [ "", "private", "", "private" ] }, + { include: [ "", "private", "", "private" ] }, + +# Similary, but for winbase.h + { include: [ "", "private", "", "private" ] }, + { include: [ "", "private", "", "private" ] }, + { include: [ "", "private", "", "private" ] }, + { include: [ "", "private", "", "private" ] }, + { include: [ "", "private", "", "private" ] }, + { include: [ "", "private", "", "private" ] }, + +# These ones say xxxx.h (include Windows.h) on the ms web site + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, # VerRsrc.h + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + +# These ones are in Windows.h but the documentation post windows 8 says they are individual headers, +# which looks like M/S are trying to get their act together. Maybe. + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + +# These ones are *not* defined to be in Windows.h, but it seems to work. These should probably be cleaned up + { include: [ "", "private", "", "public" ] }, + # These 3 should go to Shellapi.h + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, # official name according to website + { include: [ "", "private", "", "public" ] }, + # + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + +# Files that are included by other files which seem to then come for free in Windows.h but +# shouldn't. Again, should be cleaned up. + + { include: [ "", "private", "", "private" ] }, + { include: [ "", "private", "", "private" ] }, + { include: [ "", "private", "", "public" ] }, + + { include: [ "", "private", "", "private" ] }, + { include: [ "", "private", "", "public" ] }, + + { include: [ "", "private", "", "private" ] }, + { include: [ "", "private", "", "public" ] }, + +# Huh? This one is sane? + { include: [ "", "private", "", "public" ] }, + + +] + +#include // for operator delete[], etc + +#include // for _Simple_types<>::value_type +#include // for _Tree_const_iterator