summaryrefslogtreecommitdiffstats
path: root/src/app/VFS/vfile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/VFS/vfile.cpp')
-rw-r--r--src/app/VFS/vfile.cpp311
1 files changed, 311 insertions, 0 deletions
diff --git a/src/app/VFS/vfile.cpp b/src/app/VFS/vfile.cpp
new file mode 100644
index 0000000..c333f45
--- /dev/null
+++ b/src/app/VFS/vfile.cpp
@@ -0,0 +1,311 @@
+/***************************************************************************
+ vfile.cpp
+ -------------------
+ copyright : (C) 2000 by Rafi Yanai
+ e-mail : krusader@users.sourceforge.net
+ web site : http://krusader.sourceforge.net
+ ---------------------------------------------------------------------------
+
+ ***************************************************************************
+
+ A
+
+ db dD d8888b. db db .d8888. .d8b. d8888b. d88888b d8888b.
+ 88 ,8P' 88 `8D 88 88 88' YP d8' `8b 88 `8D 88' 88 `8D
+ 88,8P 88oobY' 88 88 `8bo. 88ooo88 88 88 88ooooo 88oobY'
+ 88`8b 88`8b 88 88 `Y8b. 88~~~88 88 88 88~~~~~ 88`8b
+ 88 `88. 88 `88. 88b d88 db 8D 88 88 88 .8D 88. 88 `88.
+ YP YD 88 YD ~Y8888P' `8888Y' YP YP Y8888D' Y88888P 88 YD
+
+ S o u r c e F i l e
+
+ ***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+// System includes
+#include <unistd.h>
+#include <pwd.h>
+#include <grp.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+// TQt includes
+#include <tqdatetime.h>
+// TDE includes
+#include <kmimetype.h>
+#include <tdeversion.h>
+// Krusader includes
+#include "vfile.h"
+#include "krpermhandler.h"
+#include "normal_vfs.h"
+
+#include <kdebug.h>
+
+vfile::vfile(const TQString& name, // useful construtor
+ const TDEIO::filesize_t size,
+ const TQString& perm,
+ const time_t mtime,
+ const bool symLink,
+ const uid_t owner,
+ const gid_t group,
+ const TQString& mime,
+ const TQString& symDest,
+ const mode_t mode,
+ const int rwx)
+{
+ vfile_name=name;
+ vfile_size=size;
+ vfile_owner=TQString();
+ vfile_ownerId=owner;
+ vfile_group=TQString();
+ vfile_groupId=group;
+ vfile_userName=TQString();
+ vfile_perm=perm;
+ vfile_time_t=mtime;
+ vfile_symLink=symLink;
+ vfile_mimeType=mime;
+ vfile_symDest=symDest;
+ vfile_mode=mode;
+ vfile_isdir = ( perm[ 0 ] == 'd' );
+ if (vfile_isDir() && !vfile_symLink )
+ vfile_size = 0;
+ vfile_rwx = rwx;
+ vfile_acl_loaded = false;
+}
+
+vfile::vfile(const TQString& name, // useful construtor
+ const TDEIO::filesize_t size,
+ const TQString& perm,
+ const time_t mtime,
+ const bool symLink,
+ const TQString& owner,
+ const TQString& group,
+ const TQString& userName,
+ const TQString& mime,
+ const TQString& symDest,
+ const mode_t mode,
+ const int rwx,
+ const TQString& aclString,
+ const TQString& aclDfltString ){
+ vfile_name=name;
+ vfile_size=size;
+ vfile_owner=owner;
+ vfile_group=group;
+ vfile_userName=userName;
+ vfile_ownerId=KRpermHandler::user2uid(owner) ;
+ vfile_groupId=KRpermHandler::group2gid(group);
+ vfile_perm=perm;
+ vfile_time_t=mtime;
+ vfile_symLink=symLink;
+ vfile_mimeType=mime;
+ vfile_symDest=symDest;
+ vfile_mode=mode;
+ vfile_isdir = ( perm[ 0 ] == 'd' );
+ if ( vfile_isDir() && !vfile_symLink )
+ vfile_size = 0;
+ vfile_acl = aclString;
+ vfile_def_acl = aclDfltString;
+ vfile_has_acl = !aclString.isNull() || !aclDfltString.isNull();
+ vfile_acl_loaded = true;
+ vfile_rwx = rwx;
+}
+
+char vfile::vfile_isReadable() const {
+ if( vfile_rwx == PERM_ALL )
+ return ALLOWED_PERM;
+ else if( vfile_userName.isNull() )
+ return KRpermHandler::readable(vfile_perm,vfile_groupId,vfile_ownerId,vfile_rwx);
+ else
+ return KRpermHandler::ftpReadable(vfile_owner, vfile_userName, vfile_perm);
+}
+
+char vfile::vfile_isWriteable() const {
+ if( vfile_rwx == PERM_ALL )
+ return ALLOWED_PERM;
+ else if( vfile_userName.isNull() )
+ return KRpermHandler::writeable(vfile_perm,vfile_groupId,vfile_ownerId,vfile_rwx);
+ else
+ return KRpermHandler::ftpWriteable(vfile_owner, vfile_userName, vfile_perm);
+}
+
+char vfile::vfile_isExecutable() const {
+ if( vfile_rwx == PERM_ALL )
+ {
+ if(( vfile_mode & 0111 ) || vfile_isdir )
+ return ALLOWED_PERM;
+ else
+ return NO_PERM;
+ }
+ else if( vfile_userName.isNull() )
+ return KRpermHandler::executable(vfile_perm,vfile_groupId,vfile_ownerId,vfile_rwx);
+ else
+ return KRpermHandler::ftpExecutable(vfile_owner, vfile_userName, vfile_perm);
+}
+
+const TQString& vfile::vfile_getMime(bool fast){
+ if( vfile_mimeType == TQString() ){ // mimetype == "" is OK so don't check mimetype.empty() !
+ vfile_mimeType = KMimeType::findByURL( vfile_getUrl(),vfile_getMode(),vfile_getUrl().isLocalFile(),fast)->name();
+ if( vfile_mimeType.contains("directory") ) vfile_perm[0] = 'd', vfile_isdir = true;
+ }
+ return vfile_mimeType;
+}
+
+const TQString& vfile::vfile_getOwner(){
+ if( vfile_owner.isEmpty() )
+ vfile_owner=KRpermHandler::uid2user(vfile_getUid());
+ return vfile_owner;
+}
+
+const TQString& vfile::vfile_getGroup(){
+ if( vfile_group.isEmpty() )
+ vfile_group=KRpermHandler::gid2group(vfile_getGid());
+ return vfile_group;
+}
+
+const TQString& vfile::vfile_getACL(){
+ if( !vfile_acl_loaded )
+ vfile_loadACL();
+ return vfile_acl;
+}
+
+const TQString& vfile::vfile_getDefaultACL(){
+ if( !vfile_acl_loaded )
+ vfile_loadACL();
+ return vfile_def_acl;
+}
+
+void vfile::vfile_loadACL()
+{
+ if( vfile_url.isLocalFile() )
+ {
+ normal_vfs::getACL( this, vfile_acl, vfile_def_acl );
+ vfile_has_acl = !vfile_acl.isNull() || !vfile_def_acl.isNull();
+ }
+ vfile_acl_loaded = true;
+}
+
+const TDEIO::UDSEntry vfile::vfile_getEntry() {
+ TDEIO::UDSEntry entry;
+ TDEIO::UDSAtom atom;
+
+ atom.m_uds = TDEIO::UDS_NAME;
+ atom.m_str = vfile_getName();
+ entry.append(atom);
+
+ atom.m_uds = TDEIO::UDS_SIZE;
+ atom.m_long = vfile_getSize();
+ entry.append(atom);
+
+ atom.m_uds = TDEIO::UDS_MODIFICATION_TIME;
+ atom.m_long = vfile_getTime_t();
+ entry.append(atom);
+
+ atom.m_uds = TDEIO::UDS_USER;
+ atom.m_str = vfile_getOwner();
+ entry.append(atom);
+
+ atom.m_uds = TDEIO::UDS_GROUP;
+ atom.m_str = vfile_getGroup();
+ entry.append(atom);
+
+ atom.m_uds = TDEIO::UDS_MIME_TYPE;
+ atom.m_str = vfile_getMime();
+ entry.append(atom);
+
+ atom.m_uds = TDEIO::UDS_FILE_TYPE;
+ atom.m_long = vfile_getMode() & S_IFMT;
+ entry.append(atom);
+
+ atom.m_uds = TDEIO::UDS_ACCESS;
+ atom.m_long = vfile_getMode() & 07777; // keep permissions only
+ entry.append( atom );
+
+ atom.m_uds = TDEIO::UDS_MIME_TYPE;
+ atom.m_str = vfile_getMime();
+ entry.append(atom);
+
+ if( vfile_isSymLink() ){
+ atom.m_uds = TDEIO::UDS_LINK_DEST;
+ atom.m_str = vfile_getSymDest();
+ entry.append(atom);
+ }
+
+#if KDE_IS_VERSION(3,5,0)
+ if( !vfile_acl_loaded )
+ vfile_loadACL();
+ if( vfile_has_acl ) {
+ atom.m_uds = TDEIO::UDS_EXTENDED_ACL;
+ atom.m_long = 1;
+ entry.append( atom );
+
+ if( !vfile_acl.isNull() )
+ {
+ atom.m_uds = TDEIO::UDS_ACL_STRING;
+ atom.m_str = vfile_acl;
+ entry.append(atom);
+ }
+
+ if( !vfile_def_acl.isNull() )
+ {
+ atom.m_uds = TDEIO::UDS_DEFAULT_ACL_STRING;
+ atom.m_str = vfile_acl;
+ entry.append(atom);
+ }
+ }
+#endif
+
+ return entry;
+}
+
+bool vfile::operator==(const vfile& vf) const{
+ bool equal;
+
+ if( !vfile_acl_loaded )
+ const_cast<vfile *>( this )->vfile_loadACL();
+ if( !vf.vfile_acl_loaded )
+ const_cast<vfile *>( &vf )->vfile_loadACL();
+
+ equal = (vfile_name == vf.vfile_getName() ) &&
+ (vfile_size == vf.vfile_getSize() ) &&
+ (vfile_perm == vf.vfile_getPerm() ) &&
+ (vfile_time_t == vf.vfile_getTime_t() ) &&
+ (vfile_ownerId == vf.vfile_getUid() ) &&
+ (vfile_groupId == vf.vfile_getGid() ) &&
+ (vfile_has_acl == vf.vfile_has_acl ) &&
+ (!vfile_has_acl ||
+ (vfile_acl == vf.vfile_acl ) &&
+ (vfile_def_acl == vf.vfile_def_acl ) );;
+
+ return equal;
+}
+
+vfile& vfile::operator= (const vfile& vf){
+ vfile_name = vf.vfile_name ;
+ vfile_size = vf.vfile_size ;
+ vfile_mode = vf.vfile_mode ;
+ vfile_ownerId = vf.vfile_ownerId ;
+ vfile_groupId = vf.vfile_groupId ;
+ vfile_owner = vf.vfile_owner ;
+ vfile_group = vf.vfile_group ;
+ vfile_userName = vf.vfile_userName ;
+ vfile_perm = vf.vfile_perm ;
+ vfile_time_t = vf.vfile_time_t ;
+ vfile_symLink = vf.vfile_symLink ;
+ vfile_mimeType = vf.vfile_mimeType ;
+ vfile_symDest = vf.vfile_symDest ;
+ vfile_url = vf.vfile_url ;
+ vfile_isdir = vf.vfile_isdir ;
+ vfile_has_acl = vf.vfile_has_acl ;
+ vfile_acl = vf.vfile_acl ;
+ vfile_def_acl = vf.vfile_def_acl ;
+ vfile_rwx = vf.vfile_rwx ;
+ vfile_acl_loaded = vf.vfile_acl_loaded;
+
+ return (*this);
+}
+
+#include "vfile.moc"