Typo: 'datastructure' -> 'data structure'.
[synfig.git] / synfig-core / trunk / src / synfig / importer.cpp
1 /* === S Y N F I G ========================================================= */
2 /*!     \file importer.cpp
3 **      \brief writeme
4 **
5 **      $Id$
6 **
7 **      \legal
8 **      Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 **
10 **      This package is free software; you can redistribute it and/or
11 **      modify it under the terms of the GNU General Public License as
12 **      published by the Free Software Foundation; either version 2 of
13 **      the License, or (at your option) any later version.
14 **
15 **      This package is distributed in the hope that it will be useful,
16 **      but WITHOUT ANY WARRANTY; without even the implied warranty of
17 **      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 **      General Public License for more details.
19 **      \endlegal
20 */
21 /* ========================================================================= */
22
23 /* === H E A D E R S ======================================================= */
24
25 #define SYNFIG_NO_ANGLE
26
27 #ifdef USING_PCH
28 #       include "pch.h"
29 #else
30 #ifdef HAVE_CONFIG_H
31 #       include <config.h>
32 #endif
33
34 #include "canvas.h"
35 #include "importer.h"
36 #include "surface.h"
37 #include <algorithm>
38 #include "string.h"
39 #include <map>
40 #include <ctype.h>
41 #include <functional>
42
43 #endif
44
45 /* === M A C R O S ========================================================= */
46
47 /* === G L O B A L S ======================================================= */
48
49 using namespace etl;
50 using namespace std;
51 using namespace synfig;
52
53 Importer::Book* synfig::Importer::book_;
54
55 map<String,Importer::LooseHandle> *__open_importers;
56
57 /* === P R O C E D U R E S ================================================= */
58
59 /* === M E T H O D S ======================================================= */
60
61 bool
62 Importer::subsys_init()
63 {
64         book_=new Book();
65         __open_importers=new map<String,Importer::LooseHandle>();
66         return true;
67 }
68
69 bool
70 Importer::subsys_stop()
71 {
72         delete book_;
73         delete __open_importers;
74         return true;
75 }
76
77 Importer::Book&
78 Importer::book()
79 {
80         return *book_;
81 }
82
83 Importer::Handle
84 Importer::open(const String &filename)
85 {
86         if(filename.empty())
87         {
88                 synfig::error(_("Importer::open(): Cannot open empty filename"));
89                 return 0;
90         }
91
92         // If we already have an importer open under that filename,
93         // then use it instead.
94         if(__open_importers->count(filename))
95         {
96                 //synfig::info("Found importer already open, using it...");
97                 return (*__open_importers)[filename];
98         }
99
100         if(filename_extension(filename) == "")
101         {
102                 synfig::error(_("Importer::open(): Couldn't find extension"));
103                 return 0;
104         }
105
106         String ext(filename_extension(filename));
107         if (ext.size()) ext = ext.substr(1); // skip initial '.'
108         std::transform(ext.begin(),ext.end(),ext.begin(),&::tolower);
109
110
111         if(!Importer::book().count(ext))
112         {
113                 synfig::error(_("Importer::open(): Unknown file type -- ")+ext);
114                 return 0;
115         }
116
117         try {
118                 Importer::Handle importer;
119                 importer=Importer::book()[ext](filename.c_str());
120                 (*__open_importers)[filename]=importer;
121                 return importer;
122         }
123         catch (String str)
124         {
125                 synfig::error(str);
126         }
127         return 0;
128 }
129
130 Importer::Importer():
131         gamma_(2.2)
132 {
133 }
134
135
136 Importer::~Importer()
137 {
138         // Remove ourselves from the open importer list
139         map<String,Importer::LooseHandle>::iterator iter;
140         for(iter=__open_importers->begin();iter!=__open_importers->end();++iter)
141                 if(iter->second==this)
142                 {
143                         __open_importers->erase(iter);
144                 }
145 }