00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00034 #ifndef DISTRIBUTION_INCLUDED
00035 #define DISTRIBUTION_INCLUDED
00036
00037 #include <stdio.h>
00038 #include <sys/utsname.h>
00039 #include "../common/UnicodeString.h"
00040 #include "../common/XMLFileOutput.h"
00041 #include "../common/MessageReporter.h"
00042 #include "Packager.h"
00043 #include "DefaultPackager.h"
00044
00049 #define AUTO_FREE_PACKAGERS 1
00050
00053 #define KERNEL_VERSION_CODE(major, minor, release) (0x10000 * (major) + 0x100 * (minor) + (release))
00054
00055 namespace hwdet
00056 {
00062 class Distribution : public MessageReporter
00063 {
00064 public:
00078 Distribution(const String &distro_name, MessageReporter *parent_reporter) :
00079 MessageReporter(distro_name, parent_reporter),
00080 kernel_major(0),
00081 kernel_minor(0),
00082 kernel_release(0),
00083 kernel_version_code(0),
00084 uts_name(TXT("(unknown)")),
00085 uts_release(TXT("(unknown)")),
00086 uts_version(TXT("(unknown)")),
00087 uts_machine(TXT("(unknown)")),
00088 kernel_version_parsed(TXT("(unknown)")),
00089 default_packager(new DefaultPackager(this))
00090 {
00091 utsname uts;
00092
00093 if (uname(&uts) == -1)
00094 {
00095
00096 return;
00097 }
00098
00099 if (sscanf(uts.release, "%d.%d.%d", &kernel_major, &kernel_minor, &kernel_release) < 3)
00100 {
00101
00102 kernel_major = kernel_minor = kernel_release = kernel_version_code = 0;
00103 }
00104 else
00105 {
00106 kernel_version_code = KERNEL_VERSION_CODE(kernel_major, kernel_minor, kernel_release);
00107 uts_name = String(uts.sysname);
00108 uts_release = String(uts.release);
00109 uts_version = String(uts.version);
00110 uts_machine = String(uts.machine);
00111
00112 StringStream stream;
00113 stream << kernel_major << TXT(".") << kernel_minor << TXT(".") << kernel_release;
00114
00115 kernel_version_parsed = stream.str();
00116 }
00117 }
00118
00123 virtual ~Distribution(void)
00124 {
00125 #if AUTO_FREE_PACKAGERS != 0
00126 for (std::vector< Packager * >::iterator it = packagers.begin();
00127 it != packagers.end();
00128 ++it)
00129 {
00130 delete *it;
00131 }
00132 #endif
00133 delete default_packager;
00134 }
00135
00141 String GetName(void) const
00142 {
00143 return GetName();
00144 }
00145
00161 virtual float GetFitness(void) = 0;
00162
00176 virtual bool DetectOS(XMLElement *root_node) = 0;
00177
00188 virtual bool DetectSoftware(XMLElement *products_node)
00189 {
00190 if (!products_node)
00191 {
00192 ReportMessage("Invalid products node.");
00193 return false;
00194 }
00195
00196 Packager *current_packager = GetPackager();
00197
00198 return current_packager->DetectSoftware(products_node);
00199 }
00200
00210 void AddPackager(Packager *packager)
00211 {
00212 if (packager)
00213 {
00214 packagers.push_back(packager);
00215 }
00216 }
00217
00230 Packager *GetPackager(void)
00231 {
00232
00233 for (std::vector< Packager * >::iterator it = packagers.begin();
00234 it != packagers.end();
00235 ++it)
00236 {
00237 if ((*it)->IsSupported())
00238 {
00239 return *it;
00240 }
00241 }
00242
00243
00244 return default_packager;
00245 }
00246
00247 protected:
00249 int kernel_major;
00250
00252 int kernel_minor;
00253
00255 int kernel_release;
00256
00258 int kernel_version_code;
00259
00261 String uts_name;
00262
00264 String uts_release;
00265
00267 String uts_version;
00268
00270 String uts_machine;
00271
00273 String kernel_version_parsed;
00274
00275 private:
00277 std::vector< Packager * > packagers;
00278
00280 DefaultPackager *default_packager;
00281 };
00282 }
00283
00284 #endif