+/***************************************************************************
+* this file is from kdeedu project. Filename: sharedkvtmlfiles.h
+***************************************************************************/
+
/***************************************************************************
scan a group of KVTML documents to get information from them
-----------------------------------------------------------------------
copyright : (C) 2007 Jeremy Whiting <jpwhiting@kde.org>
+
+ Copyright 2010, 2012 Reto Zingg <g.d0b3rm4n@gmail.com>
+
***************************************************************************/
/***************************************************************************
#ifndef SHAREDKVTMLFILES_H
#define SHAREDKVTMLFILES_H
-#include "libkeduvocdocument_export.h"
+#include "libqmvocdocument_export.h"
#include <QtCore/QStringList>
+typedef void (*KdeCleanUpFunction)();
+
+class KCleanUpGlobalStatic
+{
+ public:
+ KdeCleanUpFunction func;
+
+ inline ~KCleanUpGlobalStatic() { func(); }
+};
+
+
+#ifdef Q_CC_MSVC
+# define K_GLOBAL_STATIC_STRUCT_NAME(NAME) _k_##NAME##__LINE__
+#else
+# define K_GLOBAL_STATIC_STRUCT_NAME(NAME)
+#endif
+
+#define K_GLOBAL_STATIC(TYPE, NAME) K_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ())
+
+// from https://projects.kde.org/projects/kde/kdelibs/repository/revisions/02e659a25c68e7ef69af3a951d120bf3371e1fb6/entry/kdecore/kernel/kglobal.h
+// In Qt5 QBasicAtomicPointer<T> no longer implicit casts to T*
+// Instead it has load() and store() methods which do not exist in Qt4.
+// In practice, we should be porting frameworks to the new Q_GLOBAL_STATIC
+// which isn't in Qt5 yet, so duplicate for now.
+#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
+
+#define K_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS) \
+static QBasicAtomicPointer<TYPE > _k_static_##NAME = Q_BASIC_ATOMIC_INITIALIZER(0); \
+static bool _k_static_##NAME##_destroyed; \
+static struct K_GLOBAL_STATIC_STRUCT_NAME(NAME) \
+{ \
+ inline bool isDestroyed() const \
+ { \
+ return _k_static_##NAME##_destroyed; \
+ } \
+ inline bool exists() const \
+ { \
+ return _k_static_##NAME != 0; \
+ } \
+ inline operator TYPE*() \
+ { \
+ return operator->(); \
+ } \
+ inline TYPE *operator->() \
+ { \
+ if (!_k_static_##NAME) { \
+ if (isDestroyed()) { \
+ qFatal("Fatal Error: Accessed global static '%s *%s()' after destruction. " \
+ "Defined at %s:%d", #TYPE, #NAME, __FILE__, __LINE__); \
+ } \
+ TYPE *x = new TYPE ARGS; \
+ if (!_k_static_##NAME.testAndSetOrdered(0, x) \
+ && _k_static_##NAME != x ) { \
+ delete x; \
+ } else { \
+ static KCleanUpGlobalStatic cleanUpObject = { destroy }; \
+ } \
+ } \
+ return _k_static_##NAME; \
+ } \
+ inline TYPE &operator*() \
+ { \
+ return *operator->(); \
+ } \
+ static void destroy() \
+ { \
+ _k_static_##NAME##_destroyed = true; \
+ TYPE *x = _k_static_##NAME; \
+ _k_static_##NAME = 0; \
+ delete x; \
+ } \
+} NAME;
+
+#else
+
+#define K_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS) \
+static QBasicAtomicPointer<TYPE > _k_static_##NAME = Q_BASIC_ATOMIC_INITIALIZER(0); \
+static bool _k_static_##NAME##_destroyed; \
+static struct K_GLOBAL_STATIC_STRUCT_NAME(NAME) \
+{ \
+ inline bool isDestroyed() const \
+ { \
+ return _k_static_##NAME##_destroyed; \
+ } \
+ inline bool exists() const \
+ { \
+ return _k_static_##NAME.load() != 0; \
+ } \
+ inline operator TYPE*() \
+ { \
+ return operator->(); \
+ } \
+ inline TYPE *operator->() \
+ { \
+ if (!_k_static_##NAME.load()) { \
+ if (isDestroyed()) { \
+ qFatal("Fatal Error: Accessed global static '%s *%s()' after destruction. " \
+ "Defined at %s:%d", #TYPE, #NAME, __FILE__, __LINE__); \
+ } \
+ TYPE *x = new TYPE ARGS; \
+ if (!_k_static_##NAME.testAndSetOrdered(0, x) \
+ && _k_static_##NAME.load() != x ) { \
+ delete x; \
+ } else { \
+ static KCleanUpGlobalStatic cleanUpObject = { destroy }; \
+ } \
+ } \
+ return _k_static_##NAME.load(); \
+ } \
+ inline TYPE &operator*() \
+ { \
+ return *operator->(); \
+ } \
+ static void destroy() \
+ { \
+ _k_static_##NAME##_destroyed = true; \
+ TYPE *x = _k_static_##NAME.load(); \
+ _k_static_##NAME.store(0); \
+ delete x; \
+ } \
+} NAME;
+
+#endif // Qt 5
+
/**
*namespace and singleton class to scan groups of kvtml files
*from shared kvtml location, and give information
namespace SharedKvtmlFiles
{
/** get list of all languages found in any files */
- KEDUVOCDOCUMENT_EXPORT QStringList languages();
+ QMVOCDOCUMENT_EXPORT QStringList languages();
/** get list of filenames found of given language
*@param language language requested QString() for all languages
*@return a list of filenames with words in language
*/
- KEDUVOCDOCUMENT_EXPORT QStringList fileNames( const QString &language = QString() );
+ QMVOCDOCUMENT_EXPORT QStringList fileNames( const QString &language = QString() );
/** get the list of document titles found of a given language
*@param language requested language QString() for all titles
*@return a list of document titles with words in language
*/
- KEDUVOCDOCUMENT_EXPORT QStringList titles( const QString &language = QString() );
+ QMVOCDOCUMENT_EXPORT QStringList titles( const QString &language = QString() );
/** get the list of document remarks found of a given language
*@param language requested language QString() for all comments
*@return a list of document remarks with words in language
*/
- KEDUVOCDOCUMENT_EXPORT QStringList comments( const QString &language = QString() );
+ QMVOCDOCUMENT_EXPORT QStringList comments( const QString &language = QString() );
/** rescan the shared kvtml locations */
- KEDUVOCDOCUMENT_EXPORT void rescan();
+ QMVOCDOCUMENT_EXPORT void rescan();
/** sort files downloaded to kvtml top-level dir into locale sub-folders */
- KEDUVOCDOCUMENT_EXPORT void sortDownloadedFiles();
+ QMVOCDOCUMENT_EXPORT void sortDownloadedFiles();
}
#endif