protected void startElement(DAVElement parent, DAVElement element, Attributes attrs)
     throws SVNException {
   if (element == FILE_REVISION) {
     myPath = attrs.getValue("path");
     myRevision = Long.parseLong(attrs.getValue("rev"));
   } else if (element == REVISION_PROPERTY
       || element == SET_PROPERTY
       || element == DELETE_PROPERTY) {
     myPropertyName = attrs.getValue("name");
     myPropertyEncoding = attrs.getValue("encoding");
   }
   if (element == TX_DELTA) {
     // handle file revision with props.
     if (myPath != null && myFileRevisionsHandler != null) {
       if (myProperties == null) {
         myProperties = Collections.EMPTY_MAP;
       }
       if (myPropertiesDelta == null) {
         myPropertiesDelta = Collections.EMPTY_MAP;
       }
       SVNFileRevision revision =
           new SVNFileRevision(myPath, myRevision, myProperties, myPropertiesDelta);
       myFileRevisionsHandler.openRevision(revision);
       myProperties = null;
       myPropertiesDelta = null;
       myPath = null;
       myFileRevisionsHandler.applyTextDelta(myPath, null);
     }
     setDeltaProcessing(true);
   }
 }
 protected void endElement(DAVElement parent, DAVElement element, StringBuffer cdata)
     throws SVNException {
   if (element == FILE_REVISION) {
     if (myPath != null && myFileRevisionsHandler != null) {
       // handle file revision if was not handled yet (no tx delta).
       if (myProperties == null) {
         myProperties = Collections.EMPTY_MAP;
       }
       if (myPropertiesDelta == null) {
         myPropertiesDelta = Collections.EMPTY_MAP;
       }
       SVNFileRevision revision =
           new SVNFileRevision(myPath, myRevision, myProperties, myPropertiesDelta);
       myFileRevisionsHandler.openRevision(revision);
     }
     // handle close revision with props?
     if (myFileRevisionsHandler != null) {
       myFileRevisionsHandler.closeRevision(myPath);
     }
     myPath = null;
     myProperties = null;
     myPropertiesDelta = null;
     myPropertyEncoding = null;
     myPropertyName = null;
   } else if (element == TX_DELTA) {
     setDeltaProcessing(false);
     myCount++;
   } else if (element == REVISION_PROPERTY) {
     if (myProperties == null) {
       myProperties = new HashMap();
     }
     myProperties.put(myPropertyName, cdata != null ? cdata.toString() : "");
     myPropertyName = null;
   } else if (element == SET_PROPERTY) {
     if (myPropertiesDelta == null) {
       myPropertiesDelta = new HashMap();
     }
     if (myPropertyName != null) {
       String value;
       if ("base64".equals(myPropertyEncoding)) {
         byte[] bytes = allocateBuffer(cdata.length());
         int length =
             SVNBase64.base64ToByteArray(new StringBuffer(cdata.toString().trim()), bytes);
         try {
           value = new String(bytes, 0, length, "UTF-8");
         } catch (UnsupportedEncodingException e) {
           value = new String(bytes, 0, length);
         }
       } else {
         value = cdata.toString();
       }
       myPropertiesDelta.put(myPropertyName, value);
     }
     myPropertyName = null;
     myPropertyEncoding = null;
   } else if (element == DELETE_PROPERTY) {
     if (myPropertiesDelta == null) {
       myPropertiesDelta = new HashMap();
     }
     if (myPropertyName != null) {
       myPropertiesDelta.put(myPropertyName, null);
     }
     myPropertyEncoding = null;
     myPropertyName = null;
   }
 }
 public int getFileRevisions(
     String path, long sRevision, long eRevision, ISVNFileRevisionHandler handler)
     throws SVNException {
   Long srev = getRevisionObject(sRevision);
   Long erev = getRevisionObject(eRevision);
   int count = 0;
   SVNDeltaReader deltaReader = new SVNDeltaReader();
   try {
     openConnection();
     Object[] buffer = new Object[] {"get-file-revs", getRepositoryPath(path), srev, erev};
     write("(w(s(n)(n)))", buffer);
     authenticate();
     buffer = new Object[5];
     while (true) {
       SVNFileRevision fileRevision = null;
       boolean skipDelta = false;
       try {
         buffer = read("(SN(*P)(*Z)?S", buffer, false);
         if (buffer[4] != null && ((String) buffer[4]).length() == 0) {
           buffer[4] = null;
           skipDelta = true;
         } else {
           read(")", null, false);
         }
         count++;
       } catch (SVNException e) {
         read("x", buffer, true);
         read("[()]", buffer, true);
         return count;
       }
       String name = null;
       if (handler != null) {
         name = (String) buffer[0];
         long revision = SVNReader.getLong(buffer, 1);
         Map properties = SVNReader.getMap(buffer, 2);
         Map propertiesDelta = SVNReader.getMap(buffer, 3);
         if (name != null) {
           fileRevision = new SVNFileRevision(name, revision, properties, propertiesDelta);
         }
         buffer[2] = null;
         buffer[3] = null;
       }
       if (handler != null && fileRevision != null) {
         handler.openRevision(fileRevision);
       }
       if (skipDelta) {
         if (handler != null) {
           handler.closeRevision(name == null ? path : name);
         }
         continue;
       }
       boolean windowRead = false;
       while (true) {
         byte[] line = (byte[]) read("?W?B", buffer, true)[1];
         if (line == null) {
           // may be failure
           read("[]", buffer, true);
           break;
         } else if (line.length == 0) {
           // empty line, delta end.
           break;
         }
         // apply delta here.
         if (!windowRead) {
           if (handler != null) {
             handler.applyTextDelta(name == null ? path : name, null);
             windowRead = true;
           }
         }
         deltaReader.nextWindow(line, 0, line.length, name == null ? path : name, handler);
       }
       deltaReader.reset(name == null ? path : name, handler);
       if (windowRead) {
         handler.textDeltaEnd(name == null ? path : name);
       }
       if (handler != null) {
         handler.closeRevision(name == null ? path : name);
       }
     }
   } catch (SVNException e) {
     closeSession();
     handleUnsupportedCommand(e, "'get-file-revs' not implemented");
   } finally {
     closeConnection();
   }
   return -1;
 }