1 /*
2 The zlib/libpng License
3 
4 Copyright (c) 2005-2007 Phillip Castaneda (pjcast -- www.wreckedgames.com)
5 
6 This software is provided 'as-is', without any express or implied warranty. In no event will
7 the authors be held liable for any damages arising from the use of this software.
8 
9 Permission is granted to anyone to use this software for any purpose, including commercial
10 applications, and to alter it and redistribute it freely, subject to the following
11 restrictions:
12 
13     1. The origin of this software must not be misrepresented; you must not claim that
14 		you wrote the original software. If you use this software in a product,
15 		an acknowledgment in the product documentation would be appreciated but is
16 		not required.
17 
18     2. Altered source versions must be plainly marked as such, and must not be
19 		misrepresented as being the original software.
20 
21     3. This notice may not be removed or altered from any source distribution.
22 */
23 #include "OISInputManager.h"
24 #include "OISException.h"
25 #include "OISFactoryCreator.h"
26 #include "OISObject.h"
27 #include <sstream>
28 #include <algorithm>
29 
30 //Bring in correct Header / InputManager for current build platform
31 #if defined OIS_SDL_PLATFORM
32 #  include "SDL/SDLInputManager.h"
33 #elif defined OIS_WIN32_PLATFORM
34 #  include "win32/Win32InputManager.h"
35 #elif defined OIS_LINUX_PLATFORM
36 #  include "linux/LinuxInputManager.h"
37 #elif defined OIS_APPLE_PLATFORM
38 #  include "mac/MacInputManager.h"
39 #elif defined OIS_XBOX_PLATFORM
40 #  include "xbox/XBoxInputManager.h"
41 #endif
42 
43 //Bring in extra controls
44 #if defined OIS_LIRC_SUPPORT
45 #  include "extras/LIRC/OISLIRCFactoryCreator.h"
46 #endif
47 #if defined OIS_WIN32_WIIMOTE_SUPPORT
48 #  include "win32/extras/WiiMote/OISWiiMoteFactoryCreator.h"
49 #endif
50 
51 
52 using namespace OIS;
53 
54 //----------------------------------------------------------------------------//
InputManager(const std::string & name)55 InputManager::InputManager(const std::string& name) :
56 	m_VersionName(OIS_VERSION_NAME),
57 	mInputSystemName(name),
58 	m_lircSupport(0),
59 	m_wiiMoteSupport(0)
60 {
61 }
62 
63 //----------------------------------------------------------------------------//
~InputManager()64 InputManager::~InputManager()
65 {
66 #if defined OIS_LIRC_SUPPORT
67 	delete m_lircSupport;
68 #endif
69 
70 #if defined OIS_WIN32_WIIMOTE_SUPPORT
71 	delete m_wiiMoteSupport;
72 #endif
73 }
74 
75 //----------------------------------------------------------------------------//
getVersionNumber()76 unsigned int InputManager::getVersionNumber()
77 {
78 	return OIS_VERSION;
79 }
80 
81 //----------------------------------------------------------------------------//
getVersionName()82 const std::string &InputManager::getVersionName()
83 {
84 	return m_VersionName;
85 }
86 
87 //----------------------------------------------------------------------------//
createInputSystem(std::size_t windowhandle)88 InputManager* InputManager::createInputSystem( std::size_t windowhandle )
89 {
90 	ParamList pl;
91 	std::ostringstream wnd;
92 	wnd << windowhandle;
93 	pl.insert(std::make_pair( std::string("WINDOW"), wnd.str() ));
94 
95 	return createInputSystem( pl );
96 }
97 
98 //----------------------------------------------------------------------------//
createInputSystem(ParamList & paramList)99 InputManager* InputManager::createInputSystem( ParamList &paramList )
100 {
101 	InputManager* im = 0;
102 
103 #if defined OIS_SDL_PLATFORM
104 	im = new SDLInputManager();
105 #elif defined OIS_WIN32_PLATFORM
106 	im = new Win32InputManager();
107 #elif defined OIS_XBOX_PLATFORM
108 	im = new XBoxInputManager();
109 #elif defined OIS_LINUX_PLATFORM
110 	im = new LinuxInputManager();
111 #elif defined OIS_APPLE_PLATFORM
112 	im = new MacInputManager();
113 #else
114 	OIS_EXCEPT(E_General, "No platform library.. check build platform defines!");
115 #endif
116 
117 	try
118 	{
119 		im->_initialize(paramList);
120 	}
121 	catch(...)
122 	{
123 		delete im;
124 		throw; //rethrow
125 	}
126 
127 	return im;
128 }
129 
130 //----------------------------------------------------------------------------//
destroyInputSystem(InputManager * manager)131 void InputManager::destroyInputSystem(InputManager* manager)
132 {
133 	if( manager == 0 )
134 		return;
135 
136 	//Cleanup before deleting...
137 	for( FactoryCreatedObject::iterator i = manager->mFactoryObjects.begin();
138 		i != manager->mFactoryObjects.end(); ++i )
139 	{
140 		i->second->destroyObject( i->first );
141 	}
142 
143 	manager->mFactoryObjects.clear();
144 	delete manager;
145 }
146 
147 //--------------------------------------------------------------------------------//
inputSystemName()148 const std::string& InputManager::inputSystemName()
149 {
150 	return mInputSystemName;
151 }
152 
153 //--------------------------------------------------------------------------------//
getNumberOfDevices(Type iType)154 int InputManager::getNumberOfDevices( Type iType )
155 {
156 	//Count up all the factories devices
157 	int factoyObjects = 0;
158 	FactoryList::iterator i = mFactories.begin(), e = mFactories.end();
159 	for( ; i != e; ++i )
160 		factoyObjects += (*i)->totalDevices(iType);
161 
162 	return factoyObjects;
163 }
164 
165 //----------------------------------------------------------------------------//
listFreeDevices()166 DeviceList InputManager::listFreeDevices()
167 {
168 	DeviceList list;
169 	FactoryList::iterator i = mFactories.begin(), e = mFactories.end();
170 	for( ; i != e; ++i )
171 	{
172 		DeviceList temp = (*i)->freeDeviceList();
173 		list.insert(temp.begin(), temp.end());
174 	}
175 
176 	return list;
177 }
178 
179 //----------------------------------------------------------------------------//
createInputObject(Type iType,bool bufferMode,const std::string & vendor)180 Object* InputManager::createInputObject( Type iType, bool bufferMode, const std::string &vendor )
181 {
182 	Object* obj = 0;
183 	FactoryList::iterator i = mFactories.begin(), e = mFactories.end();
184 	for( ; i != e; ++i)
185 	{
186 		if( (*i)->freeDevices(iType) > 0 )
187 		{
188 			if( vendor == "" || (*i)->vendorExist(iType, vendor) )
189 			{
190 				obj = (*i)->createObject(this, iType, bufferMode, vendor);
191 				mFactoryObjects[obj] = (*i);
192 				break;
193 			}
194 		}
195 	}
196 
197 	if(!obj)
198 		OIS_EXCEPT(E_InputDeviceNonExistant, "No devices match requested type.");
199 
200 	try
201 	{	//Intialize device
202 		obj->_initialize();
203 	}
204 	catch(...)
205 	{	//Somekind of error, cleanup and rethrow
206 		destroyInputObject(obj);
207 		throw;
208 	}
209 
210 	return obj;
211 }
212 
213 //----------------------------------------------------------------------------//
destroyInputObject(Object * obj)214 void InputManager::destroyInputObject( Object* obj )
215 {
216 	if( obj == 0 )
217 		return;
218 
219 	FactoryCreatedObject::iterator i = mFactoryObjects.find(obj);
220 	if( i != mFactoryObjects.end() )
221 	{
222 		i->second->destroyObject(obj);
223 		mFactoryObjects.erase(i);
224 	}
225 	else
226 	{
227 		OIS_EXCEPT(E_General, "Object creator not known.");
228 	}
229 }
230 
231 //----------------------------------------------------------------------------//
addFactoryCreator(FactoryCreator * factory)232 void InputManager::addFactoryCreator( FactoryCreator* factory )
233 {
234 	if(factory != 0)
235 		mFactories.push_back(factory);
236 }
237 
238 //----------------------------------------------------------------------------//
removeFactoryCreator(FactoryCreator * factory)239 void InputManager::removeFactoryCreator( FactoryCreator* factory )
240 {
241 	if(factory != 0)
242 	{
243 		//First, destroy all devices created with the factory
244 		for( FactoryCreatedObject::iterator i = mFactoryObjects.begin(); i != mFactoryObjects.end(); ++i )
245 		{
246 			if( i->second == factory )
247 			{
248 				i->second->destroyObject(i->first);
249 				mFactoryObjects.erase(i++);
250 			}
251 		}
252 
253 		//Now, remove the factory itself
254 		FactoryList::iterator fact = std::find(mFactories.begin(), mFactories.end(), factory);
255 		if( fact != mFactories.end() )
256 			mFactories.erase(fact);
257 	}
258 }
259 
260 //----------------------------------------------------------------------------//
enableAddOnFactory(AddOnFactories factory)261 void InputManager::enableAddOnFactory(AddOnFactories factory)
262 {
263 #if defined OIS_LIRC_SUPPORT
264 	if( factory == AddOn_LIRC || factory == AddOn_All )
265 	{
266 		if( m_lircSupport == 0 )
267 		{
268 			m_lircSupport = new LIRCFactoryCreator();
269 			addFactoryCreator(m_lircSupport);
270 		}
271 	}
272 #endif
273 
274 #if defined OIS_WIN32_WIIMOTE_SUPPORT
275 	if( factory == AddOn_WiiMote || factory == AddOn_All )
276 	{
277 		if( m_wiiMoteSupport == 0 )
278 		{
279 			m_wiiMoteSupport = new WiiMoteFactoryCreator();
280 			addFactoryCreator(m_wiiMoteSupport);
281 		}
282 	}
283 #endif
284 }
285