moreupdates
[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: importer.cpp,v 1.1.1.1 2005/01/04 01:23:14 darco Exp $
6 **
7 **      \legal
8 **      Copyright (c) 2002 Robert B. Quattlebaum Jr.
9 **
10 **      This software and associated documentation
11 **      are CONFIDENTIAL and PROPRIETARY property of
12 **      the above-mentioned copyright holder.
13 **
14 **      You may not copy, print, publish, or in any
15 **      other way distribute this software without
16 **      a prior written agreement with
17 **      the copyright holder.
18 **      \endlegal
19 */
20 /* ========================================================================= */
21
22 /* === H E A D E R S ======================================================= */
23
24 #define SYNFIG_NO_ANGLE
25
26 #ifdef USING_PCH
27 #       include "pch.h"
28 #else
29 #ifdef HAVE_CONFIG_H
30 #       include <config.h>
31 #endif
32
33 #include "canvas.h"
34 #include "importer.h"
35 #include "surface.h"
36 #include <algorithm>
37 #include "string.h"
38 #include <map>
39 #include <ctype.h>
40 #include <functional>
41
42 #endif
43
44 /* === M A C R O S ========================================================= */
45
46 /* === G L O B A L S ======================================================= */
47
48 using namespace etl;
49 using namespace std;
50 using namespace synfig;
51
52 Importer::Book* synfig::Importer::book_;
53
54 map<String,Importer::LooseHandle> *__open_importers;
55
56 /* === P R O C E D U R E S ================================================= */
57
58 /* === M E T H O D S ======================================================= */
59
60 bool
61 Importer::subsys_init()
62 {
63         book_=new Book();
64         __open_importers=new map<String,Importer::LooseHandle>();
65         return true;
66 }
67
68 bool
69 Importer::subsys_stop()
70 {
71         delete book_;
72         delete __open_importers;
73         return true;
74 }
75
76 Importer::Book&
77 Importer::book()
78 {
79         return *book_;
80 }
81
82 Importer::Handle
83 Importer::open(const String &filename)
84 {
85         if(filename.empty())
86         {
87                 synfig::error(_("Importer::open(): Cannot open empty filename"));
88                 return 0;
89         }
90         
91         // If we already have an importer open under that filename,
92         // then use it instead.
93         if(__open_importers->count(filename))
94         {
95                 //synfig::info("Found importer already open, using it...");
96                 return (*__open_importers)[filename];
97         }
98         
99         if(find(filename.begin(),filename.end(),'.')==filename.end())
100         {
101                 synfig::error(_("Importer::open(): Couldn't find extension"));
102                 return 0;
103         }
104                 
105         String ext=string(filename.begin()+filename.find_last_of('.')+1,filename.end());
106         std::transform(ext.begin(),ext.end(),ext.begin(),&::tolower);
107         
108         
109         if(!Importer::book().count(ext))
110         {
111                 synfig::error(_("Importer::open(): Unknown file type -- ")+ext);
112                 return 0;
113         }
114         
115         try {
116                 Importer::Handle importer;
117                 importer=Importer::book()[ext](filename.c_str());
118                 (*__open_importers)[filename]=importer;
119                 return importer;
120         }
121         catch (String str)
122         {
123                 synfig::error(str);
124         }
125         return 0;
126 }
127
128 Importer::Importer():
129         gamma_(2.2)
130 {
131 }
132
133
134 Importer::~Importer()
135 {
136         // Remove ourselves from the open importer list
137         map<String,Importer::LooseHandle>::iterator iter;
138         for(iter=__open_importers->begin();iter!=__open_importers->end();++iter)
139                 if(iter->second==this)
140                 {
141                         __open_importers->erase(iter);
142                 }
143 }