Chameleon Applications

Chameleon Applications Svn Source Tree

Root/trunk/ChameleonPrefPane/Sources/PartitionInfoManager.mm

1//
2// PartitionInfoManager.mm
3// ChameleonPrefPane
4//
5// Created by Fabien on 11-11-13.
6// Copyright 2011 __MyCompanyName__. All rights reserved.
7//
8
9#import "PartitionInfoManager.h"
10#include "ShellProcess.h"
11
12// Singleton defintion
13
14static NSMutableArray* sParts = nil;
15
16@implementation PartsInfoMgr
17
18-(id) init
19{
20[super init];
21
22return self;
23}
24
25
26static NSString *currentCompare = nil;
27static BOOL isPartMatchingNameSpec(PartitionInfoElement* pe, NSUInteger idx, BOOL* stop)
28{
29NSString* s = [currentCompare stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString: @" \t\""]];
30
31if ([ [pe hdString] compare:s] == NSOrderedSame
32 || [ [pe bsdName] compare:s] == NSOrderedSame
33 || [ [pe vName] compare:s] == NSOrderedSame
34 || [ [pe vUUID] compare:s] == NSOrderedSame
35 || [ [pe vAliasName] compare:s] == NSOrderedSame
36)
37*stop= YES;
38
39return *stop;
40}
41+(PartitionInfoElement*) partWithName: (NSString*) nameSpec
42{
43return [PartsInfoMgr partWithName:nameSpec outIndex:nil];
44}
45/// Retrieve the part that maches the name
46+(PartitionInfoElement*) partWithName: (NSString*) nameSpec outIndex:(NSUInteger*) ind
47{
48if (nameSpec==nil || [nameSpec length]==0) return nil;
49currentCompare = nameSpec;
50NSArray * arr = [PartsInfoMgr parts];
51NSUInteger idx = [arr indexOfObjectPassingTest:
52 ^(id pe, NSUInteger idx, BOOL* stop) {return isPartMatchingNameSpec(pe, idx, stop); } ];
53
54PartitionInfoElement* part = nil;
55
56if (ind!=nil) *ind = idx;
57
58if (idx!= NSNotFound)
59{
60part = [arr objectAtIndex: idx];
61}
62return part;
63}
64
65/// Singleton definition
66+(NSArray*) stringsFromPartSpec: (NSString*) partSpec withCharsFromString:(NSString*) s
67{
68if (partSpec == nil || [partSpec length]==0) return nil;
69NSArray *chunks = [partSpec componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString: s] ];
70return chunks;
71}
72
73/// Retrieve all the partitions
74+(NSArray*) parts
75{
76if (sParts==nil)
77{
78[PartsInfoMgr resetSwapping];
79NSArray* partArr = [PartitionInfoElement createBSDPartitionList];
80sParts = (NSMutableArray*) [PartitionInfoElement extractInfoWithBSDNames: partArr withArray: nil];
81[partArr release];
82}
83return [sParts retain];
84}
85
86+(NSUInteger) count
87{
88return [(NSArray*)[PartsInfoMgr parts] count];
89}
90
91+(PartitionInfoElement*) objectAtIndex:(NSUInteger) index
92{
93
94PartitionInfoElement* elt = [ [[PartsInfoMgr parts] objectAtIndex:index] retain];
95
96
97return elt;
98}
99
100static void hideIterateOn(NSString* partSpec, NSString*filter)
101{
102for (currentCompare in [PartsInfoMgr stringsFromPartSpec:partSpec withCharsFromString: filter])
103{
104PartitionInfoElement * p = (currentCompare!=nil) && [currentCompare length]>0 ? [PartsInfoMgr partWithName: currentCompare] : nil;
105if (p!=nil)
106{
107[p setHidden: true];
108NSLog(@" Found part with name %@ : %@", currentCompare, p);
109}
110if ((currentCompare!=nil) && [currentCompare length]>0 )
111{
112// remove them so that they dont appear in next search
113NSMutableString *mut = [NSMutableString stringWithString:partSpec];
114[ mut replaceOccurrencesOfString: currentCompare withString:@"" options: NSCaseInsensitiveSearch range: NSMakeRange(0, [mut length]) ];
115partSpec = mut;
116}
117}
118}
119
120static NSString *sHideSpec=nil, *sRenSpec=nil;
121
122/// Update paritions alias with partSpec
123+(void) hideParts: (NSString*) hideSpec
124{
125if (hideSpec!=nil) {
126if (sHideSpec!=nil) [sHideSpec release];
127sHideSpec = [hideSpec copy];
128}
129
130// first prioritize strings in double quotes
131if ([sHideSpec rangeOfString:@"\""].location != NSNotFound)
132hideIterateOn(sHideSpec, @"\"");
133hideIterateOn(sHideSpec, @"\" \t\n");
134}
135
136
137static bool renIterateOn(NSString* partSpec, NSString*filter)
138{
139NSString *first=nil, *second=nil;
140
141for (NSString* s in [PartsInfoMgr stringsFromPartSpec:partSpec withCharsFromString: filter])
142{
143if ([s length]==0) continue;
144if (first==nil)
145first = s;
146else if (second==nil)
147{
148second = s;
149break;
150}
151}
152if (first && second)
153{
154PartitionInfoElement * p = (first!=nil) && [first length]>0 ? [PartsInfoMgr partWithName: first] : nil;
155if (p!=nil)
156{
157[p setVAliasName: second];
158NSLog(@" Rename part %@ -> %@", [p vName], second);
159return true;
160}
161}
162return false;
163}
164
165/// Update parttiions hidden property with partSpec
166+(void) renameParts: (NSString*) renSpec
167{
168if (renSpec!=nil) {
169if (sRenSpec!=nil) [sRenSpec release];
170sRenSpec = [renSpec copy];
171}
172
173NSArray* sPairs =
174[sRenSpec componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString: @";"] ];
175for (NSString* sPair in sPairs)
176{
177bool ret=false;
178
179if ([sPair rangeOfString:@"\""].location != NSNotFound)
180ret = renIterateOn(sPair, @"\"");
181if(!ret)
182renIterateOn(sPair, @" \t\n");
183}
184}
185
186+(void) reload
187{
188[PartsInfoMgr reloadWithHideSpec:nil andRenameSpec:nil];
189}
190
191+(void) reloadWithHideSpec: (NSString*) hideSpec andRenameSpec:(NSString*) renSpec
192{
193if (hideSpec!=nil) {
194if (sHideSpec!=nil) [sHideSpec release];
195sHideSpec = [hideSpec copy];
196}
197
198if (renSpec!=nil) {
199if (sRenSpec!=nil) [sRenSpec release];
200sRenSpec = [renSpec copy];
201}
202
203if (sParts!=nil) [sParts release];
204sParts = nil;
205
206// does auto-generate parts first time
207[PartsInfoMgr hideParts:sHideSpec];
208[PartsInfoMgr renameParts:sRenSpec];
209}
210
211+(void)resetSwapping
212{
213for (int i=0; i<MAX_HD; i++) PartitionInfoElement.hdRedirTable[i]=i;
214}
215
216+(void)swapHD: (NSUInteger) src with:(NSUInteger) dst
217{
218if(src < 0 || src > MAX_HD-1 || dst < 0 || dst > MAX_HD-1) return;
219PartitionInfoElement.hdRedirTable[src]=dst;
220PartitionInfoElement.hdRedirTable[dst]=src;
221
222}
223
224
225@end
226

Archive Download this file

Revision: 342