summaryrefslogtreecommitdiffstats
path: root/kcontrol/kfontinst/kio/KioFonts.cpp
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-01-27 15:11:21 -0600
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-01-27 15:11:21 -0600
commit472156a41b1348c714986c772759ad950fffbe75 (patch)
tree86369dab3bbe3d52c49051665bdfb49b9dfc16e3 /kcontrol/kfontinst/kio/KioFonts.cpp
parent3e891e81335e5243583dab27faeebf001b8139a6 (diff)
downloadtdebase-472156a41b1348c714986c772759ad950fffbe75.tar.gz
tdebase-472156a41b1348c714986c772759ad950fffbe75.zip
Rename kioslaves
Diffstat (limited to 'kcontrol/kfontinst/kio/KioFonts.cpp')
-rw-r--r--kcontrol/kfontinst/kio/KioFonts.cpp2534
1 files changed, 0 insertions, 2534 deletions
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 <stdlib.h>
-#include <pwd.h>
-#include <grp.h>
-#include <sys/types.h>
-#include <utime.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <tdeio/global.h>
-#include <tdeio/ioslave_defaults.h>
-#include <tdeio/netaccess.h>
-#include <tdeio/slaveinterface.h>
-#include <tdeio/connection.h>
-#include <tqtextstream.h>
-#include <kmimetype.h>
-#include <kmessagebox.h>
-#include <kprocess.h>
-#include <tqdir.h>
-#include <tqdatastream.h>
-#include <tqregexp.h>
-#include <kinstance.h>
-#include <klargefile.h>
-#include <ktempfile.h>
-#include <tdesu/su.h>
-#include <kprocess.h>
-#include <kdebug.h>
-#include <ktar.h>
-#include <kxftconfig.h>
-#include <fontconfig/fontconfig.h>
-#include "KfiConstants.h"
-#include "FcEngine.h"
-#include "Misc.h"
-#include <X11/Xlib.h>
-#include <fixx11h.h>
-#include <ctype.h>
-
-//#define KFI_FORCE_DEBUG_TO_STDERR
-
-#ifdef KFI_FORCE_DEBUG_TO_STDERR
-
-#include <tqtextstream.h>
-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 &sect)
-{
- return i18n(KFI_KIO_FONTS_SYS)==sect || KFI_KIO_FONTS_SYS==sect;
-}
-
-inline bool isUserFolder(const TQString &sect)
-{
- 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<rvLen; ++i)
- rv[i]=rv[i].lower();
- }
-
- for(int s=0; constSymbols[s]; ++s)
- rv=rv.replace(constSymbols[s], '_');
-
- return rv;
-}
-
-static int getSize(const TQCString &file)
-{
- KDE_struct_stat buff;
-
- if(-1!=KDE_lstat(file, &buff))
- {
- if (S_ISLNK(buff.st_mode))
- {
- char buffer2[1000];
- int n=readlink(file, buffer2, 1000);
- if(n!= -1)
- buffer2[n]='\0';
-
- if(-1==KDE_stat(file, &buff))
- return -1;
- }
- return buff.st_size;
- }
-
- return -1;
-}
-
-static int getFontSize(const TQString &file)
-{
- int size=0;
-
- KURL::List urls;
- TQStringList files;
-
- Misc::getAssociatedUrls(KURL(file), urls);
-
- files.append(file);
-
- if(urls.count())
- {
- KURL::List::Iterator uIt,
- uEnd=urls.end();
-
- for(uIt=urls.begin(); uIt!=uEnd; ++uIt)
- files.append((*uIt).path());
- }
-
- TQStringList::Iterator it(files.begin()),
- end(files.end());
-
- for(; it!=end; ++it)
- {
- int s=getSize(TQFile::encodeName(*it));
-
- if(s>-1)
- size+=s;
- }
-
- return size;
-}
-
-static int getSize(TQValueList<FcPattern *> &patterns)
-{
- TQValueList<FcPattern *>::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<FcPattern *> &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<FcPattern *> sortedPatterns;
- TQValueList<FcPattern *>::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<constFontnameMax)
- ok=true;
- fclose(f);
- }
- }
-
- return ok;
-}
-
-//
-// This function is *only* used for the generation of AFMs from PFMs.
-static bool isAType1(const TQString &fname)
-{
- static const char * constStr="%!PS-AdobeFont-";
- static const unsigned int constStrLen=15;
- static const unsigned int constPfbOffset=6;
- static const unsigned int constPfbLen=constStrLen+constPfbOffset;
-
- TQCString name(TQFile::encodeName(fname));
- char buffer[constPfbLen];
- bool match=false;
-
- if(checkExt(name, "pfa"))
- {
- FILE *f=fopen(name.data(), "r");
-
- if(f)
- {
- if(constStrLen==fread(buffer, 1, constStrLen, f))
- match=0==memcmp(buffer, constStr, constStrLen);
- fclose(f);
- }
- }
- else if(checkExt(name, "pfb"))
- {
- static const char constPfbMarker=0x80;
-
- FILE *f=fopen(name.data(), "r");
-
- if(f)
- {
- if(constPfbLen==fread(buffer, 1, constPfbLen, f))
- match=buffer[0]==constPfbMarker && 0==memcmp(&buffer[constPfbOffset], constStr, constStrLen);
- fclose(f);
- }
- }
-
- return match;
-}
-
-static TQString getMatch(const TQString &file, const char *extension)
-{
- TQString f(Misc::changeExt(file, extension));
-
- return Misc::fExists(f) ? f : TQString::null;
-}
-
-inline bool isHidden(const KURL &u)
-{
- return TQChar('.')==u.fileName()[0];
-}
-
-struct FontList
-{
- struct Path
- {
- Path(const TQString &p=TQString::null) : orig(p) { }
-
- TQString orig,
- modified;
-
- bool operator==(const Path &p) const { return p.orig==orig; }
- };
-
- FontList(const TQString &n=TQString::null, const TQString &p=TQString::null) : name(n) { if(!p.isEmpty()) paths.append(Path(p)); }
-
- TQString name;
- TQValueList<Path> 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<TQString, TQString> &map)
-{
- //
- // First of all create a list of font files, and their paths
- TQStringList::ConstIterator it=files.begin(),
- end=files.end();
- TQValueList<FontList> list;
-
- for(;it!=end; ++it)
- {
- TQString name(Misc::getFile(*it)),
- path(Misc::getDir(*it));
- TQValueList<FontList>::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<FontList>::Iterator fIt(list.begin()),
- fEnd(list.end());
-
- for(; fIt!=fEnd; ++fIt)
- {
- TQValueList<FontList::Path>::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; i<len; ++i)
- if((*pIt).orig[i]!=(*pBegin).orig[i])
- {
- (*pIt).modified=(*pIt).orig.mid(i);
- (*pIt).modified=(*pIt).modified.replace('/', '_');
- if((*pBegin).modified.isEmpty())
- {
- (*pBegin).modified=(*pBegin).orig.mid(i);
- (*pBegin).modified=(*pBegin).modified.replace('/', '_');
- }
- break;
- }
- }
- }
- for(pIt=(*fIt).paths.begin(); pIt!=pEnd; ++pIt)
- map[(*pIt).orig+(*fIt).name]=(*pIt).modified+(*fIt).name;
- }
-
- return list.count() ? true : false;
-}
-
-CKioFonts::CKioFonts(const TQCString &pool, const TQCString &app)
- : TDEIO::SlaveBase(KFI_KIO_FONTS_PROTOCOL, pool, app),
- itsRoot(Misc::root()),
- itsUsingFcFpe(false),
- itsUsingXfsFpe(false),
- itsHasSys(false),
- itsAddToSysFc(false),
- itsFontChanges(0),
- itsLastDest(DEST_UNCHANGED),
- itsLastDestTime(0),
- itsLastFcCheckTime(0),
- itsFontList(NULL)
-{
- KFI_DBUG << "Constructor" << endl;
-
- // Set core dump size to 0 because we will have
- // root's password in memory.
- struct rlimit rlim;
- rlim.rlim_cur=rlim.rlim_max=0;
- itsCanStorePasswd=setrlimit(RLIMIT_CORE, &rlim) ? false : true;
-
- //
- // Check with fontconfig for folder locations...
- //
- // 1. Get list of fontconfig dirs
- // 2. For user, look for any starting with $HOME - but prefer $HOME/.fonts
- // 3. For system, look for any starting with /usr/local/share - but prefer /usr/local/share/fonts
- // 4. If either are not found, then add to local.conf / .fonts.conf
-
- FcStrList *list=FcConfigGetFontDirs(FcInitLoadConfigAndFonts());
- TQStringList dirs;
- FcChar8 *dir;
-
- while((dir=FcStrListNext(list)))
- dirs.append(Misc::dirSyntax((const char *)dir));
-
- EFolder mainFolder=FOLDER_SYS;
-
- if(!itsRoot)
- {
- TQString home(Misc::dirSyntax(TQDir::homeDirPath())),
- defaultDir(Misc::dirSyntax(TQDir::homeDirPath()+"/.fonts/")),
- dir(getFontFolder(defaultDir, home, dirs));
-
- if(dir.isEmpty()) // Then no $HOME/ was found in fontconfigs dirs!
- {
- KXftConfig xft(KXftConfig::Dirs, false);
- xft.addDir(defaultDir);
- xft.apply();
- dir=defaultDir;
- }
- mainFolder=FOLDER_USER;
- itsFolders[FOLDER_USER].location=dir;
- }
-
- TQString sysDefault("/usr/local/share/fonts/"),
- sysDir(getFontFolder(sysDefault, "/usr/local/share/", dirs));
-
- if(sysDir.isEmpty())
- {
- if(itsRoot)
- {
- KXftConfig xft(KXftConfig::Dirs, true);
- xft.addDir(sysDefault);
- xft.apply();
- }
- else
- itsAddToSysFc=true;
-
- sysDir=sysDefault;
- }
-
- itsFolders[FOLDER_SYS].location=sysDir;
-
- //
- // Ensure exists
- if(!Misc::dExists(itsFolders[mainFolder].location))
- Misc::createDir(itsFolders[mainFolder].location);
-
- //
- // Work out best params to send to kfontinst
-
- // ...determine if X already knows about the system font path...
- Display *xDisplay=XOpenDisplay(NULL);
-
- if(xDisplay)
- {
- int numPaths=0;
- char **paths=XGetFontPath(xDisplay, &numPaths);
-
- if(numPaths>0)
- for(int path=0; path<numPaths && !itsUsingFcFpe; ++path)
- if(paths[path][0]=='/')
- {
- if(Misc::dirSyntax(paths[path])==itsFolders[FOLDER_SYS].location)
- itsHasSys=true;
- }
- else
- {
- TQString str(paths[path]);
-
- str.replace(TQRegExp("\\s*"), "");
-
- if(0==str.find("unix/:"))
- itsUsingXfsFpe=true;
- else if("fontconfig"==str)
- itsUsingFcFpe=true;
- }
- XFreeFontPath(paths);
- XCloseDisplay(xDisplay);
- }
-}
-
-CKioFonts::~CKioFonts()
-{
- KFI_DBUG << "Destructor" << endl;
- doModified();
-}
-
-void CKioFonts::listDir(const KURL &url)
-{
- KFI_DBUG << "listDir " << url.path() << endl;
-
- if(updateFontList() && checkUrl(url, true))
- {
- TDEIO::UDSEntry entry;
- int size=0;
-
- if(itsRoot || TQStringList::split('/', url.path(), false).count()!=0)
- {
- EFolder folder=getFolder(url);
-
- totalSize(itsFolders[folder].fontMap.count());
- if(itsFolders[folder].fontMap.count())
- {
- TQMap<TQString, TQValueList<FcPattern *> >::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<TQString, TQValueList<FcPattern *> >::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<TQString, TQString> map;
-
- getFontList(srcFiles, map);
-
- TQMap<TQString, TQString>::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_size<config()->readNumEntry("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<TQString, TQString> 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<TQString, TQString>::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<TQString, TQString>::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<TQString, TQString> map;
-
- if(confirmMultiple(src, srcFiles, FOLDER_SYS==destFolder ? FOLDER_USER : FOLDER_SYS, OP_MOVE) &&
- getFontList(srcFiles, map) &&
- checkDestFiles(src, map, dest, destFolder, overwrite))
- {
- TQMap<TQString, TQString>::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<FcPattern *> *entries;
-
- if(checkUrl(url) && checkAllowed(url) &&
- updateFontList() && (entries=getEntries(url)) && entries->count() &&
- confirmMultiple(url, entries, getFolder(url), OP_DELETE))
- {
- TQValueList<FcPattern *>::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<FcPattern *> &patterns=
- itsFolders[folder].fontMap[CFcEngine::createName(itsFontList->fonts[i])];
- bool use=true;
-
- if(patterns.count()) // Check for duplicates...
- {
- TQValueList<FcPattern *>::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<TQString, TQValueList<FcPattern *> >::Iterator CKioFonts::getMap(const KURL &url)
-{
- EFolder folder(getFolder(url));
- TQMap<TQString, TQValueList<FcPattern *> >::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<FcPattern *> * CKioFonts::getEntries(const KURL &url)
-{
- TQMap<TQString, TQValueList<FcPattern *> >::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<TQString, TQValueList<FcPattern *> >::Iterator it,
- end=itsFolders[folder].fontMap.end();
-
- for(it=itsFolders[folder].fontMap.begin(); it!=end; ++it)
- {
- TQValueList<FcPattern *>::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("<p>Only fonts may be installed.</p><p>If installing a fonts package (*%1), then "
- "extract the components, and install individually.</p>").arg(constMultipleExtension));
- return false;
-}
-
-bool CKioFonts::getSourceFiles(const KURL &src, TQStringList &files)
-{
- if(KFI_KIO_FONTS_PROTOCOL==src.protocol())
- {
- TQValueList<FcPattern *> *entries=getEntries(src);
-
- if(entries && entries->count())
- {
- TQValueList<FcPattern *>::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<TQString, TQString> &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<TQString, TQString>::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("<li>")+*it+TQString("</li>");
-
- if(KMessageBox::No==messageBox(QuestionYesNo,
- OP_MOVE==op
- ? i18n("<p>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:</p><ul>%1</ul><p>\n Do you wish to "
- "move all of these?</p>").arg(out)
- : OP_COPY==op
- ? i18n("<p>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:</p><ul>%1</ul><p>\n Do you wish to "
- "copy all of these?</p>").arg(out)
- : i18n("<p>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:</p><ul>%1</ul><p>\n Do you wish to "
- "delete all of these?</p>").arg(out)))
- {
- error(TDEIO::ERR_USER_CANCELED, url.prettyURL());
- return false;
- }
- }
-
- return true;
-}
-
-bool CKioFonts::confirmMultiple(const KURL &url, TQValueList<FcPattern *> *patterns, EFolder folder, EOp op)
-{
- if(KFI_KIO_FONTS_PROTOCOL!=url.protocol())
- return true;
-
- TQStringList files;
-
- if(patterns && patterns->count())
- {
- TQValueList<FcPattern *>::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;
-}
-
-}