]> icculus.org git repositories - divverent/netradiant.git/blob - radiant/filetypes.cpp
another compile fix for win32 on arch linux
[divverent/netradiant.git] / radiant / filetypes.cpp
1 /*
2 Copyright (C) 2001-2006, William Joseph.
3 All Rights Reserved.
4
5 This file is part of GtkRadiant.
6
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21
22 #include "filetypes.h"
23
24 #include "debugging/debugging.h"
25
26 #include "ifiletypes.h"
27
28 #include "string/string.h"
29 #include "os/path.h"
30 #include <vector>
31 #include <map>
32
33 class RadiantFileTypeRegistry : public IFileTypeRegistry
34 {
35   struct filetype_copy_t
36   {
37     filetype_copy_t(const char* moduleName, const filetype_t other)
38       : m_moduleName(moduleName), m_name(other.name), m_pattern(other.pattern), m_can_load(other.can_load), m_can_import(other.can_import), m_can_save(other.can_save)
39     {
40     }
41     const char* getModuleName() const
42     {
43       return m_moduleName.c_str();
44     }
45     filetype_t getType() const
46     {
47       return filetype_t(m_name.c_str(), m_pattern.c_str(), m_can_load, m_can_save, m_can_import);
48     }
49     bool m_can_load;
50     bool m_can_import;
51     bool m_can_save;
52   private:
53     CopiedString m_moduleName;
54     CopiedString m_name;
55     CopiedString m_pattern;
56   };
57   typedef std::vector<filetype_copy_t> filetype_list_t;
58   std::map<CopiedString, filetype_list_t> m_typelists;
59 public:
60   RadiantFileTypeRegistry()
61   {
62     addType("*", "*", filetype_t("All Files", "*.*"));
63   }
64   void addType(const char* moduleType, const char* moduleName, filetype_t type)
65   {
66     m_typelists[moduleType].push_back(filetype_copy_t(moduleName, type));
67   }
68   void getTypeList(const char* moduleType, IFileTypeList* typelist, bool want_load, bool want_import, bool want_save)
69   {
70     filetype_list_t& list_ref = m_typelists[moduleType];
71     for(filetype_list_t::iterator i = list_ref.begin(); i != list_ref.end(); ++i)
72     {
73       if(want_load && !(*i).m_can_load) return;
74       if(want_import && !(*i).m_can_import) return;
75       if(want_save && !(*i).m_can_save) return;
76       typelist->addType((*i).getModuleName(), (*i).getType());
77     }
78   }
79 };
80
81 static RadiantFileTypeRegistry g_patterns;
82
83 IFileTypeRegistry* GetFileTypeRegistry()
84 {
85   return &g_patterns;
86 }
87
88 const char* findModuleName(IFileTypeRegistry* registry, const char* moduleType, const char* extension)
89 {
90   class SearchFileTypeList : public IFileTypeList
91   {
92     char m_pattern[128];
93     const char* m_moduleName;
94   public:
95     SearchFileTypeList(const char* ext)
96       : m_moduleName("")
97     {
98       m_pattern[0] = '*';
99       m_pattern[1] = '.';
100       strncpy(m_pattern + 2, ext, 125);
101       m_pattern[127] = '\0';
102     }
103     void addType(const char* moduleName, filetype_t type)
104     {
105       if(extension_equal(m_pattern, type.pattern))
106       {
107         m_moduleName = moduleName;
108       }
109     }
110
111     const char* getModuleName()
112     {
113       return m_moduleName;
114     }
115   } search(extension);
116   registry->getTypeList(moduleType, &search);
117   return search.getModuleName();
118 }
119
120
121 #include "modulesystem/singletonmodule.h"
122 #include "modulesystem/moduleregistry.h"
123
124 class FiletypesAPI
125 {
126   IFileTypeRegistry* m_filetypes;
127 public:
128   typedef IFileTypeRegistry Type;
129   STRING_CONSTANT(Name, "*");
130
131   FiletypesAPI()
132   {
133     m_filetypes = GetFileTypeRegistry();
134   }
135   IFileTypeRegistry* getTable()
136   {
137     return m_filetypes;
138   }
139 };
140
141 typedef SingletonModule<FiletypesAPI> FiletypesModule;
142 typedef Static<FiletypesModule> StaticFiletypesModule;
143 StaticRegisterModule staticRegisterFiletypes(StaticFiletypesModule::instance());
144
145