author | Tero Marttila <terom@fixme.fi> |
Fri, 18 Jul 2008 21:28:42 +0300 | |
changeset 11175 | 020c61e39c94 |
parent 11062 | 19abd15f7cf8 |
permissions | -rw-r--r-- |
2186 | 1 |
/* $Id$ */ |
2 |
||
10429
1b99254f9607
(svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium
parents:
9340
diff
changeset
|
3 |
/** @file driver.cpp Base for all driver handling. */ |
6451
7baba06b4b85
(svn r8862) -Cleanup: doxygen changes, again. Mostly @files missing tags and a few comments style.
belugas
parents:
6360
diff
changeset
|
4 |
|
2171
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
5 |
#include "stdafx.h" |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
6 |
#include "openttd.h" |
2210
58a293892a66
(svn r2728) -Fix/Feature: Change the driver probing algorithm
tron
parents:
2186
diff
changeset
|
7 |
#include "debug.h" |
2171
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
8 |
#include "driver.h" |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
9 |
|
7666
a5fccd76176a
(svn r10444) -Codechange: switch to c++ classes and inheritance for sound/music/video drivers, using self-registration based on the blitter-model.
peter1138
parents:
7541
diff
changeset
|
10 |
#include "sound/sound_driver.hpp" |
a5fccd76176a
(svn r10444) -Codechange: switch to c++ classes and inheritance for sound/music/video drivers, using self-registration based on the blitter-model.
peter1138
parents:
7541
diff
changeset
|
11 |
#include "music/music_driver.hpp" |
a5fccd76176a
(svn r10444) -Codechange: switch to c++ classes and inheritance for sound/music/video drivers, using self-registration based on the blitter-model.
peter1138
parents:
7541
diff
changeset
|
12 |
#include "video/video_driver.hpp" |
2222
d227c0207a02
(svn r2740) MSCV doesn't seem to like forward declared static arrays
tron
parents:
2219
diff
changeset
|
13 |
|
8771
f7ad4dba14bf
(svn r11839) -Codechange: move some variables from variables.h to a more logical location.
rubidium
parents:
8710
diff
changeset
|
14 |
VideoDriver *_video_driver; |
f7ad4dba14bf
(svn r11839) -Codechange: move some variables from variables.h to a more logical location.
rubidium
parents:
8710
diff
changeset
|
15 |
char _ini_videodriver[32]; |
f7ad4dba14bf
(svn r11839) -Codechange: move some variables from variables.h to a more logical location.
rubidium
parents:
8710
diff
changeset
|
16 |
int _num_resolutions; |
10983
e734f891d1f6
(svn r13537) -Fix [FS#2090](r13523): QSortT won't work this way, use Dimension instead of uint16[2] for resolutions
smatz
parents:
10911
diff
changeset
|
17 |
Dimension _resolutions[32]; |
e734f891d1f6
(svn r13537) -Fix [FS#2090](r13523): QSortT won't work this way, use Dimension instead of uint16[2] for resolutions
smatz
parents:
10911
diff
changeset
|
18 |
Dimension _cur_resolution; |
8771
f7ad4dba14bf
(svn r11839) -Codechange: move some variables from variables.h to a more logical location.
rubidium
parents:
8710
diff
changeset
|
19 |
|
7666
a5fccd76176a
(svn r10444) -Codechange: switch to c++ classes and inheritance for sound/music/video drivers, using self-registration based on the blitter-model.
peter1138
parents:
7541
diff
changeset
|
20 |
SoundDriver *_sound_driver; |
8771
f7ad4dba14bf
(svn r11839) -Codechange: move some variables from variables.h to a more logical location.
rubidium
parents:
8710
diff
changeset
|
21 |
char _ini_sounddriver[32]; |
f7ad4dba14bf
(svn r11839) -Codechange: move some variables from variables.h to a more logical location.
rubidium
parents:
8710
diff
changeset
|
22 |
|
7666
a5fccd76176a
(svn r10444) -Codechange: switch to c++ classes and inheritance for sound/music/video drivers, using self-registration based on the blitter-model.
peter1138
parents:
7541
diff
changeset
|
23 |
MusicDriver *_music_driver; |
8771
f7ad4dba14bf
(svn r11839) -Codechange: move some variables from variables.h to a more logical location.
rubidium
parents:
8710
diff
changeset
|
24 |
char _ini_musicdriver[32]; |
f7ad4dba14bf
(svn r11839) -Codechange: move some variables from variables.h to a more logical location.
rubidium
parents:
8710
diff
changeset
|
25 |
|
f7ad4dba14bf
(svn r11839) -Codechange: move some variables from variables.h to a more logical location.
rubidium
parents:
8710
diff
changeset
|
26 |
char _ini_blitter[32]; |
2171
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
27 |
|
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
28 |
static const char* GetDriverParam(const char* const* parm, const char* name) |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
29 |
{ |
2458
c95808cd2ac9
(svn r2984) Use adequate types, this should aid portability a bit
tron
parents:
2303
diff
changeset
|
30 |
size_t len; |
2171
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
31 |
|
2224
e210db34b7ec
(svn r2742) Get rid of some void pointers plus a few minor changes, like 0 -> '\0'
tron
parents:
2222
diff
changeset
|
32 |
if (parm == NULL) return NULL; |
e210db34b7ec
(svn r2742) Get rid of some void pointers plus a few minor changes, like 0 -> '\0'
tron
parents:
2222
diff
changeset
|
33 |
|
e210db34b7ec
(svn r2742) Get rid of some void pointers plus a few minor changes, like 0 -> '\0'
tron
parents:
2222
diff
changeset
|
34 |
len = strlen(name); |
2171
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
35 |
for (; *parm != NULL; parm++) { |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
36 |
const char* p = *parm; |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
37 |
|
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
38 |
if (strncmp(p, name, len) == 0) { |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
39 |
if (p[len] == '=') return p + len + 1; |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
40 |
if (p[len] == '\0') return p + len; |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
41 |
} |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
42 |
} |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
43 |
return NULL; |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
44 |
} |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
45 |
|
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
46 |
bool GetDriverParamBool(const char* const* parm, const char* name) |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
47 |
{ |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
48 |
return GetDriverParam(parm, name) != NULL; |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
49 |
} |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
50 |
|
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
51 |
int GetDriverParamInt(const char* const* parm, const char* name, int def) |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
52 |
{ |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
53 |
const char* p = GetDriverParam(parm, name); |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
54 |
return p != NULL ? atoi(p) : def; |
008122046f7f
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
tron
parents:
diff
changeset
|
55 |
} |
9340
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
56 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
57 |
/** |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
58 |
* Find the requested driver and return its class. |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
59 |
* @param name the driver to select. |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
60 |
* @post Sets the driver so GetCurrentDriver() returns it too. |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
61 |
*/ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
62 |
const Driver *DriverFactoryBase::SelectDriver(const char *name, Driver::Type type) |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
63 |
{ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
64 |
if (GetDrivers().size() == 0) return NULL; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
65 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
66 |
if (*name == '\0') { |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
67 |
/* Probe for this driver */ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
68 |
for (int priority = 10; priority >= 0; priority--) { |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
69 |
Drivers::iterator it = GetDrivers().begin(); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
70 |
for (; it != GetDrivers().end(); ++it) { |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
71 |
DriverFactoryBase *d = (*it).second; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
72 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
73 |
/* Check driver type */ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
74 |
if (d->type != type) continue; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
75 |
if (d->priority != priority) continue; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
76 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
77 |
Driver *newd = d->CreateInstance(); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
78 |
const char *err = newd->Start(NULL); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
79 |
if (err == NULL) { |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
80 |
DEBUG(driver, 1, "Successfully probed %s driver '%s'", GetDriverTypeName(type), d->name); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
81 |
delete *GetActiveDriver(type); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
82 |
*GetActiveDriver(type) = newd; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
83 |
return newd; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
84 |
} |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
85 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
86 |
DEBUG(driver, 1, "Probing %s driver '%s' failed with error: %s", GetDriverTypeName(type), d->name, err); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
87 |
delete newd; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
88 |
} |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
89 |
} |
10839
a62547c31fdb
(svn r13390) -Codechange: introduce usererror() for fatal but not openttd related errors. Now all error() will 'crash' openttd after showing the message in win32 releases (MSVC), creating a crash.log and crash.dmp (like the '!' hack used before). On the other hand, usererror() will just close the game. So use error() only when it can be helpful to debugging, else use usererror().
glx
parents:
10800
diff
changeset
|
90 |
usererror("Couldn't find any suitable %s driver", GetDriverTypeName(type)); |
9340
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
91 |
} else { |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
92 |
char *parm; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
93 |
char buffer[256]; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
94 |
const char *parms[32]; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
95 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
96 |
/* Extract the driver name and put parameter list in parm */ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
97 |
strecpy(buffer, name, lastof(buffer)); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
98 |
parm = strchr(buffer, ':'); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
99 |
parms[0] = NULL; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
100 |
if (parm != NULL) { |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
101 |
uint np = 0; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
102 |
/* Tokenize the parm. */ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
103 |
do { |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
104 |
*parm++ = '\0'; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
105 |
if (np < lengthof(parms) - 1) parms[np++] = parm; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
106 |
while (*parm != '\0' && *parm != ',') parm++; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
107 |
} while (*parm == ','); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
108 |
parms[np] = NULL; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
109 |
} |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
110 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
111 |
/* Find this driver */ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
112 |
Drivers::iterator it = GetDrivers().begin(); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
113 |
for (; it != GetDrivers().end(); ++it) { |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
114 |
DriverFactoryBase *d = (*it).second; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
115 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
116 |
/* Check driver type */ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
117 |
if (d->type != type) continue; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
118 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
119 |
/* Check driver name */ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
120 |
if (strcasecmp(buffer, d->name) != 0) continue; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
121 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
122 |
/* Found our driver, let's try it */ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
123 |
Driver *newd = d->CreateInstance(); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
124 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
125 |
const char *err = newd->Start(parms); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
126 |
if (err != NULL) { |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
127 |
delete newd; |
10839
a62547c31fdb
(svn r13390) -Codechange: introduce usererror() for fatal but not openttd related errors. Now all error() will 'crash' openttd after showing the message in win32 releases (MSVC), creating a crash.log and crash.dmp (like the '!' hack used before). On the other hand, usererror() will just close the game. So use error() only when it can be helpful to debugging, else use usererror().
glx
parents:
10800
diff
changeset
|
128 |
usererror("Unable to load driver '%s'. The error was: %s", d->name, err); |
9340
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
129 |
} |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
130 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
131 |
DEBUG(driver, 1, "Successfully loaded %s driver '%s'", GetDriverTypeName(type), d->name); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
132 |
delete *GetActiveDriver(type); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
133 |
*GetActiveDriver(type) = newd; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
134 |
return newd; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
135 |
} |
10839
a62547c31fdb
(svn r13390) -Codechange: introduce usererror() for fatal but not openttd related errors. Now all error() will 'crash' openttd after showing the message in win32 releases (MSVC), creating a crash.log and crash.dmp (like the '!' hack used before). On the other hand, usererror() will just close the game. So use error() only when it can be helpful to debugging, else use usererror().
glx
parents:
10800
diff
changeset
|
136 |
usererror("No such %s driver: %s\n", GetDriverTypeName(type), buffer); |
9340
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
137 |
} |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
138 |
} |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
139 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
140 |
/** |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
141 |
* Register a driver internally, based on its name. |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
142 |
* @param name the name of the driver. |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
143 |
* @note an assert() will be trigger if 2 driver with the same name try to register. |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
144 |
*/ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
145 |
void DriverFactoryBase::RegisterDriver(const char *name, Driver::Type type, int priority) |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
146 |
{ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
147 |
/* Don't register nameless Drivers */ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
148 |
if (name == NULL) return; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
149 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
150 |
this->name = strdup(name); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
151 |
this->type = type; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
152 |
this->priority = priority; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
153 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
154 |
/* Prefix the name with driver type to make it unique */ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
155 |
char buf[32]; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
156 |
strecpy(buf, GetDriverTypeName(type), lastof(buf)); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
157 |
strecpy(buf + 5, name, lastof(buf)); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
158 |
|
11062
19abd15f7cf8
(svn r13619) -Codechange: use 'const char *' instead of std::string for blitter and driver names
smatz
parents:
10983
diff
changeset
|
159 |
const char *longname = strdup(buf); |
19abd15f7cf8
(svn r13619) -Codechange: use 'const char *' instead of std::string for blitter and driver names
smatz
parents:
10983
diff
changeset
|
160 |
|
19abd15f7cf8
(svn r13619) -Codechange: use 'const char *' instead of std::string for blitter and driver names
smatz
parents:
10983
diff
changeset
|
161 |
std::pair<Drivers::iterator, bool> P = GetDrivers().insert(Drivers::value_type(longname, this)); |
9340
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
162 |
assert(P.second); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
163 |
} |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
164 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
165 |
/** |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
166 |
* Build a human readable list of available drivers, grouped by type. |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
167 |
*/ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
168 |
char *DriverFactoryBase::GetDriversInfo(char *p, const char *last) |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
169 |
{ |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
170 |
for (Driver::Type type = Driver::DT_BEGIN; type != Driver::DT_END; type++) { |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
171 |
p += snprintf(p, last - p, "List of %s drivers:\n", GetDriverTypeName(type)); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
172 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
173 |
for (int priority = 10; priority >= 0; priority--) { |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
174 |
Drivers::iterator it = GetDrivers().begin(); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
175 |
for (; it != GetDrivers().end(); it++) { |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
176 |
DriverFactoryBase *d = (*it).second; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
177 |
if (d->type != type) continue; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
178 |
if (d->priority != priority) continue; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
179 |
p += snprintf(p, last - p, "%18s: %s\n", d->name, d->GetDescription()); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
180 |
} |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
181 |
} |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
182 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
183 |
p += snprintf(p, last - p, "\n"); |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
184 |
} |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
185 |
|
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
186 |
return p; |
a59cd2c7e548
(svn r12594) -Codechange: move large functions from driver.h to driver.cpp to reduce binary size and compile time
smatz
parents:
8771
diff
changeset
|
187 |
} |
10911
dc3cb3bb6113
(svn r13462) -Codechange: move DriverFactoryBase destructor definition from header file (saves ~16kB)
smatz
parents:
10839
diff
changeset
|
188 |
|
dc3cb3bb6113
(svn r13462) -Codechange: move DriverFactoryBase destructor definition from header file (saves ~16kB)
smatz
parents:
10839
diff
changeset
|
189 |
/** Frees memory used for this->name |
dc3cb3bb6113
(svn r13462) -Codechange: move DriverFactoryBase destructor definition from header file (saves ~16kB)
smatz
parents:
10839
diff
changeset
|
190 |
*/ |
dc3cb3bb6113
(svn r13462) -Codechange: move DriverFactoryBase destructor definition from header file (saves ~16kB)
smatz
parents:
10839
diff
changeset
|
191 |
DriverFactoryBase::~DriverFactoryBase() { |
dc3cb3bb6113
(svn r13462) -Codechange: move DriverFactoryBase destructor definition from header file (saves ~16kB)
smatz
parents:
10839
diff
changeset
|
192 |
if (this->name == NULL) return; |
dc3cb3bb6113
(svn r13462) -Codechange: move DriverFactoryBase destructor definition from header file (saves ~16kB)
smatz
parents:
10839
diff
changeset
|
193 |
|
dc3cb3bb6113
(svn r13462) -Codechange: move DriverFactoryBase destructor definition from header file (saves ~16kB)
smatz
parents:
10839
diff
changeset
|
194 |
/* Prefix the name with driver type to make it unique */ |
dc3cb3bb6113
(svn r13462) -Codechange: move DriverFactoryBase destructor definition from header file (saves ~16kB)
smatz
parents:
10839
diff
changeset
|
195 |
char buf[32]; |
dc3cb3bb6113
(svn r13462) -Codechange: move DriverFactoryBase destructor definition from header file (saves ~16kB)
smatz
parents:
10839
diff
changeset
|
196 |
strecpy(buf, GetDriverTypeName(type), lastof(buf)); |
dc3cb3bb6113
(svn r13462) -Codechange: move DriverFactoryBase destructor definition from header file (saves ~16kB)
smatz
parents:
10839
diff
changeset
|
197 |
strecpy(buf + 5, this->name, lastof(buf)); |
dc3cb3bb6113
(svn r13462) -Codechange: move DriverFactoryBase destructor definition from header file (saves ~16kB)
smatz
parents:
10839
diff
changeset
|
198 |
|
11062
19abd15f7cf8
(svn r13619) -Codechange: use 'const char *' instead of std::string for blitter and driver names
smatz
parents:
10983
diff
changeset
|
199 |
Drivers::iterator it = GetDrivers().find(buf); |
19abd15f7cf8
(svn r13619) -Codechange: use 'const char *' instead of std::string for blitter and driver names
smatz
parents:
10983
diff
changeset
|
200 |
assert(it != GetDrivers().end()); |
19abd15f7cf8
(svn r13619) -Codechange: use 'const char *' instead of std::string for blitter and driver names
smatz
parents:
10983
diff
changeset
|
201 |
|
19abd15f7cf8
(svn r13619) -Codechange: use 'const char *' instead of std::string for blitter and driver names
smatz
parents:
10983
diff
changeset
|
202 |
const char *longname = (*it).first; |
19abd15f7cf8
(svn r13619) -Codechange: use 'const char *' instead of std::string for blitter and driver names
smatz
parents:
10983
diff
changeset
|
203 |
|
19abd15f7cf8
(svn r13619) -Codechange: use 'const char *' instead of std::string for blitter and driver names
smatz
parents:
10983
diff
changeset
|
204 |
GetDrivers().erase(it); |
19abd15f7cf8
(svn r13619) -Codechange: use 'const char *' instead of std::string for blitter and driver names
smatz
parents:
10983
diff
changeset
|
205 |
free((void *)longname); |
19abd15f7cf8
(svn r13619) -Codechange: use 'const char *' instead of std::string for blitter and driver names
smatz
parents:
10983
diff
changeset
|
206 |
|
10911
dc3cb3bb6113
(svn r13462) -Codechange: move DriverFactoryBase destructor definition from header file (saves ~16kB)
smatz
parents:
10839
diff
changeset
|
207 |
if (GetDrivers().empty()) delete &GetDrivers(); |
11062
19abd15f7cf8
(svn r13619) -Codechange: use 'const char *' instead of std::string for blitter and driver names
smatz
parents:
10983
diff
changeset
|
208 |
free((void *)this->name); |
10911
dc3cb3bb6113
(svn r13462) -Codechange: move DriverFactoryBase destructor definition from header file (saves ~16kB)
smatz
parents:
10839
diff
changeset
|
209 |
} |