⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qgpluginmanager.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.** ** This program 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 2 of the License, or (at your** option) any later version.** ** A copy of the GNU GPL license version 2 is included in this package as ** LICENSE.GPL.**** This program 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.**** In addition, as a special exception Trolltech gives permission to link** the code of this program with Qtopia applications copyrighted, developed** and distributed by Trolltech under the terms of the Qtopia Personal Use** License Agreement. You must comply with the GNU General Public License** in all respects for all of the code used other than the applications** licensed under the Qtopia Personal Use License Agreement. If you modify** this file, you may extend this exception to your version of the file,** but you are not obligated to do so. If you do not wish to do so, delete** this exception statement from your version.** ** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "qgpluginmanager_p.h"#ifndef QT_NO_COMPONENT#include "qcomlibrary_p.h"#include "qmap.h"#include "qdir.h"/*  The following co-occurrence code is borrowed from Qt Linguist.  How similar are two texts? The approach used here relies on  co-occurrence matrices and is very efficient.  Let's see with an example: how similar are "here" and "hither"?  The  co-occurrence matrix M for "here" is M[h,e] = 1, M[e,r] = 1,  M[r,e] = 1 and 0 elsewhere; the matrix N for "hither" is N[h,i] = 1,  N[i,t] = 1, ..., N[h,e] = 1, N[e,r] = 1 and 0 elsewhere.  The union  U of both matrices is the matrix U[i,j] = max { M[i,j], N[i,j] },  and the intersection V is V[i,j] = min { M[i,j], N[i,j] }. The score  for a pair of texts is      score = (sum of V[i,j] over all i, j) / (sum of U[i,j] over all i, j),  a formula suggested by Arnt Gulbrandsen. Here we have      score = 2 / 6,  or one third.  The implementation differs from this in a few details.  Most  importantly, repetitions are ignored; for input "xxx", M[x,x] equals  1, not 2.*//*  Every character is assigned to one of 20 buckets so that the  co-occurrence matrix requires only 20 * 20 = 400 bits, not  256 * 256 = 65536 bits or even more if we want the whole Unicode.  Which character falls in which bucket is arbitrary.  The second half of the table is a replica of the first half, because of  laziness.*/static const char indexOf[256] = {    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,//      !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /    0,  2,  6,  7,  10, 12, 15, 19, 2,  6,  7,  10, 12, 15, 19, 0,//  0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?    1,  3,  4,  5,  8,  9,  11, 13, 14, 16, 2,  6,  7,  10, 12, 15,//  @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  6,  10, 11, 12, 13, 14,//  P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _    15, 12, 16, 17, 18, 19, 2,  10, 15, 7,  19, 2,  6,  7,  10, 0,//  `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  6,  10, 11, 12, 13, 14,//  p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~    15, 12, 16, 17, 18, 19, 2,  10, 15, 7,  19, 2,  6,  7,  10, 0,    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,    0,  2,  6,  7,  10, 12, 15, 19, 2,  6,  7,  10, 12, 15, 19, 0,    1,  3,  4,  5,  8,  9,  11, 13, 14, 16, 2,  6,  7,  10, 12, 15,    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  6,  10, 11, 12, 13, 14,    15, 12, 16, 17, 18, 19, 2,  10, 15, 7,  19, 2,  6,  7,  10, 0,    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  6,  10, 11, 12, 13, 14,    15, 12, 16, 17, 18, 19, 2,  10, 15, 7,  19, 2,  6,  7,  10, 0};/*  The entry bitCount[i] (for i between 0 and 255) is the number of  bits used to represent i in binary.*/static const char bitCount[256] = {    0,  1,  1,  2,  1,  2,  2,  3,  1,  2,  2,  3,  2,  3,  3,  4,    1,  2,  2,  3,  2,  3,  3,  4,  2,  3,  3,  4,  3,  4,  4,  5,    1,  2,  2,  3,  2,  3,  3,  4,  2,  3,  3,  4,  3,  4,  4,  5,    2,  3,  3,  4,  3,  4,  4,  5,  3,  4,  4,  5,  4,  5,  5,  6,    1,  2,  2,  3,  2,  3,  3,  4,  2,  3,  3,  4,  3,  4,  4,  5,    2,  3,  3,  4,  3,  4,  4,  5,  3,  4,  4,  5,  4,  5,  5,  6,    2,  3,  3,  4,  3,  4,  4,  5,  3,  4,  4,  5,  4,  5,  5,  6,    3,  4,  4,  5,  4,  5,  5,  6,  4,  5,  5,  6,  5,  6,  6,  7,    1,  2,  2,  3,  2,  3,  3,  4,  2,  3,  3,  4,  3,  4,  4,  5,    2,  3,  3,  4,  3,  4,  4,  5,  3,  4,  4,  5,  4,  5,  5,  6,    2,  3,  3,  4,  3,  4,  4,  5,  3,  4,  4,  5,  4,  5,  5,  6,    3,  4,  4,  5,  4,  5,  5,  6,  4,  5,  5,  6,  5,  6,  6,  7,    2,  3,  3,  4,  3,  4,  4,  5,  3,  4,  4,  5,  4,  5,  5,  6,    3,  4,  4,  5,  4,  5,  5,  6,  4,  5,  5,  6,  5,  6,  6,  7,    3,  4,  4,  5,  4,  5,  5,  6,  4,  5,  5,  6,  5,  6,  6,  7,    4,  5,  5,  6,  5,  6,  6,  7,  5,  6,  6,  7,  6,  7,  7,  8};class QCoMatrix{public:    /*      The matrix has 20 * 20 = 400 entries. This requires 50 bytes, or      13 words. Some operations are performed on words for more      efficiency.    */    union {	Q_UINT8 b[52];	Q_UINT32 w[13];    };    QCoMatrix() { memset( b, 0, 52 ); }    QCoMatrix( const char *text ) {	char c = '\0', d;	memset( b, 0, 52 );	while ( (d = *text) != '\0' ) {	    setCoocc( c, d );	    if ( (c = *++text) != '\0' ) {		setCoocc( d, c );		text++;	    }	}    }    void setCoocc( char c, char d ) {	int k = indexOf[(uchar) c] + 20 * indexOf[(uchar) d];	b[k >> 3] |= k & 0x7;    }    int worth() const {	int result = 0;	for ( int i = 0; i < 50; i++ )	    result += bitCount[b[i]];	return result;    }    static QCoMatrix reunion( const QCoMatrix& m, const QCoMatrix& n )    {	QCoMatrix p;	for ( int i = 0; i < 13; i++ )	    p.w[i] = m.w[i] | n.w[i];	return p;    }    static QCoMatrix intersection( const QCoMatrix& m, const QCoMatrix& n )    {	QCoMatrix p;	for ( int i = 0; i < 13; i++ )	    p.w[i] = m.w[i] & n.w[i];	return p;    }};/*  Returns an integer between 0 (dissimilar) and 15 (very similar)  depending on  how similar the string is to \a target.  This function is efficient, but its results might change in future  versions of Qt as the algorithm evolves.  \code    QString s( "color" );    a = similarity( s, "color" );  // a == 15    a = similarity( s, "colour" ); // a == 8    a = similarity( s, "flavor" ); // a == 4    a = similarity( s, "dahlia" ); // a == 0  \endcode*/static int similarity( const QString& s1, const QString& s2 ){    QCoMatrix m1( s1 );    QCoMatrix m2( s2 );    return ( 15 * (QCoMatrix::intersection(m1, m2).worth() + 1) ) /	   ( QCoMatrix::reunion(m1, m2).worth() + 1 );}/*!  \class QPluginManager qpluginmanager.h  \reentrant  \brief The QPluginManager class provides basic functions to access a certain kind of functionality in libraries.  \ingroup componentmodel  \internal  A common usage of components is to extend the existing functionality in an application using plugins. The application  defines interfaces that abstract a certain group of functionality, and a plugin provides a specialized implementation  of one or more of those interfaces.  The QPluginManager template has to be instantiated with an interface definition and the IID for this interface.  \code  QPluginManager<MyPluginInterface> *manager = new QPluginManager<MyPluginInterface>( IID_MyPluginInterface );  \endcode  It searches a specified directory for all shared libraries, queries for components that implement the specific interface and  reads information about the features the plugin wants to add to the application. The component can provide the set of features  provided by implementing either the QFeatureListInterface or the QComponentInformationInterface. The strings returned by the implementations  of  \code  QStringList QFeatureListInterface::featureList() const  \endcode  or  \code  QString QComponentInformationInterface::name() const  \endcode  respectively, can then be used to access the component that provides the requested feature:  \code  MyPluginInterface *iface;  manager->queryInterface( "feature", &iface );  if ( iface )      iface->execute( "feature" );  \endcode  The application can use a QPluginManager instance to create parts of the user interface based on the list of features  found in plugins:  \code  QPluginManager<MyPluginInterface> *manager = new QPluginManager<MyPluginInterface>( IID_ImageFilterInterface );  manager->addLibraryPath(...);  QStringList features = manager->featureList();  for ( QStringList::Iterator it = features.begin(); it != features.end(); ++it ) {      MyPluginInterface *iface;      manager->queryInterface( *it, &iface );      // use QAction to provide toolbuttons and menuitems for each feature...  }  \endcode*//*!  \fn QPluginManager::QPluginManager( const QUuid& id, const QStringList& paths = QString::null, const QString &suffix = QString::null, bool cs = TRUE )  Creates an QPluginManager for interfaces \a id that will load all shared library files in the \a paths + \a suffix.  If \a cs is FALSE the manager will handle feature strings case insensitive.  \warning  Setting the cs flag to FALSE requires that components also convert to lower case when comparing with passed strings, so this has  to be handled with care and documented very well.  \sa QApplication::libraryPaths()*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -