In |-[NSXMLElement(GDBpAdditions) base64DecodedValue]|, recursively print objects.
authorRobert Sesek <rsesek@bluestatic.org>
Sun, 1 May 2011 18:06:06 +0000 (14:06 -0400)
committerRobert Sesek <rsesek@bluestatic.org>
Sun, 1 May 2011 18:06:06 +0000 (14:06 -0400)
This fixes #168.

CHANGES
Source/NSXMLElementAdditions.m

diff --git a/CHANGES b/CHANGES
index 24596dd1f1c8a3bc1e7da029adf7befd17a6c88d..664516f1b61c726fddd0ccb9b552b535a2eae604 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,7 @@ MacGDBp                                                               CHANGE LOG
 - Fix: #128  Clicking on the line number will now always set the correct
   breakpoint
 - New: #190  Evaluation of arbitrary script/code fragments
+- New: #168  Recursively display objects and arrays in the variable inspector
 
 
 1.4.1
index 070e18ea8f524b812b4646a7a2fb2af2ff0ae2c7..65b915f8a52685db24a980f215047cb034d46947 100644 (file)
 #import "AppDelegate.h"
 #include "modp_b64.h"
 
+@interface NSXMLElement (GDBpAdditions_Private)
+- (NSString*)internalName;
+- (NSString*)internalBase64DecodedValue;
+- (void)recursiveBase64DecodedValue:(NSMutableString*)stringBuilder
+                              depth:(NSUInteger)depth;
+@end
+
 @implementation NSXMLElement (GDBpAdditions)
 
 /**
 }
 
 /**
- * Returns the value of the property
+ * Returns the "name" attribute.
  */
-- (NSString*)base64DecodedValue
+- (NSString*)internalName
+{
+  return [[self attributeForName:@"name"] stringValue];
+}
+
+/**
+ * Does the actual work of decoding base64.
+ */
+- (NSString*)internalBase64DecodedValue
 {
-  // Non-leaf nodes do not have a value:
-  //   https://www.bluestatic.org/bugs/showreport.php?bugid=168
-  if (![self isLeaf]) {
-    return @"...";
-  }
-  
   // The value of the node is base64 encoded.
   if ([[[self attributeForName:@"encoding"] stringValue] isEqualToString:@"base64"]) {
     const char* src = [[self stringValue] UTF8String];
       ret = [NSString stringWithUTF8String:dest];
       free(dest);
     }
-    
     return ret;
   }
-  
+
   // The value is just a normal string.
   return [self stringValue];  
 }
 
+/**
+ * Returns the value of the property
+ */
+- (NSString*)base64DecodedValue
+{
+  if (![self isLeaf]) {
+    // For non-leaf nodes, display the object structure by recursively printing
+    // the base64-decoded values.
+    NSMutableString* mutableString = [[NSMutableString alloc] initWithString:@"(\n"];
+    [self recursiveBase64DecodedValue:mutableString depth:1];
+    [mutableString appendString:@")"];
+    return [mutableString autorelease];
+  }
+
+  return [self internalBase64DecodedValue];  
+}
+
+/**
+ * Recursively builds a print_r()-style output by attaching the data to
+ * |stringBuilder| with indent level specified by |depth|.
+ */
+- (void)recursiveBase64DecodedValue:(NSMutableString*)stringBuilder
+                              depth:(NSUInteger)depth
+{
+  // Create the indention string for this level.
+  NSString* indent = [@"" stringByPaddingToLength:depth withString:@"\t" startingAtIndex:0];
+
+  if ([self isLeaf]) {
+    // If this is a leaf node, simply append the key=>value pair.
+    [stringBuilder appendFormat:@"%@%@\t=>\t%@\n", indent, [self internalName], [self internalBase64DecodedValue]];
+  } else {
+    // If this node has children, increase the depth and recurse.
+    [stringBuilder appendFormat:@"%@%@\t=>\t(\n", indent, [self internalName]];
+    for (NSXMLElement* elm in [self children]) {
+      [elm recursiveBase64DecodedValue:stringBuilder depth:depth + 1];
+    }
+    [stringBuilder appendFormat:@"%@)\n", indent];
+  }
+}
+
 @end