[Liblas-commits] r1113 - in trunk: include/liblas python/liblas python/tests src

liblas-commits at liblas.org liblas-commits at liblas.org
Thu Mar 19 00:20:51 EDT 2009


Author: hobu
Date: Thu Mar 19 00:20:50 2009
New Revision: 1113
URL: http://liblas.org/changeset/1113

Log:
stop tracking open readers/writers in order to allow multiple readers to operate on a file #111

Modified:
   trunk/include/liblas/lasheader.hpp
   trunk/python/liblas/file.py
   trunk/python/tests/File.txt
   trunk/src/las_c_api.cpp
   trunk/src/lasheader.cpp

Modified: trunk/include/liblas/lasheader.hpp
==============================================================================
--- trunk/include/liblas/lasheader.hpp	(original)
+++ trunk/include/liblas/lasheader.hpp	Thu Mar 19 00:20:50 2009
@@ -385,7 +385,6 @@
     PointOffsets m_offsets;
     PointExtents m_extents;
     std::vector<LASVLR> m_vlrs;
-    std::string m_proj4;
     LASSRS m_srs;
 };
 

Modified: trunk/python/liblas/file.py
==============================================================================
--- trunk/python/liblas/file.py	(original)
+++ trunk/python/liblas/file.py	Thu Mar 19 00:20:50 2009
@@ -47,7 +47,8 @@
 import os
 import types
 
-files = []
+files = {'append':[], 'write':[],'read':[]}
+import sys
 
 class File(object):
     def __init__(self, filename, header=None, mode='r'):
@@ -56,10 +57,18 @@
         self.handle = None
         self._mode = mode
         
+        # print self.filename
+        # print sys.stderr.write('%s %s %s'%(files, self.filename, mode))
+        # sys.stderr.flush()
         #check in the registry if we already have the file open
-        for f in files:
-            if f == self.filename:
-                raise core.LASException("File %s is already open.  Close the file or delete the reference to it", filename)
+        if mode=='r':
+            for f in files['write'] + files['append']:
+                if f == self.filename:
+                    raise core.LASException("File %s is already open for write.  Close the file or delete the reference to it" % filename)
+        else:
+            for f in files['read']:
+                if f == self.filename:
+                    raise core.LASException("File %s is already open for read. Close the file or delete the reference to it" % filename)
         self.open()
         
     def open(self):
@@ -67,13 +76,13 @@
             self.handle = core.las.LASReader_Create(self.filename)
             self.mode = 0
             self._header = lasheader.Header(handle = core.las.LASReader_GetHeader(self.handle))
-            files.append(self.filename)
+            files['read'].append(self.filename)
         if self._mode == 'w' and '+' not in self._mode:
             if not self._header:
                 self._header = lasheader.Header(handle = core.las.LASHeader_Create())
             self.handle = core.las.LASWriter_Create(self.filename, self._header.handle, 1)
             self.mode = 1
-            files.append(self.filename)
+            files['write'].append(self.filename)
         if '+' in self._mode and 'r' not in self._mode:
             if not self._header:
                 reader = core.las.LASReader_Create(self.filename)
@@ -81,7 +90,7 @@
                 core.las.LASReader_Destroy(reader)
             self.handle = core.las.LASWriter_Create(self.filename, self._header.handle, 2)
             self.mode = 2
-            files.append(self.filename)
+            files['append'].append(self.filename)
     def __del__(self):
         if not self.handle or not core: return
         self.close()
@@ -89,9 +98,14 @@
     def close(self):
         if self.mode == 0 :
             core.las.LASReader_Destroy(self.handle)
+            files['read'].remove(self.filename)
         else:
+            try:
+                files['append'].remove(self.filename)
+            except:
+                files['write'].remove(self.filename)
             core.las.LASWriter_Destroy(self.handle)
-        files.remove(self.filename)
+        
         self._header = None
         self.handle = None
     

Modified: trunk/python/tests/File.txt
==============================================================================
--- trunk/python/tests/File.txt	(original)
+++ trunk/python/tests/File.txt	Thu Mar 19 00:20:50 2009
@@ -16,6 +16,13 @@
   >>> p.x, p.y, p.z
   (630320.95999999996, 4834500.0, 55.009999999999998)
   
+  >>> f2 = file.File('../test/data/TO_core_last_clip.las')
+  >>> p2 = f2.read(6)
+  >>> p.x, p.y, p.z
+  (630320.95999999996, 4834500.0, 55.009999999999998)
+  >>> f2.close()
+  >>> del f2
+  
   >>> points = []
   >>> for i in f:
   ...   points.append(i)
@@ -74,7 +81,7 @@
   >>> pts = file.File('junk.las')
   Traceback (most recent call last):
   ...
-  LASException: ('File %s is already open.  Close the file or delete the reference to it', 'junk.las')
+  LASException: File junk.las is already open for write.  Close the file or delete the reference to it
   
   >>> f.close()
   >>> f.header

Modified: trunk/src/las_c_api.cpp
==============================================================================
--- trunk/src/las_c_api.cpp	(original)
+++ trunk/src/las_c_api.cpp	Thu Mar 19 00:20:50 2009
@@ -95,11 +95,6 @@
 } LASErrorEnum;
 
 
-
-typedef std::map<std::string, LASFile> StrLASFileMap;
-typedef std::map<std::string, LASFile>::const_iterator StrLASFileMapIt;
-
-static StrLASFileMap files;
 static std::stack<LASError > errors;
 
 #ifdef _MSC_VER
@@ -186,30 +181,24 @@
     VALIDATE_POINTER1(filename, "LASReader_Create", NULL);
 
     try {
-        StrLASFileMap::const_iterator p;
-        
-        p = files.find(filename);
+        std::ios::openmode const mode = std::ios::in | std::ios::binary;
+        std::istream* istrm;
+        if (strncasecmp(filename,"STDIN",5) == 0)
+        {
+            istrm = &std::cin;
+        }
+        else 
+        {
+            istrm = new std::ifstream(filename, mode);
+        }
         
-        if (p==files.end()) {
-
-            /* FIXME : not freed by LASReader_Destroy */
-            LASFile lasfile(filename);
-            files[filename] = lasfile;
-
-            LASReader* reader = NULL;
-            try {
-                reader = &(lasfile.GetReader());
-            }
-            catch (...) {
-                files.erase(filename);
-                throw std::runtime_error("LASReader_Create rethrowing");
-            }
-            
-            return (LASReaderH) reader;
-
+        if (!istrm->good())
+        {
+            delete istrm;
+            throw std::runtime_error("Reading stream was not able to be created");
         }
-        LASError_PushError(LE_Failure, "not able to create map entry", "LASReader_Create");
-        return NULL;
+        return (LASReaderH) new LASReader(*istrm);
+
     
     } catch (std::exception const& e)
      {
@@ -224,49 +213,24 @@
 {
     VALIDATE_POINTER0(hReader, "LASReader_Destroy");
 
-    StrLASFileMap::iterator p;    
-    LASReader* reader = (LASReader*)hReader;
-
-    for (p=files.begin(); p!=files.end(); ++p) {
-        LASFile f = p->second;
-        
-
-        try {
-            
-            LASReader& freader = f.GetReader();
-
-            try {
-                std::ifstream& a = static_cast<std::ifstream&>(freader.GetStream());
-                std::ifstream& r = static_cast<std::ifstream&>(reader->GetStream());
-                if (&a == &r) {
-                    files.erase(p);
-                    hReader = NULL;
-                    return;
-                }
-
-        
-            } catch (std::bad_cast const& /* e */)
-            {
-                std::istream& a = static_cast<std::istream&>(freader.GetStream());
-                std::istream& r = reader->GetStream();
-                if (&a == &r) {
-                    files.erase(p);
-                    hReader = NULL;
-                    return;
-                }     
-
-            } catch (std::exception const& e)
-            {
-                hReader=NULL;
-                LASError_PushError(LE_Failure, e.what(), "LASReader_Destroy");
-                return;
-            }
-    
-        }  catch (std::runtime_error const& /* e */) 
+    try { 
+        LASReader* reader = (LASReader*)hReader;
+        std::istream* istrm = &(reader->GetStream());
+
+        delete reader;
+        hReader = NULL;
+    
+        if (static_cast<std::ifstream&>(*istrm))
+            static_cast<std::ifstream&>(*istrm).close();
+        delete istrm;
+        istrm = NULL;
+  
+        }  catch (std::runtime_error const& e/* e */) 
         {
-            continue;
+            LASError_PushError(LE_Failure, e.what(), "LASReader_Destroy");
+            return;
         }
-    }
+
 
     hReader = NULL;
 }
@@ -1206,36 +1170,45 @@
     VALIDATE_POINTER1(hHeader, "LASWriter_Create", NULL); 
     
     if (filename == NULL) {
-        LASError_PushError(LE_Failure, "Inputted filename was null", "LASWriter_Create");
+        LASError_PushError(LE_Failure, "Input filename was null", "LASWriter_Create");
         return NULL;
     }
     try {
-
-        StrLASFileMap::const_iterator p;
-        
-        p = files.find(filename);
-        LASHeader* header = ((LASHeader*) hHeader);
+        std::ios::openmode m;
+        if ( (mode > 2) || (mode < 1)) {
+            throw std::runtime_error("File mode must be eWrite or eAppend");
+        }
         
-        if (p==files.end()) {
+        std::ostream* ostrm;
 
-            LASFile lasfile;
-
-            lasfile = LASFile(filename, *header, (liblas::LASFile::Mode)mode);
-            LASWriter* writer = NULL;
-            try {
-                writer = &(lasfile.GetWriter());
-            }
-            catch (...) {
-                throw std::runtime_error("LASWriter_Create rethrowing");
-            }
-
-            files[filename] = lasfile;
+        // append mode 
+        if (mode == 2) {
+            m = std::ios::out | std::ios::in | std::ios::binary | std::ios::ate;
+        }
+        // write mode
+        else {
+            m = std::ios::out | std::ios::binary | std::ios::ate;
+        }
+                
+        if (strncasecmp(filename,"STOUT",5) == 0)
+        {
+            ostrm = &std::cout;
+        }
+        else 
+        {
+            ostrm = new std::ofstream(filename, m);
+        }
 
-            return (LASWriterH) writer;
+        
+        if (!ostrm->good())
+        {
+            delete ostrm;
+            throw std::runtime_error("Writing stream was not able to be created");
         }
         
-        LASError_PushError(LE_Failure, "not able to create map entry", "LASWriter_Create");
-        return NULL;
+        LASHeader* header = ((LASHeader*) hHeader);
+        LASWriter* writer = new LASWriter(*ostrm, *header);
+        return (LASWriterH) writer;
 
     } catch (std::exception const& e)
      {
@@ -1287,53 +1260,29 @@
 {
     VALIDATE_POINTER0(hWriter, "LASWriter_Destroy");
 
-    StrLASFileMap::iterator p;  
-      
-    LASWriter* writer = (LASWriter*)hWriter;
-
-    for (p=files.begin(); p!=files.end(); ++p) {
-
-        LASFile f = p->second;
-
-        try {
-            
-            LASWriter& fwriter = f.GetWriter();
-
-            try {
-                std::ofstream& a = static_cast<std::ofstream&>(fwriter.GetStream());
-                std::ofstream& r = static_cast<std::ofstream&>(writer->GetStream());
-                if (&a == &r) {
-                    files.erase(p);
-                    hWriter = NULL;
-                    return;
-                }
-        
-            } catch (std::bad_cast const& /* e */)
-            {
-                std::ostream& a = static_cast<std::ostream&>(fwriter.GetStream());
-                std::ostream& r = writer->GetStream();
-                if (&a == &r) {
-                    files.erase(p);
-                    hWriter = NULL;
-                    return;
-                }
-
-            } catch (std::exception const& e)
-            {
-                hWriter=NULL;
-                LASError_PushError(LE_Failure, e.what(), "LASWriter_Destroy");
-                return ;
-            }
+
+    
+
+  
     
-        }  catch (std::runtime_error const& /* e */) 
+    try { 
+        LASWriter* writer = (LASWriter*)hWriter;
+        std::ostream* ostrm = &(writer->GetStream());
+
+        delete writer;
+        hWriter = NULL;
+    
+        if (static_cast<std::ofstream&>(*ostrm))
+            static_cast<std::ofstream&>(*ostrm).close();
+        delete ostrm;
+        ostrm = NULL;
+  
+        }  catch (std::runtime_error const& e/* e */) 
         {
-            continue;
+            LASError_PushError(LE_Failure, e.what(), "LASWriter_Destroy");
+            return;
         }
 
-
-    }
-
-    hWriter=NULL;
 }
 
 LAS_DLL LASErrorEnum LASWriter_SetSRS(LASWriterH hWriter, const LASSRSH hSRS) {

Modified: trunk/src/lasheader.cpp
==============================================================================
--- trunk/src/lasheader.cpp	(original)
+++ trunk/src/lasheader.cpp	Thu Mar 19 00:20:50 2009
@@ -98,7 +98,6 @@
     m_scales(other.m_scales),
     m_offsets(other.m_offsets),
     m_extents(other.m_extents),
-    m_proj4(other.m_proj4),
     m_srs(other.m_srs)
 {
     void* p = 0;
@@ -155,7 +154,6 @@
         m_scales = rhs.m_scales;
         m_offsets = rhs.m_offsets;
         m_extents = rhs.m_extents;
-        m_proj4 = rhs.m_proj4;
         m_srs = rhs.m_srs;
     }
     return *this;
@@ -188,7 +186,6 @@
     if (m_scales != other.m_scales) return false;
     if (m_offsets != other.m_offsets) return false;
     if (m_extents != other.m_extents) return false;
-    if (m_proj4 != other.m_proj4) return false;
     
     return true;
 }


More information about the Liblas-commits mailing list