Distribution.h

Go to the documentation of this file.
00001 /*
00002  *  BEEN: Benchmarking Environment
00003  *  ==============================
00004  *
00005  *  File author: Branislav Repcek
00006  *
00007  *  GNU Lesser General Public License Version 2.1
00008  *  ---------------------------------------------
00009  *  Copyright (C) 2004-2006 Distributed Systems Research Group,
00010  *  Faculty of Mathematics and Physics, Charles University in Prague
00011  *
00012  *  This library is free software; you can redistribute it and/or
00013  *  modify it under the terms of the GNU Lesser General Public
00014  *  License version 2.1, as published by the Free Software Foundation.
00015  *
00016  *  This library is distributed in the hope that it will be useful,
00017  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00019  *  Lesser General Public License for more details.
00020  *
00021  *  You should have received a copy of the GNU Lesser General Public
00022  *  License along with this library; if not, write to the Free Software
00023  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
00024  *  MA  02111-1307  USA
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                 // Call failed -> exit.
00096                 return;
00097             }
00098         
00099             if (sscanf(uts.release, "%d.%d.%d", &kernel_major, &kernel_minor, &kernel_release) < 3)
00100             {
00101                 // Unable to parse all three fields.
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             // Find first match.
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             // No match found, return default packager.
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

Generated on Tue Dec 19 17:43:51 2006 for Detector for Linux by  doxygen 1.4.7