/*
* Copyright 2006-2009, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Stephan Aßmus <superstippi@gmx.de>
*/
#include "SVGImporter.h"
#include <strings.h>
#include <Alert.h>
#include <Catalog.h>
#include <Entry.h>
#include <File.h>
#include <Locale.h>
#include <Path.h>
#include "DocumentBuilder.h"
#include "SVGParser.h"
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "Icon-O-Matic-SVGImport"
// constructor
SVGImporter::SVGImporter()
{
}
// destructor
SVGImporter::~SVGImporter()
{
}
// Import
status_t
SVGImporter::Import(Icon* icon, const entry_ref* ref)
{
status_t ret = Init(icon);
if (ret < B_OK) {
printf("SVGImporter::Import() - "
"Init() error: %s\n", strerror(ret));
return ret;
}
BPath path(ref);
ret = path.InitCheck();
if (ret < B_OK)
return ret;
// peek into file to see if this could be an SVG file at all
BFile file(path.Path(), B_READ_ONLY);
ret = file.InitCheck();
if (ret < B_OK)
return ret;
ssize_t size = 5;
char buffer[size + 1];
if (file.Read(buffer, size) != size)
return B_ERROR;
// 0 terminate
buffer[size] = 0;
if (strcasecmp(buffer, "<?xml") != 0) {
// we might be stretching it a bit, but what the heck
return B_ERROR;
}
try {
agg::svg::DocumentBuilder builder;
agg::svg::Parser parser(builder);
parser.parse(path.Path());
ret = builder.GetIcon(icon, this, ref->name);
} catch(agg::svg::exception& e) {
char error[1024];
sprintf(error, B_TRANSLATE("Failed to open the file '%s' as "
"an SVG document.\n\n"
"Error: %s"), ref->name, e.msg());
BAlert* alert = new BAlert(B_TRANSLATE("load error"),
error, B_TRANSLATE("OK"), NULL, NULL,
B_WIDTH_AS_USUAL, B_WARNING_ALERT);
alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
alert->Go(NULL);
ret = B_ERROR;
}
return ret;
}
↑ V773 Visibility scope of the 'alert' pointer was exited without releasing the memory. A memory leak is possible.