From 472156a41b1348c714986c772759ad950fffbe75 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sun, 27 Jan 2013 15:11:21 -0600 Subject: Rename kioslaves --- kcontrol/kfontinst/CMakeLists.txt | 2 +- kcontrol/kfontinst/kio/CMakeLists.txt | 39 - kcontrol/kfontinst/kio/KioFonts.cpp | 2534 ------------------------ kcontrol/kfontinst/kio/KioFonts.h | 161 -- kcontrol/kfontinst/kio/Makefile.am | 20 - kcontrol/kfontinst/kio/folder.desktop | 80 - kcontrol/kfontinst/kio/fonts.desktop | 85 - kcontrol/kfontinst/kio/fonts.protocol | 18 - kcontrol/kfontinst/kio/package.desktop | 74 - kcontrol/kfontinst/kio/system-folder.desktop | 79 - kcontrol/kfontinst/tdeio/CMakeLists.txt | 39 + kcontrol/kfontinst/tdeio/KioFonts.cpp | 2534 ++++++++++++++++++++++++ kcontrol/kfontinst/tdeio/KioFonts.h | 161 ++ kcontrol/kfontinst/tdeio/Makefile.am | 20 + kcontrol/kfontinst/tdeio/folder.desktop | 80 + kcontrol/kfontinst/tdeio/fonts.desktop | 85 + kcontrol/kfontinst/tdeio/fonts.protocol | 18 + kcontrol/kfontinst/tdeio/package.desktop | 74 + kcontrol/kfontinst/tdeio/system-folder.desktop | 79 + 19 files changed, 3091 insertions(+), 3091 deletions(-) delete mode 100644 kcontrol/kfontinst/kio/CMakeLists.txt delete mode 100644 kcontrol/kfontinst/kio/KioFonts.cpp delete mode 100644 kcontrol/kfontinst/kio/KioFonts.h delete mode 100644 kcontrol/kfontinst/kio/Makefile.am delete mode 100644 kcontrol/kfontinst/kio/folder.desktop delete mode 100644 kcontrol/kfontinst/kio/fonts.desktop delete mode 100644 kcontrol/kfontinst/kio/fonts.protocol delete mode 100644 kcontrol/kfontinst/kio/package.desktop delete mode 100644 kcontrol/kfontinst/kio/system-folder.desktop create mode 100644 kcontrol/kfontinst/tdeio/CMakeLists.txt create mode 100644 kcontrol/kfontinst/tdeio/KioFonts.cpp create mode 100644 kcontrol/kfontinst/tdeio/KioFonts.h create mode 100644 kcontrol/kfontinst/tdeio/Makefile.am create mode 100644 kcontrol/kfontinst/tdeio/folder.desktop create mode 100644 kcontrol/kfontinst/tdeio/fonts.desktop create mode 100644 kcontrol/kfontinst/tdeio/fonts.protocol create mode 100644 kcontrol/kfontinst/tdeio/package.desktop create mode 100644 kcontrol/kfontinst/tdeio/system-folder.desktop (limited to 'kcontrol/kfontinst') diff --git a/kcontrol/kfontinst/CMakeLists.txt b/kcontrol/kfontinst/CMakeLists.txt index 0fe56e1b4..e974f2a10 100644 --- a/kcontrol/kfontinst/CMakeLists.txt +++ b/kcontrol/kfontinst/CMakeLists.txt @@ -15,6 +15,6 @@ add_subdirectory( viewpart ) add_subdirectory( kcmfontinst ) add_subdirectory( tdefile-plugin ) add_subdirectory( kfontinst ) -add_subdirectory( kio ) +add_subdirectory( tdeio ) install( FILES installfont.desktop DESTINATION ${DATA_INSTALL_DIR}/konqueror/servicemenus ) diff --git a/kcontrol/kfontinst/kio/CMakeLists.txt b/kcontrol/kfontinst/kio/CMakeLists.txt deleted file mode 100644 index 9c6d0ad83..000000000 --- a/kcontrol/kfontinst/kio/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -################################################# -# -# (C) 2010-2011 Serghei Amelian -# serghei (DOT) amelian (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -include_directories( - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/kcontrol/kfontinst/lib - ${CMAKE_SOURCE_DIR}/kcontrol/fonts - ${TDE_INCLUDE_DIR} - ${TQT_INCLUDE_DIRS} -) - -link_directories( - ${TQT_LIBRARY_DIRS} -) - - -##### other data ################################ - -install( FILES fonts.protocol DESTINATION ${SERVICES_INSTALL_DIR} ) -install( FILES fonts.desktop DESTINATION ${DATA_INSTALL_DIR}/konqsidebartng/virtual_folders/services ) -install( FILES folder.desktop system-folder.desktop package.desktop DESTINATION ${MIME_INSTALL_DIR}/fonts ) - - -##### kio_fonts (module) ####################### - -tde_add_kpart( kio_fonts AUTOMOC - SOURCES KioFonts.cpp - LINK kxftconfig-static kfontinst-shared tdesu-shared - DESTINATION ${PLUGIN_INSTALL_DIR} -) diff --git a/kcontrol/kfontinst/kio/KioFonts.cpp b/kcontrol/kfontinst/kio/KioFonts.cpp deleted file mode 100644 index 4c28a1c33..000000000 --- a/kcontrol/kfontinst/kio/KioFonts.cpp +++ /dev/null @@ -1,2534 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Class Name : KFI::CKioFonts -// Author : Craig Drummond -// Project : K Font Installer -// Creation Date : 05/03/2003 -// Version : $Revision$ $Date$ -// -//////////////////////////////////////////////////////////////////////////////// -// -// 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. -// -// 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. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -// -//////////////////////////////////////////////////////////////////////////////// -// (C) Craig Drummond, 2003, 2004 -//////////////////////////////////////////////////////////////////////////////// - -/*************************************************************************** - - NOTE: Large sections of this code are copied from kio_file - -- can't just inherit from kio_file as kio_file uses "error(...); - return;" So there is no way to know if an error occured! - - ***************************************************************************/ - -#include "KioFonts.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "KfiConstants.h" -#include "FcEngine.h" -#include "Misc.h" -#include -#include -#include - -//#define KFI_FORCE_DEBUG_TO_STDERR - -#ifdef KFI_FORCE_DEBUG_TO_STDERR - -#include -TQTextOStream ostr(stderr); -#define KFI_DBUG ostr << "[" << (int)(getpid()) << "] " - -#else - -#define KFI_DBUG kdDebug() << "[" << (int)(getpid()) << "] " - -#endif - -#define MAX_IPC_SIZE (1024*32) -#define TIMEOUT 2 // Time between last mod and writing files... -#define MAX_NEW_FONTS 50 // #fonts that can be installed before automatically configuring (related to above) -#define FC_CACHE_CMD "fc-cache" - -static const char * constMultipleExtension=".fonts.tar.gz"; // Fonts that have multiple files are returned as a .tar.gz! -static const int constMaxLastDestTime=5; -static const int constMaxFcCheckTime=10; - -extern "C" -{ - KDE_EXPORT int kdemain(int argc, char **argv); -} - -int kdemain(int argc, char **argv) -{ - if (argc != 4) - { - fprintf(stderr, "Usage: kio_" KFI_KIO_FONTS_PROTOCOL " protocol domain-socket1 domain-socket2\n"); - exit(-1); - } - - KLocale::setMainCatalogue(KFI_CATALOGUE); - - TDEInstance instance("kio_" KFI_KIO_FONTS_PROTOCOL); - KFI::CKioFonts slave(argv[2], argv[3]); - - slave.dispatchLoop(); - - return 0; -} - -namespace KFI -{ - -inline bool isSysFolder(const TQString §) -{ - return i18n(KFI_KIO_FONTS_SYS)==sect || KFI_KIO_FONTS_SYS==sect; -} - -inline bool isUserFolder(const TQString §) -{ - return i18n(KFI_KIO_FONTS_USER)==sect || KFI_KIO_FONTS_USER==sect; -} - -static TQString removeMultipleExtension(const KURL &url) -{ - TQString fname(url.fileName()); - int pos; - - if(-1!=(pos=fname.findRev(TQString::fromLatin1(constMultipleExtension)))) - fname=fname.left(pos); - - return fname; -} - -static TQString modifyName(const TQString &fname) -{ - static const char constSymbols[]={ '-', ' ', ':', 0 }; - - TQString rv(fname); - int dotPos=rv.findRev('.'); - - if(-1!=dotPos) - { - unsigned int rvLen=rv.length(); - - for(unsigned int i=dotPos+1; i-1) - size+=s; - } - - return size; -} - -static int getSize(TQValueList &patterns) -{ - TQValueList::Iterator it, - end=patterns.end(); - int size=0; - - for(it=patterns.begin(); it!=end; ++it) - size+=getFontSize(CFcEngine::getFcString(*it, FC_FILE)); - - return size; -} - -static void addAtom(TDEIO::UDSEntry &entry, unsigned int ID, long l, const TQString &s=TQString::null) -{ - TDEIO::UDSAtom atom; - atom.m_uds = ID; - atom.m_long = l; - atom.m_str = s; - entry.append(atom); -} - -static bool createFolderUDSEntry(TDEIO::UDSEntry &entry, const TQString &name, const TQString &path, bool sys) -{ - KFI_DBUG << "createFolderUDSEntry " << name << ' ' << path << ' ' << sys << ' ' << endl; - - KDE_struct_stat buff; - TQCString cPath(TQFile::encodeName(path)); - - entry.clear(); - - if(-1!=KDE_lstat(cPath, &buff)) - { - addAtom(entry, TDEIO::UDS_NAME, 0, name); - - if (S_ISLNK(buff.st_mode)) - { - KFI_DBUG << path << " is a link" << endl; - - char buffer2[1000]; - int n=readlink(cPath, buffer2, 1000); - if(n!= -1) - buffer2[n]='\0'; - - addAtom(entry, TDEIO::UDS_LINK_DEST, 0, TQString::fromLocal8Bit(buffer2)); - - if(-1==KDE_stat(cPath, &buff)) - { - // It is a link pointing to nowhere - addAtom(entry, TDEIO::UDS_FILE_TYPE, S_IFMT - 1); - addAtom(entry, TDEIO::UDS_ACCESS, S_IRWXU | S_IRWXG | S_IRWXO); - addAtom(entry, TDEIO::UDS_SIZE, 0); - goto notype; - } - } - - addAtom(entry, TDEIO::UDS_FILE_TYPE, buff.st_mode&S_IFMT); - addAtom(entry, TDEIO::UDS_ACCESS, buff.st_mode&07777); - addAtom(entry, TDEIO::UDS_SIZE, buff.st_size); - - notype: - addAtom(entry, TDEIO::UDS_MODIFICATION_TIME, buff.st_mtime); - - struct passwd *user = getpwuid(buff.st_uid); - addAtom(entry, TDEIO::UDS_USER, 0, user ? user->pw_name : TQString::number(buff.st_uid).latin1()); - - struct group *grp = getgrgid(buff.st_gid); - addAtom(entry, TDEIO::UDS_GROUP, 0, grp ? grp->gr_name : TQString::number(buff.st_gid).latin1()); - - addAtom(entry, TDEIO::UDS_ACCESS_TIME, buff.st_atime); - addAtom(entry, TDEIO::UDS_MIME_TYPE, 0, sys - ? KFI_KIO_FONTS_PROTOCOL"/system-folder" - : KFI_KIO_FONTS_PROTOCOL"/folder"); - addAtom(entry, TDEIO::UDS_GUESSED_MIME_TYPE, 0, "application/octet-stream"); - TQString url(KFI_KIO_FONTS_PROTOCOL+TQString::fromLatin1(":/")); - return true; - } - else if (sys && !Misc::root()) // Default system fonts folder does not actually exist yet! - { - KFI_DBUG << "Default system folder (" << path << ") does not yet exist, so create dummy entry" << endl; - addAtom(entry, TDEIO::UDS_NAME, 0, name); - addAtom(entry, TDEIO::UDS_FILE_TYPE, S_IFDIR); - addAtom(entry, TDEIO::UDS_ACCESS, 0744); - addAtom(entry, TDEIO::UDS_USER, 0, "root"); - addAtom(entry, TDEIO::UDS_GROUP, 0, "root"); - addAtom(entry, TDEIO::UDS_MIME_TYPE, 0, KFI_KIO_FONTS_PROTOCOL"/system-folder"); - addAtom(entry, TDEIO::UDS_GUESSED_MIME_TYPE, 0, "application/octet-stream"); - - return true; - } - - - return false; -} - -static bool createFontUDSEntry(TDEIO::UDSEntry &entry, const TQString &name, TQValueList &patterns, bool sys) -{ - KFI_DBUG << "createFontUDSEntry " << name << ' ' << patterns.count() << endl; - - bool multiple=true; - - if(1==patterns.count()) // Only one font file, but are there any .pfm or .afm files? - { - KURL::List urls; - - Misc::getAssociatedUrls(KURL(CFcEngine::getFcString(patterns.first(), FC_FILE)), urls); - - if(0==urls.count()) - multiple=false; - } - - // - // In case of mixed bitmap/scalable - prefer scalable - TQValueList sortedPatterns; - TQValueList::Iterator it, - end(patterns.end()); - FcBool b=FcFalse; - - for(it=patterns.begin(); it!=end; ++it) - if(FcResultMatch==FcPatternGetBool(*it, FC_SCALABLE, 0, &b) && b) - sortedPatterns.prepend(*it); - else - sortedPatterns.append(*it); - - end=sortedPatterns.end(); - entry.clear(); - addAtom(entry, TDEIO::UDS_SIZE, getSize(patterns)); - - for(it=sortedPatterns.begin(); it!=end; ++it) - { - TQString path(CFcEngine::getFcString(*it, FC_FILE)); - TQCString cPath(TQFile::encodeName(path)); - KDE_struct_stat buff; - - if(-1!=KDE_lstat(cPath, &buff)) - { - addAtom(entry, TDEIO::UDS_NAME, 0, name); - - if (S_ISLNK(buff.st_mode)) - { - KFI_DBUG << path << " is a link" << endl; - - char buffer2[1000]; - int n=readlink(cPath, buffer2, 1000); - - if(n!= -1) - buffer2[n]='\0'; - - addAtom(entry, TDEIO::UDS_LINK_DEST, 0, TQString::fromLocal8Bit(buffer2)); - - if(-1==KDE_stat(cPath, &buff)) - { - // It is a link pointing to nowhere - addAtom(entry, TDEIO::UDS_FILE_TYPE, S_IFMT - 1); - addAtom(entry, TDEIO::UDS_ACCESS, S_IRWXU | S_IRWXG | S_IRWXO); - goto notype; - } - } - - addAtom(entry, TDEIO::UDS_FILE_TYPE, buff.st_mode&S_IFMT); - addAtom(entry, TDEIO::UDS_ACCESS, buff.st_mode&07777); - - notype: - addAtom(entry, TDEIO::UDS_MODIFICATION_TIME, buff.st_mtime); - - struct passwd *user = getpwuid(buff.st_uid); - addAtom(entry, TDEIO::UDS_USER, 0, user ? user->pw_name : TQString::number(buff.st_uid).latin1()); - - struct group *grp = getgrgid(buff.st_gid); - addAtom(entry, TDEIO::UDS_GROUP, 0, grp ? grp->gr_name : TQString::number(buff.st_gid).latin1()); - - addAtom(entry, TDEIO::UDS_ACCESS_TIME, buff.st_atime); - addAtom(entry, TDEIO::UDS_MIME_TYPE, 0, KMimeType::findByPath(path, 0, true)->name()); - addAtom(entry, TDEIO::UDS_GUESSED_MIME_TYPE, 0, "application/octet-stream"); - - TQString url(KFI_KIO_FONTS_PROTOCOL+TQString::fromLatin1(":/")); - - if(!Misc::root()) - { - url+=sys ? i18n(KFI_KIO_FONTS_SYS) : i18n(KFI_KIO_FONTS_USER); - url+=TQString::fromLatin1("/"); - } - if(multiple) - url+=name+TQString::fromLatin1(constMultipleExtension); - else - url+=Misc::getFile(path); - addAtom(entry, TDEIO::UDS_URL, 0, url); - return true; // This file was OK, so use its values... - } - } - return false; -} - -enum EUrlStatus -{ - BAD_URL, - URL_OK, - REDIRECT_URL -}; - -static KURL getRedirect(const KURL &u) -{ - // Go from fonts:/System to fonts:/ - - KURL redirect(u); - TQString path(u.path()), - sect(CKioFonts::getSect(path)); - - path.remove(sect); - path.replace("//", "/"); - redirect.setPath(path); - - KFI_DBUG << "Redirect from " << u.path() << " to " << redirect.path() << endl; - return redirect; -} - -static bool nonRootSys(const KURL &u) -{ - return !Misc::root() && isSysFolder(CKioFonts::getSect(u.path())); -} - -static TQString getFontFolder(const TQString &defaultDir, const TQString &root, TQStringList &dirs) -{ - if(dirs.contains(defaultDir)) - return defaultDir; - else - { - TQStringList::Iterator it, - end=dirs.end(); - bool found=false; - - for(it=dirs.begin(); it!=end && !found; ++it) - if(0==(*it).find(root)) - return *it; - } - - return TQString::null; -} - -static bool writeAll(int fd, const char *buf, size_t len) -{ - while(len>0) - { - ssize_t written=write(fd, buf, len); - if (written<0 && EINTR!=errno) - return false; - buf+=written; - len-=written; - } - return true; -} - -static bool checkExt(const char *fname, const char *ext) -{ - unsigned int len=strlen(fname); - - return len>4 ? (fname[len-4]=='.' && tolower(fname[len-3])==ext[0] && tolower(fname[len-2])==ext[1] && - tolower(fname[len-1])==ext[2]) - : false; -} - -static bool isAAfm(const TQString &fname) -{ - if(checkExt(TQFile::encodeName(fname), "afm")) // CPD? Is this a necessary check? - { - TQFile file(fname); - - if(file.open(IO_ReadOnly)) - { - TQTextStream stream(&file); - TQString line; - - for(int lc=0; lc<30 && !stream.atEnd(); ++lc) - { - line=stream.readLine(); - - if(line.contains("StartFontMetrics")) - { - file.close(); - return true; - } - } - - file.close(); - } - } - - return false; -} - -static bool isAPfm(const TQString &fname) -{ - bool ok=false; - - // I know extension checking is bad, but Ghostscript's pf2afm requires the pfm file to - // have the .pfm extension... - if(checkExt(TQFile::encodeName(fname), "pfm")) - { - // - // OK, the extension matches, so perform a little contents checking... - FILE *f=fopen(TQFile::encodeName(fname).data(), "r"); - - if(f) - { - static const unsigned long constCopyrightLen = 60; - static const unsigned long constTypeToExt = 49; - static const unsigned long constExtToFname = 20; - static const unsigned long constExtLen = 30; - static const unsigned long constFontnameMin = 75; - static const unsigned long constFontnameMax = 512; - - unsigned short version=0, - type=0, - extlen=0; - unsigned long length=0, - fontname=0, - fLength=0; - - fseek(f, 0, SEEK_END); - fLength=ftell(f); - fseek(f, 0, SEEK_SET); - - if(2==fread(&version, 1, 2, f) && // Read version - 4==fread(&length, 1, 4, f) && // length... - length==fLength && - 0==fseek(f, constCopyrightLen, SEEK_CUR) && // Skip copyright notice... - 2==fread(&type, 1, 2, f) && - 0==fseek(f, constTypeToExt, SEEK_CUR) && - 2==fread(&extlen, 1, 2, f) && - extlen==constExtLen && - 0==fseek(f, constExtToFname, SEEK_CUR) && - 4==fread(&fontname, 1, 4, f) && - fontname>constFontnameMin && fontname paths; - - bool operator==(const FontList &f) const { return f.name==name; } -}; - -// -// This function returns a set of maping of from -> to for copy/move operations -static bool getFontList(const TQStringList &files, TQMap &map) -{ - // - // First of all create a list of font files, and their paths - TQStringList::ConstIterator it=files.begin(), - end=files.end(); - TQValueList list; - - for(;it!=end; ++it) - { - TQString name(Misc::getFile(*it)), - path(Misc::getDir(*it)); - TQValueList::Iterator entry=list.find(FontList(name)); - - if(entry!=list.end()) - { - if(!(*entry).paths.contains(path)) - (*entry).paths.append(path); - } - else - list.append(FontList(name, path)); - } - - TQValueList::Iterator fIt(list.begin()), - fEnd(list.end()); - - for(; fIt!=fEnd; ++fIt) - { - TQValueList::Iterator pBegin((*fIt).paths.begin()), - pIt(++pBegin), - pEnd((*fIt).paths.end()); - --pBegin; - - if((*fIt).paths.count()>1) - { - // There's more than 1 file with the same name, but in a different locations - // therefore, take the unique part of the path, and replace / with _ - // e.g. - // /usr/X11R6/lib/X11/fonts/75dpi/times.pcf.gz - // /usr/X11R6/lib/X11/fonts/100dpi/times.pcf.gz - // - // Will produce: - // 75dpi_times.pcf.gz - // 100dpi_times.pcf.gz - unsigned int beginLen((*pBegin).orig.length()); - - for(; pIt!=pEnd; ++pIt) - { - unsigned int len=TQMIN((*pIt).orig.length(), beginLen); - - for(unsigned int i=0; i0) - for(int path=0; path >::Iterator it=itsFolders[folder].fontMap.begin(), - end=itsFolders[folder].fontMap.end(); - - for ( ; it != end; ++it) - { - entry.clear(); - if(createFontUDSEntry(entry, it.key(), it.data(), FOLDER_SYS==folder)) - listEntry(entry, false); - } - } - } - else - { - size=2; - totalSize(size); - createFolderUDSEntry(entry, i18n(KFI_KIO_FONTS_USER), itsFolders[FOLDER_USER].location, false); - listEntry(entry, false); - createFolderUDSEntry(entry, i18n(KFI_KIO_FONTS_SYS), itsFolders[FOLDER_SYS].location, true); - listEntry(entry, false); - } - - listEntry(size ? entry : TDEIO::UDSEntry(), true); - finished(); - } - - KFI_DBUG << "listDir - finished!" << endl; -} - -void CKioFonts::stat(const KURL &url) -{ - KFI_DBUG << "stat " << url.prettyURL() << endl; - - if(updateFontList() && checkUrl(url, true)) - { - TQString path(url.path(-1)); - - if(path.isEmpty()) - { - error(TDEIO::ERR_COULD_NOT_STAT, url.prettyURL()); - return; - } - - TQStringList pathList(TQStringList::split('/', path, false)); - TDEIO::UDSEntry entry; - bool err=false; - - switch(pathList.count()) - { - case 0: - err=!createFolderUDSEntry(entry, i18n("Fonts"), itsFolders[itsRoot ? FOLDER_SYS : FOLDER_USER].location, false); - break; - case 1: - if(itsRoot) - err=!createStatEntry(entry, url, FOLDER_SYS); - else - if(isUserFolder(pathList[0])) - err=!createFolderUDSEntry(entry, i18n(KFI_KIO_FONTS_USER), itsFolders[FOLDER_USER].location, false); - else if(isSysFolder(pathList[0])) - err=!createFolderUDSEntry(entry, i18n(KFI_KIO_FONTS_SYS), itsFolders[FOLDER_USER].location, true); - else - { - error(TDEIO::ERR_SLAVE_DEFINED, - i18n("Please specify \"%1\" or \"%2\".").arg(i18n(KFI_KIO_FONTS_USER)).arg(i18n(KFI_KIO_FONTS_SYS))); - return; - } - break; - default: - err=!createStatEntry(entry, url, getFolder(url)); - } - - if(err) - { - error(TDEIO::ERR_DOES_NOT_EXIST, url.prettyURL()); - return; - } - - statEntry(entry); - finished(); - } -} - -bool CKioFonts::createStatEntry(TDEIO::UDSEntry &entry, const KURL &url, EFolder folder) -{ - KFI_DBUG << "createStatEntry " << url.path() << endl; - - TQMap >::Iterator it=getMap(url); - - if(it!=itsFolders[folder].fontMap.end()) - return createFontUDSEntry(entry, it.key(), it.data(), FOLDER_SYS==folder); - return false; -} - -void CKioFonts::get(const KURL &url) -{ - KFI_DBUG << "get " << url.path() << " query:" << url.query() << endl; - - bool thumb="1"==metaData("thumbnail"); - TQStringList srcFiles; - - if(updateFontList() && checkUrl(url) && getSourceFiles(url, srcFiles)) // Any error will be logged in getSourceFiles - { - // - // The thumbnail job always donwloads non-local files to /tmp/... and passes this file name to the thumbnail - // creator. However, in the case of fonts which are split among many files, this wont work. Therefore, when the - // thumbnail code asks for the font to donwload, just return the URL used. This way the font-thumbnail creator can - // read this and just ask Xft/fontconfig for the font data. - if(thumb) - { - TQByteArray array; - TQTextOStream stream(array); - - emit mimeType("text/plain"); - - KFI_DBUG << "hasMetaData(\"thumbnail\"), so return: " << url.prettyURL() << endl; - - stream << url.prettyURL(); - totalSize(array.size()); - data(array); - processedSize(array.size()); - data(TQByteArray()); - processedSize(array.size()); - finished(); - return; - } - - TQString realPath, - useMime; - KDE_struct_stat buff; - bool multiple=false; - - if(1==srcFiles.count()) - realPath=srcFiles.first(); - else // Font is made up of multiple files - so create .tar.gz of them all! - { - KTempFile tmpFile; - KTar tar(tmpFile.name(), "application/x-gzip"); - - tmpFile.setAutoDelete(false); - realPath=tmpFile.name(); - - if(tar.open(IO_WriteOnly)) - { - TQMap map; - - getFontList(srcFiles, map); - - TQMap::Iterator fIt(map.begin()), - fEnd(map.end()); - - // - // Iterate through created list, and add to tar archive - for(; fIt!=fEnd; ++fIt) - tar.addLocalFile(fIt.key(), fIt.data()); - - multiple=true; - tar.close(); - } - } - - TQCString realPathC(TQFile::encodeName(realPath)); - KFI_DBUG << "real: " << realPathC << endl; - - if (-2==KDE_stat(realPathC.data(), &buff)) - error(EACCES==errno ? TDEIO::ERR_ACCESS_DENIED : TDEIO::ERR_DOES_NOT_EXIST, url.prettyURL()); - else if (S_ISDIR(buff.st_mode)) - error(TDEIO::ERR_IS_DIRECTORY, url.prettyURL()); - else if (!S_ISREG(buff.st_mode)) - error(TDEIO::ERR_CANNOT_OPEN_FOR_READING, url.prettyURL()); - else - { - int fd = KDE_open(realPathC.data(), O_RDONLY); - - if (fd < 0) - error(TDEIO::ERR_CANNOT_OPEN_FOR_READING, url.prettyURL()); - else - { - // Determine the mimetype of the file to be retrieved, and emit it. - // This is mandatory in all slaves (for KRun/BrowserRun to work). - emit mimeType(useMime.isEmpty() ? KMimeType::findByPath(realPathC, buff.st_mode, true)->name() : useMime); - - totalSize(buff.st_size); - - TDEIO::filesize_t processed=0; - char buffer[MAX_IPC_SIZE]; - TQByteArray array; - - while(1) - { - int n=::read(fd, buffer, MAX_IPC_SIZE); - if (-1==n) - { - if (errno == EINTR) - continue; - error(TDEIO::ERR_COULD_NOT_READ, url.prettyURL()); - close(fd); - if(multiple) - ::unlink(realPathC); - return; - } - if (0==n) - break; // Finished - - array.setRawData(buffer, n); - data(array); - array.resetRawData(buffer, n); - - processed+=n; - processedSize(processed); - } - - data(TQByteArray()); - close(fd); - - processedSize(buff.st_size); - finished(); - } - } - if(multiple) - ::unlink(realPathC); - } -} - -void CKioFonts::put(const KURL &u, int mode, bool overwrite, bool resume) -{ - KFI_DBUG << "put " << u.path() << endl; - - if(isHidden(u)) - { - error(TDEIO::ERR_WRITE_ACCESS_DENIED, u.prettyURL()); - return; - } - - // updateFontList(); // CPD: dont update font list upon a put - is too slow. Just stat on filename! - - //checkUrl(u) // CPD: Don't need to check URL, as the call to "confirmUrl()" below will sort out any probs! - - KURL url(u); - bool changed=confirmUrl(url), - nrs=nonRootSys(url); - EFolder destFolder(getFolder(url)); - TQString dest=itsFolders[destFolder].location+modifyName(url.fileName()), - passwd; - TQCString destC=TQFile::encodeName(dest); - KDE_struct_stat buffDest; - bool destExists=(KDE_lstat(destC.data(), &buffDest)!= -1); - - if (destExists && !overwrite && !resume) - { - error(TDEIO::ERR_FILE_ALREADY_EXIST, url.prettyURL()); - return; - } - - if(nrs) // Need to check can get root passwd before start download... - { - passwd=getRootPasswd(); - - if(passwd.isEmpty()) - { - error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS))); - return; - } - } - - // - // As we don't get passed a mime-type the following needs to happen: - // - // 1. Download to a temporary file - // 2. Check with FreeType that the file is a font, or that it is - // an AFM or PFM file - // 3. If its OK, then get the fonts "name" from - KTempFile tmpFile; - TQCString tmpFileC(TQFile::encodeName(tmpFile.name())); - - tmpFile.setAutoDelete(true); - - if(putReal(tmpFile.name(), tmpFileC, destExists, mode, resume)) - { - if(!checkFile(tmpFile.name())) // error logged in checkFile - return; - - if(nrs) // Ask root to copy the font... - { - TQCString cmd; - - if(!Misc::dExists(itsFolders[destFolder].location)) - { - cmd+="mkdir "; - cmd+=TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location)); - cmd+=" && chmod 0755 "; - cmd+=TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location)); - cmd+=" && "; - } - cmd+="cp -f "; - cmd+=TQFile::encodeName(TDEProcess::quote(tmpFileC)); - cmd+=" "; - cmd+=TQFile::encodeName(TDEProcess::quote(destC)); - cmd+=" && chmod 0644 "; - cmd+=destC; - - if(!itsCanStorePasswd) - createRootRefreshCmd(cmd); - - // Get root to move this to fonts folder... - if(doRootCmd(cmd, passwd)) - { - modified(FOLDER_SYS); - createAfm(dest, true, passwd); - } - else - { - error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS))); - return; - } - } - else // Move it to our font folder... - { - tmpFile.setAutoDelete(false); - if(Misc::doCmd("mv", "-f", tmpFileC, destC)) - { - ::chmod(destC.data(), Misc::FILE_PERMS); - modified(FOLDER_USER); - createAfm(dest); - } - else - { - error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_USER))); - return; - } - } - - finished(); - - if(changed) - itsLastDestTime=time(NULL); - } -} - -bool CKioFonts::putReal(const TQString &destOrig, const TQCString &destOrigC, bool origExists, - int mode, bool resume) -{ - bool markPartial=config()->readBoolEntry("MarkPartial", true); - TQString dest; - - if (markPartial) - { - TQString destPart(destOrig+TQString::fromLatin1(".part")); - TQCString destPartC(TQFile::encodeName(destPart)); - - dest = destPart; - - KDE_struct_stat buffPart; - bool partExists=(-1!=KDE_stat(destPartC.data(), &buffPart)); - - if (partExists && !resume && buffPart.st_size>0) - { - // Maybe we can use this partial file for resuming - // Tell about the size we have, and the app will tell us - // if it's ok to resume or not. - resume=canResume(buffPart.st_size); - - if (!resume) - if (!::remove(destPartC.data())) - partExists = false; - else - { - error(TDEIO::ERR_CANNOT_DELETE_PARTIAL, destPart); - return false; - } - } - } - else - { - dest = destOrig; - if (origExists && !resume) - ::remove(destOrigC.data()); - // Catch errors when we try to open the file. - } - - TQCString destC(TQFile::encodeName(dest)); - - int fd; - - if (resume) - { - fd = KDE_open(destC.data(), O_RDWR); // append if resuming - KDE_lseek(fd, 0, SEEK_END); // Seek to end - } - else - { - // WABA: Make sure that we keep writing permissions ourselves, - // otherwise we can be in for a surprise on NFS. - fd = KDE_open(destC.data(), O_CREAT | O_TRUNC | O_WRONLY, -1==mode ? 0666 : mode | S_IWUSR | S_IRUSR); - } - - if (fd < 0) - { - error(EACCES==errno ? TDEIO::ERR_WRITE_ACCESS_DENIED : TDEIO::ERR_CANNOT_OPEN_FOR_WRITING, dest); - return false; - } - - int result; - // Loop until we got 0 (end of data) - do - { - TQByteArray buffer; - - dataReq(); // Request for data - result = readData(buffer); - if(result > 0 && !writeAll(fd, buffer.data(), buffer.size())) - { - if(ENOSPC==errno) // disk full - { - error(TDEIO::ERR_DISK_FULL, destOrig); - result = -2; // means: remove dest file - } - else - { - error(TDEIO::ERR_COULD_NOT_WRITE, destOrig); - result = -1; - } - } - } - while(result>0); - - if (result<0) - { - close(fd); - if (-1==result) - ::remove(destC.data()); - else if (markPartial) - { - KDE_struct_stat buff; - - if ((-1==KDE_stat(destC.data(), &buff)) || - (buff.st_sizereadNumEntry("MinimumKeepSize", DEFAULT_MINIMUM_KEEP_SIZE))) - ::remove(destC.data()); - } - ::exit(255); - } - - if (-1==fd) // we got nothing to write out, so we never opened the file - { - finished(); - return false; - } - - if (close(fd)) - { - error(TDEIO::ERR_COULD_NOT_WRITE, destOrig); - return false; - } - - // after full download rename the file back to original name - if (markPartial && ::rename(destC.data(), destOrigC.data())) - { - error(TDEIO::ERR_CANNOT_RENAME_PARTIAL, destOrig); - return false; - } - - return true; -} - -void CKioFonts::copy(const KURL &src, const KURL &d, int mode, bool overwrite) -{ - // - // Support: - // Copying to fonts:/ - // Copying from fonts:/ and file:/ - // - KFI_DBUG << "copy " << src.prettyURL() << " - " << d.prettyURL() << endl; - - if(isHidden(d)) - { - error(TDEIO::ERR_WRITE_ACCESS_DENIED, d.prettyURL()); - return; - } - - bool fromFonts=KFI_KIO_FONTS_PROTOCOL==src.protocol(); - - if((!fromFonts || updateFontList()) // CPD: dont update font list upon a copy from file - is too slow. Just stat on filename! - && checkUrl(src) && checkAllowed(src)) - { - //checkUrl(u) // CPD as per comment in ::put() - - TQStringList srcFiles; - - if(getSourceFiles(src, srcFiles)) // Any error will be logged in getSourceFiles - { - KURL dest(d); - bool changed=confirmUrl(dest); - EFolder destFolder(getFolder(dest)); - TQMap map; - - if(!fromFonts) - map[src.path()]=src.fileName(); - - // As above, if copying from file, then only stat on dest filename, but if from fonts to fonts need to - // get the list of possible source files, etc. - if(fromFonts ? confirmMultiple(src, srcFiles, FOLDER_SYS==destFolder ? FOLDER_USER : FOLDER_SYS, OP_COPY) && - getFontList(srcFiles, map) && - checkDestFiles(src, map, dest, destFolder, overwrite) - : checkDestFile(src, dest, destFolder, overwrite) ) - { - if(nonRootSys(dest)) - { - TQCString cmd; - int size=0; - - if(!Misc::dExists(itsFolders[destFolder].location)) - { - cmd+="mkdir "; - cmd+=TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location)); - cmd+=" && chmod 0755 "; - cmd+=TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location)); - cmd+=" && "; - } - - TQMap::Iterator fIt(map.begin()), - fEnd(map.end()); - - for(; fIt!=fEnd; ++fIt) - { - cmd+="cp -f "; - cmd+=TQFile::encodeName(TDEProcess::quote(fIt.key())); - cmd+=" "; - cmd+=TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location+modifyName(fIt.data()))); - int s=getSize(TQFile::encodeName(fIt.key())); - if(s>0) - size+=s; - if(++fIt!=fEnd) - cmd+=" && "; - --fIt; - } - - if(!itsCanStorePasswd) - createRootRefreshCmd(cmd); - - totalSize(size); - - TQString passwd=getRootPasswd(); - - if(doRootCmd(cmd, passwd)) - { - modified(destFolder); - processedSize(size); - if(src.isLocalFile() && 1==srcFiles.count()) - createAfm(itsFolders[destFolder].location+modifyName(map.begin().data()), true, passwd); - } - else - { - error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS))); - return; - } - } - else - { - TQMap::Iterator fIt(map.begin()), - fEnd(map.end()); - - for(; fIt!=fEnd; ++fIt) - { - TQCString realSrc(TQFile::encodeName(fIt.key())), - realDest(TQFile::encodeName(itsFolders[destFolder].location+modifyName(fIt.data()))); - KDE_struct_stat buffSrc; - - if(-1==KDE_stat(realSrc.data(), &buffSrc)) - { - error(EACCES==errno ? TDEIO::ERR_ACCESS_DENIED : TDEIO::ERR_DOES_NOT_EXIST, src.prettyURL()); - return; - } - - int srcFd=KDE_open(realSrc.data(), O_RDONLY); - - if (srcFd<0) - { - error(TDEIO::ERR_CANNOT_OPEN_FOR_READING, src.prettyURL()); - return; - } - - if(!Misc::dExists(itsFolders[destFolder].location)) - Misc::createDir(itsFolders[destFolder].location); - - // WABA: Make sure that we keep writing permissions ourselves, - // otherwise we can be in for a surprise on NFS. - int destFd=KDE_open(realDest.data(), O_CREAT | O_TRUNC | O_WRONLY, -1==mode ? 0666 : mode | S_IWUSR); - - if (destFd<0) - { - error(EACCES==errno ? TDEIO::ERR_WRITE_ACCESS_DENIED : TDEIO::ERR_CANNOT_OPEN_FOR_WRITING, dest.prettyURL()); - close(srcFd); - return; - } - - totalSize(buffSrc.st_size); - - TDEIO::filesize_t processed = 0; - char buffer[MAX_IPC_SIZE]; - TQByteArray array; - - while(1) - { - int n=::read(srcFd, buffer, MAX_IPC_SIZE); - - if(-1==n) - { - if (errno == EINTR) - continue; - error(TDEIO::ERR_COULD_NOT_READ, src.prettyURL()); - close(srcFd); - close(destFd); - return; - } - if(0==n) - break; // Finished - - if(!writeAll(destFd, buffer, n)) - { - close(srcFd); - close(destFd); - if (ENOSPC==errno) // disk full - { - error(TDEIO::ERR_DISK_FULL, dest.prettyURL()); - remove(realDest.data()); - } - else - error(TDEIO::ERR_COULD_NOT_WRITE, dest.prettyURL()); - return; - } - - processed += n; - processedSize(processed); - } - - close(srcFd); - - if(close(destFd)) - { - error(TDEIO::ERR_COULD_NOT_WRITE, dest.prettyURL()); - return; - } - - ::chmod(realDest.data(), Misc::FILE_PERMS); - - // copy access and modification time - struct utimbuf ut; - - ut.actime = buffSrc.st_atime; - ut.modtime = buffSrc.st_mtime; - ::utime(realDest.data(), &ut); - - processedSize(buffSrc.st_size); - modified(destFolder); - } - - if(src.isLocalFile() && 1==srcFiles.count()) - createAfm(itsFolders[destFolder].location+modifyName(map.begin().data())); - } - - finished(); - - if(changed) - itsLastDestTime=time(NULL); - } - } - } -} - -void CKioFonts::rename(const KURL &src, const KURL &d, bool overwrite) -{ - KFI_DBUG << "rename " << src.prettyURL() << " - " << d.prettyURL() << ", " << overwrite << endl; - - if(src.directory()==d.directory()) - error(TDEIO::ERR_SLAVE_DEFINED, i18n("Sorry, fonts cannot be renamed.")); - else if(itsRoot) // Should never happen... - error(TDEIO::ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(mProtocol, TDEIO::CMD_RENAME)); - else - { - // - // Can't rename from/to file:/ -> therefore rename can only be from fonts:/System to fonts:/Personal, - // or vice versa. - - TQStringList srcFiles; - - if(getSourceFiles(src, srcFiles)) // Any error will be logged in getSourceFiles - { - KURL dest(d); - bool changed=confirmUrl(dest); - EFolder destFolder(getFolder(dest)); - TQMap map; - - if(confirmMultiple(src, srcFiles, FOLDER_SYS==destFolder ? FOLDER_USER : FOLDER_SYS, OP_MOVE) && - getFontList(srcFiles, map) && - checkDestFiles(src, map, dest, destFolder, overwrite)) - { - TQMap::Iterator fIt(map.begin()), - fEnd(map.end()); - bool askPasswd=true, - toSys=FOLDER_SYS==destFolder; - TQCString userId, - groupId, - destDir(TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location))); - - userId.setNum(toSys ? 0 : getuid()); - groupId.setNum(toSys ? 0 : getgid()); - - for(; fIt!=fEnd; ++fIt) - { - TQCString cmd, - destFile(TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location+fIt.data()))); - - if(toSys && !Misc::dExists(itsFolders[destFolder].location)) - { - cmd+="mkdir "; - cmd+=destDir; - cmd+=" && "; - } - - cmd+="mv -f "; - cmd+=TQFile::encodeName(TDEProcess::quote(fIt.key())); - cmd+=" "; - cmd+=destFile; - cmd+=" && chmod -f 0644 "; - cmd+=destFile; - cmd+=" && chown -f "; - cmd+=userId; - cmd+=":"; - cmd+=groupId; - cmd+=" "; - cmd+=destFile; - - TQString sysDir, - userDir; - - if(FOLDER_SYS==destFolder) - { - sysDir=itsFolders[destFolder].location; - userDir=Misc::getDir(fIt.key()); - } - else - { - userDir=itsFolders[destFolder].location; - sysDir=Misc::getDir(fIt.key()); - } - - if(!itsCanStorePasswd) - createRootRefreshCmd(cmd, sysDir); - - if(doRootCmd(cmd, askPasswd)) - { - modified(FOLDER_SYS, true, sysDir); - modified(FOLDER_USER, true, userDir); - askPasswd=false; // Don't keep on asking for password... - } - else - { - error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS))); - return; - } - } - if(changed) - itsLastDestTime=time(NULL); - } - } - } -} - -void CKioFonts::del(const KURL &url, bool) -{ - KFI_DBUG << "del " << url.path() << endl; - - TQValueList *entries; - - if(checkUrl(url) && checkAllowed(url) && - updateFontList() && (entries=getEntries(url)) && entries->count() && - confirmMultiple(url, entries, getFolder(url), OP_DELETE)) - { - TQValueList::Iterator it, - end=entries->end(); - CDirList modifiedDirs; - bool clearList=KFI_KIO_NO_CLEAR!=url.query(); - - if(nonRootSys(url)) - { - TQCString cmd("rm -f"); - - for(it=entries->begin(); it!=end; ++it) - { - TQString file(CFcEngine::getFcString(*it, FC_FILE)); - - modifiedDirs.add(Misc::getDir(file)); - cmd+=" "; - cmd+=TQFile::encodeName(TDEProcess::quote(file)); - - KURL::List urls; - - Misc::getAssociatedUrls(KURL(file), urls); - - if(urls.count()) - { - KURL::List::Iterator uIt, - uEnd=urls.end(); - - for(uIt=urls.begin(); uIt!=uEnd; ++uIt) - { - cmd+=" "; - cmd+=TQFile::encodeName(TDEProcess::quote((*uIt).path())); - } - } - } - - if(!itsCanStorePasswd) - createRootRefreshCmd(cmd, modifiedDirs); - - if(doRootCmd(cmd)) - modified(FOLDER_SYS, clearList, modifiedDirs); - else - error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS))); - } - else - { - for(it=entries->begin(); it!=end; ++it) - { - TQString file(CFcEngine::getFcString(*it, FC_FILE)); - - if (0!=unlink(TQFile::encodeName(file).data())) - error(EACCES==errno || EPERM==errno - ? TDEIO::ERR_ACCESS_DENIED - : EISDIR==errno - ? TDEIO::ERR_IS_DIRECTORY - : TDEIO::ERR_CANNOT_DELETE, - file); - else - { - modifiedDirs.add(Misc::getDir(file)); - - KURL::List urls; - - Misc::getAssociatedUrls(KURL(file), urls); - - if(urls.count()) - { - KURL::List::Iterator uIt, - uEnd=urls.end(); - - for(uIt=urls.begin(); uIt!=uEnd; ++uIt) - unlink(TQFile::encodeName((*uIt).path()).data()); - } - } - } - modified(itsRoot ? FOLDER_SYS : FOLDER_USER, clearList, modifiedDirs); - } - finished(); - } -} - -void CKioFonts::modified(EFolder folder, bool clearList, const CDirList &dirs) -{ - KFI_DBUG << "modified(" << (int)folder << ")\n"; - - if(FOLDER_SYS!=folder || itsCanStorePasswd || itsRoot) - { - if(dirs.count()) - { - CDirList::ConstIterator it(dirs.begin()), - end(dirs.end()); - - for(; it!=end; ++it) - itsFolders[folder].modified.add(*it); - } - else - itsFolders[folder].modified.add(itsFolders[folder].location); - - if(++itsFontChanges>MAX_NEW_FONTS) - { - setTimeoutSpecialCommand(0); // Cancel timer - doModified(); - } - else - setTimeoutSpecialCommand(TIMEOUT); - } - - if(FOLDER_SYS==folder && !itsRoot && !itsCanStorePasswd) - { - // If we modified sys, we're not root, and couldn't store the passwd, then kfontinst has already been called - // so no need to ask it to add folder to fontconfig and X's config files... - itsHasSys=true; - itsAddToSysFc=false; - } - if(clearList) - clearFontList(); // List of fonts has changed.../ -} - -void CKioFonts::special(const TQByteArray &a) -{ - KFI_DBUG << "special" << endl; - - if(a.size()) - { - TQDataStream stream(a, IO_ReadOnly); - int cmd; - - stream >> cmd; - - switch (cmd) - { - case SPECIAL_RESCAN: - clearFontList(); - updateFontList(); - finished(); - break; - case SPECIAL_RECONFIG: // Only itended to be called from kcmfontinst - when a user has re-enabled doX or doGs - if(itsRoot && !itsFolders[FOLDER_SYS].modified.contains(itsFolders[FOLDER_SYS].location)) - itsFolders[FOLDER_SYS].modified.add(itsFolders[FOLDER_SYS].location); - else if(!itsRoot && !itsFolders[FOLDER_USER].modified.contains(itsFolders[FOLDER_USER].location)) - itsFolders[FOLDER_USER].modified.add(itsFolders[FOLDER_USER].location); - - doModified(); - finished(); - break; - default: - error( TDEIO::ERR_UNSUPPORTED_ACTION, TQString::number(cmd)); - } - } - else - doModified(); -} - -void CKioFonts::createRootRefreshCmd(TQCString &cmd, const CDirList &dirs, bool reparseCfg) -{ - if(reparseCfg) - reparseConfig(); - - if(!cmd.isEmpty()) - cmd+=" && "; - - cmd+=FC_CACHE_CMD; - - if(dirs.count()) - { - CDirList::ConstIterator it(dirs.begin()), - end(dirs.end()); - - for(; it!=end; ++it) - { - TQCString tmpCmd; - - if(*it==itsFolders[FOLDER_SYS].location) - { - if(0!=itsNrsKfiParams[0]) - tmpCmd+=itsNrsKfiParams; - } - else - if(0!=itsNrsNonMainKfiParams[0]) - tmpCmd+=itsNrsNonMainKfiParams; - - if(!tmpCmd.isEmpty()) - { - cmd+=" && kfontinst "; - cmd+=tmpCmd; - cmd+=" "; - cmd+=TQFile::encodeName(TDEProcess::quote(*it)); - } - } - } - else if (0!=itsNrsKfiParams[0]) - { - cmd+=" && kfontinst "; - cmd+=itsNrsKfiParams; - cmd+=" "; - cmd+=TQFile::encodeName(TDEProcess::quote(itsFolders[FOLDER_SYS].location)); - } -} - -void CKioFonts::doModified() -{ - KFI_DBUG << "doModified" << endl; - - if(itsFolders[FOLDER_SYS].modified.count() || itsFolders[FOLDER_USER].modified.count()) - reparseConfig(); - - itsFontChanges=0; - if(itsFolders[FOLDER_SYS].modified.count()) - { - if(itsRoot) - { - Misc::doCmd(FC_CACHE_CMD); - KFI_DBUG << "RUN(root): " << FC_CACHE_CMD << endl; - - // - // If a non-default folder has been modified, always configure X - if(NULL==strchr(itsKfiParams, 'x') && - (itsFolders[FOLDER_SYS].modified.count()>1 || !itsFolders[FOLDER_SYS].modified.contains(itsFolders[FOLDER_SYS].location))) - { - if(0==itsKfiParams[0]) - strcpy(itsKfiParams, "-x"); - else - strcat(itsKfiParams, "x"); - } - - if(0!=itsKfiParams[0]) - { - CDirList::ConstIterator it(itsFolders[FOLDER_SYS].modified.begin()), - end(itsFolders[FOLDER_SYS].modified.end()); - - for(; it!=end; ++it) - { - Misc::doCmd("kfontinst", itsKfiParams, TQFile::encodeName(*it)); - KFI_DBUG << "RUN(root): kfontinst " << itsKfiParams << ' ' << *it << endl; - } - - if(itsFolders[FOLDER_SYS].modified.contains(itsFolders[FOLDER_SYS].location)) - { - itsHasSys=true; - itsAddToSysFc=false; - } - } - } - else - { - TQCString cmd; - - createRootRefreshCmd(cmd, itsFolders[FOLDER_SYS].modified, false); - if(doRootCmd(cmd, false) && itsFolders[FOLDER_SYS].modified.contains(itsFolders[FOLDER_SYS].location)) - { - itsHasSys=true; - itsAddToSysFc=false; - } - if(NULL==strstr(itsNrsKfiParams, "s")) - Misc::doCmd("xset", "fp", "rehash"); // doRootCmd can only refresh if xfs is being used, so try here anyway... - } - itsFolders[FOLDER_SYS].modified.clear(); - } - - if(!itsRoot && itsFolders[FOLDER_USER].modified.count()) - { - Misc::doCmd(FC_CACHE_CMD); - KFI_DBUG << "RUN(non-root): " << FC_CACHE_CMD << endl; - - if(0!=itsKfiParams[0]) - { - CDirList::ConstIterator it(itsFolders[FOLDER_USER].modified.begin()), - end(itsFolders[FOLDER_USER].modified.end()); - - for(; it!=end; ++it) - { - Misc::doCmd("kfontinst", itsKfiParams, TQFile::encodeName(*it)); - KFI_DBUG << "RUN(non-root): kfontinst " << itsKfiParams << ' ' << *it << endl; - } - } - itsFolders[FOLDER_USER].modified.clear(); - } - - KFI_DBUG << "finished ModifiedDirs" << endl; -} - -#define SYS_USER "root" -TQString CKioFonts::getRootPasswd(bool askPasswd) -{ - KFI_DBUG << "getRootPasswd" << endl; - TDEIO::AuthInfo authInfo; - SuProcess proc(SYS_USER); - bool error=false; - int attempts=0; - TQString errorMsg; - - authInfo.url=KURL(KFI_KIO_FONTS_PROTOCOL ":///"); - authInfo.username=SYS_USER; - authInfo.keepPassword=true; - - if(!checkCachedAuthentication(authInfo) && !askPasswd) - authInfo.password=itsPasswd; - - if(askPasswd) - while(!error && 0!=proc.checkInstall(authInfo.password.local8Bit())) - { - KFI_DBUG << "ATTEMPT : " << attempts << endl; - if(1==attempts) - errorMsg=i18n("Incorrect password.\n"); - if((!openPassDlg(authInfo, errorMsg) && attempts) || ++attempts>4 || SYS_USER!=authInfo.username) - error=true; - } - else - error=proc.checkInstall(authInfo.password.local8Bit()) ? true : false; - return error ? TQString::null : authInfo.password; -} - -bool CKioFonts::doRootCmd(const char *cmd, const TQString &passwd) -{ - KFI_DBUG << "doRootCmd " << cmd << endl; - - if(!passwd.isEmpty()) - { - SuProcess proc(SYS_USER); - - if(itsCanStorePasswd) - itsPasswd=passwd; - - KFI_DBUG << "Try to run command" << endl; - proc.setCommand(cmd); - return proc.exec(passwd.local8Bit()) ? false : true; - } - - return false; -} - -bool CKioFonts::confirmUrl(KURL &url) -{ - KFI_DBUG << "confirmUrl " << url.path() << endl; - if(!itsRoot) - { - TQString sect(getSect(url.path())); - - if(!isSysFolder(sect) && !isUserFolder(sect)) - { - bool changeToSystem=false; - - if(DEST_UNCHANGED!=itsLastDest && itsLastDestTime && (abs(time(NULL)-itsLastDestTime) < constMaxLastDestTime)) - changeToSystem=DEST_SYS==itsLastDest; - else - changeToSystem=KMessageBox::No==messageBox(QuestionYesNo, - i18n("Do you wish to install the font into \"%1\" (in which " - "case the font will only be usable by you), or \"%2\" (" - "the font will be usable by all users - but you will " - "need to know the administrator's password)?") - .arg(i18n(KFI_KIO_FONTS_USER)).arg(i18n(KFI_KIO_FONTS_SYS)), - i18n("Where to Install"), i18n(KFI_KIO_FONTS_USER), - i18n(KFI_KIO_FONTS_SYS)); - - if(changeToSystem) - { - itsLastDest=DEST_SYS; - url.setPath(TQChar('/')+i18n(KFI_KIO_FONTS_SYS)+TQChar('/')+url.fileName()); - } - else - { - itsLastDest=DEST_USER; - url.setPath(TQChar('/')+i18n(KFI_KIO_FONTS_USER)+TQChar('/')+url.fileName()); - } - - KFI_DBUG << "Changed URL to:" << url.path() << endl; - return true; - } - } - - return false; -} - -void CKioFonts::clearFontList() -{ - KFI_DBUG << "clearFontList" << endl; - - if(itsFontList) - FcFontSetDestroy(itsFontList); - - itsFontList=NULL; - itsFolders[FOLDER_SYS].fontMap.clear(); - itsFolders[FOLDER_USER].fontMap.clear(); -} - -bool CKioFonts::updateFontList() -{ - KFI_DBUG << "updateFontList" << endl; - - if(!itsFontList || !FcConfigUptoDate(0) || // For some reason just the "!FcConfigUptoDate(0)" check does not always work :-( - (abs(time(NULL)-itsLastFcCheckTime)>constMaxFcCheckTime)) - { - FcInitReinitialize(); - clearFontList(); - } - - if(!itsFontList) - { - KFI_DBUG << "updateFontList - update list of fonts " << endl; - - itsLastFcCheckTime=time(NULL); - - FcPattern *pat = FcPatternCreate(); - FcObjectSet *os = FcObjectSetBuild(FC_FILE, FC_FAMILY, FC_WEIGHT, FC_SCALABLE, -#ifdef KFI_FC_HAS_WIDTHS - FC_WIDTH, -#endif - FC_SLANT, (void*)0); - - itsFontList=FcFontList(0, pat, os); - - FcPatternDestroy(pat); - FcObjectSetDestroy(os); - - if (itsFontList) - { - TQString home(Misc::dirSyntax(TQDir::homeDirPath())); - - for (int i = 0; i < itsFontList->nfont; i++) - { - EFolder folder=FOLDER_SYS; - TQString file(Misc::fileSyntax(CFcEngine::getFcString(itsFontList->fonts[i], FC_FILE))); - - if(!file.isEmpty()) - { - if(!itsRoot && 0==file.find(home)) - folder=FOLDER_USER; - - TQValueList &patterns= - itsFolders[folder].fontMap[CFcEngine::createName(itsFontList->fonts[i])]; - bool use=true; - - if(patterns.count()) // Check for duplicates... - { - TQValueList::Iterator it, - end=patterns.end(); - - for(it=patterns.begin(); use && it!=end; ++it) - if(file==(Misc::fileSyntax(CFcEngine::getFcString(*it, FC_FILE)))) - use=false; - } - if(use) - patterns.append(itsFontList->fonts[i]); - } - } - } - } - - if(NULL==itsFontList) - { - error(TDEIO::ERR_SLAVE_DEFINED, i18n("Internal fontconfig error.")); - return false; - } - - return true; -} - -CKioFonts::EFolder CKioFonts::getFolder(const KURL &url) -{ - return itsRoot || isSysFolder(getSect(url.path())) ? FOLDER_SYS : FOLDER_USER; -} - -TQMap >::Iterator CKioFonts::getMap(const KURL &url) -{ - EFolder folder(getFolder(url)); - TQMap >::Iterator it=itsFolders[folder].fontMap.find(removeMultipleExtension(url)); - - if(it==itsFolders[folder].fontMap.end()) // Perhaps it was fonts:/System/times.ttf ??? - { - FcPattern *pat=getEntry(folder, url.fileName(), false); - - if(pat) - it=itsFolders[folder].fontMap.find(CFcEngine::createName(pat)); - } - - return it; -} - -TQValueList * CKioFonts::getEntries(const KURL &url) -{ - TQMap >::Iterator it=getMap(url); - - if(it!=itsFolders[getFolder(url)].fontMap.end()) - return &(it.data()); - - error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\".").arg(url.prettyURL())); - return NULL; -} - -FcPattern * CKioFonts::getEntry(EFolder folder, const TQString &file, bool full) -{ - TQMap >::Iterator it, - end=itsFolders[folder].fontMap.end(); - - for(it=itsFolders[folder].fontMap.begin(); it!=end; ++it) - { - TQValueList::Iterator patIt, - patEnd=it.data().end(); - - for(patIt=it.data().begin(); patIt!=patEnd; ++patIt) - if( (full && CFcEngine::getFcString(*patIt, FC_FILE)==file) || - (!full && Misc::getFile(CFcEngine::getFcString(*patIt, FC_FILE))==file)) - return *patIt; - } - - return NULL; -} - -bool CKioFonts::checkFile(const TQString &file) -{ - TQCString cFile(TQFile::encodeName(file)); - - // - // To speed things up, check the files extension 1st... - if(checkExt(cFile, "ttf") || checkExt(cFile, "otf") || checkExt(cFile, "ttc") || checkExt(cFile, "pfa") || checkExt(cFile, "pfb") || - isAAfm(file) || isAPfm(file)) - return true; - - // - // No exension match, so try querying with FreeType... - int count=0; - FcPattern *pat=FcFreeTypeQuery((const FcChar8 *)(TQFile::encodeName(file).data()), 0, NULL, &count); - - if(pat) - { - FcPatternDestroy(pat); - return true; - } - - error(TDEIO::ERR_SLAVE_DEFINED, i18n("

Only fonts may be installed.

If installing a fonts package (*%1), then " - "extract the components, and install individually.

").arg(constMultipleExtension)); - return false; -} - -bool CKioFonts::getSourceFiles(const KURL &src, TQStringList &files) -{ - if(KFI_KIO_FONTS_PROTOCOL==src.protocol()) - { - TQValueList *entries=getEntries(src); - - if(entries && entries->count()) - { - TQValueList::Iterator it, - end=entries->end(); - - for(it=entries->begin(); it!=end; ++it) - files.append(CFcEngine::getFcString(*it, FC_FILE)); - } - - if(files.count()) - { - TQStringList::Iterator sIt, - sEnd=files.end(); - - for(sIt=files.begin(); sIt!=sEnd; ++sIt) - { - KURL::List urls; - - Misc::getAssociatedUrls(KURL(*sIt), urls); - - if(urls.count()) - { - KURL::List::Iterator uIt, - uEnd=urls.end(); - - for(uIt=urls.begin(); uIt!=uEnd; ++uIt) - if(-1==files.findIndex((*uIt).path())) - files.append((*uIt).path()); - } - } - } - } - else - if(src.isLocalFile()) - if(checkFile(src.path())) - files.append(src.path()); - else - return false; // error logged in checkFile... - - if(files.count()) - { - TQStringList::Iterator it, - end=files.end(); - - for(it=files.begin(); it!=end; ++it) - { - TQCString realSrc=TQFile::encodeName(*it); - KDE_struct_stat buffSrc; - - if (-1==KDE_stat(realSrc.data(), &buffSrc)) - { - error(EACCES==errno ? TDEIO::ERR_ACCESS_DENIED : TDEIO::ERR_DOES_NOT_EXIST, src.prettyURL()); - return false; - } - if(S_ISDIR(buffSrc.st_mode)) - { - error(TDEIO::ERR_IS_DIRECTORY, src.prettyURL()); - return false; - } - if(S_ISFIFO(buffSrc.st_mode) || S_ISSOCK(buffSrc.st_mode)) - { - error(TDEIO::ERR_CANNOT_OPEN_FOR_READING, src.prettyURL()); - return false; - } - } - } - else - { - error(TDEIO::ERR_DOES_NOT_EXIST, src.prettyURL()); - return false; - } - - return true; -} - -bool CKioFonts::checkDestFile(const KURL &src, const KURL &dest, EFolder destFolder, bool overwrite) -{ - if(!overwrite && (Misc::fExists(itsFolders[destFolder].location+src.fileName()) || - Misc::fExists(itsFolders[destFolder].location+modifyName(src.fileName())) ) ) - { - error(TDEIO::ERR_FILE_ALREADY_EXIST, dest.prettyURL()); - return false; - } - - return true; -} - -bool CKioFonts::checkDestFiles(const KURL &src, TQMap &map, const KURL &dest, EFolder destFolder, bool overwrite) -{ - // - // Check whether files exist at destination... - // - if(dest.protocol()==src.protocol() && - dest.directory()==src.directory()) // Check whether confirmUrl changed a "cp fonts:/System fonts:/" - // to "cp fonts:/System fonts:/System" - { - error(TDEIO::ERR_FILE_ALREADY_EXIST, dest.prettyURL()); - return false; - } - - if(!overwrite) - { - TQMap::Iterator fIt(map.begin()), - fEnd(map.end()); - - for(; fIt!=fEnd; ++fIt) - if(NULL!=getEntry(destFolder, fIt.data()) || NULL!=getEntry(destFolder, modifyName(fIt.data()))) - { - error(TDEIO::ERR_FILE_ALREADY_EXIST, dest.prettyURL()); - return false; - } - } - - return true; -} - -// -// Gather the number and names of the font faces located in "files". If there is more than 1 face -// (such as there would be for a TTC font), then ask the user for confirmation of the action. -bool CKioFonts::confirmMultiple(const KURL &url, const TQStringList &files, EFolder folder, EOp op) -{ - if(KFI_KIO_FONTS_PROTOCOL!=url.protocol()) - return true; - - TQStringList::ConstIterator it, - end=files.end(); - TQStringList fonts; - - for(it=files.begin(); it!=files.end(); ++it) - { - FcPattern *pat=getEntry(folder, *it, false); - - if(pat) - { - TQString name(CFcEngine::createName(pat)); - - if(-1==fonts.findIndex(name)) - fonts.append(name); - } - } - - if(fonts.count()>1) - { - TQString out; - TQStringList::Iterator it, - end=fonts.end(); - - for(it=fonts.begin(); it!=end; ++it) - out+=TQString("
  • ")+*it+TQString("
  • "); - - if(KMessageBox::No==messageBox(QuestionYesNo, - OP_MOVE==op - ? i18n("

    This font is located in a file alongside other fonts; in order " - "to proceed with the moving they will all have to be moved. " - "The other affected fonts are:

      %1

    \n Do you wish to " - "move all of these?

    ").arg(out) - : OP_COPY==op - ? i18n("

    This font is located in a file alongside other fonts; in order " - "to proceed with the copying they will all have to be copied. " - "The other affected fonts are:

      %1

    \n Do you wish to " - "copy all of these?

    ").arg(out) - : i18n("

    This font is located in a file alongside other fonts; in order " - "to proceed with the deleting they will all have to be deleted. " - "The other affected fonts are:

      %1

    \n Do you wish to " - "delete all of these?

    ").arg(out))) - { - error(TDEIO::ERR_USER_CANCELED, url.prettyURL()); - return false; - } - } - - return true; -} - -bool CKioFonts::confirmMultiple(const KURL &url, TQValueList *patterns, EFolder folder, EOp op) -{ - if(KFI_KIO_FONTS_PROTOCOL!=url.protocol()) - return true; - - TQStringList files; - - if(patterns && patterns->count()) - { - TQValueList::Iterator it, - end=patterns->end(); - - for(it=patterns->begin(); it!=end; ++it) - files.append(CFcEngine::getFcString(*it, FC_FILE)); - } - - return confirmMultiple(url, files, folder, op); -} - -bool CKioFonts::checkUrl(const KURL &u, bool rootOk) -{ - if(KFI_KIO_FONTS_PROTOCOL==u.protocol() && (!rootOk || (rootOk && "/"!=u.path()))) - { - TQString sect(getSect(u.path())); - - if(itsRoot) - { - if((isSysFolder(sect) || isUserFolder(sect)) && - (itsFolders[FOLDER_SYS].fontMap.end()==itsFolders[FOLDER_SYS].fontMap.find(sect))) -//CPD: TODO: || it has a font specified! e.g. fonts:/System/Times -> even in have a fonts:/System font, redirect -//should still happen - { - redirection(getRedirect(u)); - finished(); - return false; - } - } - else - if(!isSysFolder(sect) && !isUserFolder(sect)) - { - error(TDEIO::ERR_SLAVE_DEFINED, i18n("Please specify \"%1\" or \"%2\".") - .arg(i18n(KFI_KIO_FONTS_USER)).arg(i18n(KFI_KIO_FONTS_SYS))); - return false; - } - } - - return true; -} - -bool CKioFonts::checkAllowed(const KURL &u) -{ - if (KFI_KIO_FONTS_PROTOCOL==u.protocol()) - { - TQString ds(Misc::dirSyntax(u.path())); - - if(ds==TQString(TQChar('/')+i18n(KFI_KIO_FONTS_USER)+TQChar('/')) || - ds==TQString(TQChar('/')+i18n(KFI_KIO_FONTS_SYS)+TQChar('/')) || - ds==TQString(TQChar('/')+TQString::fromLatin1(KFI_KIO_FONTS_USER)+TQChar('/')) || - ds==TQString(TQChar('/')+TQString::fromLatin1(KFI_KIO_FONTS_SYS)+TQChar('/'))) - { - error(TDEIO::ERR_SLAVE_DEFINED, i18n("Sorry, you cannot rename, move, copy, or delete either \"%1\" or \"%2\".") - .arg(i18n(KFI_KIO_FONTS_USER)).arg(i18n(KFI_KIO_FONTS_SYS))); \ - return false; - } - } - - return true; -} - -// -// Create an AFM from a Type 1 (pfa/pfb) font and its PFM file... -void CKioFonts::createAfm(const TQString &file, bool nrs, const TQString &passwd) -{ - if(nrs && passwd.isEmpty()) - return; - - bool type1=isAType1(file), - pfm=!type1 && isAPfm(file); // No point checking if is pfm if its a type1 - - if(type1 || pfm) - { - TQString afm=getMatch(file, "afm"); // pf2afm wants files with lowercase extension, so just check for lowercase! - // -- when a font is installed, the extensio is converted to lowercase anyway... - - if(afm.isEmpty()) // No point creating if AFM already exists! - { - TQString pfm, - t1; - - if(type1) // Its a Type1, so look for existing PFM - { - pfm=getMatch(file, "pfm"); - t1=file; - } - else // Its a PFM, so look for existing Type1 - { - t1=getMatch(file, "pfa"); - if(t1.isEmpty()) - t1=getMatch(file, "pfb"); - pfm=file; - } - - if(!t1.isEmpty() && !pfm.isEmpty()) // Do we have both Type1 and PFM? - { - TQString name(t1.left(t1.length()-4)); // pf2afm wants name without extension... - - if(nrs) - { - TQCString cmd("pf2afm "); - cmd+=TQFile::encodeName(TDEProcess::quote(name)); - doRootCmd(cmd, passwd); - } - else - Misc::doCmd("pf2afm", TQFile::encodeName(name)); - } - } - } -} - -void CKioFonts::reparseConfig() -{ - KFI_DBUG << "reparseConfig" << endl; - - itsKfiParams[0]=0; - if(!itsRoot) - { - itsNrsKfiParams[0]=0; - itsNrsNonMainKfiParams[0]=0; - } - - if(itsRoot) - { - TDEConfig cfg(KFI_ROOT_CFG_FILE); - bool doX=cfg.readBoolEntry(KFI_CFG_X_KEY, KFI_DEFAULT_CFG_X), - doGs=cfg.readBoolEntry(KFI_CFG_GS_KEY, KFI_DEFAULT_CFG_GS); - - if(doX || !doGs) - { - strcpy(itsKfiParams, doGs ? "-g" : "-"); - if(doX) - { - if(!itsUsingXfsFpe) - strcat(itsKfiParams, "r"); - - if(!itsUsingFcFpe) - { - strcat(itsKfiParams, itsUsingXfsFpe ? "sx" : "x"); - if(!itsHasSys) - strcat(itsKfiParams, "a"); - } - } - } - } - else - { - TDEConfig rootCfg(KFI_ROOT_CFG_FILE); - bool rootDoX=rootCfg.readBoolEntry(KFI_CFG_X_KEY, KFI_DEFAULT_CFG_X), - rootDoGs=rootCfg.readBoolEntry(KFI_CFG_GS_KEY, KFI_DEFAULT_CFG_GS); - - strcpy(itsNrsKfiParams, "-"); - - if(rootDoX || rootDoGs) - { - strcpy(itsNrsKfiParams, "-"); - strcpy(itsNrsNonMainKfiParams, "-"); - - if(rootDoGs) - { - strcpy(itsNrsKfiParams, "g"); - strcpy(itsNrsNonMainKfiParams, "g"); - } - - if(rootDoX && !itsUsingFcFpe) - { - strcat(itsNrsKfiParams, itsUsingXfsFpe ? "sx" : "x"); // Can't get root to refresh X, only xfs! - strcat(itsNrsNonMainKfiParams, itsUsingXfsFpe ? "sx" : "x"); - if(!itsHasSys) - strcat(itsNrsKfiParams, "a"); - } - if(0==itsNrsNonMainKfiParams[1]) - itsNrsNonMainKfiParams[0]=0; - } - - if(itsAddToSysFc) - strcpy(itsNrsKfiParams, "f"); - - if(0==itsNrsKfiParams[1]) - itsNrsKfiParams[0]=0; - - TDEConfig cfg(KFI_CFG_FILE); - bool doX=cfg.readBoolEntry(KFI_CFG_X_KEY, KFI_DEFAULT_CFG_X), - doGs=cfg.readBoolEntry(KFI_CFG_GS_KEY, KFI_DEFAULT_CFG_GS); - - strcpy(itsKfiParams, doGs ? "-g" : "-"); - - if(doX) - strcat(itsKfiParams, itsUsingFcFpe ? "r" : "rx"); - } - - if(0==itsKfiParams[1]) - itsKfiParams[0]=0; -} - -} diff --git a/kcontrol/kfontinst/kio/KioFonts.h b/kcontrol/kfontinst/kio/KioFonts.h deleted file mode 100644 index ec8c69c4e..000000000 --- a/kcontrol/kfontinst/kio/KioFonts.h +++ /dev/null @@ -1,161 +0,0 @@ -#ifndef __KIO_FONTS_H__ -#define __KIO_FONTS_H__ - -//////////////////////////////////////////////////////////////////////////////// -// -// Class Name : KFI::CKioFonts -// Author : Craig Drummond -// Project : K Font Installer -// Creation Date : 05/03/2003 -// Version : $Revision$ $Date$ -// -//////////////////////////////////////////////////////////////////////////////// -// -// 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. -// -// 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. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -// -//////////////////////////////////////////////////////////////////////////////// -// (C) Craig Drummond, 2003, 2004 -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Misc.h" -#include "KfiConstants.h" - -namespace KFI -{ - -class CKioFonts : public TDEIO::SlaveBase -{ - private: - - enum EConstants - { - KFI_PARAMS = 8 - }; - - enum EDest - { - DEST_UNCHANGED, - DEST_SYS, - DEST_USER - }; - - enum EFolder - { - FOLDER_SYS, - FOLDER_USER, - - FOLDER_COUNT - }; - - enum EOp - { - OP_COPY, - OP_MOVE, - OP_DELETE - }; - - class CDirList : public TQStringList - { - public: - - CDirList() { } - CDirList(const TQString &str) : TQStringList(str) { } - - void add(const TQString &d) { if ( contains(d)) append(d); } - }; - - struct TFolder - { - TQString location; - CDirList modified; - TQMap > fontMap; // Maps from "Times New Roman" -> $HOME/.fonts/times.ttf - }; - - public: - - CKioFonts(const TQCString &pool, const TQCString &app); - virtual ~CKioFonts(); - - static TQString getSect(const TQString &f) { return f.section('/', 1, 1); } - - void listDir(const KURL &url); - void stat(const KURL &url); - bool createStatEntry(TDEIO::UDSEntry &entry, const KURL &url, EFolder folder); - void get(const KURL &url); - void put(const KURL &url, int mode, bool overwrite, bool resume); - void copy(const KURL &src, const KURL &dest, int mode, bool overwrite); - void rename(const KURL &src, const KURL &dest, bool overwrite); - void del(const KURL &url, bool isFile); - - private: - - bool putReal(const TQString &destOrig, const TQCString &destOrigC, bool origExists, int mode, bool resume); - void modified(EFolder folder, bool clearList=true, const CDirList &dirs=CDirList()); - void special(const TQByteArray &a); - void createRootRefreshCmd(TQCString &cmd, const CDirList &dirs=CDirList(), bool reparseCfg=true); - void doModified(); - TQString getRootPasswd(bool askPasswd=true); - bool doRootCmd(const char *cmd, const TQString &passwd); - bool doRootCmd(const char *cmd, bool askPasswd=true) { return doRootCmd(cmd, getRootPasswd(askPasswd)); } - bool confirmUrl(KURL &url); - void clearFontList(); - bool updateFontList(); - EFolder getFolder(const KURL &url); - TQMap >::Iterator getMap(const KURL &url); - TQValueList * getEntries(const KURL &url); - FcPattern * getEntry(EFolder folder, const TQString &file, bool full=false); - bool checkFile(const TQString &file); - bool getSourceFiles(const KURL &src, TQStringList &files); - bool checkDestFile(const KURL &src, const KURL &dest, EFolder destFolder, bool overwrite); - bool checkDestFiles(const KURL &src, TQMap &map, const KURL &dest, EFolder destFolder, bool overwrite); - bool confirmMultiple(const KURL &url, const TQStringList &files, EFolder folder, EOp op); - bool confirmMultiple(const KURL &url, TQValueList *patterns, EFolder folder, EOp op); - bool checkUrl(const KURL &u, bool rootOk=false); - bool checkAllowed(const KURL &u); - void createAfm(const TQString &file, bool nrs=false, const TQString &passwd=TQString::null); - void reparseConfig(); - - private: - - bool itsRoot, - itsCanStorePasswd, - itsUsingFcFpe, - itsUsingXfsFpe, - itsHasSys, - itsAddToSysFc; - TQString itsPasswd; - unsigned int itsFontChanges; - EDest itsLastDest; - time_t itsLastDestTime, - itsLastFcCheckTime; - FcFontSet *itsFontList; - TFolder itsFolders[FOLDER_COUNT]; - char itsNrsKfiParams[KFI_PARAMS], - itsNrsNonMainKfiParams[KFI_PARAMS], - itsKfiParams[KFI_PARAMS]; -}; - -} - -#endif diff --git a/kcontrol/kfontinst/kio/Makefile.am b/kcontrol/kfontinst/kio/Makefile.am deleted file mode 100644 index ca22d13bd..000000000 --- a/kcontrol/kfontinst/kio/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -kde_module_LTLIBRARIES = kio_fonts.la -kio_fonts_la_SOURCES = \ -KioFonts.cpp - -kio_fonts_la_LIBADD = ../../fonts/libkxftconfig.la $(LIBFONTCONFIG_LIBS) $(LIBFREETYPE_LIBS) $(LIB_KIO) -ltdesu ../lib/libkfontinst.la -kio_fonts_la_LDFLAGS = $(KDE_PLUGIN) $(all_libraries) $(KDE_RPATH) $(LIBFONTCONFIG_RPATH) $(LIBFREETYPE_RPATH) -module -avoid-version -no-undefined -AM_CPPFLAGS= -I$(srcdir)/../lib -I$(srcdir)/../../fonts $(all_includes) $(LIBFREETYPE_CFLAGS) $(LIBFONTCONFIG_CFLAGS) -D_LARGEFILE64_SOURCE - -# The kxftconfig stuf really belongs to tdebase/kcontrol/fonts - here only so that can distribute this as an archive. -noinst_HEADERS = \ -KioFonts.h - -servicesdir = $(kde_servicesdir) -services_DATA = fonts.protocol - -vfsdata_DATA = fonts.desktop -vfsdatadir = $(kde_datadir)/konqsidebartng/virtual_folders/services - -mimetype_DATA = folder.desktop system-folder.desktop package.desktop -mimetypedir = $(kde_mimedir)/fonts diff --git a/kcontrol/kfontinst/kio/folder.desktop b/kcontrol/kfontinst/kio/folder.desktop deleted file mode 100644 index 848feabe5..000000000 --- a/kcontrol/kfontinst/kio/folder.desktop +++ /dev/null @@ -1,80 +0,0 @@ -[Desktop Entry] -Comment=Fonts Folder -Comment[af]=Skrif tipe Gids -Comment[ar]=مجلد المحارف -Comment[be]=Тэчка шрыфтоў -Comment[bg]=Директория за шрифтове -Comment[bn]=ফন্ট ফোল্ডার -Comment[br]=Renkell ar fontoù -Comment[bs]=Direktorij sa fontovima -Comment[ca]=Carpeta de lletres -Comment[cs]=Složka písem -Comment[csb]=Katalog fòntów -Comment[da]=Skrifttypemappe -Comment[de]=Ordner für Schriftarten -Comment[el]=Φάκελος γραμματοσειρών -Comment[eo]=Tipardosierujo -Comment[es]=Carpeta de tipos de letra -Comment[et]=Fontide kataloog -Comment[eu]=Letra-tipoen karpeta -Comment[fa]=پوشۀ قلم -Comment[fi]=Kirjasinkansio -Comment[fr]=Dossier de polices de caractères -Comment[fy]=Lettertypenmap -Comment[ga]=Fillteán na gClónna -Comment[gl]=Cartafol das Fontes -Comment[he]=תיקיית גופנים -Comment[hi]=फ़ॉन्ट्स फ़ोल्डर -Comment[hr]=Mapa fontova -Comment[hu]=Betűtípuskönyvtár -Comment[id]=Folder Fonts -Comment[is]=Leturmappa -Comment[it]=Cartella dei caratteri -Comment[ja]=フォントフォルダ -Comment[ka]=ფონტების საქაღალდე -Comment[kk]=Қаріп қапшығы -Comment[km]=ថត​ពុម្ពអក្សរ -Comment[ko]=홈 폴더 -Comment[lt]=Šriftų aplankas -Comment[lv]=Fontu mape -Comment[mk]=Папка со фонтови -Comment[ms]=Folder Fon -Comment[mt]=Direttorju tal-fonts -Comment[nb]=Mappe for skrifttyper -Comment[nds]=Schriftoorden-Orner -Comment[ne]=फन्ट फोल्डर -Comment[nl]=Lettertypenmap -Comment[nn]=Skriftmappe -Comment[pa]=ਫੋਂਟ ਫੋਲਡਰ -Comment[pl]=Katalog czcionek -Comment[pt]=Pasta de Tipos de Letra -Comment[pt_BR]=Pasta de Fontes -Comment[ro]=Folder de fonturi -Comment[ru]=Папка шрифтов -Comment[rw]=Ububiko bw'Imyandikire -Comment[se]=Fontamáhppa -Comment[sk]=Priečinok písiem -Comment[sl]=Mapa za pisave -Comment[sr]=Фасцикла за фонтове -Comment[sr@Latn]=Fascikla za fontove -Comment[sv]=Teckensnittskatalog -Comment[ta]=எழுத்துருக்கள் அடைவு -Comment[tg]=Феҳристи ҳарфҳо -Comment[th]=โฟลเดอร์แฟ้มแบบอักษร -Comment[tr]=Yazıtipi Klasörü -Comment[tt]=Yazu lar Törgäge -Comment[uk]=Тека шрифтів -Comment[uz]=Shriftlarning jildi -Comment[uz@cyrillic]=Шрифтларнинг жилди -Comment[vi]=Thư mục Phông chữ -Comment[wa]=Ridant di fontes -Comment[zh_CN]=字体文件夹 -Comment[zh_TW]=字型資料夾 -Icon=folder -Type=MimeType -MimeType=fonts/folder -Patterns= - -X-TDE-AutoEmbed=true -X-TDE-IsAlso=inode/directory - diff --git a/kcontrol/kfontinst/kio/fonts.desktop b/kcontrol/kfontinst/kio/fonts.desktop deleted file mode 100644 index ac0f592cf..000000000 --- a/kcontrol/kfontinst/kio/fonts.desktop +++ /dev/null @@ -1,85 +0,0 @@ -[Desktop Entry] -Type=Link -URL=fonts:/ -Icon=fonts -Name=Fonts -Name[af]=Skriftipes -Name[ar]=المحارف -Name[az]=Yazı növləri -Name[be]=Шрыфты -Name[bg]=Шрифтове -Name[bn]=ফন্ট -Name[br]=Fontoù -Name[bs]=Fontovi -Name[ca]=Lletres -Name[cs]=Písma -Name[csb]=Fòntë -Name[cy]=Ffontiau -Name[da]=Skrifttyper -Name[de]=Schriftarten -Name[el]=Γραμματοσειρές -Name[eo]=Tiparoj -Name[es]=Tipos de letra -Name[et]=Fondid -Name[eu]=Letra-tipoak -Name[fa]=قلمها -Name[fi]=Kirjasimet -Name[fr]=Polices -Name[fy]=Lettertypen -Name[ga]=Clónna -Name[gl]=Fontes -Name[he]=גופנים -Name[hi]=फ़ॉन्ट्स -Name[hr]=Fontovi -Name[hu]=Betűtípusok -Name[is]=Letur -Name[it]=Tipi di carattere -Name[ja]=フォント -Name[ka]=ფონტები -Name[kk]=Қаріптер -Name[km]=ពុម្ពអក្សរ -Name[ko]=글꼴 -Name[lo]=ຮູບແບບຕົວອັກສອນ -Name[lt]=Šriftai -Name[lv]=Fonti -Name[mk]=Фонтови -Name[mn]=Бичгүүд -Name[ms]=Fon -Name[nb]=Skrifttype -Name[nds]=Schriftoorden -Name[ne]=फन्ट -Name[nl]=Lettertypen -Name[nn]=Skrifttypar -Name[nso]=Difonto -Name[pa]=ਫੋਂਟ -Name[pl]=Czcionki -Name[pt]=Tipos de Letra -Name[pt_BR]=Fontes -Name[ro]=Fonturi -Name[ru]=Шрифты -Name[rw]=Imyandikire -Name[se]=Fonttat -Name[sk]=Písma -Name[sl]=Pisave -Name[sr]=Фонтови -Name[sr@Latn]=Fontovi -Name[ss]=Timo tetinhlamvu temagama -Name[sv]=Teckensnitt -Name[ta]=எழுத்துருக்கள் -Name[tg]=Ҳарфҳо -Name[th]=แบบอักษร -Name[tr]=Yazıtipleri -Name[tt]=Yazu -Name[uk]=Шрифти -Name[uz]=Shriftlar -Name[uz@cyrillic]=Шрифтлар -Name[ven]=Fontu -Name[vi]=Phông chữ -Name[wa]=Fontes -Name[xh]=Uhlobo lwamagama -Name[zh_CN]=字体 -Name[zh_TW]=字型 -Name[zu]=Izinhlobo zamagama -Open=false -X-TDE-TreeModule=Directory -X-TDE-KonqSidebarModule=konqsidebar_tree diff --git a/kcontrol/kfontinst/kio/fonts.protocol b/kcontrol/kfontinst/kio/fonts.protocol deleted file mode 100644 index 7f54dd0cc..000000000 --- a/kcontrol/kfontinst/kio/fonts.protocol +++ /dev/null @@ -1,18 +0,0 @@ -[Protocol] -exec=kio_fonts -protocol=fonts -input=none -output=filesystem -listing=Name,Type,Size,Date,AccessDate,Access,Owner,Group,Link -reading=true -writing=true -makedir=false -deleting=true -moving=true -linking=false -copyToFile=false -copyFromFile=true -Icon=fonts -defaultMimetype=application/octet-stream -maxInstances=1 -Class=:local diff --git a/kcontrol/kfontinst/kio/package.desktop b/kcontrol/kfontinst/kio/package.desktop deleted file mode 100644 index 2d2e1e4af..000000000 --- a/kcontrol/kfontinst/kio/package.desktop +++ /dev/null @@ -1,74 +0,0 @@ -[Desktop Entry] -Type=MimeType -MimeType=fonts/package -Icon=font -Patterns=*.fonts.tar.gz -Comment=Fonts Package -Comment[af]=Skriftipes Paket -Comment[ar]=حزمة المحارف -Comment[be]=Пакет шрыфтоў -Comment[bg]=Пакет с шрифтове -Comment[bn]=ফন্ট প্যাকেজ -Comment[bs]=Paket fontova -Comment[ca]=Paquet de lletres -Comment[cs]=Balík písem -Comment[csb]=Paczét fòntów -Comment[da]=Skrifttypepakke -Comment[de]=Schriftartenpaket -Comment[el]=Πακέτο γραμματοσειρών -Comment[eo]=Tiparpakaĵo -Comment[es]=Paquete de tipos de letra -Comment[et]=Fondipakett -Comment[eu]=Letra-tipoen paketea -Comment[fa]=بستۀ قلمها -Comment[fi]=Kirjasinpaketti -Comment[fr]=Paquet de polices -Comment[fy]=Lettertypenpakket -Comment[ga]=Pacáiste na gClónna -Comment[gl]=Pacote das Fontes -Comment[he]=חבילת גופנים -Comment[hr]=Paket fontova -Comment[hu]=Betűtípuscsomag -Comment[id]=Paket Font -Comment[is]=Leturpakki -Comment[it]=Pacchetto tipi di caratteri -Comment[ja]=フォントパッケージ -Comment[ka]=შრიფტების პაკეტი -Comment[kk]=Қаріп дестесі -Comment[km]=កញ្ចប់​ពុម្ពអក្សរ -Comment[lt]=Šriftų paketas -Comment[mk]=Пакет со фонтови -Comment[ms]=Pakej Fon -Comment[nb]=Pakke for skrifttyper -Comment[nds]=Schriftoorden-Paket -Comment[ne]=फन्ट प्याकेज -Comment[nl]=Lettertypenpakket -Comment[nn]=Pakke for skrifter -Comment[pa]=ਫੋਂਟ ਪੈਕੇਜ -Comment[pl]=Pakiet czcionek -Comment[pt]=Pacote de Tipos de Letra -Comment[pt_BR]=Pacote de Fontes -Comment[ro]=Pachet de fonturi -Comment[ru]=Пакет шрифтов -Comment[rw]=Rukomatanya y'Imyandikire -Comment[se]=Fontapáhkka -Comment[sk]=Balík písiem -Comment[sl]=Paket pisav -Comment[sr]=Пакет фонтова -Comment[sr@Latn]=Paket fontova -Comment[sv]=Teckensnittspaket -Comment[tg]=Бастаи ҳарфҳо -Comment[th]=แพคเกจแบบอักษร -Comment[tr]=Yazıtipi Paketi -Comment[tt]=Yazular Tuplaması -Comment[uk]=Пакунок шрифтів -Comment[uz]=Shrift -Comment[uz@cyrillic]=Шрифт -Comment[vi]=Gói Phông chữ -Comment[wa]=Paket di fontes -Comment[zh_CN]=字体包 -Comment[zh_TW]=字型套件 - -[Property::X-TDE-LocalProtocol] -Type=TQString -Value=tar diff --git a/kcontrol/kfontinst/kio/system-folder.desktop b/kcontrol/kfontinst/kio/system-folder.desktop deleted file mode 100644 index d2500c295..000000000 --- a/kcontrol/kfontinst/kio/system-folder.desktop +++ /dev/null @@ -1,79 +0,0 @@ -[Desktop Entry] -Comment=System Fonts Folder -Comment[af]=Stelsel Skrif tipe Gids -Comment[ar]=مجلد محارف النظام -Comment[be]=Тэчка сістэмных шрыфтоў -Comment[bg]=Директория за системните шрифтове -Comment[bn]=সিস্টেম ফন্ট ফোল্ডার -Comment[br]=Renkell fontoù ar reizhiad -Comment[bs]=Sistemski direktorij sa fontovima -Comment[ca]=Carpeta de lletres del sistema -Comment[cs]=Složka se systémovými písmy -Comment[csb]=Katalog systemòwëch fòntów -Comment[da]=Mappe til systemets skrifttyper -Comment[de]=Ordner für Systemschriften -Comment[el]=Φάκελος γραμματοσειρών συστήματος -Comment[eo]=Sistema tipardosierujo -Comment[es]=Carpeta de tipos de letra del sistema -Comment[et]=Süsteemi fontide kataloog -Comment[eu]=Sistemaren letra-tipoen karpeta -Comment[fa]=پوشۀ قلمهای سیستم -Comment[fi]=Järjestelmän kirjasinkansio -Comment[fr]=Dossier système de polices de caractères -Comment[fy]=Systeemlettertypenmap -Comment[ga]=Fillteán Clónna an Chórais -Comment[gl]=Cartafol das Fontes do Sistema -Comment[he]=תיקיית גופני מערכת -Comment[hi]=तंत्र फ़ॉन्ट्स फ़ोल्डर -Comment[hr]=Mapa sistemskih fontova -Comment[hu]=A rendszer betűtípusainak könyvtára -Comment[id]=Folder Font Sistem -Comment[is]=Kerfisleturmappa -Comment[it]=Cartella dei caratteri di sistema -Comment[ja]=システムフォントフォルダ -Comment[ka]=სისტემური ფონტების საქაღალდე -Comment[kk]=Жүйелік қаріптер қапшығы -Comment[km]=ថត​ពុម្ពអក្សរ​ប្រព័ន្ធ -Comment[lt]=Sistemos šriftų aplankas -Comment[lv]=Sistēmas fontu mape -Comment[mk]=Папка со системски фонтови -Comment[ms]=Folder Fon Sistem -Comment[mt]=Direttorju tal-fonts tas-sistema -Comment[nb]=Mappe for systemskrifttyper -Comment[nds]=Orner för de Systeemschriftoorden -Comment[ne]=फन्ट फोल्डर प्रणाली -Comment[nl]=Systeemlettertypenmap -Comment[nn]=Systemskriftmappe -Comment[pa]=ਸਿਸਟਮ ਫੋਂਟ ਫੋਲਡਰ -Comment[pl]=Katalog czcionek systemowych -Comment[pt]=Pasta de Tipos de Letra do Sistema -Comment[pt_BR]=Pasta de Fontes do Sistema -Comment[ro]=Folder fonturi de sistem -Comment[ru]=Папка системных шрифтов -Comment[rw]=Ububiko bw'Imyandikire Sisitemu -Comment[se]=Vuogádatfontamáhppa -Comment[sk]=Priečinok systémových písiem -Comment[sl]=Mapa za sistemske pisave -Comment[sr]=Фасцикла за системске фонтове -Comment[sr@Latn]=Fascikla za sistemske fontove -Comment[sv]=Systemteckensnittskatalog -Comment[ta]=அமைப்பு எழுத்துருக்கள் அடைவு -Comment[tg]=Системаи феҳристи ҳарфҳо -Comment[th]=โฟลเดอร์แฟ้มแบบอักษรของระบบ -Comment[tr]=Sistem Yazı Tipi Klasörü -Comment[tt]=Sistem Yazular Törgäge -Comment[uk]=Тека системних шрифтів -Comment[uz]=Tizim shriftlarining jildi -Comment[uz@cyrillic]=Тизим шрифтларининг жилди -Comment[vi]=Thư mục Phông chữ Hệ thống -Comment[wa]=Ridant di fontes do sistinme -Comment[zh_CN]=系统字体文件夹 -Comment[zh_TW]=系統字型資料夾 -Icon=folder_red -Type=MimeType -MimeType=fonts/system-folder -Patterns= - -X-TDE-AutoEmbed=true -X-TDE-IsAlso=inode/directory - diff --git a/kcontrol/kfontinst/tdeio/CMakeLists.txt b/kcontrol/kfontinst/tdeio/CMakeLists.txt new file mode 100644 index 000000000..dff38b281 --- /dev/null +++ b/kcontrol/kfontinst/tdeio/CMakeLists.txt @@ -0,0 +1,39 @@ +################################################# +# +# (C) 2010-2011 Serghei Amelian +# serghei (DOT) amelian (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +include_directories( + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/kcontrol/kfontinst/lib + ${CMAKE_SOURCE_DIR}/kcontrol/fonts + ${TDE_INCLUDE_DIR} + ${TQT_INCLUDE_DIRS} +) + +link_directories( + ${TQT_LIBRARY_DIRS} +) + + +##### other data ################################ + +install( FILES fonts.protocol DESTINATION ${SERVICES_INSTALL_DIR} ) +install( FILES fonts.desktop DESTINATION ${DATA_INSTALL_DIR}/konqsidebartng/virtual_folders/services ) +install( FILES folder.desktop system-folder.desktop package.desktop DESTINATION ${MIME_INSTALL_DIR}/fonts ) + + +##### tdeio_fonts (module) ####################### + +tde_add_kpart( tdeio_fonts AUTOMOC + SOURCES KioFonts.cpp + LINK kxftconfig-static kfontinst-shared tdesu-shared + DESTINATION ${PLUGIN_INSTALL_DIR} +) diff --git a/kcontrol/kfontinst/tdeio/KioFonts.cpp b/kcontrol/kfontinst/tdeio/KioFonts.cpp new file mode 100644 index 000000000..a443ef546 --- /dev/null +++ b/kcontrol/kfontinst/tdeio/KioFonts.cpp @@ -0,0 +1,2534 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Class Name : KFI::CKioFonts +// Author : Craig Drummond +// Project : K Font Installer +// Creation Date : 05/03/2003 +// Version : $Revision$ $Date$ +// +//////////////////////////////////////////////////////////////////////////////// +// +// 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. +// +// 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. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +//////////////////////////////////////////////////////////////////////////////// +// (C) Craig Drummond, 2003, 2004 +//////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************** + + NOTE: Large sections of this code are copied from tdeio_file + -- can't just inherit from tdeio_file as tdeio_file uses "error(...); + return;" So there is no way to know if an error occured! + + ***************************************************************************/ + +#include "KioFonts.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "KfiConstants.h" +#include "FcEngine.h" +#include "Misc.h" +#include +#include +#include + +//#define KFI_FORCE_DEBUG_TO_STDERR + +#ifdef KFI_FORCE_DEBUG_TO_STDERR + +#include +TQTextOStream ostr(stderr); +#define KFI_DBUG ostr << "[" << (int)(getpid()) << "] " + +#else + +#define KFI_DBUG kdDebug() << "[" << (int)(getpid()) << "] " + +#endif + +#define MAX_IPC_SIZE (1024*32) +#define TIMEOUT 2 // Time between last mod and writing files... +#define MAX_NEW_FONTS 50 // #fonts that can be installed before automatically configuring (related to above) +#define FC_CACHE_CMD "fc-cache" + +static const char * constMultipleExtension=".fonts.tar.gz"; // Fonts that have multiple files are returned as a .tar.gz! +static const int constMaxLastDestTime=5; +static const int constMaxFcCheckTime=10; + +extern "C" +{ + KDE_EXPORT int kdemain(int argc, char **argv); +} + +int kdemain(int argc, char **argv) +{ + if (argc != 4) + { + fprintf(stderr, "Usage: tdeio_" KFI_KIO_FONTS_PROTOCOL " protocol domain-socket1 domain-socket2\n"); + exit(-1); + } + + KLocale::setMainCatalogue(KFI_CATALOGUE); + + TDEInstance instance("tdeio_" KFI_KIO_FONTS_PROTOCOL); + KFI::CKioFonts slave(argv[2], argv[3]); + + slave.dispatchLoop(); + + return 0; +} + +namespace KFI +{ + +inline bool isSysFolder(const TQString §) +{ + return i18n(KFI_KIO_FONTS_SYS)==sect || KFI_KIO_FONTS_SYS==sect; +} + +inline bool isUserFolder(const TQString §) +{ + return i18n(KFI_KIO_FONTS_USER)==sect || KFI_KIO_FONTS_USER==sect; +} + +static TQString removeMultipleExtension(const KURL &url) +{ + TQString fname(url.fileName()); + int pos; + + if(-1!=(pos=fname.findRev(TQString::fromLatin1(constMultipleExtension)))) + fname=fname.left(pos); + + return fname; +} + +static TQString modifyName(const TQString &fname) +{ + static const char constSymbols[]={ '-', ' ', ':', 0 }; + + TQString rv(fname); + int dotPos=rv.findRev('.'); + + if(-1!=dotPos) + { + unsigned int rvLen=rv.length(); + + for(unsigned int i=dotPos+1; i-1) + size+=s; + } + + return size; +} + +static int getSize(TQValueList &patterns) +{ + TQValueList::Iterator it, + end=patterns.end(); + int size=0; + + for(it=patterns.begin(); it!=end; ++it) + size+=getFontSize(CFcEngine::getFcString(*it, FC_FILE)); + + return size; +} + +static void addAtom(TDEIO::UDSEntry &entry, unsigned int ID, long l, const TQString &s=TQString::null) +{ + TDEIO::UDSAtom atom; + atom.m_uds = ID; + atom.m_long = l; + atom.m_str = s; + entry.append(atom); +} + +static bool createFolderUDSEntry(TDEIO::UDSEntry &entry, const TQString &name, const TQString &path, bool sys) +{ + KFI_DBUG << "createFolderUDSEntry " << name << ' ' << path << ' ' << sys << ' ' << endl; + + KDE_struct_stat buff; + TQCString cPath(TQFile::encodeName(path)); + + entry.clear(); + + if(-1!=KDE_lstat(cPath, &buff)) + { + addAtom(entry, TDEIO::UDS_NAME, 0, name); + + if (S_ISLNK(buff.st_mode)) + { + KFI_DBUG << path << " is a link" << endl; + + char buffer2[1000]; + int n=readlink(cPath, buffer2, 1000); + if(n!= -1) + buffer2[n]='\0'; + + addAtom(entry, TDEIO::UDS_LINK_DEST, 0, TQString::fromLocal8Bit(buffer2)); + + if(-1==KDE_stat(cPath, &buff)) + { + // It is a link pointing to nowhere + addAtom(entry, TDEIO::UDS_FILE_TYPE, S_IFMT - 1); + addAtom(entry, TDEIO::UDS_ACCESS, S_IRWXU | S_IRWXG | S_IRWXO); + addAtom(entry, TDEIO::UDS_SIZE, 0); + goto notype; + } + } + + addAtom(entry, TDEIO::UDS_FILE_TYPE, buff.st_mode&S_IFMT); + addAtom(entry, TDEIO::UDS_ACCESS, buff.st_mode&07777); + addAtom(entry, TDEIO::UDS_SIZE, buff.st_size); + + notype: + addAtom(entry, TDEIO::UDS_MODIFICATION_TIME, buff.st_mtime); + + struct passwd *user = getpwuid(buff.st_uid); + addAtom(entry, TDEIO::UDS_USER, 0, user ? user->pw_name : TQString::number(buff.st_uid).latin1()); + + struct group *grp = getgrgid(buff.st_gid); + addAtom(entry, TDEIO::UDS_GROUP, 0, grp ? grp->gr_name : TQString::number(buff.st_gid).latin1()); + + addAtom(entry, TDEIO::UDS_ACCESS_TIME, buff.st_atime); + addAtom(entry, TDEIO::UDS_MIME_TYPE, 0, sys + ? KFI_KIO_FONTS_PROTOCOL"/system-folder" + : KFI_KIO_FONTS_PROTOCOL"/folder"); + addAtom(entry, TDEIO::UDS_GUESSED_MIME_TYPE, 0, "application/octet-stream"); + TQString url(KFI_KIO_FONTS_PROTOCOL+TQString::fromLatin1(":/")); + return true; + } + else if (sys && !Misc::root()) // Default system fonts folder does not actually exist yet! + { + KFI_DBUG << "Default system folder (" << path << ") does not yet exist, so create dummy entry" << endl; + addAtom(entry, TDEIO::UDS_NAME, 0, name); + addAtom(entry, TDEIO::UDS_FILE_TYPE, S_IFDIR); + addAtom(entry, TDEIO::UDS_ACCESS, 0744); + addAtom(entry, TDEIO::UDS_USER, 0, "root"); + addAtom(entry, TDEIO::UDS_GROUP, 0, "root"); + addAtom(entry, TDEIO::UDS_MIME_TYPE, 0, KFI_KIO_FONTS_PROTOCOL"/system-folder"); + addAtom(entry, TDEIO::UDS_GUESSED_MIME_TYPE, 0, "application/octet-stream"); + + return true; + } + + + return false; +} + +static bool createFontUDSEntry(TDEIO::UDSEntry &entry, const TQString &name, TQValueList &patterns, bool sys) +{ + KFI_DBUG << "createFontUDSEntry " << name << ' ' << patterns.count() << endl; + + bool multiple=true; + + if(1==patterns.count()) // Only one font file, but are there any .pfm or .afm files? + { + KURL::List urls; + + Misc::getAssociatedUrls(KURL(CFcEngine::getFcString(patterns.first(), FC_FILE)), urls); + + if(0==urls.count()) + multiple=false; + } + + // + // In case of mixed bitmap/scalable - prefer scalable + TQValueList sortedPatterns; + TQValueList::Iterator it, + end(patterns.end()); + FcBool b=FcFalse; + + for(it=patterns.begin(); it!=end; ++it) + if(FcResultMatch==FcPatternGetBool(*it, FC_SCALABLE, 0, &b) && b) + sortedPatterns.prepend(*it); + else + sortedPatterns.append(*it); + + end=sortedPatterns.end(); + entry.clear(); + addAtom(entry, TDEIO::UDS_SIZE, getSize(patterns)); + + for(it=sortedPatterns.begin(); it!=end; ++it) + { + TQString path(CFcEngine::getFcString(*it, FC_FILE)); + TQCString cPath(TQFile::encodeName(path)); + KDE_struct_stat buff; + + if(-1!=KDE_lstat(cPath, &buff)) + { + addAtom(entry, TDEIO::UDS_NAME, 0, name); + + if (S_ISLNK(buff.st_mode)) + { + KFI_DBUG << path << " is a link" << endl; + + char buffer2[1000]; + int n=readlink(cPath, buffer2, 1000); + + if(n!= -1) + buffer2[n]='\0'; + + addAtom(entry, TDEIO::UDS_LINK_DEST, 0, TQString::fromLocal8Bit(buffer2)); + + if(-1==KDE_stat(cPath, &buff)) + { + // It is a link pointing to nowhere + addAtom(entry, TDEIO::UDS_FILE_TYPE, S_IFMT - 1); + addAtom(entry, TDEIO::UDS_ACCESS, S_IRWXU | S_IRWXG | S_IRWXO); + goto notype; + } + } + + addAtom(entry, TDEIO::UDS_FILE_TYPE, buff.st_mode&S_IFMT); + addAtom(entry, TDEIO::UDS_ACCESS, buff.st_mode&07777); + + notype: + addAtom(entry, TDEIO::UDS_MODIFICATION_TIME, buff.st_mtime); + + struct passwd *user = getpwuid(buff.st_uid); + addAtom(entry, TDEIO::UDS_USER, 0, user ? user->pw_name : TQString::number(buff.st_uid).latin1()); + + struct group *grp = getgrgid(buff.st_gid); + addAtom(entry, TDEIO::UDS_GROUP, 0, grp ? grp->gr_name : TQString::number(buff.st_gid).latin1()); + + addAtom(entry, TDEIO::UDS_ACCESS_TIME, buff.st_atime); + addAtom(entry, TDEIO::UDS_MIME_TYPE, 0, KMimeType::findByPath(path, 0, true)->name()); + addAtom(entry, TDEIO::UDS_GUESSED_MIME_TYPE, 0, "application/octet-stream"); + + TQString url(KFI_KIO_FONTS_PROTOCOL+TQString::fromLatin1(":/")); + + if(!Misc::root()) + { + url+=sys ? i18n(KFI_KIO_FONTS_SYS) : i18n(KFI_KIO_FONTS_USER); + url+=TQString::fromLatin1("/"); + } + if(multiple) + url+=name+TQString::fromLatin1(constMultipleExtension); + else + url+=Misc::getFile(path); + addAtom(entry, TDEIO::UDS_URL, 0, url); + return true; // This file was OK, so use its values... + } + } + return false; +} + +enum EUrlStatus +{ + BAD_URL, + URL_OK, + REDIRECT_URL +}; + +static KURL getRedirect(const KURL &u) +{ + // Go from fonts:/System to fonts:/ + + KURL redirect(u); + TQString path(u.path()), + sect(CKioFonts::getSect(path)); + + path.remove(sect); + path.replace("//", "/"); + redirect.setPath(path); + + KFI_DBUG << "Redirect from " << u.path() << " to " << redirect.path() << endl; + return redirect; +} + +static bool nonRootSys(const KURL &u) +{ + return !Misc::root() && isSysFolder(CKioFonts::getSect(u.path())); +} + +static TQString getFontFolder(const TQString &defaultDir, const TQString &root, TQStringList &dirs) +{ + if(dirs.contains(defaultDir)) + return defaultDir; + else + { + TQStringList::Iterator it, + end=dirs.end(); + bool found=false; + + for(it=dirs.begin(); it!=end && !found; ++it) + if(0==(*it).find(root)) + return *it; + } + + return TQString::null; +} + +static bool writeAll(int fd, const char *buf, size_t len) +{ + while(len>0) + { + ssize_t written=write(fd, buf, len); + if (written<0 && EINTR!=errno) + return false; + buf+=written; + len-=written; + } + return true; +} + +static bool checkExt(const char *fname, const char *ext) +{ + unsigned int len=strlen(fname); + + return len>4 ? (fname[len-4]=='.' && tolower(fname[len-3])==ext[0] && tolower(fname[len-2])==ext[1] && + tolower(fname[len-1])==ext[2]) + : false; +} + +static bool isAAfm(const TQString &fname) +{ + if(checkExt(TQFile::encodeName(fname), "afm")) // CPD? Is this a necessary check? + { + TQFile file(fname); + + if(file.open(IO_ReadOnly)) + { + TQTextStream stream(&file); + TQString line; + + for(int lc=0; lc<30 && !stream.atEnd(); ++lc) + { + line=stream.readLine(); + + if(line.contains("StartFontMetrics")) + { + file.close(); + return true; + } + } + + file.close(); + } + } + + return false; +} + +static bool isAPfm(const TQString &fname) +{ + bool ok=false; + + // I know extension checking is bad, but Ghostscript's pf2afm requires the pfm file to + // have the .pfm extension... + if(checkExt(TQFile::encodeName(fname), "pfm")) + { + // + // OK, the extension matches, so perform a little contents checking... + FILE *f=fopen(TQFile::encodeName(fname).data(), "r"); + + if(f) + { + static const unsigned long constCopyrightLen = 60; + static const unsigned long constTypeToExt = 49; + static const unsigned long constExtToFname = 20; + static const unsigned long constExtLen = 30; + static const unsigned long constFontnameMin = 75; + static const unsigned long constFontnameMax = 512; + + unsigned short version=0, + type=0, + extlen=0; + unsigned long length=0, + fontname=0, + fLength=0; + + fseek(f, 0, SEEK_END); + fLength=ftell(f); + fseek(f, 0, SEEK_SET); + + if(2==fread(&version, 1, 2, f) && // Read version + 4==fread(&length, 1, 4, f) && // length... + length==fLength && + 0==fseek(f, constCopyrightLen, SEEK_CUR) && // Skip copyright notice... + 2==fread(&type, 1, 2, f) && + 0==fseek(f, constTypeToExt, SEEK_CUR) && + 2==fread(&extlen, 1, 2, f) && + extlen==constExtLen && + 0==fseek(f, constExtToFname, SEEK_CUR) && + 4==fread(&fontname, 1, 4, f) && + fontname>constFontnameMin && fontname paths; + + bool operator==(const FontList &f) const { return f.name==name; } +}; + +// +// This function returns a set of maping of from -> to for copy/move operations +static bool getFontList(const TQStringList &files, TQMap &map) +{ + // + // First of all create a list of font files, and their paths + TQStringList::ConstIterator it=files.begin(), + end=files.end(); + TQValueList list; + + for(;it!=end; ++it) + { + TQString name(Misc::getFile(*it)), + path(Misc::getDir(*it)); + TQValueList::Iterator entry=list.find(FontList(name)); + + if(entry!=list.end()) + { + if(!(*entry).paths.contains(path)) + (*entry).paths.append(path); + } + else + list.append(FontList(name, path)); + } + + TQValueList::Iterator fIt(list.begin()), + fEnd(list.end()); + + for(; fIt!=fEnd; ++fIt) + { + TQValueList::Iterator pBegin((*fIt).paths.begin()), + pIt(++pBegin), + pEnd((*fIt).paths.end()); + --pBegin; + + if((*fIt).paths.count()>1) + { + // There's more than 1 file with the same name, but in a different locations + // therefore, take the unique part of the path, and replace / with _ + // e.g. + // /usr/X11R6/lib/X11/fonts/75dpi/times.pcf.gz + // /usr/X11R6/lib/X11/fonts/100dpi/times.pcf.gz + // + // Will produce: + // 75dpi_times.pcf.gz + // 100dpi_times.pcf.gz + unsigned int beginLen((*pBegin).orig.length()); + + for(; pIt!=pEnd; ++pIt) + { + unsigned int len=TQMIN((*pIt).orig.length(), beginLen); + + for(unsigned int i=0; i0) + for(int path=0; path >::Iterator it=itsFolders[folder].fontMap.begin(), + end=itsFolders[folder].fontMap.end(); + + for ( ; it != end; ++it) + { + entry.clear(); + if(createFontUDSEntry(entry, it.key(), it.data(), FOLDER_SYS==folder)) + listEntry(entry, false); + } + } + } + else + { + size=2; + totalSize(size); + createFolderUDSEntry(entry, i18n(KFI_KIO_FONTS_USER), itsFolders[FOLDER_USER].location, false); + listEntry(entry, false); + createFolderUDSEntry(entry, i18n(KFI_KIO_FONTS_SYS), itsFolders[FOLDER_SYS].location, true); + listEntry(entry, false); + } + + listEntry(size ? entry : TDEIO::UDSEntry(), true); + finished(); + } + + KFI_DBUG << "listDir - finished!" << endl; +} + +void CKioFonts::stat(const KURL &url) +{ + KFI_DBUG << "stat " << url.prettyURL() << endl; + + if(updateFontList() && checkUrl(url, true)) + { + TQString path(url.path(-1)); + + if(path.isEmpty()) + { + error(TDEIO::ERR_COULD_NOT_STAT, url.prettyURL()); + return; + } + + TQStringList pathList(TQStringList::split('/', path, false)); + TDEIO::UDSEntry entry; + bool err=false; + + switch(pathList.count()) + { + case 0: + err=!createFolderUDSEntry(entry, i18n("Fonts"), itsFolders[itsRoot ? FOLDER_SYS : FOLDER_USER].location, false); + break; + case 1: + if(itsRoot) + err=!createStatEntry(entry, url, FOLDER_SYS); + else + if(isUserFolder(pathList[0])) + err=!createFolderUDSEntry(entry, i18n(KFI_KIO_FONTS_USER), itsFolders[FOLDER_USER].location, false); + else if(isSysFolder(pathList[0])) + err=!createFolderUDSEntry(entry, i18n(KFI_KIO_FONTS_SYS), itsFolders[FOLDER_USER].location, true); + else + { + error(TDEIO::ERR_SLAVE_DEFINED, + i18n("Please specify \"%1\" or \"%2\".").arg(i18n(KFI_KIO_FONTS_USER)).arg(i18n(KFI_KIO_FONTS_SYS))); + return; + } + break; + default: + err=!createStatEntry(entry, url, getFolder(url)); + } + + if(err) + { + error(TDEIO::ERR_DOES_NOT_EXIST, url.prettyURL()); + return; + } + + statEntry(entry); + finished(); + } +} + +bool CKioFonts::createStatEntry(TDEIO::UDSEntry &entry, const KURL &url, EFolder folder) +{ + KFI_DBUG << "createStatEntry " << url.path() << endl; + + TQMap >::Iterator it=getMap(url); + + if(it!=itsFolders[folder].fontMap.end()) + return createFontUDSEntry(entry, it.key(), it.data(), FOLDER_SYS==folder); + return false; +} + +void CKioFonts::get(const KURL &url) +{ + KFI_DBUG << "get " << url.path() << " query:" << url.query() << endl; + + bool thumb="1"==metaData("thumbnail"); + TQStringList srcFiles; + + if(updateFontList() && checkUrl(url) && getSourceFiles(url, srcFiles)) // Any error will be logged in getSourceFiles + { + // + // The thumbnail job always donwloads non-local files to /tmp/... and passes this file name to the thumbnail + // creator. However, in the case of fonts which are split among many files, this wont work. Therefore, when the + // thumbnail code asks for the font to donwload, just return the URL used. This way the font-thumbnail creator can + // read this and just ask Xft/fontconfig for the font data. + if(thumb) + { + TQByteArray array; + TQTextOStream stream(array); + + emit mimeType("text/plain"); + + KFI_DBUG << "hasMetaData(\"thumbnail\"), so return: " << url.prettyURL() << endl; + + stream << url.prettyURL(); + totalSize(array.size()); + data(array); + processedSize(array.size()); + data(TQByteArray()); + processedSize(array.size()); + finished(); + return; + } + + TQString realPath, + useMime; + KDE_struct_stat buff; + bool multiple=false; + + if(1==srcFiles.count()) + realPath=srcFiles.first(); + else // Font is made up of multiple files - so create .tar.gz of them all! + { + KTempFile tmpFile; + KTar tar(tmpFile.name(), "application/x-gzip"); + + tmpFile.setAutoDelete(false); + realPath=tmpFile.name(); + + if(tar.open(IO_WriteOnly)) + { + TQMap map; + + getFontList(srcFiles, map); + + TQMap::Iterator fIt(map.begin()), + fEnd(map.end()); + + // + // Iterate through created list, and add to tar archive + for(; fIt!=fEnd; ++fIt) + tar.addLocalFile(fIt.key(), fIt.data()); + + multiple=true; + tar.close(); + } + } + + TQCString realPathC(TQFile::encodeName(realPath)); + KFI_DBUG << "real: " << realPathC << endl; + + if (-2==KDE_stat(realPathC.data(), &buff)) + error(EACCES==errno ? TDEIO::ERR_ACCESS_DENIED : TDEIO::ERR_DOES_NOT_EXIST, url.prettyURL()); + else if (S_ISDIR(buff.st_mode)) + error(TDEIO::ERR_IS_DIRECTORY, url.prettyURL()); + else if (!S_ISREG(buff.st_mode)) + error(TDEIO::ERR_CANNOT_OPEN_FOR_READING, url.prettyURL()); + else + { + int fd = KDE_open(realPathC.data(), O_RDONLY); + + if (fd < 0) + error(TDEIO::ERR_CANNOT_OPEN_FOR_READING, url.prettyURL()); + else + { + // Determine the mimetype of the file to be retrieved, and emit it. + // This is mandatory in all slaves (for KRun/BrowserRun to work). + emit mimeType(useMime.isEmpty() ? KMimeType::findByPath(realPathC, buff.st_mode, true)->name() : useMime); + + totalSize(buff.st_size); + + TDEIO::filesize_t processed=0; + char buffer[MAX_IPC_SIZE]; + TQByteArray array; + + while(1) + { + int n=::read(fd, buffer, MAX_IPC_SIZE); + if (-1==n) + { + if (errno == EINTR) + continue; + error(TDEIO::ERR_COULD_NOT_READ, url.prettyURL()); + close(fd); + if(multiple) + ::unlink(realPathC); + return; + } + if (0==n) + break; // Finished + + array.setRawData(buffer, n); + data(array); + array.resetRawData(buffer, n); + + processed+=n; + processedSize(processed); + } + + data(TQByteArray()); + close(fd); + + processedSize(buff.st_size); + finished(); + } + } + if(multiple) + ::unlink(realPathC); + } +} + +void CKioFonts::put(const KURL &u, int mode, bool overwrite, bool resume) +{ + KFI_DBUG << "put " << u.path() << endl; + + if(isHidden(u)) + { + error(TDEIO::ERR_WRITE_ACCESS_DENIED, u.prettyURL()); + return; + } + + // updateFontList(); // CPD: dont update font list upon a put - is too slow. Just stat on filename! + + //checkUrl(u) // CPD: Don't need to check URL, as the call to "confirmUrl()" below will sort out any probs! + + KURL url(u); + bool changed=confirmUrl(url), + nrs=nonRootSys(url); + EFolder destFolder(getFolder(url)); + TQString dest=itsFolders[destFolder].location+modifyName(url.fileName()), + passwd; + TQCString destC=TQFile::encodeName(dest); + KDE_struct_stat buffDest; + bool destExists=(KDE_lstat(destC.data(), &buffDest)!= -1); + + if (destExists && !overwrite && !resume) + { + error(TDEIO::ERR_FILE_ALREADY_EXIST, url.prettyURL()); + return; + } + + if(nrs) // Need to check can get root passwd before start download... + { + passwd=getRootPasswd(); + + if(passwd.isEmpty()) + { + error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS))); + return; + } + } + + // + // As we don't get passed a mime-type the following needs to happen: + // + // 1. Download to a temporary file + // 2. Check with FreeType that the file is a font, or that it is + // an AFM or PFM file + // 3. If its OK, then get the fonts "name" from + KTempFile tmpFile; + TQCString tmpFileC(TQFile::encodeName(tmpFile.name())); + + tmpFile.setAutoDelete(true); + + if(putReal(tmpFile.name(), tmpFileC, destExists, mode, resume)) + { + if(!checkFile(tmpFile.name())) // error logged in checkFile + return; + + if(nrs) // Ask root to copy the font... + { + TQCString cmd; + + if(!Misc::dExists(itsFolders[destFolder].location)) + { + cmd+="mkdir "; + cmd+=TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location)); + cmd+=" && chmod 0755 "; + cmd+=TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location)); + cmd+=" && "; + } + cmd+="cp -f "; + cmd+=TQFile::encodeName(TDEProcess::quote(tmpFileC)); + cmd+=" "; + cmd+=TQFile::encodeName(TDEProcess::quote(destC)); + cmd+=" && chmod 0644 "; + cmd+=destC; + + if(!itsCanStorePasswd) + createRootRefreshCmd(cmd); + + // Get root to move this to fonts folder... + if(doRootCmd(cmd, passwd)) + { + modified(FOLDER_SYS); + createAfm(dest, true, passwd); + } + else + { + error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS))); + return; + } + } + else // Move it to our font folder... + { + tmpFile.setAutoDelete(false); + if(Misc::doCmd("mv", "-f", tmpFileC, destC)) + { + ::chmod(destC.data(), Misc::FILE_PERMS); + modified(FOLDER_USER); + createAfm(dest); + } + else + { + error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_USER))); + return; + } + } + + finished(); + + if(changed) + itsLastDestTime=time(NULL); + } +} + +bool CKioFonts::putReal(const TQString &destOrig, const TQCString &destOrigC, bool origExists, + int mode, bool resume) +{ + bool markPartial=config()->readBoolEntry("MarkPartial", true); + TQString dest; + + if (markPartial) + { + TQString destPart(destOrig+TQString::fromLatin1(".part")); + TQCString destPartC(TQFile::encodeName(destPart)); + + dest = destPart; + + KDE_struct_stat buffPart; + bool partExists=(-1!=KDE_stat(destPartC.data(), &buffPart)); + + if (partExists && !resume && buffPart.st_size>0) + { + // Maybe we can use this partial file for resuming + // Tell about the size we have, and the app will tell us + // if it's ok to resume or not. + resume=canResume(buffPart.st_size); + + if (!resume) + if (!::remove(destPartC.data())) + partExists = false; + else + { + error(TDEIO::ERR_CANNOT_DELETE_PARTIAL, destPart); + return false; + } + } + } + else + { + dest = destOrig; + if (origExists && !resume) + ::remove(destOrigC.data()); + // Catch errors when we try to open the file. + } + + TQCString destC(TQFile::encodeName(dest)); + + int fd; + + if (resume) + { + fd = KDE_open(destC.data(), O_RDWR); // append if resuming + KDE_lseek(fd, 0, SEEK_END); // Seek to end + } + else + { + // WABA: Make sure that we keep writing permissions ourselves, + // otherwise we can be in for a surprise on NFS. + fd = KDE_open(destC.data(), O_CREAT | O_TRUNC | O_WRONLY, -1==mode ? 0666 : mode | S_IWUSR | S_IRUSR); + } + + if (fd < 0) + { + error(EACCES==errno ? TDEIO::ERR_WRITE_ACCESS_DENIED : TDEIO::ERR_CANNOT_OPEN_FOR_WRITING, dest); + return false; + } + + int result; + // Loop until we got 0 (end of data) + do + { + TQByteArray buffer; + + dataReq(); // Request for data + result = readData(buffer); + if(result > 0 && !writeAll(fd, buffer.data(), buffer.size())) + { + if(ENOSPC==errno) // disk full + { + error(TDEIO::ERR_DISK_FULL, destOrig); + result = -2; // means: remove dest file + } + else + { + error(TDEIO::ERR_COULD_NOT_WRITE, destOrig); + result = -1; + } + } + } + while(result>0); + + if (result<0) + { + close(fd); + if (-1==result) + ::remove(destC.data()); + else if (markPartial) + { + KDE_struct_stat buff; + + if ((-1==KDE_stat(destC.data(), &buff)) || + (buff.st_sizereadNumEntry("MinimumKeepSize", DEFAULT_MINIMUM_KEEP_SIZE))) + ::remove(destC.data()); + } + ::exit(255); + } + + if (-1==fd) // we got nothing to write out, so we never opened the file + { + finished(); + return false; + } + + if (close(fd)) + { + error(TDEIO::ERR_COULD_NOT_WRITE, destOrig); + return false; + } + + // after full download rename the file back to original name + if (markPartial && ::rename(destC.data(), destOrigC.data())) + { + error(TDEIO::ERR_CANNOT_RENAME_PARTIAL, destOrig); + return false; + } + + return true; +} + +void CKioFonts::copy(const KURL &src, const KURL &d, int mode, bool overwrite) +{ + // + // Support: + // Copying to fonts:/ + // Copying from fonts:/ and file:/ + // + KFI_DBUG << "copy " << src.prettyURL() << " - " << d.prettyURL() << endl; + + if(isHidden(d)) + { + error(TDEIO::ERR_WRITE_ACCESS_DENIED, d.prettyURL()); + return; + } + + bool fromFonts=KFI_KIO_FONTS_PROTOCOL==src.protocol(); + + if((!fromFonts || updateFontList()) // CPD: dont update font list upon a copy from file - is too slow. Just stat on filename! + && checkUrl(src) && checkAllowed(src)) + { + //checkUrl(u) // CPD as per comment in ::put() + + TQStringList srcFiles; + + if(getSourceFiles(src, srcFiles)) // Any error will be logged in getSourceFiles + { + KURL dest(d); + bool changed=confirmUrl(dest); + EFolder destFolder(getFolder(dest)); + TQMap map; + + if(!fromFonts) + map[src.path()]=src.fileName(); + + // As above, if copying from file, then only stat on dest filename, but if from fonts to fonts need to + // get the list of possible source files, etc. + if(fromFonts ? confirmMultiple(src, srcFiles, FOLDER_SYS==destFolder ? FOLDER_USER : FOLDER_SYS, OP_COPY) && + getFontList(srcFiles, map) && + checkDestFiles(src, map, dest, destFolder, overwrite) + : checkDestFile(src, dest, destFolder, overwrite) ) + { + if(nonRootSys(dest)) + { + TQCString cmd; + int size=0; + + if(!Misc::dExists(itsFolders[destFolder].location)) + { + cmd+="mkdir "; + cmd+=TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location)); + cmd+=" && chmod 0755 "; + cmd+=TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location)); + cmd+=" && "; + } + + TQMap::Iterator fIt(map.begin()), + fEnd(map.end()); + + for(; fIt!=fEnd; ++fIt) + { + cmd+="cp -f "; + cmd+=TQFile::encodeName(TDEProcess::quote(fIt.key())); + cmd+=" "; + cmd+=TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location+modifyName(fIt.data()))); + int s=getSize(TQFile::encodeName(fIt.key())); + if(s>0) + size+=s; + if(++fIt!=fEnd) + cmd+=" && "; + --fIt; + } + + if(!itsCanStorePasswd) + createRootRefreshCmd(cmd); + + totalSize(size); + + TQString passwd=getRootPasswd(); + + if(doRootCmd(cmd, passwd)) + { + modified(destFolder); + processedSize(size); + if(src.isLocalFile() && 1==srcFiles.count()) + createAfm(itsFolders[destFolder].location+modifyName(map.begin().data()), true, passwd); + } + else + { + error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS))); + return; + } + } + else + { + TQMap::Iterator fIt(map.begin()), + fEnd(map.end()); + + for(; fIt!=fEnd; ++fIt) + { + TQCString realSrc(TQFile::encodeName(fIt.key())), + realDest(TQFile::encodeName(itsFolders[destFolder].location+modifyName(fIt.data()))); + KDE_struct_stat buffSrc; + + if(-1==KDE_stat(realSrc.data(), &buffSrc)) + { + error(EACCES==errno ? TDEIO::ERR_ACCESS_DENIED : TDEIO::ERR_DOES_NOT_EXIST, src.prettyURL()); + return; + } + + int srcFd=KDE_open(realSrc.data(), O_RDONLY); + + if (srcFd<0) + { + error(TDEIO::ERR_CANNOT_OPEN_FOR_READING, src.prettyURL()); + return; + } + + if(!Misc::dExists(itsFolders[destFolder].location)) + Misc::createDir(itsFolders[destFolder].location); + + // WABA: Make sure that we keep writing permissions ourselves, + // otherwise we can be in for a surprise on NFS. + int destFd=KDE_open(realDest.data(), O_CREAT | O_TRUNC | O_WRONLY, -1==mode ? 0666 : mode | S_IWUSR); + + if (destFd<0) + { + error(EACCES==errno ? TDEIO::ERR_WRITE_ACCESS_DENIED : TDEIO::ERR_CANNOT_OPEN_FOR_WRITING, dest.prettyURL()); + close(srcFd); + return; + } + + totalSize(buffSrc.st_size); + + TDEIO::filesize_t processed = 0; + char buffer[MAX_IPC_SIZE]; + TQByteArray array; + + while(1) + { + int n=::read(srcFd, buffer, MAX_IPC_SIZE); + + if(-1==n) + { + if (errno == EINTR) + continue; + error(TDEIO::ERR_COULD_NOT_READ, src.prettyURL()); + close(srcFd); + close(destFd); + return; + } + if(0==n) + break; // Finished + + if(!writeAll(destFd, buffer, n)) + { + close(srcFd); + close(destFd); + if (ENOSPC==errno) // disk full + { + error(TDEIO::ERR_DISK_FULL, dest.prettyURL()); + remove(realDest.data()); + } + else + error(TDEIO::ERR_COULD_NOT_WRITE, dest.prettyURL()); + return; + } + + processed += n; + processedSize(processed); + } + + close(srcFd); + + if(close(destFd)) + { + error(TDEIO::ERR_COULD_NOT_WRITE, dest.prettyURL()); + return; + } + + ::chmod(realDest.data(), Misc::FILE_PERMS); + + // copy access and modification time + struct utimbuf ut; + + ut.actime = buffSrc.st_atime; + ut.modtime = buffSrc.st_mtime; + ::utime(realDest.data(), &ut); + + processedSize(buffSrc.st_size); + modified(destFolder); + } + + if(src.isLocalFile() && 1==srcFiles.count()) + createAfm(itsFolders[destFolder].location+modifyName(map.begin().data())); + } + + finished(); + + if(changed) + itsLastDestTime=time(NULL); + } + } + } +} + +void CKioFonts::rename(const KURL &src, const KURL &d, bool overwrite) +{ + KFI_DBUG << "rename " << src.prettyURL() << " - " << d.prettyURL() << ", " << overwrite << endl; + + if(src.directory()==d.directory()) + error(TDEIO::ERR_SLAVE_DEFINED, i18n("Sorry, fonts cannot be renamed.")); + else if(itsRoot) // Should never happen... + error(TDEIO::ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(mProtocol, TDEIO::CMD_RENAME)); + else + { + // + // Can't rename from/to file:/ -> therefore rename can only be from fonts:/System to fonts:/Personal, + // or vice versa. + + TQStringList srcFiles; + + if(getSourceFiles(src, srcFiles)) // Any error will be logged in getSourceFiles + { + KURL dest(d); + bool changed=confirmUrl(dest); + EFolder destFolder(getFolder(dest)); + TQMap map; + + if(confirmMultiple(src, srcFiles, FOLDER_SYS==destFolder ? FOLDER_USER : FOLDER_SYS, OP_MOVE) && + getFontList(srcFiles, map) && + checkDestFiles(src, map, dest, destFolder, overwrite)) + { + TQMap::Iterator fIt(map.begin()), + fEnd(map.end()); + bool askPasswd=true, + toSys=FOLDER_SYS==destFolder; + TQCString userId, + groupId, + destDir(TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location))); + + userId.setNum(toSys ? 0 : getuid()); + groupId.setNum(toSys ? 0 : getgid()); + + for(; fIt!=fEnd; ++fIt) + { + TQCString cmd, + destFile(TQFile::encodeName(TDEProcess::quote(itsFolders[destFolder].location+fIt.data()))); + + if(toSys && !Misc::dExists(itsFolders[destFolder].location)) + { + cmd+="mkdir "; + cmd+=destDir; + cmd+=" && "; + } + + cmd+="mv -f "; + cmd+=TQFile::encodeName(TDEProcess::quote(fIt.key())); + cmd+=" "; + cmd+=destFile; + cmd+=" && chmod -f 0644 "; + cmd+=destFile; + cmd+=" && chown -f "; + cmd+=userId; + cmd+=":"; + cmd+=groupId; + cmd+=" "; + cmd+=destFile; + + TQString sysDir, + userDir; + + if(FOLDER_SYS==destFolder) + { + sysDir=itsFolders[destFolder].location; + userDir=Misc::getDir(fIt.key()); + } + else + { + userDir=itsFolders[destFolder].location; + sysDir=Misc::getDir(fIt.key()); + } + + if(!itsCanStorePasswd) + createRootRefreshCmd(cmd, sysDir); + + if(doRootCmd(cmd, askPasswd)) + { + modified(FOLDER_SYS, true, sysDir); + modified(FOLDER_USER, true, userDir); + askPasswd=false; // Don't keep on asking for password... + } + else + { + error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS))); + return; + } + } + if(changed) + itsLastDestTime=time(NULL); + } + } + } +} + +void CKioFonts::del(const KURL &url, bool) +{ + KFI_DBUG << "del " << url.path() << endl; + + TQValueList *entries; + + if(checkUrl(url) && checkAllowed(url) && + updateFontList() && (entries=getEntries(url)) && entries->count() && + confirmMultiple(url, entries, getFolder(url), OP_DELETE)) + { + TQValueList::Iterator it, + end=entries->end(); + CDirList modifiedDirs; + bool clearList=KFI_KIO_NO_CLEAR!=url.query(); + + if(nonRootSys(url)) + { + TQCString cmd("rm -f"); + + for(it=entries->begin(); it!=end; ++it) + { + TQString file(CFcEngine::getFcString(*it, FC_FILE)); + + modifiedDirs.add(Misc::getDir(file)); + cmd+=" "; + cmd+=TQFile::encodeName(TDEProcess::quote(file)); + + KURL::List urls; + + Misc::getAssociatedUrls(KURL(file), urls); + + if(urls.count()) + { + KURL::List::Iterator uIt, + uEnd=urls.end(); + + for(uIt=urls.begin(); uIt!=uEnd; ++uIt) + { + cmd+=" "; + cmd+=TQFile::encodeName(TDEProcess::quote((*uIt).path())); + } + } + } + + if(!itsCanStorePasswd) + createRootRefreshCmd(cmd, modifiedDirs); + + if(doRootCmd(cmd)) + modified(FOLDER_SYS, clearList, modifiedDirs); + else + error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS))); + } + else + { + for(it=entries->begin(); it!=end; ++it) + { + TQString file(CFcEngine::getFcString(*it, FC_FILE)); + + if (0!=unlink(TQFile::encodeName(file).data())) + error(EACCES==errno || EPERM==errno + ? TDEIO::ERR_ACCESS_DENIED + : EISDIR==errno + ? TDEIO::ERR_IS_DIRECTORY + : TDEIO::ERR_CANNOT_DELETE, + file); + else + { + modifiedDirs.add(Misc::getDir(file)); + + KURL::List urls; + + Misc::getAssociatedUrls(KURL(file), urls); + + if(urls.count()) + { + KURL::List::Iterator uIt, + uEnd=urls.end(); + + for(uIt=urls.begin(); uIt!=uEnd; ++uIt) + unlink(TQFile::encodeName((*uIt).path()).data()); + } + } + } + modified(itsRoot ? FOLDER_SYS : FOLDER_USER, clearList, modifiedDirs); + } + finished(); + } +} + +void CKioFonts::modified(EFolder folder, bool clearList, const CDirList &dirs) +{ + KFI_DBUG << "modified(" << (int)folder << ")\n"; + + if(FOLDER_SYS!=folder || itsCanStorePasswd || itsRoot) + { + if(dirs.count()) + { + CDirList::ConstIterator it(dirs.begin()), + end(dirs.end()); + + for(; it!=end; ++it) + itsFolders[folder].modified.add(*it); + } + else + itsFolders[folder].modified.add(itsFolders[folder].location); + + if(++itsFontChanges>MAX_NEW_FONTS) + { + setTimeoutSpecialCommand(0); // Cancel timer + doModified(); + } + else + setTimeoutSpecialCommand(TIMEOUT); + } + + if(FOLDER_SYS==folder && !itsRoot && !itsCanStorePasswd) + { + // If we modified sys, we're not root, and couldn't store the passwd, then kfontinst has already been called + // so no need to ask it to add folder to fontconfig and X's config files... + itsHasSys=true; + itsAddToSysFc=false; + } + if(clearList) + clearFontList(); // List of fonts has changed.../ +} + +void CKioFonts::special(const TQByteArray &a) +{ + KFI_DBUG << "special" << endl; + + if(a.size()) + { + TQDataStream stream(a, IO_ReadOnly); + int cmd; + + stream >> cmd; + + switch (cmd) + { + case SPECIAL_RESCAN: + clearFontList(); + updateFontList(); + finished(); + break; + case SPECIAL_RECONFIG: // Only itended to be called from kcmfontinst - when a user has re-enabled doX or doGs + if(itsRoot && !itsFolders[FOLDER_SYS].modified.contains(itsFolders[FOLDER_SYS].location)) + itsFolders[FOLDER_SYS].modified.add(itsFolders[FOLDER_SYS].location); + else if(!itsRoot && !itsFolders[FOLDER_USER].modified.contains(itsFolders[FOLDER_USER].location)) + itsFolders[FOLDER_USER].modified.add(itsFolders[FOLDER_USER].location); + + doModified(); + finished(); + break; + default: + error( TDEIO::ERR_UNSUPPORTED_ACTION, TQString::number(cmd)); + } + } + else + doModified(); +} + +void CKioFonts::createRootRefreshCmd(TQCString &cmd, const CDirList &dirs, bool reparseCfg) +{ + if(reparseCfg) + reparseConfig(); + + if(!cmd.isEmpty()) + cmd+=" && "; + + cmd+=FC_CACHE_CMD; + + if(dirs.count()) + { + CDirList::ConstIterator it(dirs.begin()), + end(dirs.end()); + + for(; it!=end; ++it) + { + TQCString tmpCmd; + + if(*it==itsFolders[FOLDER_SYS].location) + { + if(0!=itsNrsKfiParams[0]) + tmpCmd+=itsNrsKfiParams; + } + else + if(0!=itsNrsNonMainKfiParams[0]) + tmpCmd+=itsNrsNonMainKfiParams; + + if(!tmpCmd.isEmpty()) + { + cmd+=" && kfontinst "; + cmd+=tmpCmd; + cmd+=" "; + cmd+=TQFile::encodeName(TDEProcess::quote(*it)); + } + } + } + else if (0!=itsNrsKfiParams[0]) + { + cmd+=" && kfontinst "; + cmd+=itsNrsKfiParams; + cmd+=" "; + cmd+=TQFile::encodeName(TDEProcess::quote(itsFolders[FOLDER_SYS].location)); + } +} + +void CKioFonts::doModified() +{ + KFI_DBUG << "doModified" << endl; + + if(itsFolders[FOLDER_SYS].modified.count() || itsFolders[FOLDER_USER].modified.count()) + reparseConfig(); + + itsFontChanges=0; + if(itsFolders[FOLDER_SYS].modified.count()) + { + if(itsRoot) + { + Misc::doCmd(FC_CACHE_CMD); + KFI_DBUG << "RUN(root): " << FC_CACHE_CMD << endl; + + // + // If a non-default folder has been modified, always configure X + if(NULL==strchr(itsKfiParams, 'x') && + (itsFolders[FOLDER_SYS].modified.count()>1 || !itsFolders[FOLDER_SYS].modified.contains(itsFolders[FOLDER_SYS].location))) + { + if(0==itsKfiParams[0]) + strcpy(itsKfiParams, "-x"); + else + strcat(itsKfiParams, "x"); + } + + if(0!=itsKfiParams[0]) + { + CDirList::ConstIterator it(itsFolders[FOLDER_SYS].modified.begin()), + end(itsFolders[FOLDER_SYS].modified.end()); + + for(; it!=end; ++it) + { + Misc::doCmd("kfontinst", itsKfiParams, TQFile::encodeName(*it)); + KFI_DBUG << "RUN(root): kfontinst " << itsKfiParams << ' ' << *it << endl; + } + + if(itsFolders[FOLDER_SYS].modified.contains(itsFolders[FOLDER_SYS].location)) + { + itsHasSys=true; + itsAddToSysFc=false; + } + } + } + else + { + TQCString cmd; + + createRootRefreshCmd(cmd, itsFolders[FOLDER_SYS].modified, false); + if(doRootCmd(cmd, false) && itsFolders[FOLDER_SYS].modified.contains(itsFolders[FOLDER_SYS].location)) + { + itsHasSys=true; + itsAddToSysFc=false; + } + if(NULL==strstr(itsNrsKfiParams, "s")) + Misc::doCmd("xset", "fp", "rehash"); // doRootCmd can only refresh if xfs is being used, so try here anyway... + } + itsFolders[FOLDER_SYS].modified.clear(); + } + + if(!itsRoot && itsFolders[FOLDER_USER].modified.count()) + { + Misc::doCmd(FC_CACHE_CMD); + KFI_DBUG << "RUN(non-root): " << FC_CACHE_CMD << endl; + + if(0!=itsKfiParams[0]) + { + CDirList::ConstIterator it(itsFolders[FOLDER_USER].modified.begin()), + end(itsFolders[FOLDER_USER].modified.end()); + + for(; it!=end; ++it) + { + Misc::doCmd("kfontinst", itsKfiParams, TQFile::encodeName(*it)); + KFI_DBUG << "RUN(non-root): kfontinst " << itsKfiParams << ' ' << *it << endl; + } + } + itsFolders[FOLDER_USER].modified.clear(); + } + + KFI_DBUG << "finished ModifiedDirs" << endl; +} + +#define SYS_USER "root" +TQString CKioFonts::getRootPasswd(bool askPasswd) +{ + KFI_DBUG << "getRootPasswd" << endl; + TDEIO::AuthInfo authInfo; + SuProcess proc(SYS_USER); + bool error=false; + int attempts=0; + TQString errorMsg; + + authInfo.url=KURL(KFI_KIO_FONTS_PROTOCOL ":///"); + authInfo.username=SYS_USER; + authInfo.keepPassword=true; + + if(!checkCachedAuthentication(authInfo) && !askPasswd) + authInfo.password=itsPasswd; + + if(askPasswd) + while(!error && 0!=proc.checkInstall(authInfo.password.local8Bit())) + { + KFI_DBUG << "ATTEMPT : " << attempts << endl; + if(1==attempts) + errorMsg=i18n("Incorrect password.\n"); + if((!openPassDlg(authInfo, errorMsg) && attempts) || ++attempts>4 || SYS_USER!=authInfo.username) + error=true; + } + else + error=proc.checkInstall(authInfo.password.local8Bit()) ? true : false; + return error ? TQString::null : authInfo.password; +} + +bool CKioFonts::doRootCmd(const char *cmd, const TQString &passwd) +{ + KFI_DBUG << "doRootCmd " << cmd << endl; + + if(!passwd.isEmpty()) + { + SuProcess proc(SYS_USER); + + if(itsCanStorePasswd) + itsPasswd=passwd; + + KFI_DBUG << "Try to run command" << endl; + proc.setCommand(cmd); + return proc.exec(passwd.local8Bit()) ? false : true; + } + + return false; +} + +bool CKioFonts::confirmUrl(KURL &url) +{ + KFI_DBUG << "confirmUrl " << url.path() << endl; + if(!itsRoot) + { + TQString sect(getSect(url.path())); + + if(!isSysFolder(sect) && !isUserFolder(sect)) + { + bool changeToSystem=false; + + if(DEST_UNCHANGED!=itsLastDest && itsLastDestTime && (abs(time(NULL)-itsLastDestTime) < constMaxLastDestTime)) + changeToSystem=DEST_SYS==itsLastDest; + else + changeToSystem=KMessageBox::No==messageBox(QuestionYesNo, + i18n("Do you wish to install the font into \"%1\" (in which " + "case the font will only be usable by you), or \"%2\" (" + "the font will be usable by all users - but you will " + "need to know the administrator's password)?") + .arg(i18n(KFI_KIO_FONTS_USER)).arg(i18n(KFI_KIO_FONTS_SYS)), + i18n("Where to Install"), i18n(KFI_KIO_FONTS_USER), + i18n(KFI_KIO_FONTS_SYS)); + + if(changeToSystem) + { + itsLastDest=DEST_SYS; + url.setPath(TQChar('/')+i18n(KFI_KIO_FONTS_SYS)+TQChar('/')+url.fileName()); + } + else + { + itsLastDest=DEST_USER; + url.setPath(TQChar('/')+i18n(KFI_KIO_FONTS_USER)+TQChar('/')+url.fileName()); + } + + KFI_DBUG << "Changed URL to:" << url.path() << endl; + return true; + } + } + + return false; +} + +void CKioFonts::clearFontList() +{ + KFI_DBUG << "clearFontList" << endl; + + if(itsFontList) + FcFontSetDestroy(itsFontList); + + itsFontList=NULL; + itsFolders[FOLDER_SYS].fontMap.clear(); + itsFolders[FOLDER_USER].fontMap.clear(); +} + +bool CKioFonts::updateFontList() +{ + KFI_DBUG << "updateFontList" << endl; + + if(!itsFontList || !FcConfigUptoDate(0) || // For some reason just the "!FcConfigUptoDate(0)" check does not always work :-( + (abs(time(NULL)-itsLastFcCheckTime)>constMaxFcCheckTime)) + { + FcInitReinitialize(); + clearFontList(); + } + + if(!itsFontList) + { + KFI_DBUG << "updateFontList - update list of fonts " << endl; + + itsLastFcCheckTime=time(NULL); + + FcPattern *pat = FcPatternCreate(); + FcObjectSet *os = FcObjectSetBuild(FC_FILE, FC_FAMILY, FC_WEIGHT, FC_SCALABLE, +#ifdef KFI_FC_HAS_WIDTHS + FC_WIDTH, +#endif + FC_SLANT, (void*)0); + + itsFontList=FcFontList(0, pat, os); + + FcPatternDestroy(pat); + FcObjectSetDestroy(os); + + if (itsFontList) + { + TQString home(Misc::dirSyntax(TQDir::homeDirPath())); + + for (int i = 0; i < itsFontList->nfont; i++) + { + EFolder folder=FOLDER_SYS; + TQString file(Misc::fileSyntax(CFcEngine::getFcString(itsFontList->fonts[i], FC_FILE))); + + if(!file.isEmpty()) + { + if(!itsRoot && 0==file.find(home)) + folder=FOLDER_USER; + + TQValueList &patterns= + itsFolders[folder].fontMap[CFcEngine::createName(itsFontList->fonts[i])]; + bool use=true; + + if(patterns.count()) // Check for duplicates... + { + TQValueList::Iterator it, + end=patterns.end(); + + for(it=patterns.begin(); use && it!=end; ++it) + if(file==(Misc::fileSyntax(CFcEngine::getFcString(*it, FC_FILE)))) + use=false; + } + if(use) + patterns.append(itsFontList->fonts[i]); + } + } + } + } + + if(NULL==itsFontList) + { + error(TDEIO::ERR_SLAVE_DEFINED, i18n("Internal fontconfig error.")); + return false; + } + + return true; +} + +CKioFonts::EFolder CKioFonts::getFolder(const KURL &url) +{ + return itsRoot || isSysFolder(getSect(url.path())) ? FOLDER_SYS : FOLDER_USER; +} + +TQMap >::Iterator CKioFonts::getMap(const KURL &url) +{ + EFolder folder(getFolder(url)); + TQMap >::Iterator it=itsFolders[folder].fontMap.find(removeMultipleExtension(url)); + + if(it==itsFolders[folder].fontMap.end()) // Perhaps it was fonts:/System/times.ttf ??? + { + FcPattern *pat=getEntry(folder, url.fileName(), false); + + if(pat) + it=itsFolders[folder].fontMap.find(CFcEngine::createName(pat)); + } + + return it; +} + +TQValueList * CKioFonts::getEntries(const KURL &url) +{ + TQMap >::Iterator it=getMap(url); + + if(it!=itsFolders[getFolder(url)].fontMap.end()) + return &(it.data()); + + error(TDEIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\".").arg(url.prettyURL())); + return NULL; +} + +FcPattern * CKioFonts::getEntry(EFolder folder, const TQString &file, bool full) +{ + TQMap >::Iterator it, + end=itsFolders[folder].fontMap.end(); + + for(it=itsFolders[folder].fontMap.begin(); it!=end; ++it) + { + TQValueList::Iterator patIt, + patEnd=it.data().end(); + + for(patIt=it.data().begin(); patIt!=patEnd; ++patIt) + if( (full && CFcEngine::getFcString(*patIt, FC_FILE)==file) || + (!full && Misc::getFile(CFcEngine::getFcString(*patIt, FC_FILE))==file)) + return *patIt; + } + + return NULL; +} + +bool CKioFonts::checkFile(const TQString &file) +{ + TQCString cFile(TQFile::encodeName(file)); + + // + // To speed things up, check the files extension 1st... + if(checkExt(cFile, "ttf") || checkExt(cFile, "otf") || checkExt(cFile, "ttc") || checkExt(cFile, "pfa") || checkExt(cFile, "pfb") || + isAAfm(file) || isAPfm(file)) + return true; + + // + // No exension match, so try querying with FreeType... + int count=0; + FcPattern *pat=FcFreeTypeQuery((const FcChar8 *)(TQFile::encodeName(file).data()), 0, NULL, &count); + + if(pat) + { + FcPatternDestroy(pat); + return true; + } + + error(TDEIO::ERR_SLAVE_DEFINED, i18n("

    Only fonts may be installed.

    If installing a fonts package (*%1), then " + "extract the components, and install individually.

    ").arg(constMultipleExtension)); + return false; +} + +bool CKioFonts::getSourceFiles(const KURL &src, TQStringList &files) +{ + if(KFI_KIO_FONTS_PROTOCOL==src.protocol()) + { + TQValueList *entries=getEntries(src); + + if(entries && entries->count()) + { + TQValueList::Iterator it, + end=entries->end(); + + for(it=entries->begin(); it!=end; ++it) + files.append(CFcEngine::getFcString(*it, FC_FILE)); + } + + if(files.count()) + { + TQStringList::Iterator sIt, + sEnd=files.end(); + + for(sIt=files.begin(); sIt!=sEnd; ++sIt) + { + KURL::List urls; + + Misc::getAssociatedUrls(KURL(*sIt), urls); + + if(urls.count()) + { + KURL::List::Iterator uIt, + uEnd=urls.end(); + + for(uIt=urls.begin(); uIt!=uEnd; ++uIt) + if(-1==files.findIndex((*uIt).path())) + files.append((*uIt).path()); + } + } + } + } + else + if(src.isLocalFile()) + if(checkFile(src.path())) + files.append(src.path()); + else + return false; // error logged in checkFile... + + if(files.count()) + { + TQStringList::Iterator it, + end=files.end(); + + for(it=files.begin(); it!=end; ++it) + { + TQCString realSrc=TQFile::encodeName(*it); + KDE_struct_stat buffSrc; + + if (-1==KDE_stat(realSrc.data(), &buffSrc)) + { + error(EACCES==errno ? TDEIO::ERR_ACCESS_DENIED : TDEIO::ERR_DOES_NOT_EXIST, src.prettyURL()); + return false; + } + if(S_ISDIR(buffSrc.st_mode)) + { + error(TDEIO::ERR_IS_DIRECTORY, src.prettyURL()); + return false; + } + if(S_ISFIFO(buffSrc.st_mode) || S_ISSOCK(buffSrc.st_mode)) + { + error(TDEIO::ERR_CANNOT_OPEN_FOR_READING, src.prettyURL()); + return false; + } + } + } + else + { + error(TDEIO::ERR_DOES_NOT_EXIST, src.prettyURL()); + return false; + } + + return true; +} + +bool CKioFonts::checkDestFile(const KURL &src, const KURL &dest, EFolder destFolder, bool overwrite) +{ + if(!overwrite && (Misc::fExists(itsFolders[destFolder].location+src.fileName()) || + Misc::fExists(itsFolders[destFolder].location+modifyName(src.fileName())) ) ) + { + error(TDEIO::ERR_FILE_ALREADY_EXIST, dest.prettyURL()); + return false; + } + + return true; +} + +bool CKioFonts::checkDestFiles(const KURL &src, TQMap &map, const KURL &dest, EFolder destFolder, bool overwrite) +{ + // + // Check whether files exist at destination... + // + if(dest.protocol()==src.protocol() && + dest.directory()==src.directory()) // Check whether confirmUrl changed a "cp fonts:/System fonts:/" + // to "cp fonts:/System fonts:/System" + { + error(TDEIO::ERR_FILE_ALREADY_EXIST, dest.prettyURL()); + return false; + } + + if(!overwrite) + { + TQMap::Iterator fIt(map.begin()), + fEnd(map.end()); + + for(; fIt!=fEnd; ++fIt) + if(NULL!=getEntry(destFolder, fIt.data()) || NULL!=getEntry(destFolder, modifyName(fIt.data()))) + { + error(TDEIO::ERR_FILE_ALREADY_EXIST, dest.prettyURL()); + return false; + } + } + + return true; +} + +// +// Gather the number and names of the font faces located in "files". If there is more than 1 face +// (such as there would be for a TTC font), then ask the user for confirmation of the action. +bool CKioFonts::confirmMultiple(const KURL &url, const TQStringList &files, EFolder folder, EOp op) +{ + if(KFI_KIO_FONTS_PROTOCOL!=url.protocol()) + return true; + + TQStringList::ConstIterator it, + end=files.end(); + TQStringList fonts; + + for(it=files.begin(); it!=files.end(); ++it) + { + FcPattern *pat=getEntry(folder, *it, false); + + if(pat) + { + TQString name(CFcEngine::createName(pat)); + + if(-1==fonts.findIndex(name)) + fonts.append(name); + } + } + + if(fonts.count()>1) + { + TQString out; + TQStringList::Iterator it, + end=fonts.end(); + + for(it=fonts.begin(); it!=end; ++it) + out+=TQString("
  • ")+*it+TQString("
  • "); + + if(KMessageBox::No==messageBox(QuestionYesNo, + OP_MOVE==op + ? i18n("

    This font is located in a file alongside other fonts; in order " + "to proceed with the moving they will all have to be moved. " + "The other affected fonts are:

      %1

    \n Do you wish to " + "move all of these?

    ").arg(out) + : OP_COPY==op + ? i18n("

    This font is located in a file alongside other fonts; in order " + "to proceed with the copying they will all have to be copied. " + "The other affected fonts are:

      %1

    \n Do you wish to " + "copy all of these?

    ").arg(out) + : i18n("

    This font is located in a file alongside other fonts; in order " + "to proceed with the deleting they will all have to be deleted. " + "The other affected fonts are:

      %1

    \n Do you wish to " + "delete all of these?

    ").arg(out))) + { + error(TDEIO::ERR_USER_CANCELED, url.prettyURL()); + return false; + } + } + + return true; +} + +bool CKioFonts::confirmMultiple(const KURL &url, TQValueList *patterns, EFolder folder, EOp op) +{ + if(KFI_KIO_FONTS_PROTOCOL!=url.protocol()) + return true; + + TQStringList files; + + if(patterns && patterns->count()) + { + TQValueList::Iterator it, + end=patterns->end(); + + for(it=patterns->begin(); it!=end; ++it) + files.append(CFcEngine::getFcString(*it, FC_FILE)); + } + + return confirmMultiple(url, files, folder, op); +} + +bool CKioFonts::checkUrl(const KURL &u, bool rootOk) +{ + if(KFI_KIO_FONTS_PROTOCOL==u.protocol() && (!rootOk || (rootOk && "/"!=u.path()))) + { + TQString sect(getSect(u.path())); + + if(itsRoot) + { + if((isSysFolder(sect) || isUserFolder(sect)) && + (itsFolders[FOLDER_SYS].fontMap.end()==itsFolders[FOLDER_SYS].fontMap.find(sect))) +//CPD: TODO: || it has a font specified! e.g. fonts:/System/Times -> even in have a fonts:/System font, redirect +//should still happen + { + redirection(getRedirect(u)); + finished(); + return false; + } + } + else + if(!isSysFolder(sect) && !isUserFolder(sect)) + { + error(TDEIO::ERR_SLAVE_DEFINED, i18n("Please specify \"%1\" or \"%2\".") + .arg(i18n(KFI_KIO_FONTS_USER)).arg(i18n(KFI_KIO_FONTS_SYS))); + return false; + } + } + + return true; +} + +bool CKioFonts::checkAllowed(const KURL &u) +{ + if (KFI_KIO_FONTS_PROTOCOL==u.protocol()) + { + TQString ds(Misc::dirSyntax(u.path())); + + if(ds==TQString(TQChar('/')+i18n(KFI_KIO_FONTS_USER)+TQChar('/')) || + ds==TQString(TQChar('/')+i18n(KFI_KIO_FONTS_SYS)+TQChar('/')) || + ds==TQString(TQChar('/')+TQString::fromLatin1(KFI_KIO_FONTS_USER)+TQChar('/')) || + ds==TQString(TQChar('/')+TQString::fromLatin1(KFI_KIO_FONTS_SYS)+TQChar('/'))) + { + error(TDEIO::ERR_SLAVE_DEFINED, i18n("Sorry, you cannot rename, move, copy, or delete either \"%1\" or \"%2\".") + .arg(i18n(KFI_KIO_FONTS_USER)).arg(i18n(KFI_KIO_FONTS_SYS))); \ + return false; + } + } + + return true; +} + +// +// Create an AFM from a Type 1 (pfa/pfb) font and its PFM file... +void CKioFonts::createAfm(const TQString &file, bool nrs, const TQString &passwd) +{ + if(nrs && passwd.isEmpty()) + return; + + bool type1=isAType1(file), + pfm=!type1 && isAPfm(file); // No point checking if is pfm if its a type1 + + if(type1 || pfm) + { + TQString afm=getMatch(file, "afm"); // pf2afm wants files with lowercase extension, so just check for lowercase! + // -- when a font is installed, the extensio is converted to lowercase anyway... + + if(afm.isEmpty()) // No point creating if AFM already exists! + { + TQString pfm, + t1; + + if(type1) // Its a Type1, so look for existing PFM + { + pfm=getMatch(file, "pfm"); + t1=file; + } + else // Its a PFM, so look for existing Type1 + { + t1=getMatch(file, "pfa"); + if(t1.isEmpty()) + t1=getMatch(file, "pfb"); + pfm=file; + } + + if(!t1.isEmpty() && !pfm.isEmpty()) // Do we have both Type1 and PFM? + { + TQString name(t1.left(t1.length()-4)); // pf2afm wants name without extension... + + if(nrs) + { + TQCString cmd("pf2afm "); + cmd+=TQFile::encodeName(TDEProcess::quote(name)); + doRootCmd(cmd, passwd); + } + else + Misc::doCmd("pf2afm", TQFile::encodeName(name)); + } + } + } +} + +void CKioFonts::reparseConfig() +{ + KFI_DBUG << "reparseConfig" << endl; + + itsKfiParams[0]=0; + if(!itsRoot) + { + itsNrsKfiParams[0]=0; + itsNrsNonMainKfiParams[0]=0; + } + + if(itsRoot) + { + TDEConfig cfg(KFI_ROOT_CFG_FILE); + bool doX=cfg.readBoolEntry(KFI_CFG_X_KEY, KFI_DEFAULT_CFG_X), + doGs=cfg.readBoolEntry(KFI_CFG_GS_KEY, KFI_DEFAULT_CFG_GS); + + if(doX || !doGs) + { + strcpy(itsKfiParams, doGs ? "-g" : "-"); + if(doX) + { + if(!itsUsingXfsFpe) + strcat(itsKfiParams, "r"); + + if(!itsUsingFcFpe) + { + strcat(itsKfiParams, itsUsingXfsFpe ? "sx" : "x"); + if(!itsHasSys) + strcat(itsKfiParams, "a"); + } + } + } + } + else + { + TDEConfig rootCfg(KFI_ROOT_CFG_FILE); + bool rootDoX=rootCfg.readBoolEntry(KFI_CFG_X_KEY, KFI_DEFAULT_CFG_X), + rootDoGs=rootCfg.readBoolEntry(KFI_CFG_GS_KEY, KFI_DEFAULT_CFG_GS); + + strcpy(itsNrsKfiParams, "-"); + + if(rootDoX || rootDoGs) + { + strcpy(itsNrsKfiParams, "-"); + strcpy(itsNrsNonMainKfiParams, "-"); + + if(rootDoGs) + { + strcpy(itsNrsKfiParams, "g"); + strcpy(itsNrsNonMainKfiParams, "g"); + } + + if(rootDoX && !itsUsingFcFpe) + { + strcat(itsNrsKfiParams, itsUsingXfsFpe ? "sx" : "x"); // Can't get root to refresh X, only xfs! + strcat(itsNrsNonMainKfiParams, itsUsingXfsFpe ? "sx" : "x"); + if(!itsHasSys) + strcat(itsNrsKfiParams, "a"); + } + if(0==itsNrsNonMainKfiParams[1]) + itsNrsNonMainKfiParams[0]=0; + } + + if(itsAddToSysFc) + strcpy(itsNrsKfiParams, "f"); + + if(0==itsNrsKfiParams[1]) + itsNrsKfiParams[0]=0; + + TDEConfig cfg(KFI_CFG_FILE); + bool doX=cfg.readBoolEntry(KFI_CFG_X_KEY, KFI_DEFAULT_CFG_X), + doGs=cfg.readBoolEntry(KFI_CFG_GS_KEY, KFI_DEFAULT_CFG_GS); + + strcpy(itsKfiParams, doGs ? "-g" : "-"); + + if(doX) + strcat(itsKfiParams, itsUsingFcFpe ? "r" : "rx"); + } + + if(0==itsKfiParams[1]) + itsKfiParams[0]=0; +} + +} diff --git a/kcontrol/kfontinst/tdeio/KioFonts.h b/kcontrol/kfontinst/tdeio/KioFonts.h new file mode 100644 index 000000000..ec8c69c4e --- /dev/null +++ b/kcontrol/kfontinst/tdeio/KioFonts.h @@ -0,0 +1,161 @@ +#ifndef __KIO_FONTS_H__ +#define __KIO_FONTS_H__ + +//////////////////////////////////////////////////////////////////////////////// +// +// Class Name : KFI::CKioFonts +// Author : Craig Drummond +// Project : K Font Installer +// Creation Date : 05/03/2003 +// Version : $Revision$ $Date$ +// +//////////////////////////////////////////////////////////////////////////////// +// +// 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. +// +// 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. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +//////////////////////////////////////////////////////////////////////////////// +// (C) Craig Drummond, 2003, 2004 +//////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Misc.h" +#include "KfiConstants.h" + +namespace KFI +{ + +class CKioFonts : public TDEIO::SlaveBase +{ + private: + + enum EConstants + { + KFI_PARAMS = 8 + }; + + enum EDest + { + DEST_UNCHANGED, + DEST_SYS, + DEST_USER + }; + + enum EFolder + { + FOLDER_SYS, + FOLDER_USER, + + FOLDER_COUNT + }; + + enum EOp + { + OP_COPY, + OP_MOVE, + OP_DELETE + }; + + class CDirList : public TQStringList + { + public: + + CDirList() { } + CDirList(const TQString &str) : TQStringList(str) { } + + void add(const TQString &d) { if ( contains(d)) append(d); } + }; + + struct TFolder + { + TQString location; + CDirList modified; + TQMap > fontMap; // Maps from "Times New Roman" -> $HOME/.fonts/times.ttf + }; + + public: + + CKioFonts(const TQCString &pool, const TQCString &app); + virtual ~CKioFonts(); + + static TQString getSect(const TQString &f) { return f.section('/', 1, 1); } + + void listDir(const KURL &url); + void stat(const KURL &url); + bool createStatEntry(TDEIO::UDSEntry &entry, const KURL &url, EFolder folder); + void get(const KURL &url); + void put(const KURL &url, int mode, bool overwrite, bool resume); + void copy(const KURL &src, const KURL &dest, int mode, bool overwrite); + void rename(const KURL &src, const KURL &dest, bool overwrite); + void del(const KURL &url, bool isFile); + + private: + + bool putReal(const TQString &destOrig, const TQCString &destOrigC, bool origExists, int mode, bool resume); + void modified(EFolder folder, bool clearList=true, const CDirList &dirs=CDirList()); + void special(const TQByteArray &a); + void createRootRefreshCmd(TQCString &cmd, const CDirList &dirs=CDirList(), bool reparseCfg=true); + void doModified(); + TQString getRootPasswd(bool askPasswd=true); + bool doRootCmd(const char *cmd, const TQString &passwd); + bool doRootCmd(const char *cmd, bool askPasswd=true) { return doRootCmd(cmd, getRootPasswd(askPasswd)); } + bool confirmUrl(KURL &url); + void clearFontList(); + bool updateFontList(); + EFolder getFolder(const KURL &url); + TQMap >::Iterator getMap(const KURL &url); + TQValueList * getEntries(const KURL &url); + FcPattern * getEntry(EFolder folder, const TQString &file, bool full=false); + bool checkFile(const TQString &file); + bool getSourceFiles(const KURL &src, TQStringList &files); + bool checkDestFile(const KURL &src, const KURL &dest, EFolder destFolder, bool overwrite); + bool checkDestFiles(const KURL &src, TQMap &map, const KURL &dest, EFolder destFolder, bool overwrite); + bool confirmMultiple(const KURL &url, const TQStringList &files, EFolder folder, EOp op); + bool confirmMultiple(const KURL &url, TQValueList *patterns, EFolder folder, EOp op); + bool checkUrl(const KURL &u, bool rootOk=false); + bool checkAllowed(const KURL &u); + void createAfm(const TQString &file, bool nrs=false, const TQString &passwd=TQString::null); + void reparseConfig(); + + private: + + bool itsRoot, + itsCanStorePasswd, + itsUsingFcFpe, + itsUsingXfsFpe, + itsHasSys, + itsAddToSysFc; + TQString itsPasswd; + unsigned int itsFontChanges; + EDest itsLastDest; + time_t itsLastDestTime, + itsLastFcCheckTime; + FcFontSet *itsFontList; + TFolder itsFolders[FOLDER_COUNT]; + char itsNrsKfiParams[KFI_PARAMS], + itsNrsNonMainKfiParams[KFI_PARAMS], + itsKfiParams[KFI_PARAMS]; +}; + +} + +#endif diff --git a/kcontrol/kfontinst/tdeio/Makefile.am b/kcontrol/kfontinst/tdeio/Makefile.am new file mode 100644 index 000000000..9f59e28b8 --- /dev/null +++ b/kcontrol/kfontinst/tdeio/Makefile.am @@ -0,0 +1,20 @@ +kde_module_LTLIBRARIES = tdeio_fonts.la +tdeio_fonts_la_SOURCES = \ +KioFonts.cpp + +tdeio_fonts_la_LIBADD = ../../fonts/libkxftconfig.la $(LIBFONTCONFIG_LIBS) $(LIBFREETYPE_LIBS) $(LIB_KIO) -ltdesu ../lib/libkfontinst.la +tdeio_fonts_la_LDFLAGS = $(KDE_PLUGIN) $(all_libraries) $(KDE_RPATH) $(LIBFONTCONFIG_RPATH) $(LIBFREETYPE_RPATH) -module -avoid-version -no-undefined +AM_CPPFLAGS= -I$(srcdir)/../lib -I$(srcdir)/../../fonts $(all_includes) $(LIBFREETYPE_CFLAGS) $(LIBFONTCONFIG_CFLAGS) -D_LARGEFILE64_SOURCE + +# The kxftconfig stuf really belongs to tdebase/kcontrol/fonts - here only so that can distribute this as an archive. +noinst_HEADERS = \ +KioFonts.h + +servicesdir = $(kde_servicesdir) +services_DATA = fonts.protocol + +vfsdata_DATA = fonts.desktop +vfsdatadir = $(kde_datadir)/konqsidebartng/virtual_folders/services + +mimetype_DATA = folder.desktop system-folder.desktop package.desktop +mimetypedir = $(kde_mimedir)/fonts diff --git a/kcontrol/kfontinst/tdeio/folder.desktop b/kcontrol/kfontinst/tdeio/folder.desktop new file mode 100644 index 000000000..848feabe5 --- /dev/null +++ b/kcontrol/kfontinst/tdeio/folder.desktop @@ -0,0 +1,80 @@ +[Desktop Entry] +Comment=Fonts Folder +Comment[af]=Skrif tipe Gids +Comment[ar]=مجلد المحارف +Comment[be]=Тэчка шрыфтоў +Comment[bg]=Директория за шрифтове +Comment[bn]=ফন্ট ফোল্ডার +Comment[br]=Renkell ar fontoù +Comment[bs]=Direktorij sa fontovima +Comment[ca]=Carpeta de lletres +Comment[cs]=Složka písem +Comment[csb]=Katalog fòntów +Comment[da]=Skrifttypemappe +Comment[de]=Ordner für Schriftarten +Comment[el]=Φάκελος γραμματοσειρών +Comment[eo]=Tipardosierujo +Comment[es]=Carpeta de tipos de letra +Comment[et]=Fontide kataloog +Comment[eu]=Letra-tipoen karpeta +Comment[fa]=پوشۀ قلم +Comment[fi]=Kirjasinkansio +Comment[fr]=Dossier de polices de caractères +Comment[fy]=Lettertypenmap +Comment[ga]=Fillteán na gClónna +Comment[gl]=Cartafol das Fontes +Comment[he]=תיקיית גופנים +Comment[hi]=फ़ॉन्ट्स फ़ोल्डर +Comment[hr]=Mapa fontova +Comment[hu]=Betűtípuskönyvtár +Comment[id]=Folder Fonts +Comment[is]=Leturmappa +Comment[it]=Cartella dei caratteri +Comment[ja]=フォントフォルダ +Comment[ka]=ფონტების საქაღალდე +Comment[kk]=Қаріп қапшығы +Comment[km]=ថត​ពុម្ពអក្សរ +Comment[ko]=홈 폴더 +Comment[lt]=Šriftų aplankas +Comment[lv]=Fontu mape +Comment[mk]=Папка со фонтови +Comment[ms]=Folder Fon +Comment[mt]=Direttorju tal-fonts +Comment[nb]=Mappe for skrifttyper +Comment[nds]=Schriftoorden-Orner +Comment[ne]=फन्ट फोल्डर +Comment[nl]=Lettertypenmap +Comment[nn]=Skriftmappe +Comment[pa]=ਫੋਂਟ ਫੋਲਡਰ +Comment[pl]=Katalog czcionek +Comment[pt]=Pasta de Tipos de Letra +Comment[pt_BR]=Pasta de Fontes +Comment[ro]=Folder de fonturi +Comment[ru]=Папка шрифтов +Comment[rw]=Ububiko bw'Imyandikire +Comment[se]=Fontamáhppa +Comment[sk]=Priečinok písiem +Comment[sl]=Mapa za pisave +Comment[sr]=Фасцикла за фонтове +Comment[sr@Latn]=Fascikla za fontove +Comment[sv]=Teckensnittskatalog +Comment[ta]=எழுத்துருக்கள் அடைவு +Comment[tg]=Феҳристи ҳарфҳо +Comment[th]=โฟลเดอร์แฟ้มแบบอักษร +Comment[tr]=Yazıtipi Klasörü +Comment[tt]=Yazu lar Törgäge +Comment[uk]=Тека шрифтів +Comment[uz]=Shriftlarning jildi +Comment[uz@cyrillic]=Шрифтларнинг жилди +Comment[vi]=Thư mục Phông chữ +Comment[wa]=Ridant di fontes +Comment[zh_CN]=字体文件夹 +Comment[zh_TW]=字型資料夾 +Icon=folder +Type=MimeType +MimeType=fonts/folder +Patterns= + +X-TDE-AutoEmbed=true +X-TDE-IsAlso=inode/directory + diff --git a/kcontrol/kfontinst/tdeio/fonts.desktop b/kcontrol/kfontinst/tdeio/fonts.desktop new file mode 100644 index 000000000..ac0f592cf --- /dev/null +++ b/kcontrol/kfontinst/tdeio/fonts.desktop @@ -0,0 +1,85 @@ +[Desktop Entry] +Type=Link +URL=fonts:/ +Icon=fonts +Name=Fonts +Name[af]=Skriftipes +Name[ar]=المحارف +Name[az]=Yazı növləri +Name[be]=Шрыфты +Name[bg]=Шрифтове +Name[bn]=ফন্ট +Name[br]=Fontoù +Name[bs]=Fontovi +Name[ca]=Lletres +Name[cs]=Písma +Name[csb]=Fòntë +Name[cy]=Ffontiau +Name[da]=Skrifttyper +Name[de]=Schriftarten +Name[el]=Γραμματοσειρές +Name[eo]=Tiparoj +Name[es]=Tipos de letra +Name[et]=Fondid +Name[eu]=Letra-tipoak +Name[fa]=قلمها +Name[fi]=Kirjasimet +Name[fr]=Polices +Name[fy]=Lettertypen +Name[ga]=Clónna +Name[gl]=Fontes +Name[he]=גופנים +Name[hi]=फ़ॉन्ट्स +Name[hr]=Fontovi +Name[hu]=Betűtípusok +Name[is]=Letur +Name[it]=Tipi di carattere +Name[ja]=フォント +Name[ka]=ფონტები +Name[kk]=Қаріптер +Name[km]=ពុម្ពអក្សរ +Name[ko]=글꼴 +Name[lo]=ຮູບແບບຕົວອັກສອນ +Name[lt]=Šriftai +Name[lv]=Fonti +Name[mk]=Фонтови +Name[mn]=Бичгүүд +Name[ms]=Fon +Name[nb]=Skrifttype +Name[nds]=Schriftoorden +Name[ne]=फन्ट +Name[nl]=Lettertypen +Name[nn]=Skrifttypar +Name[nso]=Difonto +Name[pa]=ਫੋਂਟ +Name[pl]=Czcionki +Name[pt]=Tipos de Letra +Name[pt_BR]=Fontes +Name[ro]=Fonturi +Name[ru]=Шрифты +Name[rw]=Imyandikire +Name[se]=Fonttat +Name[sk]=Písma +Name[sl]=Pisave +Name[sr]=Фонтови +Name[sr@Latn]=Fontovi +Name[ss]=Timo tetinhlamvu temagama +Name[sv]=Teckensnitt +Name[ta]=எழுத்துருக்கள் +Name[tg]=Ҳарфҳо +Name[th]=แบบอักษร +Name[tr]=Yazıtipleri +Name[tt]=Yazu +Name[uk]=Шрифти +Name[uz]=Shriftlar +Name[uz@cyrillic]=Шрифтлар +Name[ven]=Fontu +Name[vi]=Phông chữ +Name[wa]=Fontes +Name[xh]=Uhlobo lwamagama +Name[zh_CN]=字体 +Name[zh_TW]=字型 +Name[zu]=Izinhlobo zamagama +Open=false +X-TDE-TreeModule=Directory +X-TDE-KonqSidebarModule=konqsidebar_tree diff --git a/kcontrol/kfontinst/tdeio/fonts.protocol b/kcontrol/kfontinst/tdeio/fonts.protocol new file mode 100644 index 000000000..02e5e5f29 --- /dev/null +++ b/kcontrol/kfontinst/tdeio/fonts.protocol @@ -0,0 +1,18 @@ +[Protocol] +exec=tdeio_fonts +protocol=fonts +input=none +output=filesystem +listing=Name,Type,Size,Date,AccessDate,Access,Owner,Group,Link +reading=true +writing=true +makedir=false +deleting=true +moving=true +linking=false +copyToFile=false +copyFromFile=true +Icon=fonts +defaultMimetype=application/octet-stream +maxInstances=1 +Class=:local diff --git a/kcontrol/kfontinst/tdeio/package.desktop b/kcontrol/kfontinst/tdeio/package.desktop new file mode 100644 index 000000000..2d2e1e4af --- /dev/null +++ b/kcontrol/kfontinst/tdeio/package.desktop @@ -0,0 +1,74 @@ +[Desktop Entry] +Type=MimeType +MimeType=fonts/package +Icon=font +Patterns=*.fonts.tar.gz +Comment=Fonts Package +Comment[af]=Skriftipes Paket +Comment[ar]=حزمة المحارف +Comment[be]=Пакет шрыфтоў +Comment[bg]=Пакет с шрифтове +Comment[bn]=ফন্ট প্যাকেজ +Comment[bs]=Paket fontova +Comment[ca]=Paquet de lletres +Comment[cs]=Balík písem +Comment[csb]=Paczét fòntów +Comment[da]=Skrifttypepakke +Comment[de]=Schriftartenpaket +Comment[el]=Πακέτο γραμματοσειρών +Comment[eo]=Tiparpakaĵo +Comment[es]=Paquete de tipos de letra +Comment[et]=Fondipakett +Comment[eu]=Letra-tipoen paketea +Comment[fa]=بستۀ قلمها +Comment[fi]=Kirjasinpaketti +Comment[fr]=Paquet de polices +Comment[fy]=Lettertypenpakket +Comment[ga]=Pacáiste na gClónna +Comment[gl]=Pacote das Fontes +Comment[he]=חבילת גופנים +Comment[hr]=Paket fontova +Comment[hu]=Betűtípuscsomag +Comment[id]=Paket Font +Comment[is]=Leturpakki +Comment[it]=Pacchetto tipi di caratteri +Comment[ja]=フォントパッケージ +Comment[ka]=შრიფტების პაკეტი +Comment[kk]=Қаріп дестесі +Comment[km]=កញ្ចប់​ពុម្ពអក្សរ +Comment[lt]=Šriftų paketas +Comment[mk]=Пакет со фонтови +Comment[ms]=Pakej Fon +Comment[nb]=Pakke for skrifttyper +Comment[nds]=Schriftoorden-Paket +Comment[ne]=फन्ट प्याकेज +Comment[nl]=Lettertypenpakket +Comment[nn]=Pakke for skrifter +Comment[pa]=ਫੋਂਟ ਪੈਕੇਜ +Comment[pl]=Pakiet czcionek +Comment[pt]=Pacote de Tipos de Letra +Comment[pt_BR]=Pacote de Fontes +Comment[ro]=Pachet de fonturi +Comment[ru]=Пакет шрифтов +Comment[rw]=Rukomatanya y'Imyandikire +Comment[se]=Fontapáhkka +Comment[sk]=Balík písiem +Comment[sl]=Paket pisav +Comment[sr]=Пакет фонтова +Comment[sr@Latn]=Paket fontova +Comment[sv]=Teckensnittspaket +Comment[tg]=Бастаи ҳарфҳо +Comment[th]=แพคเกจแบบอักษร +Comment[tr]=Yazıtipi Paketi +Comment[tt]=Yazular Tuplaması +Comment[uk]=Пакунок шрифтів +Comment[uz]=Shrift +Comment[uz@cyrillic]=Шрифт +Comment[vi]=Gói Phông chữ +Comment[wa]=Paket di fontes +Comment[zh_CN]=字体包 +Comment[zh_TW]=字型套件 + +[Property::X-TDE-LocalProtocol] +Type=TQString +Value=tar diff --git a/kcontrol/kfontinst/tdeio/system-folder.desktop b/kcontrol/kfontinst/tdeio/system-folder.desktop new file mode 100644 index 000000000..d2500c295 --- /dev/null +++ b/kcontrol/kfontinst/tdeio/system-folder.desktop @@ -0,0 +1,79 @@ +[Desktop Entry] +Comment=System Fonts Folder +Comment[af]=Stelsel Skrif tipe Gids +Comment[ar]=مجلد محارف النظام +Comment[be]=Тэчка сістэмных шрыфтоў +Comment[bg]=Директория за системните шрифтове +Comment[bn]=সিস্টেম ফন্ট ফোল্ডার +Comment[br]=Renkell fontoù ar reizhiad +Comment[bs]=Sistemski direktorij sa fontovima +Comment[ca]=Carpeta de lletres del sistema +Comment[cs]=Složka se systémovými písmy +Comment[csb]=Katalog systemòwëch fòntów +Comment[da]=Mappe til systemets skrifttyper +Comment[de]=Ordner für Systemschriften +Comment[el]=Φάκελος γραμματοσειρών συστήματος +Comment[eo]=Sistema tipardosierujo +Comment[es]=Carpeta de tipos de letra del sistema +Comment[et]=Süsteemi fontide kataloog +Comment[eu]=Sistemaren letra-tipoen karpeta +Comment[fa]=پوشۀ قلمهای سیستم +Comment[fi]=Järjestelmän kirjasinkansio +Comment[fr]=Dossier système de polices de caractères +Comment[fy]=Systeemlettertypenmap +Comment[ga]=Fillteán Clónna an Chórais +Comment[gl]=Cartafol das Fontes do Sistema +Comment[he]=תיקיית גופני מערכת +Comment[hi]=तंत्र फ़ॉन्ट्स फ़ोल्डर +Comment[hr]=Mapa sistemskih fontova +Comment[hu]=A rendszer betűtípusainak könyvtára +Comment[id]=Folder Font Sistem +Comment[is]=Kerfisleturmappa +Comment[it]=Cartella dei caratteri di sistema +Comment[ja]=システムフォントフォルダ +Comment[ka]=სისტემური ფონტების საქაღალდე +Comment[kk]=Жүйелік қаріптер қапшығы +Comment[km]=ថត​ពុម្ពអក្សរ​ប្រព័ន្ធ +Comment[lt]=Sistemos šriftų aplankas +Comment[lv]=Sistēmas fontu mape +Comment[mk]=Папка со системски фонтови +Comment[ms]=Folder Fon Sistem +Comment[mt]=Direttorju tal-fonts tas-sistema +Comment[nb]=Mappe for systemskrifttyper +Comment[nds]=Orner för de Systeemschriftoorden +Comment[ne]=फन्ट फोल्डर प्रणाली +Comment[nl]=Systeemlettertypenmap +Comment[nn]=Systemskriftmappe +Comment[pa]=ਸਿਸਟਮ ਫੋਂਟ ਫੋਲਡਰ +Comment[pl]=Katalog czcionek systemowych +Comment[pt]=Pasta de Tipos de Letra do Sistema +Comment[pt_BR]=Pasta de Fontes do Sistema +Comment[ro]=Folder fonturi de sistem +Comment[ru]=Папка системных шрифтов +Comment[rw]=Ububiko bw'Imyandikire Sisitemu +Comment[se]=Vuogádatfontamáhppa +Comment[sk]=Priečinok systémových písiem +Comment[sl]=Mapa za sistemske pisave +Comment[sr]=Фасцикла за системске фонтове +Comment[sr@Latn]=Fascikla za sistemske fontove +Comment[sv]=Systemteckensnittskatalog +Comment[ta]=அமைப்பு எழுத்துருக்கள் அடைவு +Comment[tg]=Системаи феҳристи ҳарфҳо +Comment[th]=โฟลเดอร์แฟ้มแบบอักษรของระบบ +Comment[tr]=Sistem Yazı Tipi Klasörü +Comment[tt]=Sistem Yazular Törgäge +Comment[uk]=Тека системних шрифтів +Comment[uz]=Tizim shriftlarining jildi +Comment[uz@cyrillic]=Тизим шрифтларининг жилди +Comment[vi]=Thư mục Phông chữ Hệ thống +Comment[wa]=Ridant di fontes do sistinme +Comment[zh_CN]=系统字体文件夹 +Comment[zh_TW]=系統字型資料夾 +Icon=folder_red +Type=MimeType +MimeType=fonts/system-folder +Patterns= + +X-TDE-AutoEmbed=true +X-TDE-IsAlso=inode/directory + -- cgit v1.2.3