1/*
2 * Copyright (c) 2008 Stephan A��mus <superstippi@gmx.de>
3 * All rights reserved. Distributed under the terms of the MIT license.
4 */
5
6#include "ChangesIterator.h"
7
8#include <new>
9#include <stdio.h>
10#include <string.h>
11
12#include <Directory.h>
13
14#include "Model.h"
15
16using std::nothrow;
17
18
19//#define TRACE_CHANGES_ITERATOR
20#ifdef TRACE_CHANGES_ITERATOR
21# define TRACE(x...) printf(x)
22#else
23# define TRACE(x...)
24#endif
25
26
27ChangesIterator::ChangesIterator(const Model* model)
28	: FileIterator(),
29	  fPathMap(),
30	  fIteratorIndex(0),
31
32	  fRecurseDirs(model->fRecurseDirs),
33	  fRecurseLinks(model->fRecurseLinks),
34	  fSkipDotDirs(model->fSkipDotDirs),
35	  fTextOnly(model->fTextOnly)
36{
37}
38
39
40ChangesIterator::~ChangesIterator()
41{
42}
43
44
45bool
46ChangesIterator::IsValid() const
47{
48	return fPathMap.InitCheck() == B_OK;
49}
50
51
52bool
53ChangesIterator::GetNextName(char* buffer)
54{
55	// TODO: inefficient
56	PathMap::Iterator iterator = fPathMap.GetIterator();
57	int32 index = 0;
58	while (index < fIteratorIndex && iterator.HasNext()) {
59		iterator.Next();
60		index++;
61	}
62
63	if (iterator.HasNext()) {
64		const PathMap::Entry& entry = iterator.Next();
65		sprintf(buffer, "%s", entry.key.GetString());
66
67		fIteratorIndex++;
68		return true;
69	}
70
71	return false;
72}
73
74
75bool
76ChangesIterator::NotifyNegatives() const
77{
78	return true;
79}
80
81
82// #pragma mark -
83
84
85void
86ChangesIterator::EntryAdded(const char* path)
87{
88	HashString key(path);
89	if (fPathMap.ContainsKey(key))
90		return;
91
92	TRACE("added: %s\n", path);
93
94	fPathMap.Put(key, ENTRY_ADDED);
95}
96
97
98void
99ChangesIterator::EntryRemoved(const char* path)
100{
101	HashString key(path);
102	if (fPathMap.ContainsKey(key)) {
103		TRACE("ignoring: %s\n", path);
104		fPathMap.Remove(key);
105	}
106}
107
108
109void
110ChangesIterator::EntryChanged(const char* path)
111{
112	HashString key(path);
113	if (fPathMap.ContainsKey(key) && fPathMap.Get(key) == ENTRY_ADDED)
114		return;
115
116	TRACE("changed: %s\n", path);
117
118	fPathMap.Put(key, ENTRY_CHANGED);
119}
120
121
122bool
123ChangesIterator::IsEmpty() const
124{
125	PathMap::Iterator iterator = fPathMap.GetIterator();
126	return !iterator.HasNext();
127}
128
129void
130ChangesIterator::PrintToStream() const
131{
132	printf("ChangesIterator contents:\n");
133	PathMap::Iterator iterator = fPathMap.GetIterator();
134	while (iterator.HasNext()) {
135		const PathMap::Entry& entry = iterator.Next();
136		const char* value;
137		switch (entry.value) {
138			case ENTRY_ADDED:
139				value = "ADDED";
140				break;
141			case ENTRY_REMOVED:
142				value = "REMOVED";
143				break;
144			case ENTRY_CHANGED:
145				value = "CHANGED";
146				break;
147			default:
148				value = "???";
149				break;
150		}
151		printf("entry: %s - %s\n", entry.key.GetString(), value);
152	}
153}
154
155