All pastes #1932746 Raw Edit

Use RemoteFile if 50KB

public text v1 · immutable
#1932746 ·published 2010-09-04 14:52 UTC
rendered paste body
Index: mythiowrapper.cpp
===================================================================
--- mythiowrapper.cpp	(revision 26107)
+++ mythiowrapper.cpp	(working copy)
@@ -28,6 +28,7 @@
 
 QReadWriteLock            m_fileWrapperLock;
 QHash <int, RingBuffer *> m_ringbuffers;
+QHash <int, RemoteFile *> m_remotefiles;
 QHash <int, int>          m_localfiles;
 QHash <int, QString>      m_filenames;
 
@@ -50,7 +51,9 @@
 
     for (; id < maxID; ++id)
     {
-        if (!m_localfiles.contains(id) && !m_ringbuffers.contains(id))
+        if ((!m_localfiles.contains(id)) &&
+            (!m_remotefiles.contains(id)) &&
+            (!m_ringbuffers.contains(id)))
             break;
     }
 
@@ -74,6 +77,8 @@
     m_fileWrapperLock.lockForWrite();
     if (m_localfiles.contains(id))
         result = 1;
+    else if (m_remotefiles.contains(id))
+        result = 1;
     else if (m_ringbuffers.contains(id))
         result = 1;
     m_fileWrapperLock.unlock();
@@ -109,21 +114,42 @@
     else
     {
         RingBuffer *rb = NULL;
-        if (flags & O_WRONLY)
-            rb = new RingBuffer(pathname, true, false, -1); // Writeable
+        RemoteFile *rf = NULL;
+
+        if ((fileinfo.st_size < 51200) &&
+            (fileinfo.st_mtime < (time(NULL) - 300)))
+        {
+            if (flags & O_WRONLY)
+                rf = new RemoteFile(pathname, true, false); // Writeable
+            else
+                rf = new RemoteFile(pathname, false, true); // Read-Only
+
+            if (!rf)
+                return -1;
+        }
         else
-            rb = new RingBuffer(pathname, false, true, -1); // Read-Only
+        {
+            if (flags & O_WRONLY)
+                rb = new RingBuffer(pathname, true, false, -1); // Writeable
+            else
+                rb = new RingBuffer(pathname, false, true, -1); // Read-Only
 
-        if (!rb)
-            return -1;
+            if (!rb)
+                return -1;
 
-        rb->SetStreamOnly(true);
-        rb->OpenFile(pathname);
-        rb->Start();
+            rb->SetStreamOnly(true);
+            rb->OpenFile(pathname);
+            rb->Start();
+        }
 
         m_fileWrapperLock.lockForWrite();
         fileID = getNextFileID();
-        m_ringbuffers[fileID] = rb;
+
+        if (rf)
+            m_remotefiles[fileID] = rf;
+        else if (rb)
+            m_ringbuffers[fileID] = rb;
+
         m_filenames[fileID] = pathname;
         m_fileWrapperLock.unlock();
     }
@@ -146,6 +172,14 @@
 
         result = 0;
     }
+    else if (m_remotefiles.contains(fileID))
+    {
+        RemoteFile *rf = m_remotefiles[fileID];
+        m_remotefiles.remove(fileID);
+        delete rf;
+
+        result = 0;
+    }
     else if (m_localfiles.contains(fileID))
     {
         close(m_localfiles[fileID]);
@@ -167,6 +201,8 @@
     m_fileWrapperLock.lockForRead();
     if (m_ringbuffers.contains(fileID))
         result = m_ringbuffers[fileID]->Seek(offset, whence);
+    else if (m_remotefiles.contains(fileID))
+        result = m_remotefiles[fileID]->Seek(offset, whence);
     else if (m_localfiles.contains(fileID))
 #ifdef USING_MINGW
         result = lseek64(m_localfiles[fileID], offset, whence);
@@ -187,6 +223,8 @@
     m_fileWrapperLock.lockForRead();
     if (m_ringbuffers.contains(fileID))
         result = m_ringbuffers[fileID]->Seek(0, SEEK_CUR);
+    else if (m_remotefiles.contains(fileID))
+        result = m_remotefiles[fileID]->Seek(0, SEEK_CUR);
     else if (m_localfiles.contains(fileID))
 #ifdef USING_MINGW
         result = lseek64(m_localfiles[fileID], 0, SEEK_CUR);
@@ -208,6 +246,8 @@
     m_fileWrapperLock.lockForRead();
     if (m_ringbuffers.contains(fileID))
         result = m_ringbuffers[fileID]->Read(buf, count);
+    else if (m_remotefiles.contains(fileID))
+        result = m_remotefiles[fileID]->Read(buf, count);
     else if (m_localfiles.contains(fileID))
         result = read(m_localfiles[fileID], buf, count);
     m_fileWrapperLock.unlock();
@@ -225,6 +265,8 @@
     m_fileWrapperLock.lockForRead();
     if (m_ringbuffers.contains(fileID))
         result = m_ringbuffers[fileID]->Write(buf, count);
+    else if (m_remotefiles.contains(fileID))
+        result = m_remotefiles[fileID]->Write(buf, count);
     else if (m_localfiles.contains(fileID))
         result = write(m_localfiles[fileID], buf, count);
     m_fileWrapperLock.unlock();