[zi-cvs] packages/com.zzoss.zic applications.php,1.9,1.10 packages.php,1.7,1.8 packages_confirm.php,1.4,1.5 packages_dependencies.php,1.6,1.7 packages_download.php,1.5,1.6 packages_process.php,1.4,1.5
[email protected] Thu, 12 Feb 2004 02:36:43 -0800
| Newsgroups | gmane.comp.php.zzoss.installer.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/zzossinstaller/packages/com.zzoss.zic
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24632/com.zzoss.zic
Modified Files:
applications.php packages.php packages_confirm.php
packages_dependencies.php packages_download.php
packages_process.php
Log Message:
after-install package manager
Index: applications.php
===================================================================
RCS file: /cvsroot/zzossinstaller/packages/com.zzoss.zic/applications.php,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** applications.php 11 Feb 2004 14:38:40 -0000 1.9
--- applications.php 12 Feb 2004 10:36:41 -0000 1.10
***************
*** 54,68 ****
$zi_registry->setDistribution($distribution);
$_REQUEST['application'] = $zi_registry->getApplicationNameById($_REQUEST['id']);
!
if(isset($_REQUEST['mode']) && !$_REQUEST['mode'] == 'dev'){
! if(strlen($split[1])) {
! if($split[1]=='I') {
! $_REQUEST["ZI_LOCATION_NEXT"] = 'application_settings.php'.zi_form_querystr();
! }
! if($split[1]=='R') {
! $_REQUEST["ZI_LOCATION_NEXT"] = 'application_delete.php'.zi_form_querystr();
! }
! if($split[1]=='U') {
! $_REQUEST["ZI_LOCATION_NEXT"] = 'application_update.php'.zi_form_querystr();
}
}
--- 54,75 ----
$zi_registry->setDistribution($distribution);
$_REQUEST['application'] = $zi_registry->getApplicationNameById($_REQUEST['id']);
!
! $action = $split[1];
!
if(isset($_REQUEST['mode']) && !$_REQUEST['mode'] == 'dev'){
! if(strlen($action)) {
! switch($action){
! case 'I':
! $_REQUEST["ZI_LOCATION_NEXT"] = 'application_settings.php'.zi_form_querystr();
! break;
! case 'R':
! $_REQUEST["ZI_LOCATION_NEXT"] = 'application_delete.php'.zi_form_querystr();
! break;
! case 'U':
! $_REQUEST["ZI_LOCATION_NEXT"] = 'application_update.php'.zi_form_querystr();
! break;
! case 'P':
! $_REQUEST["ZI_LOCATION_NEXT"] = 'packages.php'.zi_form_querystr();
! break;
}
}
***************
*** 152,159 ****
} else {
?>
! <th align="center" width="30"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/run.png" border="0" alt="Install" title="Install"></th>
! <th align="center" width="30"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/rebuild.png" border="0" alt="Update" title="Update"></th>
! <!--<th align="center" width="30"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/package_settings.png" border="0" alt="Reconfigure" title="Reconfigure"></th>-->
! <th align="center" width="30"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/trashcan_empty.png" border="0" alt="Remove" title="Remove"></th>
<?php
}
--- 159,167 ----
} else {
?>
! <th align="center"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/run.png" border="0" alt="Install" title="Install"></th>
! <th align="center"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/package.png" border="0" alt="Packages" title="Packages"></th>
! <th align="center"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/rebuild.png" border="0" alt="Update" title="Update"></th>
! <!--<th align="center"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/package_settings.png" border="0" alt="Reconfigure" title="Reconfigure"></th>-->
! <th align="center"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/trashcan_empty.png" border="0" alt="Remove" title="Remove"></th>
<?php
}
***************
*** 200,208 ****
$options["install"] = '';
! $options["update"] = '';
$options["reconfigure"] = '';
$options["remove"] = '';
$options["install_prefix"] = '';
! $options["update_prefix"] = '';
$options["reconfigure_prefix"] = '';
$options["remove_prefix"] = '';
--- 208,216 ----
$options["install"] = '';
! $options['packages'] = $options["update"] = '';
$options["reconfigure"] = '';
$options["remove"] = '';
$options["install_prefix"] = '';
! $options['packages_prefix'] = $options["update_prefix"] = '';
$options["reconfigure_prefix"] = '';
$options["remove_prefix"] = '';
***************
*** 210,215 ****
if(!isset($application["installed"]) || !strlen($application["installed"])) {
$application["installed"] = '-';
! $options["update"] = ' disabled';
! $options["update_prefix"] = '_disabled';
$options["reconfigure"] = ' disabled';
$options["reconfigure_prefix"] = '_disabled';
--- 218,223 ----
if(!isset($application["installed"]) || !strlen($application["installed"])) {
$application["installed"] = '-';
! $options['packages'] = $options["update"] = ' disabled';
! $options['packages_prefix'] = $options["update_prefix"] = '_disabled';
$options["reconfigure"] = ' disabled';
$options["reconfigure_prefix"] = '_disabled';
***************
*** 257,260 ****
--- 265,269 ----
} else {
echo '<td align="center" valign="middle"'.$highlight.'><input type="radio" name="a'.$options["install_prefix"].'"'.$options["install"].' value="'.$application["id"].'_I_'.$distribution['name'].'-'.$distribution['release']['version'].'" title="Install"></td>';
+ echo '<td align="center" valign="middle"'.$highlight.'><input type="radio" name="a'.$options["packages_prefix"].'"'.$options["packages"].' value="'.$application["id"].'_P_'.$distribution['name'].'-'.$distribution['release']['version'].'" title="Packages"></td>';
echo '<td align="center" valign="middle"'.$highlight.'><input type="radio" name="a'.$options["update_prefix"].'"'.$options["update"].' value="'.$application["id"].'_U_'.$distribution['name'].'-'.$distribution['release']['version'].'" title="Update"></td>';
echo '<!--<td align="center" valign="middle"'.$highlight.'><input type="radio" name="a'.$options["reconfigure_prefix"].'"'.$options["reconfigure"].' value="'.$application["id"].'_C_'.$distribution['name'].'-'.$distribution['release']['version'].'" title="Reconfigure"></td>-->';
Index: packages.php
===================================================================
RCS file: /cvsroot/zzossinstaller/packages/com.zzoss.zic/packages.php,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** packages.php 11 Feb 2004 14:41:58 -0000 1.7
--- packages.php 12 Feb 2004 10:36:41 -0000 1.8
***************
*** 27,31 ****
require_once 'inc/init.php';
! if($_REQUEST["profile"] != 'custom') {
header('Location: packages_auto.php'.zi_form_querystr());
exit;
--- 27,31 ----
require_once 'inc/init.php';
! if(isset($_REQUEST['profile']) && $_REQUEST["profile"] != 'custom') {
header('Location: packages_auto.php'.zi_form_querystr());
exit;
***************
*** 97,104 ****
<table class="list">
<tr>
! <th align="center" width="30"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/run.png" border="0" alt="Install" title="Install"></th>
! <th align="center" width="30"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/rebuild.png" border="0" alt="Update" title="Update"></th>
! <th align="center" width="30"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/trashcan_empty.png" border="0" alt="Remove" title="Remove"></th>
! <th align="center" width="30"> </th>
<th align="left">Package</th>
<!-- <th align="center">Distribution</th> -->
--- 97,104 ----
<table class="list">
<tr>
! <th align="center"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/run.png" border="0" alt="Install" title="Install"></th>
! <th align="center"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/rebuild.png" border="0" alt="Update" title="Update"></th>
! <th align="center"><img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/trashcan_empty.png" border="0" alt="Remove" title="Remove"></th>
! <th align="center"> </th>
<th align="left">Package</th>
<!-- <th align="center">Distribution</th> -->
***************
*** 156,161 ****
if($package["installed"] == $package["release"]["version"]) {
$modified = false;
$options["update"] = ' disabled';
! $options["update_prefix"] = '_disabled';
$options["install"] = ' disabled';
$options["install_prefix"] = '_disabled';
--- 156,162 ----
if($package["installed"] == $package["release"]["version"]) {
$modified = false;
+ /*
$options["update"] = ' disabled';
! $options["update_prefix"] = '_disabled';*/
$options["install"] = ' disabled';
$options["install_prefix"] = '_disabled';
***************
*** 208,212 ****
?>
<?php
! if($package["install"]["type"] == 'remote') {
echo '<img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/network.png" align="absmiddle" border="0" alt="Download" title="Download">';
}
--- 209,213 ----
?>
<?php
! if($package["installed"] == '-' && $package["install"]["type"] == 'remote') {
echo '<img src="themes/share/icons/org.kde.icons.crystalsvg/16x16/network.png" align="absmiddle" border="0" alt="Download" title="Download">';
}
***************
*** 225,235 ****
<br clear="all"/>
<?php
! if(strlen($_REQUEST["profile"])) {
$zi_buttons['back'] = 'application_profile.php'.zi_form_querystr();
}
! $link_next = "packages_confirm.php";
! if(strlen($_REQUEST["profile"])) {
! $link_next .= zi_form_querystr();
! }
$zi_buttons['next'] = $link_next;
include 'themes/'.$GLOBALS['ZI']['theme'].'/footer.php';
--- 226,234 ----
<br clear="all"/>
<?php
! if(isset($_REQUEST["profile"])) {
$zi_buttons['back'] = 'application_profile.php'.zi_form_querystr();
}
! $link_next = "packages_confirm.php".zi_form_querystr();
!
$zi_buttons['next'] = $link_next;
include 'themes/'.$GLOBALS['ZI']['theme'].'/footer.php';
Index: packages_confirm.php
===================================================================
RCS file: /cvsroot/zzossinstaller/packages/com.zzoss.zic/packages_confirm.php,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** packages_confirm.php 10 Feb 2004 12:22:14 -0000 1.4
--- packages_confirm.php 12 Feb 2004 10:36:41 -0000 1.5
***************
*** 26,30 ****
// execute init file
require_once 'inc/init.php';
!
/***************************************************************************
* STARTUP *
--- 26,59 ----
// execute init file
require_once 'inc/init.php';
! /*
! function zi_process()
! {
! global $zi_registry;
!
! $actions = $zi_registry->getPackagesActions();
!
! // register packages that should be downloaded
! $pkgs_remote = array();
!
! // refresh the packages registry
! $zi_registry->registerPackages();
! $packages_resolve = $zi_registry->getPackagesResolve();
! $packages = $zi_registry->getPackages();
!
! foreach($actions as $key => $val) {
! $name = $packages_resolve[$key];
! $package = $packages[$name];
! if( ($val=='I') && ($package["install"]["type"] == 'remote') ) {
! $pkgs_remote[$package['name'].'-'.$package['release']['version']]['tgz'] = $package['filelist']['file']['#'];
! // Do we also download the remote package XML ?
! if(strlen($package['filelist']['descriptor']['#'])>2) {
! $pkgs_remote[$package['name'].'-'.$package['release']['version']]['xml'] = $package['filelist']['descriptor']['#'];
! }
! }
! }
!
! $zi_registry->setPackagesRemote($pkgs_remote);
! }
! */
/***************************************************************************
* STARTUP *
***************
*** 38,44 ****
}
- // default next link
- $link_next = 'packages_dependencies.php';
-
// Register all packages
$zi_registry->registerPackages();
--- 67,70 ----
***************
*** 91,95 ****
$portlet_pkg->setRegistry($zi_registry);
$portlet_pkg->showActions();
! // so are there any packages to process
if(!$portlet_pkg->hasActions()) {
$link_next = 'packages.php';
--- 117,125 ----
$portlet_pkg->setRegistry($zi_registry);
$portlet_pkg->showActions();
!
! // default next link
! $link_next = 'packages_dependencies.php'.zi_form_querystr();
!
! // so are there any packages to process
if(!$portlet_pkg->hasActions()) {
$link_next = 'packages.php';
***************
*** 97,115 ****
if($portlet_pkg->hasDownloads()) {
! $link_next = 'packages_download.php';
! }
! if(strlen($_REQUEST["profile"])) {
! $link_next .= zi_form_querystr();
}
if($portlet_pkg->hasActions()) {
$zi_buttons['ok'] = $link_next;
}
! if(($_REQUEST["profile"]=='full')||($_REQUEST["profile"]=='minimum')) {
$zi_buttons['back'] = "application_profile.php".zi_form_querystr();
- } elseif($_REQUEST["profile"]=='custom') {
- $zi_buttons['back'] = "packages.php".zi_form_querystr().'&loadSelection=true';
} else {
! $zi_buttons['back'] = "packages.php".zi_form_querystr()."&loadSelection=true";
}
include 'themes/'.$GLOBALS['ZI']['theme'].'/footer.php';
?>
\ No newline at end of file
--- 127,143 ----
if($portlet_pkg->hasDownloads()) {
! $link_next = 'packages_download.php'.zi_form_querystr();
}
+
if($portlet_pkg->hasActions()) {
$zi_buttons['ok'] = $link_next;
}
!
! if(isset($_REQUEST['profile']) && ($_REQUEST["profile"] == 'full' || $_REQUEST["profile"] == 'minimum')) {
$zi_buttons['back'] = "application_profile.php".zi_form_querystr();
} else {
! $zi_buttons['back'] = "packages.php".zi_form_querystr();
}
+
include 'themes/'.$GLOBALS['ZI']['theme'].'/footer.php';
?>
\ No newline at end of file
Index: packages_dependencies.php
===================================================================
RCS file: /cvsroot/zzossinstaller/packages/com.zzoss.zic/packages_dependencies.php,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** packages_dependencies.php 11 Feb 2004 14:41:58 -0000 1.6
--- packages_dependencies.php 12 Feb 2004 10:36:41 -0000 1.7
***************
*** 193,197 ****
?></td>
<td align="left"><?php
! $pkgs_needed = $pkgs_needed_by;
foreach($pkgs_needed as $pkg_needed){
$package = $packages[key($pkg_needed)];
--- 193,197 ----
?></td>
<td align="left"><?php
! $pkgs_needed = $pkgs_needed_by['needed_by'];
foreach($pkgs_needed as $pkg_needed){
$package = $packages[key($pkg_needed)];
***************
*** 225,242 ****
$zi_registry->setPackagesActionsDeps($actions_deps);
}
! if($error){
! $link_back = 'applications.php';
! } else {
! $link_back = "packages.php";
! if(strlen($_REQUEST["profile"])) {
! $link_back .= zi_form_querystr();
! }
! if(!$zi_deps->hasPendingDeps()) {
! $zi_buttons['next'] = $link_next;
! } else {
! $zi_buttons['ok'] = 'packages_download.php'.zi_form_querystr();
! }
! }
$zi_buttons['back'] = $link_back;
include 'themes/'.$GLOBALS['ZI']['theme'].'/footer.php';
--- 225,238 ----
$zi_registry->setPackagesActionsDeps($actions_deps);
}
+ $link_back = "packages.php".zi_form_querystr();
! if(!$error){
! if(!$zi_deps->hasPendingDeps()) {
! $zi_buttons['next'] = $link_next;
! } else {
! $zi_buttons['ok'] = 'packages_download.php'.zi_form_querystr();
! }
! }
!
$zi_buttons['back'] = $link_back;
include 'themes/'.$GLOBALS['ZI']['theme'].'/footer.php';
Index: packages_download.php
===================================================================
RCS file: /cvsroot/zzossinstaller/packages/com.zzoss.zic/packages_download.php,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** packages_download.php 11 Feb 2004 14:41:58 -0000 1.5
--- packages_download.php 12 Feb 2004 10:36:41 -0000 1.6
***************
*** 37,42 ****
$error = false;
! if(is_array($packages_selection)) {
global $zi_registry;
$packages_resolve = $zi_registry->getPackagesResolve();
$packages = $zi_registry->getPackages();
--- 37,48 ----
$error = false;
! if(!is_array($packages_selection)) {
! $result['error'] = true;
! $result['log'] = 'No actions defined.';
! } else {
global $zi_registry;
+
+ $items = array();
+
$packages_resolve = $zi_registry->getPackagesResolve();
$packages = $zi_registry->getPackages();
***************
*** 54,137 ****
}
! require_once 'ZZOSS_Html/Progress.php';
! $bar = new ZZOSS_HtmlProgress();
! $bar->prepareListHorizontal($items, 'Downloading');
!
! require_once 'ZZOSS_File/Download.php';
! $download = new ZZOSS_FileDownload();
! $download->setCallback(array(&$bar, '_downloadCallback'));
!
! $log = '';
!
! foreach($packages_selection as $key=>$val) {
! if(!$error) {
! $name = $packages_resolve[$key];
! $package = $packages[$name];
! if($val == 'I' && $package["install"]["type"] == 'remote') {
! // create directory
! $dir_packages = $zi_registry->getApplicationPath().'packages'.DIRECTORY_SEPARATOR;
! $dir_downloads = $zi_registry->getApplicationPath().'downloads'.DIRECTORY_SEPARATOR;
! $dir_package = $dir_packages.$package['name'].'-'.$package['release']['version'].DIRECTORY_SEPARATOR;
!
! $log .= "[".$package['name'].'-'.$package['release']['version']."]\n";
! if(strlen($package['filelist']['file']['#'])>2) {
! // download archive and extract it
! $pkg_dl = $dir_downloads.basename($package['filelist']['file']['#']);
!
! $log .= "Downloading remote package archive ...\n";
! $download->download($package['filelist']['file']['#'], $pkg_dl);
! //$bar->executeListHorizontal();
! $log .= $download->getLog();
!
! if(file_exists($pkg_dl)) {
! //$log .= 'downloaded package '.$package['name'].'-'.$package['release']['version']."\n";
! $tar = new Archive_Tar($pkg_dl);
! if (!$tar->extract($dir_packages)) {
! return PEAR::raiseError("unable to unpack $pkg_dl");
}
! //unlink($pkg_dl);
! }
! }
!
! $xml_dest = $dir_package.'package.xml';
! $xml_dl = $dir_packages.'package.xml';
! // move package XML included in package
! if(file_exists($xml_dl)) {
! copy($xml_dl, $xml_dest);
! unlink($xml_dl);
! }
! //echo $package['filelist']['descriptor']['#'];
! if(strlen($package['filelist']['descriptor']['#'])>2) {
! $xml_dl = $dir_downloads.$package['name'].'-'.$package['release']['version'].'.xml';
! // download specified remote package XML
! $log .= "\nDownloading remote package XML ...\n";
! $download->download($package['filelist']['descriptor']['#'], $xml_dl);
! $log .= $download->getLog();
if(file_exists($xml_dl)) {
! copy($xml_dl, $xml_dest);
unlink($xml_dl);
! }
! }
! /*
! // register new package
! if(file_exists($file_dest)) {
! $zi_registry->replacePackage($package['id'], $file_dest, $dir_package);
! $log .= 'registered new package '.$package['name']."-".$package['release']['version']."\n";
! } else {
! $log .= 'error: no package.xml in package '.$package['name'].'-'.$package['release']['version']."\n";
! $error = true;
! }
! */
! }
! }
! }
! $result['error'] = $error;
! $result['log'] = $log;
! } else {
! $result['error'] = true;
! $result['log'] = 'Nothing to download';
}
--- 60,145 ----
}
! if(!count($items)){
! $result['error'] = true;
! $result['log'] = 'Nothing to download';
! } else {
! require_once 'ZZOSS_Html/Progress.php';
! $bar = new ZZOSS_HtmlProgress();
! $bar->prepareListHorizontal($items, 'Downloading');
!
! require_once 'ZZOSS_File/Download.php';
! $download = new ZZOSS_FileDownload();
! $download->setCallback(array(&$bar, '_downloadCallback'));
!
! $log = '';
!
! foreach($packages_selection as $key=>$val) {
! if(!$error) {
! $name = $packages_resolve[$key];
! $package = $packages[$name];
! if($val == 'I' && $package["install"]["type"] == 'remote') {
! // create directory
! $dir_packages = $zi_registry->getApplicationPath().'packages'.DIRECTORY_SEPARATOR;
! $dir_downloads = $zi_registry->getApplicationPath().'downloads'.DIRECTORY_SEPARATOR;
! $dir_package = $dir_packages.$package['name'].'-'.$package['release']['version'].DIRECTORY_SEPARATOR;
! $log .= "[".$package['name'].'-'.$package['release']['version']."]\n";
! if(strlen($package['filelist']['file']['#'])>2) {
! // download archive and extract it
! $pkg_dl = $dir_downloads.basename($package['filelist']['file']['#']);
! $log .= "Downloading remote package archive ...\n";
!
! $download->download($package['filelist']['file']['#'], $pkg_dl);
! //$bar->executeListHorizontal();
!
! $log .= $download->getLog();
!
! if(file_exists($pkg_dl)) {
! //$log .= 'downloaded package '.$package['name'].'-'.$package['release']['version']."\n";
! $tar = new Archive_Tar($pkg_dl);
! if (!$tar->extract($dir_packages)) {
! return PEAR::raiseError("unable to unpack $pkg_dl");
! }
! //unlink($pkg_dl);
}
! }
! $xml_dest = $dir_package.'package.xml';
! $xml_dl = $dir_packages.'package.xml';
! // move package XML included in package
if(file_exists($xml_dl)) {
! copy($xml_dl, $xml_dest);
unlink($xml_dl);
! }
! //echo $package['filelist']['descriptor']['#'];
! if(strlen($package['filelist']['descriptor']['#'])>2) {
! $xml_dl = $dir_downloads.$package['name'].'-'.$package['release']['version'].'.xml';
!
! // download specified remote package XML
! $log .= "\nDownloading remote package XML ...\n";
! $download->download($package['filelist']['descriptor']['#'], $xml_dl);
! $log .= $download->getLog();
! if(file_exists($xml_dl)) {
! copy($xml_dl, $xml_dest);
! unlink($xml_dl);
! }
! }
!
! // register new package
! if(file_exists($xml_dest)) {
! $zi_registry->replacePackage($package['id'], $xml_dest, $dir_package);
! $log .= 'registered new package '.$package['name']."-".$package['release']['version']."\n";
! } else {
! $log .= 'error: no package.xml in package '.$package['name'].'-'.$package['release']['version']."\n";
! $error = true;
! }
!
! }
! }
! }
! $result['error'] = $error;
! $result['log'] = $log;
! }
}
***************
*** 171,183 ****
<br clear="all"/>
<?php
! $link_back = "packages_confirm.php";
! $link_next = 'packages_dependencies.php';
! if(strlen($_REQUEST["profile"])) {
! $link_back .= zi_form_querystr();
! $link_next .= zi_form_querystr();
! }
! $zi_buttons['back'] = $link_back;
if(!$result['error']) {
! $zi_buttons['next'] = $link_next;
}
include 'themes/'.$GLOBALS['ZI']['theme'].'/footer.php';
--- 179,186 ----
<br clear="all"/>
<?php
! $zi_buttons['back'] = "packages_confirm.php".zi_form_querystr();
!
if(!$result['error']) {
! $zi_buttons['next'] = 'packages_dependencies.php'.zi_form_querystr();
}
include 'themes/'.$GLOBALS['ZI']['theme'].'/footer.php';
-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click