]> err.no Git - sope/commitdiff
improved robustness
authorznek <znek@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Wed, 20 Oct 2004 12:13:04 +0000 (12:13 +0000)
committerznek <znek@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Wed, 20 Oct 2004 12:13:04 +0000 (12:13 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@283 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-ical/versitSaxDriver/ChangeLog
sope-ical/versitSaxDriver/VSSaxDriver.m
sope-ical/versitSaxDriver/Version

index 54c70c6622c4013ff17f14fb262e178783cb2e28..c62042442b9fa5c701a4fc8a4ab3b3e6ddc5db69 100644 (file)
@@ -1,3 +1,10 @@
+2004-10-20  Marcus Mueller  <znek@mulle-kybernetik.com>
+
+       * VSSaxDriver.m: remove surrounding double quotes from attribute values
+         if any. During parsing, check if end tags match expectations and
+         issue warnings if they don't. Added some logic to get parsing
+         straight nevertheless in such events. (v4.3.10)
+
 2004-10-19  Marcus Mueller  <znek@mulle-kybernetik.com>
 
        * v4.3.9
index 230594d4e7244e473d34de96c0fe2a4a966071b0..203bd9e91bb10de4e25bd81ad82a1da25aaa98fe 100644 (file)
@@ -248,8 +248,26 @@ static VSStringFormatter *stringFormatter = nil;
   
   r = [_attr rangeOfCharacterFromSet:equalSignCharSet];
   if (r.length > 0) {
+    unsigned left, right;
+
     attrName  = [[_attr substringToIndex:r.location] uppercaseString];
-    attrValue = [_attr substringFromIndex:(r.location + 1)];
+    left = NSMaxRange(r);
+    right = [_attr length] - 1;
+    if(left != right) {
+      if(([_attr characterAtIndex:left]  == '"') &&
+         ([_attr characterAtIndex:right] == '"'))
+      {
+        left += 1;
+        r = NSMakeRange(left, right - left);
+        attrValue = [_attr substringWithRange:r];
+      }
+      else {
+        attrValue = [_attr substringFromIndex:left];
+      }
+    }
+    else {
+      attrValue = @"";
+    }
   }
   else {
     attrName  = @"TYPE";
@@ -420,6 +438,7 @@ static VSStringFormatter *stringFormatter = nil;
   r = [_line rangeOfCharacterFromSet:colonAndSemicolonCharSet
              options:0
              range:todoRange];
+  /* is line well-formed? */
   if(r.length == 0) {
     if(debugOn) {
       NSLog(@"%s got an improper content line! ->\n%@",
@@ -432,6 +451,9 @@ static VSStringFormatter *stringFormatter = nil;
   tagName = [[_line substringToIndex:r.location] uppercaseString];
   tagAttributes = [[NSMutableArray alloc] init];
 
+  /* possible shortcut: if we spotted a ':', we don't have to do "expensive"
+     argument scanning/processing.
+  */
   if([_line characterAtIndex:r.location] != ':') {
     BOOL isAtEnd = NO, isInDquote = NO;
     unsigned start = NSMaxRange(r);
@@ -444,7 +466,7 @@ static VSStringFormatter *stringFormatter = nil;
       r = [_line rangeOfCharacterFromSet:colonSemicolonAndDquoteCharSet
                  options:0
                  range:todoRange];
-      /* is line well-formed ? */
+      /* is line well-formed? */
       if(r.length == 0 || r.location == 0) {
         if(debugOn) {
           NSLog(@"%s got an improper content line! ->\n%@",
@@ -498,7 +520,41 @@ static VSStringFormatter *stringFormatter = nil;
     [self->cardStack addObject:tag];
   } 
   else if ([tagName isEqualToString:@"END"]) {
-    [self _endTag:[self _mapTagName:tagValue]];
+    NSString *mtName;
+    
+    mtName = [self _mapTagName:tagValue];
+    if([self->cardStack count] > 0) {
+      NSString *expectedName;
+
+      expectedName = [[self->cardStack lastObject] objectAtIndex:1];
+      if(![expectedName isEqualToString:mtName]) {
+        if(debugOn) {
+          NSLog(@"%s found end tag '%@' which doesn't match expected name "
+                @"'%@'! Tag '%@' hasn't been closed properly. Given iCal "
+                @"document contains errors!",
+                __PRETTY_FUNCTION__,
+                mtName,
+                expectedName,
+                expectedName);
+        }
+        /* probably futile attempt to parse anyways */
+        if(debugOn) {
+          NSLog(@"%s trying to fix previous error by inserting bogus end "
+                @"tag.",
+                __PRETTY_FUNCTION__);
+        }
+        [self _endTag:expectedName];
+        [self->cardStack removeLastObject];
+      }
+    }
+    else {
+      if(debugOn) {
+        NSLog(@"%s found end tag '%@' without any open tags left?!",
+              __PRETTY_FUNCTION__,
+              mtName);
+      }
+    }
+    [self _endTag:mtName];
     [self->cardStack removeLastObject];
     if ([self->cardStack count] == 0)
       [self _eventsForElements];
@@ -613,6 +669,15 @@ static VSStringFormatter *stringFormatter = nil;
     [self _parseLine:line];
   }
 
+  if([self->cardStack count] != 0) {
+    if(debugOn) {
+      NSLog(@"%s found elements on cardStack. This indicates an improper "
+            @"iCal structure! Not all required events will have been "
+            @"generated, leading to unpredictable results!",
+            __PRETTY_FUNCTION__);
+    }
+  }
+
   [line release];
   [self->contentHandler endPrefixMapping:@""];
   [self->contentHandler endDocument];
index b191a15e76dac3e66bcd9f3cefe22e3b7ade21f4..c7825e078ab1a600cba9b22cbe0e1d7cdea587b8 100644 (file)
@@ -1,3 +1,3 @@
 # Version file
 
-SUBMINOR_VERSION:=9
+SUBMINOR_VERSION:=10