diff options
-rw-r--r-- | src/driver.cpp | 134 | ||||
-rw-r--r-- | src/driver.h | 137 |
2 files changed, 137 insertions, 134 deletions
diff --git a/src/driver.cpp b/src/driver.cpp index 35f4b5ce9..487be75d5 100644 --- a/src/driver.cpp +++ b/src/driver.cpp @@ -53,3 +53,137 @@ int GetDriverParamInt(const char* const* parm, const char* name, int def) const char* p = GetDriverParam(parm, name); return p != NULL ? atoi(p) : def; } + +/** + * Find the requested driver and return its class. + * @param name the driver to select. + * @post Sets the driver so GetCurrentDriver() returns it too. + */ +const Driver *DriverFactoryBase::SelectDriver(const char *name, Driver::Type type) +{ + if (GetDrivers().size() == 0) return NULL; + + if (*name == '\0') { + /* Probe for this driver */ + for (int priority = 10; priority >= 0; priority--) { + Drivers::iterator it = GetDrivers().begin(); + for (; it != GetDrivers().end(); ++it) { + DriverFactoryBase *d = (*it).second; + + /* Check driver type */ + if (d->type != type) continue; + if (d->priority != priority) continue; + + Driver *newd = d->CreateInstance(); + const char *err = newd->Start(NULL); + if (err == NULL) { + DEBUG(driver, 1, "Successfully probed %s driver '%s'", GetDriverTypeName(type), d->name); + delete *GetActiveDriver(type); + *GetActiveDriver(type) = newd; + return newd; + } + + DEBUG(driver, 1, "Probing %s driver '%s' failed with error: %s", GetDriverTypeName(type), d->name, err); + delete newd; + } + } + error("Couldn't find any suitable %s driver", GetDriverTypeName(type)); + } else { + char *parm; + char buffer[256]; + const char *parms[32]; + + /* Extract the driver name and put parameter list in parm */ + strecpy(buffer, name, lastof(buffer)); + parm = strchr(buffer, ':'); + parms[0] = NULL; + if (parm != NULL) { + uint np = 0; + /* Tokenize the parm. */ + do { + *parm++ = '\0'; + if (np < lengthof(parms) - 1) parms[np++] = parm; + while (*parm != '\0' && *parm != ',') parm++; + } while (*parm == ','); + parms[np] = NULL; + } + + /* Find this driver */ + Drivers::iterator it = GetDrivers().begin(); + for (; it != GetDrivers().end(); ++it) { + DriverFactoryBase *d = (*it).second; + + /* Check driver type */ + if (d->type != type) continue; + + /* Check driver name */ + if (strcasecmp(buffer, d->name) != 0) continue; + + /* Found our driver, let's try it */ + Driver *newd = d->CreateInstance(); + + const char *err = newd->Start(parms); + if (err != NULL) { + delete newd; + error("Unable to load driver '%s'. The error was: %s", d->name, err); + } + + DEBUG(driver, 1, "Successfully loaded %s driver '%s'", GetDriverTypeName(type), d->name); + delete *GetActiveDriver(type); + *GetActiveDriver(type) = newd; + return newd; + } + error("No such %s driver: %s\n", GetDriverTypeName(type), buffer); + } +} + +/** + * Register a driver internally, based on its name. + * @param name the name of the driver. + * @note an assert() will be trigger if 2 driver with the same name try to register. + */ +void DriverFactoryBase::RegisterDriver(const char *name, Driver::Type type, int priority) +{ + /* Don't register nameless Drivers */ + if (name == NULL) return; + + this->name = strdup(name); + this->type = type; + this->priority = priority; + + /* Prefix the name with driver type to make it unique */ + char buf[32]; + strecpy(buf, GetDriverTypeName(type), lastof(buf)); + strecpy(buf + 5, name, lastof(buf)); + +#if !defined(NDEBUG) || defined(WITH_ASSERT) + /* NDEBUG disables asserts and gives a warning: unused variable 'P' */ + std::pair<Drivers::iterator, bool> P = +#endif /* !NDEBUG */ + GetDrivers().insert(Drivers::value_type(buf, this)); + assert(P.second); +} + +/** + * Build a human readable list of available drivers, grouped by type. + */ +char *DriverFactoryBase::GetDriversInfo(char *p, const char *last) +{ + for (Driver::Type type = Driver::DT_BEGIN; type != Driver::DT_END; type++) { + p += snprintf(p, last - p, "List of %s drivers:\n", GetDriverTypeName(type)); + + for (int priority = 10; priority >= 0; priority--) { + Drivers::iterator it = GetDrivers().begin(); + for (; it != GetDrivers().end(); it++) { + DriverFactoryBase *d = (*it).second; + if (d->type != type) continue; + if (d->priority != priority) continue; + p += snprintf(p, last - p, "%18s: %s\n", d->name, d->GetDescription()); + } + } + + p += snprintf(p, last - p, "\n"); + } + + return p; +} diff --git a/src/driver.h b/src/driver.h index 1a088d8c4..e78dfaf5b 100644 --- a/src/driver.h +++ b/src/driver.h @@ -60,32 +60,7 @@ private: } protected: - /** - * Register a driver internally, based on its name. - * @param name the name of the driver. - * @note an assert() will be trigger if 2 driver with the same name try to register. - */ - void RegisterDriver(const char *name, Driver::Type type, int priority) - { - /* Don't register nameless Drivers */ - if (name == NULL) return; - - this->name = strdup(name); - this->type = type; - this->priority = priority; - - /* Prefix the name with driver type to make it unique */ - char buf[32]; - strecpy(buf, GetDriverTypeName(type), lastof(buf)); - strecpy(buf + 5, name, lastof(buf)); - -#if !defined(NDEBUG) || defined(WITH_ASSERT) - /* NDEBUG disables asserts and gives a warning: unused variable 'P' */ - std::pair<Drivers::iterator, bool> P = -#endif /* !NDEBUG */ - GetDrivers().insert(Drivers::value_type(buf, this)); - assert(P.second); - } + void RegisterDriver(const char *name, Driver::Type type, int priority); public: DriverFactoryBase() : @@ -94,114 +69,8 @@ public: virtual ~DriverFactoryBase() { if (this->name != NULL) GetDrivers().erase(this->name); free(this->name); } - /** - * Find the requested driver and return its class. - * @param name the driver to select. - * @post Sets the driver so GetCurrentDriver() returns it too. - */ - static Driver *SelectDriver(const char *name, Driver::Type type) - { - if (GetDrivers().size() == 0) return NULL; - - if (*name == '\0') { - /* Probe for this driver */ - for (int priority = 10; priority >= 0; priority--) { - Drivers::iterator it = GetDrivers().begin(); - for (; it != GetDrivers().end(); ++it) { - DriverFactoryBase *d = (*it).second; - - /* Check driver type */ - if (d->type != type) continue; - if (d->priority != priority) continue; - - Driver *newd = d->CreateInstance(); - const char *err = newd->Start(NULL); - if (err == NULL) { - DEBUG(driver, 1, "Successfully probed %s driver '%s'", GetDriverTypeName(type), d->name); - delete *GetActiveDriver(type); - *GetActiveDriver(type) = newd; - return newd; - } - - DEBUG(driver, 1, "Probing %s driver '%s' failed with error: %s", GetDriverTypeName(type), d->name, err); - delete newd; - } - } - error("Couldn't find any suitable %s driver", GetDriverTypeName(type)); - } else { - char *parm; - char buffer[256]; - const char *parms[32]; - - /* Extract the driver name and put parameter list in parm */ - strecpy(buffer, name, lastof(buffer)); - parm = strchr(buffer, ':'); - parms[0] = NULL; - if (parm != NULL) { - uint np = 0; - /* Tokenize the parm. */ - do { - *parm++ = '\0'; - if (np < lengthof(parms) - 1) - parms[np++] = parm; - while (*parm != '\0' && *parm != ',') - parm++; - } while (*parm == ','); - parms[np] = NULL; - } - - /* Find this driver */ - Drivers::iterator it = GetDrivers().begin(); - for (; it != GetDrivers().end(); ++it) { - DriverFactoryBase *d = (*it).second; - - /* Check driver type */ - if (d->type != type) continue; - - /* Check driver name */ - if (strcasecmp(buffer, d->name) != 0) continue; - - /* Found our driver, let's try it */ - Driver *newd = d->CreateInstance(); - - const char *err = newd->Start(parms); - if (err != NULL) { - delete newd; - error("Unable to load driver '%s'. The error was: %s", d->name, err); - } - - DEBUG(driver, 1, "Successfully loaded %s driver '%s'", GetDriverTypeName(type), d->name); - delete *GetActiveDriver(type); - *GetActiveDriver(type) = newd; - return newd; - } - error("No such %s driver: %s\n", GetDriverTypeName(type), buffer); - } - } - - /** - * Build a human readable list of available drivers, grouped by type. - */ - static char *GetDriversInfo(char *p, const char *last) - { - for (Driver::Type type = Driver::DT_BEGIN; type != Driver::DT_END; type++) { - p += snprintf(p, last - p, "List of %s drivers:\n", GetDriverTypeName(type)); - - for (int priority = 10; priority >= 0; priority--) { - Drivers::iterator it = GetDrivers().begin(); - for (; it != GetDrivers().end(); it++) { - DriverFactoryBase *d = (*it).second; - if (d->type != type) continue; - if (d->priority != priority) continue; - p += snprintf(p, last - p, "%18s: %s\n", d->name, d->GetDescription()); - } - } - - p += snprintf(p, last - p, "\n"); - } - - return p; - } + static const Driver *SelectDriver(const char *name, Driver::Type type); + static char *GetDriversInfo(char *p, const char *last); /** * Get a nice description of the driver-class. |