forked from mykeepass/KeePassLib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Node.m
94 lines (78 loc) · 1.97 KB
/
Node.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//
// Node.m
// KeePass2
//
// Created by Qiang Yu on 2/10/10.
// Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import "Node.h"
#import "RandomStream.h"
#import "Base64.h"
#define A_PROTECTED "Protected"
@implementation Node
@synthesize _parent;
@synthesize _text;
@synthesize _name;
#pragma mark alloc/dealloc
-(id)initWithUTF8Name:(uint8_t *)name{
NSString * value = [[NSString alloc]initWithUTF8String:(const char *)name];
self = [self initWithStringName:value];
[value release];
return self;
}
-(id)initWithStringName:(NSString *)name{
//DLog(@"+++ Node %@ created", name);
if(self = [super init]){
self._name = name;
_text = [[NSMutableString alloc]initWithCapacity:64];
}
return self;
}
-(void)dealloc{
//DLog(@"--- Node %@ deallocated", _name);
[_parent release];
[_children release];
[_attributes release];
[_text release];
[_name release];
[super dealloc];
}
-(void)addChild:(Node *) child{
if(!_children) _children = [[NSMutableArray alloc]initWithCapacity:8];
[_children addObject:child];
child._parent = self;
}
-(void)removeChild:(Node *) child{
[_children removeObject:child];
child._parent = nil;
}
-(void)addAttribute:(NSString *)key value:(NSString *)value{
if(!_attributes) _attributes = [[NSMutableDictionary alloc] initWithCapacity:2];
[_attributes setObject:value forKey:key];
}
-(NSString *)description{
return [NSString stringWithFormat:@"<%@>%@<%@/>", _name,_text, _name];
}
-(NSArray *)_children{
return _children;
}
-(NSDictionary *)_attributes{
return _attributes;
}
//break cyclic references
-(void)breakCyclcReference{
self._parent = nil;
for(Node * child in _children){
[child breakCyclcReference];
}
}
//do nothing by default
-(void)postProcess:(id<RandomStream>)rs{
if([(NSString *)[_attributes objectForKey:@A_PROTECTED] boolValue]){
NSMutableData * data = [[NSMutableData alloc]initWithCapacity:[_text length]];
[Base64 decode:_text to:data];
[self._text setString:[rs xor:data]];
[data release];
}
}
@end