1/*
2Open Tracker License
3
4Terms and Conditions
5
6Copyright (c) 1991-2000, Be Incorporated. All rights reserved.
7
8Permission is hereby granted, free of charge, to any person obtaining a copy of
9this software and associated documentation files (the "Software"), to deal in
10the Software without restriction, including without limitation the rights to
11use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
12of the Software, and to permit persons to whom the Software is furnished to do
13so, subject to the following conditions:
14
15The above copyright notice and this permission notice applies to all licensees
16and shall be included in all copies or substantial portions of the Software.
17
18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF TITLE, MERCHANTABILITY,
20FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21BE INCORPORATED BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION
23WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
25Except as contained in this notice, the name of Be Incorporated shall not be
26used in advertising or otherwise to promote the sale, use or other dealings in
27this Software without prior written authorization from Be Incorporated.
28
29Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks
30of Be Incorporated in the United States and other countries. Other brand product
31names are registered trademarks or trademarks of their respective holders.
32All rights reserved.
33*/
34
35#include <Message.h>
36#include <PropertyInfo.h>
37
38#include "Tracker.h"
39#include "FSUtils.h"
40
41#define kPropertyTrash "Trash"
42#define kPropertyFolder "Folder"
43#define kPropertyPreferences "Preferences"
44
45#if 0
46
47doo Tracker delete Trash
48doo Tracker create Folder to '/boot/home/Desktop/hello'
49
50ToDo:
51Create file: on a "Tracker" "File" "B_CREATE_PROPERTY" "name"
52Create query: on a "Tracker" "Query" "B_CREATE_PROPERTY" "name"
53Open a folder: Tracker Execute "Folder" bla
54Find a window for a path
55
56#endif
57
58
59#if _SUPPORTS_FEATURE_SCRIPTING
60
61const property_info kTrackerPropertyList[] = {
62	{	kPropertyTrash,
63		{ B_DELETE_PROPERTY },
64		{ B_DIRECT_SPECIFIER },
65		"delete Trash # Empties the Trash",
66		0,
67		{},
68		{},
69		{}
70	},
71	{	kPropertyFolder,
72		{ B_CREATE_PROPERTY },
73		{ B_DIRECT_SPECIFIER },
74		"create Folder to path # creates a new folder",
75		0,
76		{ B_REF_TYPE },
77		{},
78		{}
79	},
80	{	kPropertyPreferences,
81		{ B_EXECUTE_PROPERTY },
82		{ B_DIRECT_SPECIFIER },
83		"shows Tracker preferences",
84		0,
85		{},
86		{},
87		{}
88	},
89	{NULL,
90		{},
91		{},
92		NULL, 0,
93		{},
94		{},
95		{}
96	}
97};
98
99
100status_t
101TTracker::GetSupportedSuites(BMessage* data)
102{
103	data->AddString("suites", kTrackerSuites);
104	BPropertyInfo propertyInfo(const_cast<property_info*>
105		(kTrackerPropertyList));
106	data->AddFlat("messages", &propertyInfo);
107
108	return _inherited::GetSupportedSuites(data);
109}
110
111
112BHandler*
113TTracker::ResolveSpecifier(BMessage* message, int32 index,
114	BMessage* specifier, int32 form, const char* property)
115{
116	BPropertyInfo propertyInfo(const_cast<property_info*>
117		(kTrackerPropertyList));
118
119	int32 result = propertyInfo.FindMatch(message, index, specifier, form,
120		property);
121	if (result < 0) {
122		//PRINT(("FindMatch result %d %s\n", result, strerror(result)));
123		return _inherited::ResolveSpecifier(message, index, specifier,
124			form, property);
125	}
126
127	return this;
128}
129
130
131bool
132TTracker::HandleScriptingMessage(BMessage* message)
133{
134	if (message->what != B_GET_PROPERTY
135		&& message->what != B_SET_PROPERTY
136		&& message->what != B_CREATE_PROPERTY
137		&& message->what != B_COUNT_PROPERTIES
138		&& message->what != B_DELETE_PROPERTY
139		&& message->what != B_EXECUTE_PROPERTY)
140		return false;
141
142	// dispatch scripting messages
143	BMessage reply(B_REPLY);
144	const char* property = 0;
145	bool handled = false;
146
147	int32 index = 0;
148	int32 form = 0;
149	BMessage specifier;
150
151	status_t result = message->GetCurrentSpecifier(&index, &specifier,
152		&form, &property);
153
154	if (result != B_OK || index == -1)
155		return false;
156
157	ASSERT(property);
158
159	switch (message->what) {
160		case B_CREATE_PROPERTY:
161			handled = CreateProperty(message, &specifier, form, property,
162				&reply);
163			break;
164
165		case B_GET_PROPERTY:
166			handled = GetProperty(&specifier, form, property, &reply);
167			break;
168
169		case B_SET_PROPERTY:
170			handled = SetProperty(message, &specifier, form, property,
171				&reply);
172			break;
173
174		case B_COUNT_PROPERTIES:
175			handled = CountProperty(&specifier, form, property, &reply);
176			break;
177
178		case B_DELETE_PROPERTY:
179			handled = DeleteProperty(&specifier, form, property, &reply);
180			break;
181
182		case B_EXECUTE_PROPERTY:
183			handled = ExecuteProperty(&specifier, form, property, &reply);
184			break;
185	}
186
187	if (handled) {
188		// done handling message, send a reply
189		message->SendReply(&reply);
190	}
191
192	return handled;
193}
194
195
196bool
197TTracker::CreateProperty(BMessage* message, BMessage*, int32 form,
198	const char* property, BMessage* reply)
199{
200	bool handled = false;
201	status_t error = B_OK;
202	if (strcmp(property, kPropertyFolder) == 0) {
203		if (form != B_DIRECT_SPECIFIER)
204			return false;
205
206		// create new empty folders
207		entry_ref ref;
208		for (int32 index = 0;
209			message->FindRef("data", index, &ref) == B_OK; index++) {
210
211			BEntry entry(&ref);
212			if (!entry.Exists())
213				error = FSCreateNewFolder(&ref);
214
215			if (error != B_OK)
216				break;
217		}
218
219		handled = true;
220	}
221
222	if (error != B_OK)
223		reply->AddInt32("error", error);
224
225	return handled;
226}
227
228
229bool
230TTracker::DeleteProperty(BMessage* /*specifier*/, int32 form,
231	const char* property, BMessage* /*reply*/)
232{
233	if (strcmp(property, kPropertyTrash) == 0) {
234		// deleting on a selection is handled as removing a part of the
235		// selection not to be confused with deleting a selected item
236
237		if (form != B_DIRECT_SPECIFIER)
238			// only support direct specifier
239			return false;
240
241		// empty the trash
242		FSEmptyTrash();
243		return true;
244
245	}
246	return false;
247}
248
249#else	// _SUPPORTS_FEATURE_SCRIPTING
250
251status_t
252TTracker::GetSupportedSuites(BMessage* /*data*/)
253{
254	return B_UNSUPPORTED;
255}
256
257
258BHandler*
259TTracker::ResolveSpecifier(BMessage* /*message*/,
260	int32 /*index*/, BMessage* /*specifier*/,
261	int32 /*form*/, const char* /*property*/)
262{
263	return NULL;
264}
265
266
267bool
268TTracker::HandleScriptingMessage(BMessage* /*message*/)
269{
270	return false;
271}
272
273
274bool
275TTracker::CreateProperty(BMessage* /*message*/, BMessage*, int32 /*form*/,
276	const char* /*property*/, BMessage* /*reply*/)
277{
278	return false;
279}
280
281
282bool
283TTracker::DeleteProperty(BMessage* /*specifier*/, int32 /*form*/,
284	const char* /*property*/, BMessage*)
285{
286	return false;
287}
288
289#endif	// _SUPPORTS_FEATURE_SCRIPTING
290
291
292bool
293TTracker::ExecuteProperty(BMessage*, int32 form, const char* property, BMessage*)
294{
295	if (strcmp(property, kPropertyPreferences) == 0) {
296
297		if (form != B_DIRECT_SPECIFIER)
298			// only support direct specifier
299			return false;
300
301		ShowSettingsWindow();
302		return true;
303
304	}
305	return false;
306}
307
308
309bool
310TTracker::CountProperty(BMessage*, int32, const char*, BMessage*)
311{
312	return false;
313}
314
315
316bool
317TTracker::GetProperty(BMessage*, int32, const char*, BMessage*)
318{
319	return false;
320}
321
322
323bool
324TTracker::SetProperty(BMessage*, BMessage*, int32, const char*, BMessage*)
325{
326	return false;
327}
328