]> err.no Git - sope/commitdiff
properly write HTTP headers on MacOS 10.5
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Sat, 9 Feb 2008 14:52:58 +0000 (14:52 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Sat, 9 Feb 2008 14:52:58 +0000 (14:52 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@1599 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-core/NGStreams/ChangeLog
sope-core/NGStreams/NGCTextStream.m
sope-core/NGStreams/NGStreams/NGCTextStream.h
sope-core/NGStreams/Version

index aa19ac0321e86a0ec29c9146447ab82ea598eec1..bab4db4df828806766b770fde12ff82aa4b91ed3 100644 (file)
@@ -1,3 +1,8 @@
+2008-02-09  Helge Hess  <helge.hess@opengroupware.org>
+
+       * NGCTextStream.m: fixed -writeString: on MacOS > 10.4, use
+         -maximumLengthOfBytesUsingEncoding: (v4.7.56)
+
 2007-12-03  Helge Hess  <me@helgehess.eu>
 
        * NGCTextStream.m: replaced usage of getCString on MacOS > 10.4
index 3e40a3df85c4df3c225268f6cf328a2fe6e95fe2..cb9bee41f5747a0d9ae9fbba2d432aa34afe1e5e 100644 (file)
@@ -1,6 +1,6 @@
 /*
-  Copyright (C) 2000-2007 SKYRIX Software AG
-  Copyright (C) 2007      Helge Hess
+  Copyright (C) 2000-2008 SKYRIX Software AG
+  Copyright (C) 2007-2008 Helge Hess
 
   This file is part of SOPE.
 
@@ -110,8 +110,11 @@ static void _flushAtExit(void) {
     [self release];
     return nil;
   }
-  if ((self = [super init])) {
+  if ((self = [super init]) != nil) {
     self->source = [_stream retain];
+    
+    /* On MacOS 10.5 this is per default 30 aka MacOS Roman */
+    self->encoding = [NSString defaultCStringEncoding];
 
 #ifdef __APPLE__
     //#  warning no selector caching on MacOSX ...
@@ -256,7 +259,8 @@ static void _flushAtExit(void) {
                                          autorelease];
 }
 
-// NGTextOutputStream
+
+/* NGTextOutputStream */
 
 - (BOOL)writeCharacter:(unichar)_character {
   unsigned char c;
@@ -266,16 +270,16 @@ static void _flushAtExit(void) {
     // character is not in range of maximum system encoding
     [NSException raise:@"NGCTextStreamEncodingException"
                  format:
-                   @"called writeCharacter: with character code (0x%X) exceeding"
-                   @" the maximum system character code (0x%X)",
+                   @"called writeCharacter: with character code (0x%X)"
+                   @" exceeding the maximum system character code (0x%X)",
                    _character, ((sizeof(unsigned char) * 256) - 1)];
   }
 
   c = _character;
 
-  if (writeBytes) {
-    res = writeBytes(self->source, @selector(writeBytes:count:),
-                     &c, sizeof(unsigned char));
+  if (self->writeBytes != NULL) {
+    res = self->writeBytes(self->source, @selector(writeBytes:count:),
+                          &c, sizeof(unsigned char));
   }
   else
     res = [self->source writeBytes:&c count:sizeof(unsigned char)];
@@ -293,22 +297,30 @@ static void _flushAtExit(void) {
   unsigned toGo;
 
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1040
-  NSStringEncoding enc = [NSString defaultCStringEncoding];
-  
-  // TBD: better use -maximumLengthOf... and then search for \0
-  if ((toGo = [_string lengthOfBytesUsingEncoding:enc]) == 0)
+  if ((toGo = [_string maximumLengthOfBytesUsingEncoding:self->encoding]) == 0)
     return YES;
-
-  buf = str = calloc(toGo + 1, sizeof(unsigned char));
-  [_string getCString:(char *)str maxLength:toGo encoding:enc];
+  
+  buf = str = calloc(toGo + 2, sizeof(unsigned char));
+  // Note: maxLength INCLUDES the 0-terminator. And -getCString: does
+  //       0-terminate the buffer
+  if (![_string getCString:(char *)str maxLength:(toGo + 1)
+               encoding:self->encoding]) {
+    NSLog(@"ERROR(%s): failed to extract cString in defaultCStringEncoding(%i)"
+         @" from NSString: '%@'\n", __PRETTY_FUNCTION__,
+         self->encoding, _string);
+    return NO;
+  }
+  
+  // we need to update the *real* (not the max) length
+  toGo = strlen((char *)str);
 #else
   if ((toGo = [_string cStringLength]) == 0)
     return YES;
 
-  buf = str = calloc(toGo + 1, sizeof(unsigned char));
+  buf = str = calloc(toGo + 2, sizeof(unsigned char));
   [_string getCString:(char *)str];
-#endif
   str[toGo] = '\0';
+#endif
   
   NS_DURING {
     while (toGo > 0) {
index f2529a682b7b697a524c1d37c0c4756dd76482cb..9388710e7f843b4abe3808aaa31d93c1a142113a 100644 (file)
@@ -1,5 +1,6 @@
 /*
-  Copyright (C) 2000-2005 SKYRIX Software AG
+  Copyright (C) 2000-2008 SKYRIX Software AG
+  Copyright (C) 2008      Helge Hess
 
   This file is part of SOPE.
 
@@ -56,6 +57,7 @@ NGStreams_EXPORT void NGInitTextStdio(void);
   NGIOReadMethodType  readBytes;
   NGIOWriteMethodType writeBytes;
   BOOL                (*flushBuffer)(id, SEL);
+  NSStringEncoding    encoding;
 }
 
 + (id)textStreamWithInputSource:(id<NGInputStream>)_source;
index 1e1b1b4fc4a61239d7b40fff10fac21af915cc33..0d71e7663cdd42daf5b48bcffc44392a12b595b6 100644 (file)
@@ -1,3 +1,3 @@
 # version file
 
-SUBMINOR_VERSION:=55
+SUBMINOR_VERSION:=56