Deprecated: Assigning the return value of new by reference is deprecated in /home/bluestat/public_html/source/index.php on line 477
MacGDBp - Blob - ViewGit - Blue Static
/*
 * MacGDBp
 * Copyright (c) 2007 - 2009, Blue Static <http://www.bluestatic.org>
 *
 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU
 * General Public License as published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program; if not,
 * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
 */

#import <Cocoa/Cocoa.h>
#include "base64.h"
#import "AppDelegate.h"

@implementation NSXMLElement (GDBpAdditions)

/**
 * Return's the property's full name
 */
- (NSString*)fullname
{
	return [[self attributeForName:@"fullname"] stringValue];
}

/**
 * Return's the property's name from the attributes list
 */
- (NSString*)variable
{
	return [[self attributeForName:@"name"] stringValue];
}

/**
 * Returns whether or not this node has any children
 */
- (BOOL)isLeaf
{
	return ([[[self attributeForName:@"children"] stringValue] intValue] == 0);
}

/**
 * Override children so we can fetch more depth as needed
 */
- (NSArray*)subnodes
{
	NSArray* children = [self children];
	if (![self isLeaf] && [children count] < 1)
	{
		return [[[(AppDelegate*)[NSApp delegate] debugger] connection] getProperty:[self fullname]];
	}
	return children;
}

/**
 * Returns the value of the property
 */
- (NSString*)value
{
	// not a leaf, so don't display any value
	if (![self isLeaf])
	{
		return @"...";
	}

	// base64 encoded data
	if ([[[self attributeForName:@"encoding"] stringValue] isEqualToString:@"base64"])
	{
		char* str = (char*)[[self stringValue] cStringUsingEncoding:NSASCIIStringEncoding];
		int strlen = [[self stringValue] lengthOfBytesUsingEncoding:NSASCIIStringEncoding];

		char* data;
		size_t datalen;

		if (!base64_decode_alloc(str, strlen, &data, &datalen))
		{
			NSLog(@"error in converting %@ to base64", self);
		}

		NSString* ret = [NSString stringWithCString:data length:datalen];
		free(data);

		return ret;
	}

	// just a normal string
	return [self stringValue];
}

/**
 * Returns the type of variable this is
 */
- (NSString*)type
{
	NSXMLNode* className = [self attributeForName:@"classname"];
	NSString* type = [[self attributeForName:@"type"] stringValue];
	if (className != nil)
	{
		return [NSString stringWithFormat:@"%@ (%@)", [className stringValue], type];
	}
	return type;
}

@end