xref: /haiku/src/kits/tracker/TrackerInitialState.cpp (revision 5e96d7d537fbec23bad4ae9b4c8e7b02e769f0c6)
1 /*
2 Open Tracker License
3 
4 Terms and Conditions
5 
6 Copyright (c) 1991-2000, Be Incorporated. All rights reserved.
7 
8 Permission is hereby granted, free of charge, to any person obtaining a copy of
9 this software and associated documentation files (the "Software"), to deal in
10 the Software without restriction, including without limitation the rights to
11 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
12 of the Software, and to permit persons to whom the Software is furnished to do
13 so, subject to the following conditions:
14 
15 The above copyright notice and this permission notice applies to all licensees
16 and shall be included in all copies or substantial portions of the Software.
17 
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF TITLE, MERCHANTABILITY,
20 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 BE INCORPORATED BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION
23 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 
25 Except as contained in this notice, the name of Be Incorporated shall not be
26 used in advertising or otherwise to promote the sale, use or other dealings in
27 this Software without prior written authorization from Be Incorporated.
28 
29 Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks
30 of Be Incorporated in the United States and other countries. Other brand product
31 names are registered trademarks or trademarks of their respective holders.
32 All rights reserved.
33 */
34 
35 // ToDo:
36 // add code to initialize a subset of the mime database, including
37 // important sniffer rules
38 
39 
40 #include <Alert.h>
41 #include <Catalog.h>
42 #include <Directory.h>
43 #include <InterfaceDefs.h>
44 #include <Locale.h>
45 #include <Message.h>
46 #include <Node.h>
47 #include <Path.h>
48 #include <Screen.h>
49 #include <VolumeRoster.h>
50 
51 #include <fs_attr.h>
52 #include <fs_index.h>
53 
54 #include "pr_server.h"
55 
56 #include "Attributes.h"
57 #include "AttributeStream.h"
58 #include "BackgroundImage.h"
59 #include "Bitmaps.h"
60 #include "ContainerWindow.h"
61 #include "MimeTypes.h"
62 #include "FSUtils.h"
63 #include "QueryContainerWindow.h"
64 #include "Tracker.h"
65 
66 
67 enum {
68 	kForceLargeIcon = 0x1,
69 	kForceMiniIcon = 0x2,
70 	kForceShortDescription = 0x4,
71 	kForceLongDescription = 0x8,
72 	kForcePreferredApp = 0x10
73 };
74 
75 
76 const char* kAttrName = "META:name";
77 const char* kAttrCompany = "META:company";
78 const char* kAttrAddress = "META:address";
79 const char* kAttrCity = "META:city";
80 const char* kAttrState = "META:state";
81 const char* kAttrZip = "META:zip";
82 const char* kAttrCountry = "META:country";
83 const char* kAttrHomePhone = "META:hphone";
84 const char* kAttrWorkPhone = "META:wphone";
85 const char* kAttrFax = "META:fax";
86 const char* kAttrEmail = "META:email";
87 const char* kAttrURL = "META:url";
88 const char* kAttrGroup = "META:group";
89 const char* kAttrNickname = "META:nickname";
90 
91 const char* kNetPositiveSignature = "application/x-vnd.Be-NPOS";
92 const char* kPeopleSignature = "application/x-vnd.Be-PEPL";
93 
94 // the following templates are in big endian and we rely on the Tracker
95 // translation support to swap them on little endian machines
96 //
97 // in case there is an attribute (B_RECT_TYPE) that gets swapped by the media
98 // (unzip, file system endianness swapping, etc., the correct endianness for
99 // the correct machine has to be used here
100 
101 const BRect kDefaultFrame(40, 40, 695, 350);
102 const int32 kDefaultQueryTemplateCount = 3;
103 
104 const AttributeTemplate kDefaultQueryTemplate[] =
105 	/* /boot/home/config/settings/Tracker/DefaultQueryTemplates/
106 		application_octet-stream */
107 {
108 	{
109 		// default frame
110 		kAttrWindowFrame,
111 		B_RECT_TYPE,
112 		16,
113 		(const char*)&kDefaultFrame
114 	},
115 	{
116 		// attr: _trk/viewstate
117 		kAttrViewState_be,
118 		B_RAW_TYPE,
119 		49,
120 		"o^\365R\000\000\000\012Tlst\000\000\000\000\000\000\000\000\000\000"
121 		"\000\000\000\000\000\000\000\000\000\000\357\323\335RCSTR\000\000"
122 		"\000\000\000\000\000\000\000"
123 	},
124 	{
125 		// attr: _trk/columns
126 		kAttrColumns_be,
127 		B_RAW_TYPE,
128 		223,
129 		"O\362VR\000\000\000\025\000\000\000\004Name\000B \000\000C\021\000"
130 		"\000\000\000\000\000\000\000\000\012_stat/name\000\357\323\335RCST"
131 		"R\001\001O\362VR\000\000\000\025\000\000\000\004Path\000CH\000\000"
132 		"Ca\000\000\000\000\000\000\000\000\000\011_trk/path\000\357_\174RC"
133 		"STR\000\000O\362VR\000\000\000\025\000\000\000\004Size\000C\334\000"
134 		"\000B$\000\000\000\000\000\001\000\000\000\012_stat/size\000\317\317"
135 		"\306TOFFT\001\000O\362VR\000\000\000\025\000\000\000\010Modified\000"
136 		"C\370\000\000C\012\000\000\000\000\000\000\000\000\000\016_stat/mo"
137 		"dified\000]KmETIME\001\000"
138 	}
139 };
140 
141 const AttributeTemplate kBookmarkQueryTemplate[] =
142 	/* /boot/home/config/settings/Tracker/DefaultQueryTemplates/
143 		application_x-vnd.Be-bookmark */
144 {
145 	{
146 		// default frame
147 		kAttrWindowFrame,
148 		B_RECT_TYPE,
149 		16,
150 		(const char*)&kDefaultFrame
151 	},
152 	{
153 		// attr: _trk/viewstate
154 		kAttrViewState_be,
155 		B_RAW_TYPE,
156 		49,
157 		"o^\365R\000\000\000\012Tlst\000\000\000\000\000\000\000\000\000\000"
158 		"\000\000\000\000\000\000\000\000\000\000w\373\175RCSTR\000\000\000"
159 		"\000\000\000\000\000\000"
160 	},
161 	{
162 		// attr: _trk/columns
163 		kAttrColumns_be,
164 		B_RAW_TYPE,
165 		163,
166 		"O\362VR\000\000\000\025\000\000\000\005Title\000B \000\000C+\000\000"
167 		"\000\000\000\000\000\000\000\012META:title\000w\373\175RCSTR\000\001"
168 		"O\362VR\000\000\000\025\000\000\000\003URL\000Cb\000\000C\217\200"
169 		"\000\000\000\000\000\000\000\000\010META:url\000\343[TRCSTR\000\001O"
170 		"\362VR\000\000\000\025\000\000\000\010Keywords\000D\004\000\000C\002"
171 		"\000\000\000\000\000\000\000\000\000\011META:keyw\000\333\363\334"
172 		"RCSTR\000\001"
173 	}
174 };
175 
176 const AttributeTemplate kPersonQueryTemplate[] =
177 	/* /boot/home/config/settings/Tracker/DefaultQueryTemplates/
178 		application_x-vnd.Be-bookmark */
179 {
180 	{
181 		// default frame
182 		kAttrWindowFrame,
183 		B_RECT_TYPE,
184 		16,
185 		(const char*)&kDefaultFrame
186 	},
187 	{
188 		// attr: _trk/viewstate
189 		kAttrViewState_be,
190 		B_RAW_TYPE,
191 		49,
192 		"o^\365R\000\000\000\012Tlst\000\000\000\000\000\000\000\000\000\000"
193 		"\000\000\000\000\000\000\000\000\000\000\357\323\335RCSTR\000\000"
194 		"\000\000\000\000\000\000\000"
195 	},
196 	{
197 		// attr: _trk/columns
198 		kAttrColumns_be,
199 		B_RAW_TYPE,
200 		230,
201 		"O\362VR\000\000\000\025\000\000\000\004Name\000B \000\000B\346\000"
202 		"\000\000\000\000\000\000\000\000\012_stat/name\000\357\323\335RCST"
203 		"R\001\001O\362VR\000\000\000\025\000\000\000\012Work Phone\000C*\000"
204 		"\000B\264\000\000\000\000\000\000\000\000\000\013META:wphone\000C_"
205 		"uRCSTR\000\001O\362VR\000\000\000\025\000\000\000\006E-mail\000C\211"
206 		"\200\000B\272\000\000\000\000\000\000\000\000\000\012META:email\000"
207 		"sW\337RCSTR\000\001O\362VR\000\000\000\025\000\000\000\007Company"
208 		"\000C\277\200\000B\360\000\000\000\000\000\000\000\000\000\014"
209 		"META:company\000CS\174RCSTR\000\001"
210 	},
211 };
212 
213 const AttributeTemplate kEmailQueryTemplate[] =
214 	/* /boot/home/config/settings/Tracker/DefaultQueryTemplates/
215 		text_x-email */
216 {
217 	{
218 		// default frame
219 		kAttrWindowFrame,
220 		B_RECT_TYPE,
221 		16,
222 		(const char*)&kDefaultFrame
223 	},
224 	{
225 		// attr: _trk/viewstate
226 		kAttrViewState_be,
227 		B_RAW_TYPE,
228 		49,
229 		"o^\365R\000\000\000\012Tlst\000\000\000\000\000\000\000\000\000\000"
230 		"\000\000\000\000\000\000\000\000\000\000\366_\377ETIME\000\000\000"
231 		"\000\000\000\000\000\000"
232 	},
233 	{
234 		// attr: _trk/columns
235 		kAttrColumns_be,
236 		B_RAW_TYPE,
237 		222,
238 		"O\362VR\000\000\000\025\000\000\000\007Subject\000B \000\000B\334"
239 		"\000\000\000\000\000\000\000\000\000\014MAIL:subject\000\343\173\337"
240 		"RCSTR\000\000O\362VR\000\000\000\025\000\000\000\004From\000C%\000"
241 		"\000C\031\000\000\000\000\000\000\000\000\000\011MAIL:from\000\317"
242 		"s_RCSTR\000\000O\362VR\000\000\000\025\000\000\000\004When\000C\246"
243 		"\200\000B\360\000\000\000\000\000\000\000\000\000\011MAIL:when\000"
244 		"\366_\377ETIME\000\000O\362VR\000\000\000\025\000\000\000\006Status"
245 		"\000C\352\000\000BH\000\000\000\000\000\001\000\000\000\013"
246 		"MAIL:status\000G\363\134RCSTR\000\001"
247 	},
248 };
249 
250 
251 namespace BPrivate {
252 
253 class ExtraAttributeLazyInstaller {
254 public:
255 	ExtraAttributeLazyInstaller(const char* type);
256 	~ExtraAttributeLazyInstaller();
257 
258 	bool AddExtraAttribute(const char* publicName, const char* name,
259 		uint32 type, bool viewable, bool editable, float width,
260 		int32 alignment, bool extra);
261 
262 	status_t InitCheck() const;
263 public:
264 	BMimeType fMimeType;
265 	BMessage fExtraAttrs;
266 	bool fDirty;
267 };
268 
269 }	// namespace BPrivate
270 
271 
272 ExtraAttributeLazyInstaller::ExtraAttributeLazyInstaller(const char* type)
273 	:
274 	fMimeType(type),
275 	fDirty(false)
276 {
277 	if (fMimeType.InitCheck() == B_OK)
278 		fMimeType.GetAttrInfo(&fExtraAttrs);
279 }
280 
281 
282 ExtraAttributeLazyInstaller::~ExtraAttributeLazyInstaller()
283 {
284 	if (fMimeType.InitCheck() == B_OK && fDirty)
285 		fMimeType.SetAttrInfo(&fExtraAttrs);
286 }
287 
288 
289 bool
290 ExtraAttributeLazyInstaller::AddExtraAttribute(const char* publicName,
291 	const char* name, uint32 type, bool viewable, bool editable, float width,
292 	int32 alignment, bool extra)
293 {
294 	for (int32 index = 0; ; index++) {
295 		const char* oldPublicName;
296 		if (fExtraAttrs.FindString("attr:public_name", index, &oldPublicName)
297 				!= B_OK) {
298 			break;
299 		}
300 
301 		if (strcmp(oldPublicName, publicName) == 0)
302 			// already got this extra atribute, no work left
303 			return false;
304 	}
305 
306 	fExtraAttrs.AddString("attr:public_name", publicName);
307 	fExtraAttrs.AddString("attr:name", name);
308 	fExtraAttrs.AddInt32("attr:type", (int32)type);
309 	fExtraAttrs.AddBool("attr:viewable", viewable);
310 	fExtraAttrs.AddBool("attr:editable", editable);
311 	fExtraAttrs.AddInt32("attr:width", (int32)width);
312 	fExtraAttrs.AddInt32("attr:alignment", alignment);
313 	fExtraAttrs.AddBool("attr:extra", extra);
314 
315 	fDirty = true;
316 	return true;
317 }
318 
319 
320 // #pragma mark -
321 
322 
323 static void
324 InstallTemporaryBackgroundImages(BNode* node, BMessage* message)
325 {
326 	int32 size = message->FlattenedSize();
327 
328 	try {
329 		char* buffer = new char[size];
330 		message->Flatten(buffer, size);
331 		node->WriteAttr(kBackgroundImageInfo, B_MESSAGE_TYPE, 0, buffer,
332 			(size_t)size);
333 		delete[] buffer;
334 	} catch (...) {
335 	}
336 }
337 
338 
339 static void
340 AddTemporaryBackgroundImages(BMessage* message, const char* imagePath,
341 	BackgroundImage::Mode mode, BPoint offset, uint32 workspaces,
342 	bool textWidgetOutlines)
343 {
344 	message->AddString(kBackgroundImageInfoPath, imagePath);
345 	message->AddInt32(kBackgroundImageInfoWorkspaces, (int32)workspaces);
346 	message->AddInt32(kBackgroundImageInfoMode, mode);
347 	message->AddBool(kBackgroundImageInfoTextOutline, textWidgetOutlines);
348 	message->AddPoint(kBackgroundImageInfoOffset, offset);
349 }
350 
351 
352 // #pragma mark -
353 
354 
355 #undef B_TRANSLATION_CONTEXT
356 #define B_TRANSLATION_CONTEXT "TrackerInitialState"
357 
358 bool
359 TTracker::InstallMimeIfNeeded(const char* type, int32 bitsID,
360 	const char* shortDescription, const char* longDescription,
361 	const char* preferredAppSignature, uint32 forceMask)
362 {
363 	// used by InitMimeTypes - checks if a metamime of a given <type> is
364 	// installed and if it has all the specified attributes; if not, the
365 	// whole mime type is installed and all attributes are set; nulls can
366 	// be passed for attributes that don't matter; returns true if anything
367 	// had to be changed
368 
369 	BBitmap vectorIcon(BRect(0, 0, 31, 31), B_BITMAP_NO_SERVER_LINK,
370 		B_RGBA32);
371 	BBitmap largeIcon(BRect(0, 0, 31, 31), B_BITMAP_NO_SERVER_LINK, B_CMAP8);
372 	BBitmap miniIcon(BRect(0, 0, 15, 15), B_BITMAP_NO_SERVER_LINK, B_CMAP8);
373 	char tmp[B_MIME_TYPE_LENGTH];
374 
375 	BMimeType mime(type);
376 	bool installed = mime.IsInstalled();
377 
378 	if (!installed
379 		|| (bitsID >= 0 && ((forceMask & kForceLargeIcon)
380 			|| mime.GetIcon(&vectorIcon, B_LARGE_ICON) != B_OK))
381 		|| (bitsID >= 0 && ((forceMask & kForceLargeIcon)
382 			|| mime.GetIcon(&largeIcon, B_LARGE_ICON) != B_OK))
383 		|| (bitsID >= 0 && ((forceMask & kForceMiniIcon)
384 			|| mime.GetIcon(&miniIcon, B_MINI_ICON) != B_OK))
385 		|| (shortDescription && ((forceMask & kForceShortDescription)
386 			|| mime.GetShortDescription(tmp) != B_OK))
387 		|| (longDescription && ((forceMask & kForceLongDescription)
388 			|| mime.GetLongDescription(tmp) != B_OK))
389 		|| (preferredAppSignature && ((forceMask & kForcePreferredApp)
390 			|| mime.GetPreferredApp(tmp) != B_OK))) {
391 
392 		if (!installed)
393 			mime.Install();
394 
395 		if (bitsID >= 0) {
396 			const uint8* iconData;
397 			size_t iconSize;
398 			if (GetTrackerResources()->
399 					GetIconResource(bitsID, &iconData, &iconSize) == B_OK)
400 				mime.SetIcon(iconData, iconSize);
401 
402 			if (GetTrackerResources()->
403 					GetIconResource(bitsID, B_LARGE_ICON, &largeIcon) == B_OK)
404 				mime.SetIcon(&largeIcon, B_LARGE_ICON);
405 
406 			if (GetTrackerResources()->
407 					GetIconResource(bitsID, B_MINI_ICON, &miniIcon) == B_OK)
408 				mime.SetIcon(&miniIcon, B_MINI_ICON);
409 		}
410 
411 		if (shortDescription)
412 			mime.SetShortDescription(shortDescription);
413 
414 		if (longDescription)
415 			mime.SetLongDescription(longDescription);
416 
417 		if (preferredAppSignature)
418 			mime.SetPreferredApp(preferredAppSignature);
419 
420 		return true;
421 	}
422 	return false;
423 }
424 
425 
426 void
427 TTracker::InitMimeTypes()
428 {
429 	InstallMimeIfNeeded(B_APP_MIME_TYPE, R_AppIcon, "Be Application",
430 		"Generic Be application executable.", kTrackerSignature);
431 
432 	InstallMimeIfNeeded(B_FILE_MIMETYPE, R_FileIcon,
433 		"Generic file", "Generic document file.", kTrackerSignature);
434 
435 	InstallMimeIfNeeded(B_VOLUME_MIMETYPE, R_HardDiskIcon,
436 		"Be Volume", "Disk volume.", kTrackerSignature);
437 
438 	InstallMimeIfNeeded(B_QUERY_MIMETYPE, R_QueryDirIcon,
439 		"Be Query", "Query to locate items on disks.", kTrackerSignature);
440 
441 	InstallMimeIfNeeded(B_QUERY_TEMPLATE_MIMETYPE, R_QueryTemplateIcon,
442 		"Be Query template", "", kTrackerSignature);
443 
444 	InstallMimeIfNeeded(B_LINK_MIMETYPE, R_BrokenLinkIcon, "Symbolic link",
445 		"Link to another item in the file system.", kTrackerSignature);
446 
447 	InstallMimeIfNeeded(B_ROOT_MIMETYPE, R_RootIcon,
448 		"Be Root", "File system root.", kTrackerSignature);
449 
450 	InstallMimeIfNeeded(B_BOOKMARK_MIMETYPE, R_BookmarkIcon,
451 		"Bookmark", "Bookmark for a web page.", kNetPositiveSignature);
452 
453 	{
454 		// install a couple of extra fields for bookmark
455 
456 		ExtraAttributeLazyInstaller installer(B_BOOKMARK_MIMETYPE);
457 		installer.AddExtraAttribute("URL", "META:url", B_STRING_TYPE,
458 			true, true, 170, B_ALIGN_LEFT, false);
459 		installer.AddExtraAttribute("Keywords", "META:keyw", B_STRING_TYPE,
460 			true, true, 130, B_ALIGN_LEFT, false);
461 		installer.AddExtraAttribute("Title", "META:title", B_STRING_TYPE,
462 			true, true, 130, B_ALIGN_LEFT, false);
463 	}
464 
465 	InstallMimeIfNeeded(B_PERSON_MIMETYPE, R_PersonIcon,
466 		"Person", "Contact information for a person.", kPeopleSignature);
467 
468 	{
469 		ExtraAttributeLazyInstaller installer(B_PERSON_MIMETYPE);
470 		installer.AddExtraAttribute("Contact name", kAttrName, B_STRING_TYPE,
471 			true, true, 120, B_ALIGN_LEFT, false);
472 		installer.AddExtraAttribute("Company", kAttrCompany, B_STRING_TYPE,
473 			true, true, 120, B_ALIGN_LEFT, false);
474 		installer.AddExtraAttribute("Address", kAttrAddress, B_STRING_TYPE,
475 			true, true, 120, B_ALIGN_LEFT, false);
476 		installer.AddExtraAttribute("City", kAttrCity, B_STRING_TYPE,
477 			true, true, 90, B_ALIGN_LEFT, false);
478 		installer.AddExtraAttribute("State", kAttrState, B_STRING_TYPE,
479 			true, true, 50, B_ALIGN_LEFT, false);
480 		installer.AddExtraAttribute("Zip", kAttrZip, B_STRING_TYPE,
481 			true, true, 50, B_ALIGN_LEFT, false);
482 		installer.AddExtraAttribute("Country", kAttrCountry, B_STRING_TYPE,
483 			true, true, 120, B_ALIGN_LEFT, false);
484 		installer.AddExtraAttribute("E-mail", kAttrEmail, B_STRING_TYPE,
485 			true, true, 120, B_ALIGN_LEFT, false);
486 		installer.AddExtraAttribute("Home phone", kAttrHomePhone,
487 			B_STRING_TYPE, true, true, 90, B_ALIGN_LEFT, false);
488 		installer.AddExtraAttribute("Work phone", kAttrWorkPhone,
489 			B_STRING_TYPE, true, true, 90, B_ALIGN_LEFT, false);
490 		installer.AddExtraAttribute("Fax", kAttrFax, B_STRING_TYPE,
491 			true, true, 90, B_ALIGN_LEFT, false);
492 		installer.AddExtraAttribute("URL", kAttrURL, B_STRING_TYPE,
493 			true, true, 120, B_ALIGN_LEFT, false);
494 		installer.AddExtraAttribute("Group", kAttrGroup, B_STRING_TYPE,
495 			true, true, 120, B_ALIGN_LEFT, false);
496 		installer.AddExtraAttribute("Nickname", kAttrNickname, B_STRING_TYPE,
497 			true, true, 120, B_ALIGN_LEFT, false);
498 	}
499 
500 	InstallMimeIfNeeded(B_PRINTER_SPOOL_MIMETYPE, R_SpoolFileIcon,
501 		"Printer spool", "Printer spool file.", "application/x-vnd.Be-PRNT");
502 
503 	{
504 #if B_BEOS_VERSION_DANO
505 		ExtraAttributeLazyInstaller installer(B_PRINTER_SPOOL_MIMETYPE);
506 		installer.AddExtraAttribute("Status", PSRV_SPOOL_ATTR_STATUS,
507 			B_STRING_TYPE, true, false, 60, B_ALIGN_LEFT, false);
508 		installer.AddExtraAttribute("Page count", PSRV_SPOOL_ATTR_PAGECOUNT,
509 			B_INT32_TYPE, true, false, 40, B_ALIGN_RIGHT, false);
510 		installer.AddExtraAttribute("Description",
511 			PSRV_SPOOL_ATTR_DESCRIPTION, B_STRING_TYPE, true, true, 100,
512 			B_ALIGN_LEFT, false);
513 		installer.AddExtraAttribute("Printer name", PSRV_SPOOL_ATTR_PRINTER,
514 			B_STRING_TYPE, true, false, 80, B_ALIGN_LEFT, false);
515 		installer.AddExtraAttribute("Job creator type",
516 			PSRV_SPOOL_ATTR_MIMETYPE, B_ASCII_TYPE, true, false, 60,
517 			B_ALIGN_LEFT, false);
518 #else
519 		ExtraAttributeLazyInstaller installer(B_PRINTER_SPOOL_MIMETYPE);
520 		installer.AddExtraAttribute("Page count", "_spool/Page Count",
521 			B_INT32_TYPE, true, false, 40, B_ALIGN_RIGHT, false);
522 		installer.AddExtraAttribute("Description", "_spool/Description",
523 			B_ASCII_TYPE, true, true, 100, B_ALIGN_LEFT, false);
524 		installer.AddExtraAttribute("Printer name", "_spool/Printer",
525 			B_ASCII_TYPE, true, false, 80, B_ALIGN_LEFT, false);
526 		installer.AddExtraAttribute("Job creator type", "_spool/MimeType",
527 			B_ASCII_TYPE, true, false, 60, B_ALIGN_LEFT, false);
528 #endif
529 	}
530 
531 	InstallMimeIfNeeded(B_PRINTER_MIMETYPE, R_GenericPrinterIcon,
532 		"Printer", "Printer queue.", kTrackerSignature);
533 		// application/x-vnd.Be-PRNT
534 		// for now set tracker as a default handler for the printer because we
535 		// just want to open it as a folder
536 #if B_BEOS_VERSION_DANO
537 	{
538 		ExtraAttributeLazyInstaller installer(B_PRINTER_MIMETYPE);
539 		installer.AddExtraAttribute("Driver", PSRV_PRINTER_ATTR_DRV_NAME,
540 			B_STRING_TYPE, true, false, 120, B_ALIGN_LEFT, false);
541 		installer.AddExtraAttribute("Transport",
542 			PSRV_PRINTER_ATTR_TRANSPORT, B_STRING_TYPE, true, false,
543 			60, B_ALIGN_RIGHT, false);
544 		installer.AddExtraAttribute("Connection",
545 			PSRV_PRINTER_ATTR_CNX, B_STRING_TYPE, true, false,
546 			40, B_ALIGN_LEFT, false);
547 		installer.AddExtraAttribute("Description",
548 			PSRV_PRINTER_ATTR_COMMENTS, B_STRING_TYPE, true, true,
549 			140, B_ALIGN_LEFT, false);
550 	}
551 #endif
552 }
553 
554 
555 void
556 TTracker::InstallIndices()
557 {
558 	BVolumeRoster roster;
559 	BVolume volume;
560 
561 	roster.Rewind();
562 	while (roster.GetNextVolume(&volume) == B_OK) {
563 		if (volume.IsReadOnly() || !volume.IsPersistent()
564 			|| !volume.KnowsAttr() || !volume.KnowsQuery())
565 			continue;
566 		InstallIndices(volume.Device());
567 	}
568 }
569 
570 
571 void
572 TTracker::InstallIndices(dev_t device)
573 {
574 	fs_create_index(device, kAttrQueryLastChange, B_INT32_TYPE, 0);
575 	fs_create_index(device, "_trk/recentQuery", B_INT32_TYPE, 0);
576 }
577 
578 
579 void
580 TTracker::InstallDefaultTemplates()
581 {
582 	BNode node;
583 	BString query(kQueryTemplates);
584 	query += "/application_octet-stream";
585 
586 	if (!BContainerWindow::DefaultStateSourceNode(query.String(),
587 			&node, false)) {
588 		if (BContainerWindow::DefaultStateSourceNode(query.String(),
589 				&node, true)) {
590 			AttributeStreamFileNode fileNode(&node);
591 			AttributeStreamTemplateNode tmp(kDefaultQueryTemplate, 3);
592 			fileNode << tmp;
593 		}
594 	}
595 
596 	(query = kQueryTemplates) += "/application_x-vnd.Be-bookmark";
597 	if (!BContainerWindow::DefaultStateSourceNode(query.String(),
598 			&node, false)) {
599 		if (BContainerWindow::DefaultStateSourceNode(query.String(),
600 				&node, true)) {
601 			AttributeStreamFileNode fileNode(&node);
602 			AttributeStreamTemplateNode tmp(kBookmarkQueryTemplate, 3);
603 			fileNode << tmp;
604 		}
605 	}
606 
607 	(query = kQueryTemplates) += "/application_x-person";
608 	if (!BContainerWindow::DefaultStateSourceNode(query.String(),
609 			&node, false)) {
610 		if (BContainerWindow::DefaultStateSourceNode(query.String(),
611 				&node, true)) {
612 			AttributeStreamFileNode fileNode(&node);
613 			AttributeStreamTemplateNode tmp(kPersonQueryTemplate, 3);
614 			fileNode << tmp;
615 		}
616 	}
617 
618 	(query = kQueryTemplates) += "/text_x-email";
619 	if (!BContainerWindow::DefaultStateSourceNode(query.String(),
620 			&node, false)) {
621 		if (BContainerWindow::DefaultStateSourceNode(query.String(),
622 				&node, true)) {
623 			AttributeStreamFileNode fileNode(&node);
624 			AttributeStreamTemplateNode tmp(kEmailQueryTemplate, 3);
625 			fileNode << tmp;
626 		}
627 	}
628 }
629 
630 
631 void
632 TTracker::InstallTemporaryBackgroundImages()
633 {
634 	// make the large Haiku Logo the default background
635 
636 	BPath path;
637 	status_t status = find_directory(B_SYSTEM_DATA_DIRECTORY, &path);
638 	if (status < B_OK) {
639 		// TODO: this error shouldn't be shown to the regular user
640 		BString errorMessage(B_TRANSLATE("At %func \nfind_directory() "
641 			"failed. \nReason: %error"));
642 		errorMessage.ReplaceFirst("%func", __PRETTY_FUNCTION__);
643 		errorMessage.ReplaceFirst("%error", strerror(status));
644 		BAlert* alert = new BAlert("AlertError", errorMessage.String(),
645 			B_TRANSLATE("OK"), NULL, NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT);
646 		alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
647 		alert->Go();
648 		return;
649 	}
650 	path.Append("artwork");
651 
652 	BString defaultBackgroundImage("/HAIKU logo - white on blue - big.png");
653 
654 	BDirectory dir;
655 	if (FSGetBootDeskDir(&dir) == B_OK) {
656 		// install a default background if there is no background defined yet
657 		attr_info info;
658 		if (dir.GetAttrInfo(kBackgroundImageInfo, &info) != B_OK) {
659 			BScreen screen(B_MAIN_SCREEN_ID);
660 			BPoint logoPos;
661 			logoPos.x
662 				= floorf((screen.Frame().Width() - 605) * (sqrtf(5) - 1) / 2);
663 			logoPos.y = floorf((screen.Frame().Height() - 190) * 0.9);
664 			BMessage message;
665 			AddTemporaryBackgroundImages(&message,
666 				(BString(path.Path()) << defaultBackgroundImage).String(),
667 				BackgroundImage::kAtOffset, logoPos, 0xffffffff, false);
668 			::InstallTemporaryBackgroundImages(&dir, &message);
669 		}
670 	}
671 }
672