175584Sru/*
275584Sru * Copyright 2006-2009, Haiku, Inc. All rights reserved.
375584Sru * Distributed under the terms of the MIT License.
475584Sru *
575584Sru * Authors:
675584Sru *		Stephan A��mus <superstippi@gmx.de>
775584Sru */
875584Sru
975584Sru#include "SVGImporter.h"
1075584Sru
1175584Sru#include <strings.h>
1275584Sru
1375584Sru#include <Alert.h>
1475584Sru#include <Catalog.h>
1575584Sru#include <Entry.h>
1675584Sru#include <File.h>
1775584Sru#include <Locale.h>
1875584Sru#include <MimeType.h>
1975584Sru#include <Path.h>
2075584Sru
2175584Sru#include "DocumentBuilder.h"
2275584Sru#include "nanosvg.h"
2375584Sru
2475584Sru
2575584Sru#undef B_TRANSLATION_CONTEXT
2675584Sru#define B_TRANSLATION_CONTEXT "Icon-O-Matic-SVGImport"
2775584Sru
2875584Sru
2975584Sru// constructor
3075584SruSVGImporter::SVGImporter()
3175584Sru{
3275584Sru}
3375584Sru
3475584Sru// destructor
3575584SruSVGImporter::~SVGImporter()
3675584Sru{
3775584Sru}
3875584Sru
3975584Sru// Import
4075584Srustatus_t
4175584SruSVGImporter::Import(Icon* icon, const entry_ref* ref)
4275584Sru{
4375584Sru	status_t ret = Init(icon);
4475584Sru	if (ret < B_OK) {
4575584Sru		printf("SVGImporter::Import() - "
4675584Sru			   "Init() error: %s\n", strerror(ret));
4775584Sru		return ret;
4875584Sru	}
4975584Sru
5075584Sru	BPath path(ref);
5175584Sru	ret = path.InitCheck();
5275584Sru	if (ret < B_OK)
5375584Sru		return ret;
5475584Sru
5575584Sru	// Check that it indeed looks like an SVG file
5675584Sru	BMimeType type;
5775584Sru	ret = BMimeType::GuessMimeType(ref, &type);
5875584Sru	if (ret != B_OK || strcmp(type.Type(), "image/svg+xml") != 0) {
5975584Sru		printf("not an svg file %s %s\n", strerror(ret), type.Type());
6075584Sru		return B_ERROR;
6175584Sru	}
6275584Sru
6375584Sru	NSVGimage* svg = nsvgParseFromFile(path.Path(), "px", 96);
6475584Sru	if (svg == NULL) {
6575584Sru		char error[1024];
6675584Sru		sprintf(error, B_TRANSLATE("Failed to open the file '%s' as "
6775584Sru			"an SVG document.\n\n"), ref->name);
6875584Sru		BAlert* alert = new BAlert(B_TRANSLATE("Load error"),
6975584Sru			error, B_TRANSLATE("OK"), NULL, NULL,
7075584Sru			B_WIDTH_AS_USUAL, B_WARNING_ALERT);
7175584Sru		alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
7275584Sru		alert->Go(NULL);
7375584Sru		return B_ERROR;
7475584Sru	}
7575584Sru
7675584Sru	DocumentBuilder builder(svg);
7775584Sru	ret = builder.GetIcon(icon, ref->name);
7875584Sru	nsvgDelete(svg);
7975584Sru
8075584Sru	return ret;
8175584Sru}
8275584Sru