1/*
2 * Copyright 2002-2010, Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT license.
4 *
5 * Authors:
6 *		Oliver Siebenmarck
7 *		Andrew McCall, mccall@digitalparadise.co.uk
8 *		Michael Wilber
9 */
10
11#include "DataTranslations.h"
12
13#include <stdio.h>
14
15#include <Alert.h>
16#include <Catalog.h>
17#include <Directory.h>
18#include <Entry.h>
19#include <FindDirectory.h>
20#include <String.h>
21#include <TextView.h>
22#include <TranslatorRoster.h>
23
24#include "DataTranslationsWindow.h"
25
26
27#undef B_TRANSLATION_CONTEXT
28#define B_TRANSLATION_CONTEXT "DataTranslations"
29
30
31const char* kApplicationSignature = "application/x-vnd.Haiku-DataTranslations";
32
33
34DataTranslationsApplication::DataTranslationsApplication()
35	:
36	BApplication(kApplicationSignature)
37{
38	new DataTranslationsWindow();
39}
40
41
42DataTranslationsApplication::~DataTranslationsApplication()
43{
44}
45
46
47void
48DataTranslationsApplication::_InstallError(const char* name, status_t status)
49{
50	BString text;
51	snprintf(text.LockBuffer(512), 512,
52			B_TRANSLATE("Could not install %s:\n%s"), name, strerror(status));
53	text.UnlockBuffer();
54	BAlert* alert = new BAlert(B_TRANSLATE("DataTranslations - Error"),
55		text.String(), B_TRANSLATE("OK"));
56	alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
57	alert->Go();
58}
59
60
61/*!
62	Installs the given entry in the target directory either by moving
63	or copying the entry.
64*/
65status_t
66DataTranslationsApplication::_Install(BDirectory& target, BEntry& entry)
67{
68	// Find out whether we need to copy it
69	status_t status = entry.MoveTo(&target, NULL, true);
70	if (status == B_OK)
71		return B_OK;
72
73	// we need to copy the file
74
75	// TODO!
76	return B_ERROR;
77}
78
79
80void
81DataTranslationsApplication::_NoTranslatorError(const char* name)
82{
83	BString text(
84		B_TRANSLATE("The item '%name' does not appear to be a Translator and "
85		"will not be installed."));
86	text.ReplaceAll("%name", name);
87	BAlert* alert = new BAlert("", text.String(), B_TRANSLATE("OK"));
88	alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
89	alert->Go();
90}
91
92
93void
94DataTranslationsApplication::RefsReceived(BMessage* message)
95{
96	BTranslatorRoster* roster = BTranslatorRoster::Default();
97
98	BPath path;
99	status_t status = find_directory(B_USER_NONPACKAGED_ADDONS_DIRECTORY,
100		&path, true);
101	if (status != B_OK) {
102		_InstallError("translator", status);
103		return;
104	}
105
106	BDirectory target;
107	status = target.SetTo(path.Path());
108	if (status == B_OK) {
109		if (!target.Contains("Translators"))
110			status = target.CreateDirectory("Translators", &target);
111		else
112			status = target.SetTo(&target, "Translators");
113	}
114	if (status != B_OK) {
115		_InstallError("translator", status);
116		return;
117	}
118
119	int32 i = 0;
120	entry_ref ref;
121	while (message->FindRef("refs", i++, &ref) == B_OK) {
122		if (!roster->IsTranslator(&ref)) {
123			_NoTranslatorError(ref.name);
124			continue;
125		}
126
127		BEntry entry(&ref, true);
128		status = entry.InitCheck();
129		if (status != B_OK) {
130			_InstallError(ref.name, status);
131			continue;
132		}
133
134		if (target.Contains(ref.name)) {
135			BString string(
136				B_TRANSLATE("An item named '%name' already exists in the "
137				"Translators folder! Shall the existing translator be "
138				"overwritten?"));
139			string.ReplaceAll("%name", ref.name);
140
141			BAlert* alert = new BAlert(B_TRANSLATE("DataTranslations - Note"),
142				string.String(), B_TRANSLATE("Cancel"),
143				B_TRANSLATE("Overwrite"));
144			alert->SetShortcut(0, B_ESCAPE);
145			if (alert->Go() != 1)
146				continue;
147
148			// the original file will be replaced
149		}
150
151		// find out whether we need to copy it or not
152
153		status = _Install(target, entry);
154		if (status == B_OK) {
155			BAlert* alert = new BAlert(B_TRANSLATE("DataTranslations - Note"),
156				B_TRANSLATE("The new translator has been installed "
157					"successfully."), B_TRANSLATE("OK"));
158			alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
159			alert->Go(NULL);
160		} else
161			_InstallError(ref.name, status);
162	}
163}
164
165
166//	#pragma mark -
167
168
169int
170main(int, char**)
171{
172	DataTranslationsApplication app;
173	app.Run();
174
175	return 0;
176}
177