ObjXMPP  Diff

Differences From Artifact [0f6eec9046]:

To Artifact [9ac2bb0130]:


299
300
301
302
303
304
305
306

307
308
309
310
311

312
313
314
315
316
317
318
319
320
321
322
323
324
325
326

327
328
329
330


331
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
371
372
373
374
375
376
377
378
379
380




381
382
299
300
301
302
303
304
305

306
307
308
309
310

311
312
313
314
315
316
317
318
319
320
321
322
323
324
325

326
327
328


329
330
331

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
371
372
373
374
375
376




377
378
379
380
381
382







-
+




-
+














-
+


-
-
+
+

-
+


-
-
+
+

-
+





-
+





-
+




-
+






-
-
-
+
+
+

-
+

-
-
+
+







-
-
-
-
+
+
+
+


- (OFEnumerator*)objectEnumerator
{
	return [[[XMPPSRVEnumerator alloc] initWithList: _list] autorelease];
}
@end

@implementation XMPPSRVEnumerator
- initWithList: (OFList*)list_
- initWithList: (OFList*)list
{
	self = [super init];

	@try {
		list = [list_ copy];
		_list = [list copy];
	} @catch (id e) {
		[self release];
		@throw e;
	}

	return self;
}

- (id)nextObject
{
	XMPPSRVEntry *ret = nil;
	of_list_object_t *iter;
	uint32_t totalWeight = 0;

	if (done)
	if (_done)
		return nil;

	if (listIter == NULL)
		listIter = [list firstListObject];
	if (_listIter == NULL)
		_listIter = [_list firstListObject];

	if (listIter == NULL)
	if (_listIter == NULL)
		return nil;

	if (subListCopy == nil)
		subListCopy = [listIter->object copy];
	if (_subListCopy == nil)
		_subListCopy = [_listIter->object copy];

	for (iter = [subListCopy firstListObject]; iter != NULL;
	for (iter = [_subListCopy firstListObject]; iter != NULL;
	     iter = iter->next) {
		totalWeight += [iter->object weight];
		[iter->object setAccumulatedWeight: totalWeight];
	}

	if ([subListCopy count] > 0)  {
	if ([_subListCopy count] > 0)  {
		uint32_t randomWeight;

		RAND_pseudo_bytes((uint8_t*)&randomWeight, sizeof(uint32_t));
		randomWeight %= (totalWeight + 1);

		for (iter = [subListCopy firstListObject]; iter != NULL;
		for (iter = [_subListCopy firstListObject]; iter != NULL;
		     iter = iter->next) {
			if ([iter->object accumulatedWeight] >= randomWeight) {
				ret = [[iter->object retain] autorelease];

				[subListCopy removeListObject: iter];
				[_subListCopy removeListObject: iter];

				break;
			}
		}
	}

	if ([subListCopy count] == 0) {
		[subListCopy release];
		subListCopy = nil;
	if ([_subListCopy count] == 0) {
		[_subListCopy release];
		_subListCopy = nil;

		listIter = listIter->next;
		_listIter = _listIter->next;

		if (listIter == NULL)
			done = true;
		if (_listIter == NULL)
			_done = true;
	}

	return ret;
}

- (void)reset
{
	listIter = NULL;
	[subListCopy release];
	subListCopy = nil;
	done = false;
	_listIter = NULL;
	[_subListCopy release];
	_subListCopy = nil;
	_done = false;
}
@end