File: packagerepository.cpp

package info (click to toggle)
asc 2.6.1.0-9
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 81,740 kB
  • sloc: cpp: 158,704; sh: 11,544; ansic: 6,736; makefile: 604; perl: 138
file content (118 lines) | stat: -rw-r--r-- 3,954 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
     This file is part of Advanced Strategic Command; http://www.asc-hq.org
     Copyright (C) 1994-2010  Martin Bickel
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or
     (at your option) any later version.
 
     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
     along with this program; see the file COPYING. If not, write to the 
     Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
     Boston, MA  02111-1307  USA
*/

#include "packagerepository.h"
#include "strtmesg.h"
#include "packagemanager.h"            
            

PackageRepository packageRepository;

void PackageRepository ::addProgramPackage()
{
   Package* prog = _getPackage( "ASC");
   if ( !prog ) {
      prog = new Package();
      packageRepository.push_back( prog );
      prog->name = "ASC";
   }
   prog->version.fromString( getVersionString() );
}

void PackageRepository ::readTextFiles( PropertyReadingContainer& prc, const ASCString& fileName, const ASCString& location )
{
   Package* p = new Package();
   p->runTextIO( prc );
   
   // p->filename = fileName;
   // p->location = location;
   
   packageRepository.push_back( p );
}

void PackageRepository :: read ( tnstream& stream )
{
   stream.readInt();
   readPointerContainer( packageRepository, stream );
}

void PackageRepository :: write ( tnstream& stream )
{
   stream.writeInt( 1 );
   writePointerContainer( packageRepository, stream );
}

sigc::signal<void> PackageRepository::packgeDescriptionLoaded;

void PackageRepository :: postChecks() 
{
   addProgramPackage();
   for ( PackageRepository::iterator i = packageRepository.begin(); i != packageRepository.end(); ++i ) {
      checkPackageDependency( *i );
   }
   packgeDescriptionLoaded();
}

void PackageRepository::checkPackageDependency( const Package* pack, const PackageData* packageData )
{
   for ( Package::Dependencies::const_iterator dep = pack->dependencies.begin(); dep != pack->dependencies.end(); ++dep ) {
      const Package* p = getPackage( dep->name );
      if ( p ) {
         if ( p->version < dep->version ) {
            ASCString s = "The package " +  dep->name + " on your system is outdated.\n"
                  + "Package " + pack->name + " requires at least " + dep->version.toString() + "\n";
            
            if ( !p->description.empty() )
                s += "\nPackage Info:\n" + p->description ;
            throw ASCmsgException( s);
         } 
      } else {
         ASCString s = "The package " +  dep->name + " is missing on your system!" ;
         if ( packageData ) {
            for ( PackageData::Packages::const_iterator ref = packageData->packages.begin(); ref != packageData->packages.end(); ++ref )
               if ( ref->second->name == dep->name )
                  if ( !ref->second->description.empty())
                     s += "\nPackage Info:\n" + ref->second->description ;
                        
         }
         throw ASCmsgException( s );
      }

   }
}


Package* PackageRepository::_getPackage( const ASCString& name ) 
{
   for ( PackageRepository::const_iterator p = packageRepository.begin(); p != packageRepository.end(); ++p ) 
      if ( (*p)->name.compare_ci( name ) == 0 ) 
         return *p;
   return NULL;
}

const Package* PackageRepository::getPackage( const ASCString& name ) const
{
   for ( PackageRepository::const_iterator p = packageRepository.begin(); p != packageRepository.end(); ++p ) 
      if ( (*p)->name.compare_ci( name ) == 0 ) 
         return *p;
   return NULL;
}