#import "AppDelegate.h"
-@interface NSXMLElement (GDBpAdditions_Private)
-- (NSString*)internalName;
-- (NSString*)internalBase64DecodedValue;
-- (void)recursiveBase64DecodedValue:(NSMutableString*)stringBuilder
- depth:(NSUInteger)depth;
-@end
-
@implementation NSXMLElement (GDBpAdditions)
/**
}
/**
- * Returns the "name" attribute.
- */
-- (NSString*)internalName
-{
- return [[self attributeForName:@"name"] stringValue];
-}
-
-/**
- * Does the actual work of decoding base64.
+ * Returns the value of the property
*/
-- (NSString*)internalBase64DecodedValue
+- (NSString*)base64DecodedValue
{
// The value of the node is base64 encoded.
if ([[[self attributeForName:@"encoding"] stringValue] isEqualToString:@"base64"]) {
}
// The value is just a normal string.
- return [self stringValue];
-}
+ if (![self isLeaf])
+ 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;
- }
-
- 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];
- }
+ return nil;
}
@end
@implementation VariableNode {
NSMutableArray* _children;
+ NSString* _nodeValue;
}
- (id)initWithXMLNode:(NSXMLElement*)node {
_fullName = [[[node attributeForName:@"fullname"] stringValue] copy];
_className = [[[node attributeForName:@"classname"] stringValue] copy];
_type = [[[node attributeForName:@"type"] stringValue] copy];
- _value = [[node base64DecodedValue] copy];
+ _nodeValue = [[node base64DecodedValue] copy];
_children = [[NSMutableArray alloc] init];
if ([node children]) {
[self setChildrenFromXMLChildren:[node children]];
return [NSString stringWithFormat:@"<VariableNode %p : %@>", self, self.fullName];
}
+- (NSString*)value {
+ if (!self.isLeaf) {
+ if (self.childCount != self.children.count) {
+ return @"…";
+ }
+ // For non-leaf nodes, display the object structure by recursively printing
+ // the base64-decoded values.
+ NSMutableString* mutableString = [[NSMutableString alloc] initWithString:@"(\n"];
+ for (VariableNode* child in self.children) {
+ [self recusivelyFormatNode:child appendTo:mutableString depth:1];
+ }
+ [mutableString appendString:@")"];
+
+ return mutableString;
+ }
+
+ return _nodeValue;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+#pragma mark Private
+
+/**
+ * Recursively builds a print_r()-style output by attaching the data to
+ * |stringBuilder| with indent level specified by |depth|.
+ */
+- (void)recusivelyFormatNode:(VariableNode*)node
+ appendTo:(NSMutableString*)stringBuilder
+ depth:(NSUInteger)depth
+{
+ // Create the indention string for this level.
+ NSString* indent = [@"" stringByPaddingToLength:depth withString:@"\t" startingAtIndex:0];
+
+ if (node.isLeaf) {
+ // If this is a leaf node, simply append the key=>value pair.
+ [stringBuilder appendFormat:@"%@%@\t=>\t%@\n", indent, node.name, node->_nodeValue];
+ } else {
+ // If this node has children, increase the depth and recurse.
+ [stringBuilder appendFormat:@"%@%@\t=>\t(\n", indent, node.name];
+ for (VariableNode* child in node.children) {
+ [self recusivelyFormatNode:child appendTo:stringBuilder depth:depth + 1];
+ }
+ [stringBuilder appendFormat:@"%@)\n", indent];
+ }
+}
+
@end