1/*
2 * Copyright 2006-2009, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Stephan Aßmus <superstippi@gmx.de>
7 */
8
9#include "SVGImporter.h"
10
11#include <Alert.h>
12#include <Catalog.h>
13#include <Entry.h>
14#include <File.h>
15#include <Locale.h>
16#include <Path.h>
17
18#include "DocumentBuilder.h"
19#include "SVGParser.h"
20
21
22#undef B_TRANSLATION_CONTEXT
23#define B_TRANSLATION_CONTEXT "Icon-O-Matic-SVGImport"
24
25
26// constructor
27SVGImporter::SVGImporter()
28{
29}
30
31// destructor
32SVGImporter::~SVGImporter()
33{
34}
35
36// Import
37status_t
38SVGImporter::Import(Icon* icon, const entry_ref* ref)
39{
40	status_t ret = Init(icon);
41	if (ret < B_OK) {
42		printf("SVGImporter::Import() - "
43			   "Init() error: %s\n", strerror(ret));
44		return ret;
45	}
46
47	BPath path(ref);
48	ret = path.InitCheck();
49	if (ret < B_OK)
50		return ret;
51
52	// peek into file to see if this could be an SVG file at all
53	BFile file(path.Path(), B_READ_ONLY);
54	ret = file.InitCheck();
55	if (ret < B_OK)
56		return ret;
57
58	ssize_t size = 5;
59	char buffer[size + 1];
60	if (file.Read(buffer, size) != size)
61		return B_ERROR;
62
63	// 0 terminate
64	buffer[size] = 0;
65	if (strcasecmp(buffer, "<?xml") != 0) {
66		// we might be  stretching it a bit, but what the heck
67		return B_ERROR;
68	}
69
70    try {
71		agg::svg::DocumentBuilder builder;
72		agg::svg::Parser parser(builder);
73		parser.parse(path.Path());
74		ret = builder.GetIcon(icon, this, ref->name);
75	} catch(agg::svg::exception& e) {
76		char error[1024];
77		sprintf(error, B_TRANSLATE("Failed to open the file '%s' as "
78					   "an SVG document.\n\n"
79					   "Error: %s"), ref->name, e.msg());
80		BAlert* alert = new BAlert(B_TRANSLATE("load error"),
81								   error, B_TRANSLATE("OK"), NULL, NULL,
82								   B_WIDTH_AS_USUAL, B_WARNING_ALERT);
83		alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
84		alert->Go(NULL);
85		ret = B_ERROR;
86	}
87
88	return ret;
89}
90