[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/work/kio_virtualfile/kioslave/file
From:       Allan Sandfeld Jensen <kde () carewolf ! com>
Date:       2006-07-05 22:14:38
Message-ID: 1152137678.857010.7277.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 558732 by carewolf:

The beginnings of File::open


 M  +82 -2     file.cc  
 M  +1 -0      file.h  


--- branches/work/kio_virtualfile/kioslave/file/file.cc #558731:558732
@@ -339,6 +339,86 @@
     finished();
 }
 
+void FileProtocol::open( const KUrl& url )
+{
+    QByteArray _path( QFile::encodeName(url.path()));
+    KDE_struct_stat buff;
+    if ( KDE_stat( _path.data(), &buff ) == -1 ) {
+        if ( errno == EACCES )
+           error( KIO::ERR_ACCESS_DENIED, url.path() );
+        else
+           error( KIO::ERR_DOES_NOT_EXIST, url.path() );
+        return;
+    }
+
+    if ( S_ISDIR( buff.st_mode ) ) {
+        error( KIO::ERR_IS_DIRECTORY, url.path() );
+        return;
+    }
+    if ( !S_ISREG( buff.st_mode ) ) {
+        error( KIO::ERR_CANNOT_OPEN_FOR_READING, url.path() );
+        return;
+    }
+
+    int fd = KDE_open( _path.data(), O_RDONLY);
+    if ( fd < 0 ) {
+        error( KIO::ERR_CANNOT_OPEN_FOR_READING, url.path() );
+        return;
+    }
+    // Determine the mimetype of the file to be retrieved, and emit it.
+    // This is mandatory in all slaves (for KRun/BrowserRun to work).
+    KMimeType::Ptr mt = KMimeType::findByURL( url, buff.st_mode, true /* local URL */ );
+    emit mimeType( mt->name() );
+
+    totalSize( buff.st_size );
+
+    emit file(fd);
+
+    QByteArray array;
+
+    // Command-loop:
+    int cmd = CMD_NONE;
+    while (true) {
+        QByteArray data;
+        appconn->read(&cmd, data);
+        QDataStream stream( data );
+        switch( command ) {
+        case CMD_READ: {
+            char buffer[ bytes ];
+            int bytes;
+            stream >> bytes;
+            ::read(fd, buffer, bytes);
+            array = array.fromRawData(buffer, n);
+            data( array );
+            array.clear();
+            break;
+        }
+        case CMD_WRITE: {/*
+            QByteArray buffer;
+            dataReq(); // Request for data
+            result = readData( buffer );
+
+            if (result >= 0)
+            {
+            */
+            break;
+        }
+        case CMD_SEEK: {
+            int offset;
+            stream >> offset;
+            KDE_seek(fd, offset);
+        }
+        case CMD_CLOSE:
+            close( fd );
+            finished();
+            break;
+        default:
+            // wrong command
+        }
+        if (cmd == CMD_CLOSE) break;
+    }
+}
+
 static int
 write_all(int fd, const char *buf, size_t len)
 {
@@ -622,7 +702,7 @@
            return;
         }
 
-	if ( same_inode( buff_dest, buff_src) ) 
+	if ( same_inode( buff_dest, buff_src) )
 	{
 	    error( KIO::ERR_IDENTICAL_FILES, dest.path() );
 	    return;
@@ -835,7 +915,7 @@
            return;
         }
 
-	if ( same_inode( buff_dest, buff_src) ) 
+	if ( same_inode( buff_dest, buff_src) )
 	{
 	    error( KIO::ERR_IDENTICAL_FILES, dest.path() );
 	    return;
--- branches/work/kio_virtualfile/kioslave/file/file.h #558731:558732
@@ -61,6 +61,7 @@
   virtual void mkdir( const KUrl& url, int permissions );
   virtual void chmod( const KUrl& url, int permissions );
   virtual void del( const KUrl& url, bool isfile);
+  virtual void open( const KUrl& url );
 
   /**
    * Special commands supported by this slave:
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic