Changeset 3331


Ignore:
Timestamp:
10/30/07 13:08:52 (12 years ago)
Author:
melissa
Message:

Catch EOFException when parsing image files.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/in/ZeissZVIReader.java

    r3286 r3331  
    237237 
    238238    if (legacy != null) legacy.close(); 
    239     pixels = null; 
    240     names = null; 
    241     offsets = null; 
     239    pixels = names = offsets = null; 
     240    zIndices = cIndices = tIndices = null; 
     241    bpp = tileRows = tileColumns = 0; 
     242    zIndex = cIndex = tIndex = -1; 
     243    needLegacy = isTiled = isJPEG = false; 
    242244 
    243245    String[] vars = {"dirName", "root", "dir", "document", "dis", 
     
    660662          (data.length > core.sizeX[0]*core.sizeY[0])) 
    661663        { 
    662           s.skipBytes(6); 
    663  
    664           int vt = s.readShort(); 
    665           if (vt == 3) { 
     664          try { 
    666665            s.skipBytes(6); 
     666 
     667            int vt = s.readShort(); 
     668            if (vt == 3) { 
     669              s.skipBytes(6); 
     670            } 
     671            else if (vt == 8) { 
     672              int l = s.readShort(); 
     673              s.skipBytes(l + 2); 
     674            } 
     675            int len = s.readShort(); 
     676            if (s.readShort() != 0) s.seek(s.getFilePointer() - 2); 
     677 
     678            if (s.getFilePointer() + len <= s.length()) { 
     679              s.skipBytes(len); 
     680            } 
     681            else break; 
     682 
     683            vt = s.readShort(); 
     684            if (vt == 8) { 
     685              len = s.readInt(); 
     686              s.skipBytes(len + 2); 
     687            } 
     688 
     689            int tw = s.readInt(); 
     690            if (core.sizeX[0] == 0 || (tw < core.sizeX[0] && tw > 0)) { 
     691              core.sizeX[0] = tw; 
     692            } 
     693            s.skipBytes(2); 
     694            int th = s.readInt(); 
     695            if (core.sizeY[0] == 0 || (th < core.sizeY[0] && th > 0)) { 
     696              core.sizeY[0] = th; 
     697            } 
     698 
     699            s.skipBytes(14); 
     700 
     701            int numImageContainers = s.readInt(); 
     702            s.skipBytes(6); 
     703 
     704            // VT_CLSID - PluginCLSID 
     705            while (s.readShort() != 65); 
     706 
     707            // VT_BLOB - Others 
     708            len = s.readInt(); 
     709            s.skipBytes(len); 
     710 
     711            // VT_STORED_OBJECT - Layers 
     712            s.skipBytes(2); 
     713            long old = s.getFilePointer(); 
     714            len = s.readInt(); 
     715 
     716            s.skipBytes(8); 
     717 
     718            int zidx = s.readInt(); 
     719            int cidx = s.readInt(); 
     720            int tidx = s.readInt(); 
     721 
     722            Integer zndx = new Integer(zidx); 
     723            Integer cndx = new Integer(cidx); 
     724            Integer tndx = new Integer(tidx); 
     725 
     726            if (!zIndices.contains(zndx)) zIndices.add(zndx); 
     727            if (!cIndices.contains(cndx)) cIndices.add(cndx); 
     728            if (!tIndices.contains(tndx)) tIndices.add(tndx); 
     729 
     730            s.seek(old + len + 4); 
     731 
     732            boolean foundWidth = s.readInt() == core.sizeX[0]; 
     733            boolean foundHeight = s.readInt() == core.sizeY[0]; 
     734            boolean findFailed = false; 
     735            while ((!foundWidth || !foundHeight) && 
     736              s.getFilePointer() + 1 < s.length()) 
     737            { 
     738              s.seek(s.getFilePointer() - 7); 
     739              foundWidth = s.readInt() == core.sizeX[0]; 
     740              foundHeight = s.readInt() == core.sizeY[0]; 
     741            } 
     742            s.seek(s.getFilePointer() - 16); 
     743            findFailed = !foundWidth && !foundHeight; 
     744 
     745            // image header and data 
     746 
     747            if (dirName.toUpperCase().indexOf("ITEM") != -1 || 
     748              (dirName.equals("Image") && numImageContainers == 0)) 
     749            { 
     750              if (findFailed) s.seek(old + len + 92); 
     751              long fp = s.getFilePointer(); 
     752              byte[] o = new byte[(int) (s.length() - fp)]; 
     753              s.read(o); 
     754 
     755              int imageNum = 0; 
     756              if (dirName.toUpperCase().indexOf("ITEM") != -1) { 
     757                String num = dirName.substring(5); 
     758                num = num.substring(0, num.length() - 1); 
     759                imageNum = Integer.parseInt(num); 
     760              } 
     761 
     762              offsets.put(new Integer(imageNum), new Integer((int) fp + 32)); 
     763              parsePlane(o, imageNum, directory, entryName); 
     764            } 
    667765          } 
    668           else if (vt == 8) { 
    669             int l = s.readShort(); 
    670             s.skipBytes(l + 2); 
    671           } 
    672           int len = s.readShort(); 
    673           if (s.readShort() != 0) s.seek(s.getFilePointer() - 2); 
    674  
    675           if (s.getFilePointer() + len <= s.length()) { 
    676             s.skipBytes(len); 
    677           } 
    678           else break; 
    679  
    680           vt = s.readShort(); 
    681           if (vt == 8) { 
    682             len = s.readInt(); 
    683             s.skipBytes(len + 2); 
    684           } 
    685  
    686           int tw = s.readInt(); 
    687           if (core.sizeX[0] == 0 || (tw < core.sizeX[0] && tw > 0)) { 
    688             core.sizeX[0] = tw; 
    689           } 
    690           s.skipBytes(2); 
    691           int th = s.readInt(); 
    692           if (core.sizeY[0] == 0 || (th < core.sizeY[0] && th > 0)) { 
    693             core.sizeY[0] = th; 
    694           } 
    695  
    696           s.skipBytes(14); 
    697  
    698           int numImageContainers = s.readInt(); 
    699           s.skipBytes(6); 
    700  
    701           // VT_CLSID - PluginCLSID 
    702           while (s.readShort() != 65); 
    703  
    704           // VT_BLOB - Others 
    705           len = s.readInt(); 
    706           s.skipBytes(len); 
    707  
    708           // VT_STORED_OBJECT - Layers 
    709           s.skipBytes(2); 
    710           long old = s.getFilePointer(); 
    711           len = s.readInt(); 
    712  
    713           s.skipBytes(8); 
    714  
    715           int zidx = s.readInt(); 
    716           int cidx = s.readInt(); 
    717           int tidx = s.readInt(); 
    718  
    719           Integer zndx = new Integer(zidx); 
    720           Integer cndx = new Integer(cidx); 
    721           Integer tndx = new Integer(tidx); 
    722  
    723           if (!zIndices.contains(zndx)) zIndices.add(zndx); 
    724           if (!cIndices.contains(cndx)) cIndices.add(cndx); 
    725           if (!tIndices.contains(tndx)) tIndices.add(tndx); 
    726  
    727           s.seek(old + len + 4); 
    728  
    729           boolean foundWidth = s.readInt() == core.sizeX[0]; 
    730           boolean foundHeight = s.readInt() == core.sizeY[0]; 
    731           boolean findFailed = false; 
    732           while ((!foundWidth || !foundHeight) && 
    733             s.getFilePointer() + 1 < s.length()) 
    734           { 
    735             s.seek(s.getFilePointer() - 7); 
    736             foundWidth = s.readInt() == core.sizeX[0]; 
    737             foundHeight = s.readInt() == core.sizeY[0]; 
    738           } 
    739           s.seek(s.getFilePointer() - 16); 
    740           findFailed = !foundWidth && !foundHeight; 
    741  
    742           // image header and data 
    743  
    744           if (dirName.toUpperCase().indexOf("ITEM") != -1 || 
    745             (dirName.equals("Image") && numImageContainers == 0)) 
    746           { 
    747             if (findFailed) s.seek(old + len + 92); 
    748             long fp = s.getFilePointer(); 
    749             byte[] o = new byte[(int) (s.length() - fp)]; 
    750             s.read(o); 
    751  
    752             int imageNum = 0; 
    753             if (dirName.toUpperCase().indexOf("ITEM") != -1) { 
    754               String num = dirName.substring(5); 
    755               num = num.substring(0, num.length() - 1); 
    756               imageNum = Integer.parseInt(num); 
    757             } 
    758  
    759             offsets.put(new Integer(imageNum), new Integer((int) fp + 32)); 
    760             parsePlane(o, imageNum, directory, entryName); 
    761           } 
     766          catch (EOFException exc) { } 
    762767        } 
    763768        else { 
Note: See TracChangeset for help on using the changeset viewer.