]> err.no Git - sope/commitdiff
added parsing method to iCalCalendar
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Fri, 15 Jul 2005 09:30:28 +0000 (09:30 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Fri, 15 Jul 2005 09:30:28 +0000 (09:30 +0000)
reset sax driver in NGVCard parsing

git-svn-id: http://svn.opengroupware.org/SOPE/trunk@905 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-ical/NGiCal/ChangeLog
sope-ical/NGiCal/NGVCard.m
sope-ical/NGiCal/Version
sope-ical/NGiCal/iCalCalendar.h
sope-ical/NGiCal/iCalCalendar.m

index 1d4cd5d1d3ce531fbea770b426f13e4591a4299e..6dc41f035f9f6c76e7ae4e0cce8b4284203dcf96 100644 (file)
@@ -1,24 +1,28 @@
-2005-07-15  Marcus Mueller  <znek@mulle-kybernetik.com>
+2005-07-15  Helge Hess  <helge.hess@opengroupware.org>
 
-       * v4.5.52
-       
-       * iCalEntityObject.[hm]: added -increaseSequence
+       * v4.5.53
 
-       * v4.5.51
+       * iCalCalendar.m: added +parseCalendarFromSource: convenience method
+
+       * NGVCard.m: properly reset sax driver after parsing
+
+2005-07-15  Marcus Mueller  <znek@mulle-kybernetik.com>
+
+       * iCalEntityObject.[hm]: added -increaseSequence (v4.5.52)
 
        * iCalPerson.m: fixed -hasSameEmailAddress: to lowercase email
-         addresses before attempting comparison
+         addresses before attempting comparison (v4.5.51)
 
 2005-07-15  Helge Hess  <helge.hess@opengroupware.org>
 
        * v4.5.50
-
+       
        * NGiCal.xmap: fixed mapping of 'method' property (is an attribute of
          the calendar)
          
        * iCalCalendar.m: use ASSIGNCOPY in accessors, added 'method' to
          -description
-
+         
 2005-07-14  Marcus Mueller  <znek@mulle-kybernetik.com>
 
        * v4.5.49
index 5cc7721388dd5057288387d8fb2be87017d5beb8..8be6a93aaadcc4d65e01100e8d74e80dbe0d9c28 100644 (file)
@@ -43,7 +43,7 @@ static NGVCardSaxHandler         *sax   = nil; // THREAD
                             createXMLReaderForMimeType:@"text/x-vcard"]
                              retain];
     if (parser == nil) {
-      NSLog(@"%s: did not find a parser for text/x-vcard !",
+      NSLog(@"ERROR(%s): did not find a parser for text/x-vcard!",
            __PRETTY_FUNCTION__);
       return nil;
     }
@@ -57,12 +57,15 @@ static NGVCardSaxHandler         *sax   = nil; // THREAD
 
 + (NSArray *)parseVCardsFromSource:(id)_src {
   static id<NSObject,SaxXMLReader> parser;
+  NSArray *vCards;
   
   if ((parser = [self vCardParser]) == nil)
     return nil;
   
   [parser parseFromSource:_src];
-  return [sax vCards];
+  vCards = [[sax vCards] retain];
+  [sax reset];
+  return [vCards autorelease];
 }
 
 - (id)initWithUid:(NSString *)_uid version:(NSString *)_version {
index 3a75896212eb14d10a670227cac0cce9605cc9d5..d2b964f05e61163c56d990ac2ab61c17533ff7c0 100644 (file)
@@ -2,7 +2,7 @@
 
 MAJOR_VERSION=4
 MINOR_VERSION=5
-SUBMINOR_VERSION:=52
+SUBMINOR_VERSION:=53
 
 # v4.5.40 requires NGExtensions v4.5.145
 # v4.5.37 requires NGExtensions v4.5.140
index 0227c88b3359dcf64a4fd3a4bf37303c98b96980..2170827fecc68525b5b3964badf84beb2cb1c53b 100644 (file)
@@ -25,7 +25,7 @@
 #include <NGiCal/iCalObject.h>
 
 @class NSString, NSMutableArray, NSArray, NSEnumerator, NSMutableDictionary;
-@class iCalEvent, iCalToDo, iCalJournal, iCalFreeBusy;
+@class iCalEvent, iCalToDo, iCalJournal, iCalFreeBusy, iCalEntityObject;
 
 @interface iCalCalendar : iCalObject
 {
@@ -41,6 +41,9 @@
   NSMutableDictionary *timezones;
 }
 
++ (iCalCalendar *)parseCalendarFromSource:(id)_src;
+- (id)initWithEntityObject:(iCalEntityObject *)_entityObject;
+
 /* accessors */
 
 - (NSString *)calscale;
index 3554848d6d8045789de283d29424e98f92703bbe..9bdddcbab33558c06bf4fcd85c66a1f4a70690da 100644 (file)
 */
 
 #include "iCalCalendar.h"
+#include <SaxObjC/SaxObjC.h>
+#include "iCalEntityObject.h"
 #include "common.h"
 
+@interface iCalCalendar(Privates)
+- (void)addToEvents:(iCalEvent *)_event;
+- (void)addToTimezones:(id)_tz;
+- (void)addToTodos:(iCalToDo *)_todo;
+- (void)addToJournals:(iCalJournal *)_obj;
+- (void)addToFreeBusys:(iCalFreeBusy *)_obj;
+@end
+
 @implementation iCalCalendar
 
+static id<NSObject,SaxXMLReader> parser  = nil; // THREAD
+static SaxObjectDecoder          *sax    = nil; // THREAD
+
++ (id<NSObject,SaxXMLReader>)iCalParser {
+  if (sax == nil) {
+    sax = [[SaxObjectDecoder alloc] initWithMappingNamed:@"NGiCal"];;
+    if (sax == nil) {
+      NSLog(@"ERROR(%s): could not create iCal SAX handler!",
+           __PRETTY_FUNCTION__);
+    }
+  }
+  if (sax != nil && parser == nil) {
+    parser =
+      [[[SaxXMLReaderFactory standardXMLReaderFactory] 
+                            createXMLReaderForMimeType:@"text/calendar"]
+                             retain];
+    if (parser == nil) {
+      NSLog(@"ERROR(%s): did not find a parser for text/calendar!",
+           __PRETTY_FUNCTION__);
+      return nil;
+    }
+    
+    [parser setContentHandler:sax];
+    [parser setErrorHandler:sax];
+  }
+  return parser;
+}
+
++ (iCalCalendar *)parseCalendarFromSource:(id)_src {
+  static id<NSObject,SaxXMLReader> parser;
+  id root, cal;
+  
+  if ((parser = [self iCalParser]) == nil)
+    return nil;
+  
+  [parser parseFromSource:_src];
+  root = [[sax rootObject] retain];
+  [sax reset];
+  
+  if (root == nil)
+    return nil;
+  if ([root isKindOfClass:self])
+    return [root autorelease];
+  
+  if (![root isKindOfClass:[iCalEntityObject class]]) {
+    NSLog(@"ERROR(%s): parsed object is of an unexpected class %@: %@",
+         __PRETTY_FUNCTION__, NSStringFromClass([root class]), root);
+    [root release];
+    return nil;
+  }
+  
+  /* so we just got an iCalEntityObject, wrap that manually into a cal */
+  cal = [[[self alloc] initWithEntityObject:root] autorelease];
+  [root release]; root = nil;
+  return cal;
+}
+
+- (id)initWithEntityObject:(iCalEntityObject *)_entityObject {
+  if ((self = [self init])) {
+    if ([_entityObject isKindOfClass:[iCalEvent class]])
+      [self addToEvents:(iCalEvent *)_entityObject];
+    else if ([_entityObject isKindOfClass:[iCalToDo class]])
+      [self addToTodos:(iCalToDo *)_entityObject];
+    else if ([_entityObject isKindOfClass:[iCalJournal class]])
+      [self addToJournals:(iCalJournal *)_entityObject];
+    else if ([_entityObject isKindOfClass:[iCalFreeBusy class]])
+      [self addToFreeBusys:(iCalFreeBusy *)_entityObject];
+    else if ([_entityObject isNotNull]) {
+      [self errorWithFormat:@"Unexpected entity object: %@", _entityObject];
+      [self release];
+      return nil;
+    }
+  }
+  return self;
+}
+
 - (void)dealloc {
   [self->version   release];
   [self->calscale  release];
   return self->journals;
 }
 
-- (void)addToFreeBusys:(iCalJournal *)_obj {
+- (void)addToFreeBusys:(iCalFreeBusy *)_obj {
   if (_obj == nil) return;
   if (self->freeBusys == nil)
     self->freeBusys = [[NSMutableArray alloc] initWithCapacity:4];