ObjFW  Diff

Differences From Artifact [a2f59b5b67]:

To Artifact [8c15fe2a75]:


30
31
32
33
34
35
36
37

38
39
40
41
42
43
44
45
30
31
32
33
34
35
36

37

38
39
40
41
42
43
44







-
+
-







#import "OFInvalidFormatException.h"
#import "OFOpenWindowsRegistryKeyFailedException.h"
#import "OFOutOfRangeException.h"
#import "OFSetWindowsRegistryValueFailedException.h"

OF_DIRECT_MEMBERS
@interface OFWindowsRegistryKey ()
- (instancetype)of_initWithHKey: (HKEY)hKey
- (instancetype)of_initWithHKey: (HKEY)hKey close: (bool)close;
			  close: (bool)close;
@end

@implementation OFWindowsRegistryKey
+ (instancetype)classesRootKey
{
	return [[[self alloc] of_initWithHKey: HKEY_CLASSES_ROOT
					close: false] autorelease];
65
66
67
68
69
70
71
72

73
74
75
76
77
78
79
80
64
65
66
67
68
69
70

71

72
73
74
75
76
77
78







-
+
-








+ (instancetype)usersKey
{
	return [[[self alloc] of_initWithHKey: HKEY_USERS
					close: false] autorelease];
}

- (instancetype)of_initWithHKey: (HKEY)hKey
- (instancetype)of_initWithHKey: (HKEY)hKey close: (bool)close
			  close: (bool)close
{
	self = [super init];

	_hKey = hKey;
	_close = close;

	return self;
181
182
183
184
185
186
187
188

189
190
191
192
193
194
195
196
179
180
181
182
183
184
185

186

187
188
189
190
191
192
193







-
+
-







	objc_autoreleasePoolPop(pool);

	return [[[OFWindowsRegistryKey alloc] of_initWithHKey: subKey
							close: true]
	    autorelease];
}

- (OFData *)dataForValueNamed: (OFString *)name
- (OFData *)dataForValueNamed: (OFString *)name type: (DWORD *)type
			 type: (DWORD *)type
{
	void *pool = objc_autoreleasePoolPush();
	BYTE stackBuffer[256], *buffer = stackBuffer;
	DWORD length = sizeof(stackBuffer);
	OFMutableData *ret = nil;
	bool winNT = [OFSystemInfo isWindowsNT];
	LSTATUS status;
266
267
268
269
270
271
272
273

274
275
276
277

278
279
280
281
282

283
284
285
286
287
288
289
290
263
264
265
266
267
268
269

270

271
272

273

274
275
276

277

278
279
280
281
282
283
284







-
+
-


-
+
-



-
+
-







					data: data
					type: type
				      status: status];
}

- (OFString *)stringForValueNamed: (OFString *)name
{
	return [self stringForValueNamed: name
	return [self stringForValueNamed: name type: NULL];
				    type: NULL];
}

- (OFString *)stringForValueNamed: (OFString *)name
- (OFString *)stringForValueNamed: (OFString *)name type: (DWORD *)typeOut
			     type: (DWORD *)typeOut
{
	void *pool = objc_autoreleasePoolPush();
	DWORD type;
	OFData *data = [self dataForValueNamed: name
	OFData *data = [self dataForValueNamed: name type: &type];
					  type: &type];
	OFString *ret;

	if (data == nil)
		return nil;

	if (type != REG_SZ && type != REG_EXPAND_SZ && type != REG_LINK)
		@throw [OFInvalidEncodingException exception];
338
339
340
341
342
343
344
345

346
347
348
349

350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369

370
371
372
373
374

375
376
377
378
379
380
381
382
332
333
334
335
336
337
338

339

340


341

342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359

360

361
362


363

364
365
366
367
368
369
370







-
+
-

-
-
+
-


















-
+
-


-
-
+
-







		*typeOut = type;

	objc_autoreleasePoolPop(pool);

	return [ret autorelease];
}

- (void)setString: (OFString *)string
- (void)setString: (OFString *)string forValueNamed: (OFString *)name
    forValueNamed: (OFString *)name
{
	[self	setString: string
	    forValueNamed: name
	[self setString: string forValueNamed: name type: REG_SZ];
		     type: REG_SZ];
}

- (void)setString: (OFString *)string
    forValueNamed: (OFString *)name
	     type: (DWORD)type
{
	void *pool = objc_autoreleasePoolPush();
	OFData *data;

	if ([OFSystemInfo isWindowsNT])
		data = [OFData dataWithItems: string.UTF16String
				       count: string.UTF16StringLength + 1
				    itemSize: sizeof(of_char16_t)];
	else {
		of_string_encoding_t encoding = [OFLocale encoding];
		const char *cString = [string cStringWithEncoding: encoding];
		size_t length = [string cStringLengthWithEncoding: encoding];

		data = [OFData dataWithItems: cString
		data = [OFData dataWithItems: cString count: length + 1];
				       count: length + 1];
	}

	[self	  setData: data
	    forValueNamed: name
	[self setData: data forValueNamed: name type: type];
		     type: type];

	objc_autoreleasePoolPop(pool);
}

- (void)deleteValueNamed: (OFString *)name
{
	void *pool = objc_autoreleasePoolPush();