Skip to content

Commit

Permalink
implement symlink().
Browse files Browse the repository at this point in the history
  • Loading branch information
JonathanBeck committed Apr 24, 2010
1 parent b443c08 commit acd02ec
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 2 deletions.
32 changes: 30 additions & 2 deletions afcdevice.cpp
Expand Up @@ -583,8 +583,6 @@ bool AfcDevice::del( const QString& path, KIO::Error& error)


bool AfcDevice::rename( const QString& src, const QString& dest, KIO::JobFlags flags, KIO::Error& error ) bool AfcDevice::rename( const QString& src, const QString& dest, KIO::JobFlags flags, KIO::Error& error )
{ {
char off_t_should_be_64_bits[sizeof(off_t) >= 8 ? 1 : -1]; (void) off_t_should_be_64_bits;

//make sure path exists //make sure path exists
UDSEntry entry_src; UDSEntry entry_src;
if ( !createUDSEntry("", src, entry_src, error) ) if ( !createUDSEntry("", src, entry_src, error) )
Expand Down Expand Up @@ -612,3 +610,33 @@ bool AfcDevice::rename( const QString& src, const QString& dest, KIO::JobFlags f


return checkError(er, error); return checkError(er, error);
} }

bool AfcDevice::symlink( const QString& src, const QString& dest, KIO::JobFlags flags, KIO::Error& error )
{
//make sure path exists
UDSEntry entry_src;
if ( !createUDSEntry("", src, entry_src, error) )
{
return false;
}

UDSEntry entry_dest;
if ( createUDSEntry("", dest, entry_dest, error) )
{
if (S_ISDIR( entry_dest.numberValue(UDSEntry::UDS_FILE_TYPE ) ) )
{
error = KIO::ERR_DIR_ALREADY_EXIST;
return false;
}

if (!(flags & KIO::Overwrite))
{
error = KIO::ERR_FILE_ALREADY_EXIST;
return false;
}
}

afc_error_t er = afc_make_link ( _afc, AFC_SYMLINK, (const char*) src.toLocal8Bit(), (const char*) dest.toLocal8Bit() );

return checkError(er, error);
}
1 change: 1 addition & 0 deletions afcdevice.h
Expand Up @@ -51,6 +51,7 @@ class AfcDevice
bool del( const QString& path, KIO::Error& error); bool del( const QString& path, KIO::Error& error);


bool rename( const QString& src, const QString& dest, KIO::JobFlags flags, KIO::Error& error ); bool rename( const QString& src, const QString& dest, KIO::JobFlags flags, KIO::Error& error );
bool symlink( const QString& src, const QString& dest, KIO::JobFlags flags, KIO::Error& error );




private: private:
Expand Down
32 changes: 32 additions & 0 deletions kio_afc.cpp
Expand Up @@ -276,6 +276,38 @@ void AfcProtocol::symlink( const QString &target, const KUrl &dest,
KIO::JobFlags flags ) KIO::JobFlags flags )
{ {
kDebug(KIO_AFC) << target << "to " << dest; kDebug(KIO_AFC) << target << "to " << dest;

// check (correct) URL
const AfcPath path_dest = checkURL(dest);

//make sue we are on the same device

if ( target.contains( path_dest.m_host, Qt::CaseSensitive ) )
{
AfcDevice* device = _devices[path_dest.m_host];

if ( NULL == device )
{
error(KIO::ERR_DOES_NOT_EXIST, "Could not find specified device");
return;
}

QString src = target;
src.remove("/" + path_dest.m_host, Qt::CaseSensitive );

KIO::Error err;
if ( ! device->symlink(src, path_dest.m_path, flags, err ) )
{
error(err, target);
return;
}
}
else
{
error ( KIO::ERR_CANNOT_SYMLINK, "Cannot symlink on different device");
return;
}
finished();
} }




Expand Down

0 comments on commit acd02ec

Please sign in to comment.