• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/CocoaInputManager.h"
39 #  include "mac/MacInputManager.h"
40 #elif defined OIS_IPHONE_PLATFORM
41 #  include "iphone/iPhoneInputManager.h"
42 #elif defined OIS_XBOX_PLATFORM
43 #  include "xbox/XBoxInputManager.h"
44 #endif
45 
46 //Bring in extra controls
47 #if defined OIS_LIRC_SUPPORT
48 #  include "extras/LIRC/OISLIRCFactoryCreator.h"
49 #endif
50 #if defined OIS_WIN32_WIIMOTE_SUPPORT
51 #  include "win32/extras/WiiMote/OISWiiMoteFactoryCreator.h"
52 #endif
53 
54 
55 using namespace OIS;
56 
57 //----------------------------------------------------------------------------//
InputManager(const std::string & name)58 InputManager::InputManager(const std::string& name) :
59 	m_VersionName(OIS_VERSION_NAME),
60 	mInputSystemName(name),
61 	m_lircSupport(0),
62 	m_wiiMoteSupport(0)
63 {
64     mFactories.clear();
65     mFactoryObjects.clear();
66 }
67 
68 //----------------------------------------------------------------------------//
~InputManager()69 InputManager::~InputManager()
70 {
71 #if defined OIS_LIRC_SUPPORT
72 	delete m_lircSupport;
73 #endif
74 
75 #if defined OIS_WIN32_WIIMOTE_SUPPORT
76 	delete m_wiiMoteSupport;
77 #endif
78 }
79 
80 //----------------------------------------------------------------------------//
getVersionNumber()81 unsigned int InputManager::getVersionNumber()
82 {
83 	return OIS_VERSION;
84 }
85 
86 //----------------------------------------------------------------------------//
getVersionName()87 const std::string &InputManager::getVersionName()
88 {
89 	return m_VersionName;
90 }
91 
92 //----------------------------------------------------------------------------//
createInputSystem(std::size_t windowhandle)93 InputManager* InputManager::createInputSystem( std::size_t windowhandle )
94 {
95 	ParamList pl;
96 	std::ostringstream wnd;
97 	wnd << windowhandle;
98 	pl.insert(std::make_pair( std::string("WINDOW"), wnd.str() ));
99 
100 	return createInputSystem( pl );
101 }
102 
103 //----------------------------------------------------------------------------//
createInputSystem(ParamList & paramList)104 InputManager* InputManager::createInputSystem( ParamList &paramList )
105 {
106 	InputManager* im = 0;
107 
108 #if defined OIS_SDL_PLATFORM
109 	im = new SDLInputManager();
110 #elif defined OIS_WIN32_PLATFORM
111 	im = new Win32InputManager();
112 #elif defined OIS_XBOX_PLATFORM
113 	im = new XBoxInputManager();
114 #elif defined OIS_LINUX_PLATFORM
115 	im = new LinuxInputManager();
116 #elif defined OIS_APPLE_PLATFORM
117 	im = new CocoaInputManager();
118 //	ParamList::iterator i = paramList.find("WINDOW");
119 //	if(i != paramList.end())
120 //    {
121 //        id obj = (id)strtoul(i->second.c_str(), 0, 10);
122 //        if(obj && [obj isKindOfClass:[NSWindow class]])
123 //            im = new CocoaInputManager();
124 // #ifndef __LP64__
125 //        else
126 //            im = new MacInputManager();
127 // #endif
128 //    }
129 #elif defined OIS_IPHONE_PLATFORM
130 	im = new iPhoneInputManager();
131 #else
132 	OIS_EXCEPT(E_General, "No platform library.. check build platform defines!");
133 #endif
134 
135 	try
136 	{
137 		im->_initialize(paramList);
138 	}
139 	catch(...)
140 	{
141 		delete im;
142 		throw; //rethrow
143 	}
144 
145 	return im;
146 }
147 
148 //----------------------------------------------------------------------------//
destroyInputSystem(InputManager * manager)149 void InputManager::destroyInputSystem(InputManager* manager)
150 {
151 	if( manager == 0 )
152 		return;
153 
154 	//Cleanup before deleting...
155 	for( FactoryCreatedObject::iterator i = manager->mFactoryObjects.begin();
156 		i != manager->mFactoryObjects.end(); ++i )
157 	{
158 		i->second->destroyObject( i->first );
159 	}
160 
161 	manager->mFactoryObjects.clear();
162 	delete manager;
163 }
164 
165 //--------------------------------------------------------------------------------//
inputSystemName()166 const std::string& InputManager::inputSystemName()
167 {
168 	return mInputSystemName;
169 }
170 
171 //--------------------------------------------------------------------------------//
getNumberOfDevices(Type iType)172 int InputManager::getNumberOfDevices( Type iType )
173 {
174 	//Count up all the factories devices
175 	int factoyObjects = 0;
176 	FactoryList::iterator i = mFactories.begin(), e = mFactories.end();
177 	for( ; i != e; ++i )
178 		factoyObjects += (*i)->totalDevices(iType);
179 
180 	return factoyObjects;
181 }
182 
183 //----------------------------------------------------------------------------//
listFreeDevices()184 DeviceList InputManager::listFreeDevices()
185 {
186 	DeviceList list;
187 	FactoryList::iterator i = mFactories.begin(), e = mFactories.end();
188 	for( ; i != e; ++i )
189 	{
190 		DeviceList temp = (*i)->freeDeviceList();
191 		list.insert(temp.begin(), temp.end());
192 	}
193 
194 	return list;
195 }
196 
197 //----------------------------------------------------------------------------//
createInputObject(Type iType,bool bufferMode,const std::string & vendor)198 Object* InputManager::createInputObject( Type iType, bool bufferMode, const std::string &vendor )
199 {
200 	Object* obj = 0;
201 	FactoryList::iterator i = mFactories.begin(), e = mFactories.end();
202 	for( ; i != e; ++i)
203 	{
204 		if( (*i)->freeDevices(iType) > 0 )
205 		{
206 			if( vendor == "" || (*i)->vendorExist(iType, vendor) )
207 			{
208 				obj = (*i)->createObject(this, iType, bufferMode, vendor);
209 				mFactoryObjects[obj] = (*i);
210 				break;
211 			}
212 		}
213 	}
214 
215 	if(!obj)
216 		OIS_EXCEPT(E_InputDeviceNonExistant, "No devices match requested type.");
217 
218 	try
219 	{	//Intialize device
220 		obj->_initialize();
221 	}
222 	catch(...)
223 	{	//Somekind of error, cleanup and rethrow
224 		destroyInputObject(obj);
225 		throw;
226 	}
227 
228 	return obj;
229 }
230 
231 //----------------------------------------------------------------------------//
destroyInputObject(Object * obj)232 void InputManager::destroyInputObject( Object* obj )
233 {
234 	if( obj == 0 )
235 		return;
236 
237 	FactoryCreatedObject::iterator i = mFactoryObjects.find(obj);
238 	if( i != mFactoryObjects.end() )
239 	{
240 		i->second->destroyObject(obj);
241 		mFactoryObjects.erase(i);
242 	}
243 	else
244 	{
245 		OIS_EXCEPT(E_General, "Object creator not known.");
246 	}
247 }
248 
249 //----------------------------------------------------------------------------//
addFactoryCreator(FactoryCreator * factory)250 void InputManager::addFactoryCreator( FactoryCreator* factory )
251 {
252 	if(factory != 0)
253 		mFactories.push_back(factory);
254 }
255 
256 //----------------------------------------------------------------------------//
removeFactoryCreator(FactoryCreator * factory)257 void InputManager::removeFactoryCreator( FactoryCreator* factory )
258 {
259 	if(factory != 0)
260 	{
261 		//First, destroy all devices created with the factory
262 		for( FactoryCreatedObject::iterator i = mFactoryObjects.begin(); i != mFactoryObjects.end(); ++i )
263 		{
264 			if( i->second == factory )
265 			{
266 				i->second->destroyObject(i->first);
267 				mFactoryObjects.erase(i++);
268 			}
269 		}
270 
271 		//Now, remove the factory itself
272 		FactoryList::iterator fact = std::find(mFactories.begin(), mFactories.end(), factory);
273 		if( fact != mFactories.end() )
274 			mFactories.erase(fact);
275 	}
276 }
277 
278 //----------------------------------------------------------------------------//
enableAddOnFactory(AddOnFactories factory)279 void InputManager::enableAddOnFactory(AddOnFactories factory)
280 {
281 #if defined OIS_LIRC_SUPPORT
282 	if( factory == AddOn_LIRC || factory == AddOn_All )
283 	{
284 		if( m_lircSupport == 0 )
285 		{
286 			m_lircSupport = new LIRCFactoryCreator();
287 			addFactoryCreator(m_lircSupport);
288 		}
289 	}
290 #endif
291 
292 #if defined OIS_WIN32_WIIMOTE_SUPPORT
293 	if( factory == AddOn_WiiMote || factory == AddOn_All )
294 	{
295 		if( m_wiiMoteSupport == 0 )
296 		{
297 			m_wiiMoteSupport = new WiiMoteFactoryCreator();
298 			addFactoryCreator(m_wiiMoteSupport);
299 		}
300 	}
301 #endif
302 }
303