ktempfile.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <config.h>
00024
00025 #include <sys/types.h>
00026
00027 #ifdef HAVE_SYS_STAT_H
00028 #include <sys/stat.h>
00029 #endif
00030
00031 #include <fcntl.h>
00032 #include <stdlib.h>
00033 #include <unistd.h>
00034
00035 #ifdef HAVE_TEST
00036 #include <test.h>
00037 #endif
00038 #ifdef HAVE_PATHS_H
00039 #include <paths.h>
00040 #endif
00041
00042 #ifndef _PATH_TMP
00043 #define _PATH_TMP "/tmp"
00044 #endif
00045
00046 #include <qdatetime.h>
00047 #include <qfile.h>
00048 #include <qdatastream.h>
00049 #include <qtextstream.h>
00050
00051 #include "kglobal.h"
00052 #include "kapplication.h"
00053 #include "kinstance.h"
00054 #include "ktempfile.h"
00055 #include "kstandarddirs.h"
00056
00057
00058
00059 KTempFile::KTempFile(QString filePrefix, QString fileExtension, int mode)
00060 {
00061 bAutoDelete = false;
00062 mFd = -1;
00063 mStream = 0;
00064 mFile = 0;
00065 mTextStream = 0;
00066 mDataStream = 0;
00067 mError = 0;
00068 bOpen = false;
00069 if (fileExtension.isEmpty())
00070 fileExtension = ".tmp";
00071 if (filePrefix.isEmpty())
00072 {
00073 filePrefix = locateLocal("tmp", KGlobal::instance()->instanceName());
00074 }
00075 (void) create(filePrefix, fileExtension, mode);
00076 }
00077
00078 KTempFile::KTempFile(bool)
00079 {
00080 bAutoDelete = false;
00081 mFd = -1;
00082 mStream = 0;
00083 mFile = 0;
00084 mTextStream = 0;
00085 mDataStream = 0;
00086 mError = 0;
00087 bOpen = false;
00088 }
00089
00090 bool
00091 KTempFile::create(const QString &filePrefix, const QString &fileExtension,
00092 int mode)
00093 {
00094
00095 (void) KApplication::random();
00096
00097 QCString ext = QFile::encodeName(fileExtension);
00098 QCString nme = QFile::encodeName(filePrefix) + "XXXXXX" + ext;
00099 if((mFd = mkstemps(nme.data(), ext.length())) < 0)
00100 {
00101
00102 QCString nme = QFile::encodeName(filePrefix) + "XXXXXX" + ext;
00103 qWarning("KTempFile: Error trying to create %s: %s", nme.data(), strerror(errno));
00104 mError = errno;
00105 mTmpName = QString::null;
00106 return false;
00107 }
00108
00109
00110 mTmpName = QFile::decodeName(nme);
00111 mode_t tmp = 0;
00112 mode_t umsk = umask(tmp);
00113 umask(umsk);
00114 chmod(nme, mode&(~umsk));
00115
00116
00117 bOpen = true;
00118
00119
00120 chown(nme, getuid(), getgid());
00121 return true;
00122 }
00123
00124 KTempFile::~KTempFile()
00125 {
00126 close();
00127 if (bAutoDelete)
00128 unlink();
00129 }
00130
00131 int
00132 KTempFile::status() const
00133 {
00134 return mError;
00135 }
00136
00137 QString
00138 KTempFile::name() const
00139 {
00140 return mTmpName;
00141 }
00142
00143 int
00144 KTempFile::handle() const
00145 {
00146 return mFd;
00147 }
00148
00149 FILE *
00150 KTempFile::fstream()
00151 {
00152 if (mStream) return mStream;
00153 if (mFd < 0) return 0;
00154
00155
00156 mStream = fdopen(mFd, "r+");
00157 if (!mStream) {
00158 qWarning("KTempFile: Error trying to open %s: %s", mTmpName.latin1(), strerror(errno));
00159 mError = errno;
00160 }
00161 return mStream;
00162 }
00163
00164 QFile *
00165 KTempFile::file()
00166 {
00167 if (mFile) return mFile;
00168 if ( !fstream() ) return 0;
00169
00170 mFile = new QFile();
00171 mFile->setName( name() );
00172 mFile->open(IO_ReadWrite, mStream);
00173 return mFile;
00174 }
00175
00176 QTextStream *
00177 KTempFile::textStream()
00178 {
00179 if (mTextStream) return mTextStream;
00180 if ( !file() ) return 0;
00181
00182 mTextStream = new QTextStream( mFile );
00183 return mTextStream;
00184 }
00185
00186 QDataStream *
00187 KTempFile::dataStream()
00188 {
00189 if (mDataStream) return mDataStream;
00190 if ( !file() ) return 0;
00191
00192 mDataStream = new QDataStream( mFile );
00193 return mDataStream;
00194 }
00195
00196 void
00197 KTempFile::unlink()
00198 {
00199 if (!mTmpName.isEmpty())
00200 QFile::remove( mTmpName );
00201 mTmpName = QString::null;
00202 }
00203
00204 bool
00205 KTempFile::close()
00206 {
00207 int result = 0;
00208 delete mTextStream; mTextStream = 0;
00209 delete mDataStream; mDataStream = 0;
00210 delete mFile; mFile = 0;
00211
00212 if (mStream)
00213 {
00214 result = ferror(mStream);
00215 if (result)
00216 mError = ENOSPC;
00217
00218 result = fclose(mStream);
00219 mStream = 0;
00220 mFd = -1;
00221 if (result != 0) {
00222 qWarning("KTempFile: Error trying to closing %s: %s", mTmpName.latin1(), strerror(errno));
00223 mError = errno;
00224 }
00225 }
00226
00227
00228 if (mFd >= 0)
00229 {
00230 result = ::close(mFd);
00231 mFd = -1;
00232 if (result != 0) {
00233 qWarning("KTempFile: Error trying to closing %s: %s", mTmpName.latin1(), strerror(errno));
00234 mError = errno;
00235 }
00236 }
00237
00238 bOpen = false;
00239 return (mError == 0);
00240 }
00241
This file is part of the documentation for kdecore Library Version 3.2.0.