/**
	 * @see	wcf\system\package\plugin\IPackageInstallationPlugin::install()
	 */
	public function install() {
		parent::install();
		
		// get installation path of package
		$sql = "SELECT	packageDir
			FROM	wcf".WCF_N."_package
			WHERE	packageID = ?";
		$statement = WCF::getDB()->prepareStatement($sql);
		$statement->execute(array($this->installation->getPackageID()));
		$packageDir = $statement->fetchArray();
		$packageDir = $packageDir['packageDir'];
		
		// get relative path of script
		$path = FileUtil::getRealPath(WCF_DIR.$packageDir);
		
		// reset WCF cache
		CacheHandler::getInstance()->flushAll();
		
		// run script
		$this->run($path.$this->instruction['value']);
		
		// delete script
		if (@unlink($path.$this->instruction['value'])) {
			// delete file log entry
			$sql = "DELETE FROM	wcf".WCF_N."_package_installation_file_log
				WHERE		packageID = ?
						AND filename = ?";
			$statement = WCF::getDB()->prepareStatement($sql);
			$statement->execute(array(
				$this->installation->getPackageID(),
				$this->instruction['value']
			));
		}
	}
	/**
	 * @see	wcf\system\package\plugin\IPackageInstallationPlugin::uninstall()
	 */
	public function uninstall() {
		// create ACP-templates list
		$templates = array();
		
		// get ACP-templates from log
		$sql = "SELECT	*
			FROM	wcf".WCF_N."_acp_template
			WHERE	packageID = ?";
		$statement = WCF::getDB()->prepareStatement($sql);
		$statement->execute(array($this->installation->getPackageID()));
		while ($row = $statement->fetchArray()) {
			// store acp template with suffix (_$packageID)
			$templates[] = 'acp/templates/'.$row['templateName'].'.tpl';
		}
		
		if (!empty($templates)) {
			// delete template files
			$packageDir = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR.$this->installation->getPackage()->packageDir));
			$deleteEmptyDirectories = $this->installation->getPackage()->isApplication;
			$this->installation->deleteFiles($packageDir, $templates, false, $deleteEmptyDirectories);
			
			// delete log entries
			parent::uninstall();
		}
	}
 /**
  * @see	\wcf\system\package\plugin\IPackageInstallationPlugin::install()
  */
 public function install()
 {
     parent::install();
     $abbreviation = 'wcf';
     $path = '';
     if (isset($this->instruction['attributes']['application'])) {
         $abbreviation = $this->instruction['attributes']['application'];
     } else {
         if ($this->installation->getPackage()->isApplication) {
             $path = FileUtil::getRealPath(WCF_DIR . $this->installation->getPackage()->packageDir);
         }
     }
     if (empty($path)) {
         $dirConstant = strtoupper($abbreviation) . '_DIR';
         if (!defined($dirConstant)) {
             throw new SystemException("Cannot execute script-PIP, abbreviation '" . $abbreviation . "' is unknown");
         }
         $path = constant($dirConstant);
     }
     // reset WCF cache
     CacheHandler::getInstance()->flushAll();
     // run script
     $this->run($path . $this->instruction['value']);
     // delete script
     if (@unlink($path . $this->instruction['value'])) {
         // delete file log entry
         $sql = "DELETE FROM\twcf" . WCF_N . "_package_installation_file_log\n\t\t\t\tWHERE\t\tpackageID = ?\n\t\t\t\t\t\tAND filename = ?";
         $statement = WCF::getDB()->prepareStatement($sql);
         $statement->execute(array($this->installation->getPackageID(), $this->instruction['value']));
     }
 }
 /**
  * @see	\wcf\system\package\plugin\IPackageInstallationPlugin::install()
  */
 public function install()
 {
     AbstractPackageInstallationPlugin::install();
     $xml = $this->getXML($this->instruction['value']);
     $xpath = $xml->xpath();
     if ($this->installation->getAction() == 'update') {
         // handle delete first
         $this->deleteItems($xpath);
     }
     // import or update categories
     $this->importCategories($xpath);
     // import or update options
     $this->importOptions($xpath);
 }
 /** 
  * @see	wcf\system\package\plugin\IPackageInstallationPlugin::install()
  */
 public function install()
 {
     parent::install();
     // extract style tar
     $filename = $this->installation->getArchive()->extractTar($this->instructions['value'], 'style_');
     // import style
     $style = StyleEditor::import($filename, $this->installation->getPackageID());
     // set style as default
     if (isset($this->instruction['attributes']['default'])) {
         $style->setAsDefault();
     }
     // remove tmp file
     @unlink($filename);
 }
 /**
  * @see	wcf\system\package\plugin\IPackageInstallationPlugin::install()
  */
 public function install()
 {
     parent::install();
     // search sql files in package archive
     if (($fileIndex = $this->installation->getArchive()->getTar()->getIndexByFilename($this->instruction['value'])) === false) {
         throw new SystemException("Package icon '" . $this->instruction['value'] . "' not found.");
     }
     // get extension
     $extension = substr($this->instruction['value'], strrpos($this->instruction['value'], '.'));
     // extract image
     $this->installation->getArchive()->getTar()->extract($fileIndex, WCF_DIR . 'icon/packages/' . $this->installation->getPackage()->packageID . $extension);
     // update package
     $packageEditor = new PackageEditor($this->installation->getPackage());
     $packageEditor->update(array('packageIcon' => 'icon/packages/' . $packageEditor->packageID . $extension));
 }
 /**
  * @see	wcf\system\package\plugin\IPackageInstallationPlugin::install()
  */
 public function install()
 {
     parent::install();
     // get xml
     $xml = $this->getXML($this->instruction['value']);
     $xpath = $xml->xpath();
     // handle delete first
     if ($this->installation->getAction() == 'update') {
         $this->deleteItems($xpath);
     }
     // handle import
     $this->importItems($xpath);
     // execute cleanup after successfull import/delete/update
     $this->cleanup();
 }
 /**
  * @see	\wcf\system\package\plugin\IPackageInstallationPlugin::uninstall()
  */
 public function uninstall()
 {
     // fetch ACP templates from log
     $sql = "SELECT\ttemplateName, application\n\t\t\tFROM\twcf" . WCF_N . "_acp_template\n\t\t\tWHERE\tpackageID = ?";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array($this->installation->getPackageID()));
     $templates = array();
     while ($row = $statement->fetchArray()) {
         if (!isset($templates[$row['application']])) {
             $templates[$row['application']] = array();
         }
         $templates[$row['application']][] = 'acp/templates/' . $row['templateName'] . '.tpl';
     }
     foreach ($templates as $application => $templateNames) {
         $this->installation->deleteFiles(Application::getDirectory($application), $templateNames, false, $this->installation->getPackage()->isApplication);
         // delete log entries
         parent::uninstall();
     }
 }
 /**
  * Uninstalls the templates of this package.
  */
 public function uninstall()
 {
     // create templates list
     $templates = array();
     // get templates from log
     $sql = "SELECT\ttemplateName\n\t\t\tFROM\twcf" . WCF_N . "_template\n\t\t\tWHERE \tpackageID = ?";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array($this->installation->getPackageID()));
     while ($row = $statement->fetchArray()) {
         $templates[] = 'templates/' . $row['templateName'] . '.tpl';
     }
     if (count($templates) > 0) {
         // delete template files
         $packageDir = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR . $this->installation->getPackage()->packageDir));
         $deleteEmptyDirectories = $this->installation->getPackage()->isApplication;
         $this->installation->deleteFiles($packageDir, $templates, false, $deleteEmptyDirectories);
         // delete log entries
         parent::uninstall();
     }
 }
 /**
  * @see	wcf\system\package\plugin\IPackageInstallationPlugin::install()
  */
 public function install()
 {
     AbstractPackageInstallationPlugin::install();
     // get language files
     $languageFiles = array();
     $multipleFiles = false;
     $filename = $this->instruction['value'];
     if (strpos($filename, '*') !== false) {
         // wildcard syntax; import multiple files
         $multipleFiles = true;
         $files = $this->installation->getArchive()->getTar()->getContentList();
         $pattern = str_replace("\\*", ".*", preg_quote($filename));
         foreach ($files as $file) {
             if (preg_match('!' . $pattern . '!i', $file['filename'])) {
                 if (preg_match('~([a-z-]+)\\.xml$~i', $file['filename'], $match)) {
                     $languageFiles[$match[1]] = $file['filename'];
                 } else {
                     throw new SystemException("Can not determine language code of language file '" . $file['filename'] . "'");
                 }
             }
         }
     } else {
         if (!empty($this->instruction['attributes']['languagecode'])) {
             $languageCode = $this->instruction['attributes']['languagecode'];
         } else {
             if (!empty($this->instruction['attributes']['language'])) {
                 $languageCode = $this->instruction['attributes']['language'];
             } else {
                 if (preg_match('~([a-z-]+)\\.xml$~i', $filename, $match)) {
                     $languageCode = $match[1];
                 } else {
                     throw new SystemException("Can not determine language code of language file '" . $filename . "'");
                 }
             }
         }
         $languageFiles[$languageCode] = $filename;
     }
     // get installed languages
     $installedLanguages = array();
     $sql = "SELECT\t\t*\n\t\t\tFROM\t\twcf" . WCF_N . "_language\n\t\t\tORDER BY\tisDefault DESC";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute();
     while ($row = $statement->fetchArray()) {
         $installedLanguages[] = $row;
     }
     // install language
     $addedLanguageIDArray = array();
     foreach ($installedLanguages as $installedLanguage) {
         $languageFile = null;
         if (isset($languageFiles[$installedLanguage['languageCode']])) {
             $languageFile = $languageFiles[$installedLanguage['languageCode']];
         } else {
             if ($multipleFiles) {
                 // use default language
                 if (isset($languageFiles[$installedLanguages[0]['languageCode']])) {
                     $languageFile = $languageFiles[$installedLanguages[0]['languageCode']];
                 } else {
                     if (isset($languageFiles['en'])) {
                         foreach ($installedLanguages as $installedLanguage2) {
                             if ($installedLanguage2['languageCode'] == 'en') {
                                 $languageFile = $languageFiles['en'];
                                 break;
                             }
                         }
                     }
                 }
                 // use any installed language
                 if ($languageFile === null) {
                     foreach ($installedLanguages as $installedLanguage2) {
                         if (isset($languageFiles[$installedLanguage2['languageCode']])) {
                             $languageFile = $languageFiles[$installedLanguage2['languageCode']];
                             break;
                         }
                     }
                 }
                 // use first delivered language
                 if ($languageFile === null) {
                     foreach ($languageFiles as $languageFile) {
                         break;
                     }
                 }
             }
         }
         // save language
         if ($languageFile !== null) {
             if ($xml = $this->readLanguage($languageFile)) {
                 // get language object
                 $language = LanguageFactory::getInstance()->getLanguageByCode($installedLanguage['languageCode']);
                 $languageEditor = new LanguageEditor($language);
                 // import xml
                 // don't update language files if package is an application
                 $languageEditor->updateFromXML($xml, $this->installation->getPackageID(), !$this->installation->getPackage()->isApplication);
                 // add language to this package
                 $addedLanguageIDArray[] = $language->languageID;
             }
         }
     }
     // save package to language
     if (count($addedLanguageIDArray)) {
         $condition = '';
         $statementParameters = array($this->installation->getPackageID());
         foreach ($addedLanguageIDArray as $languageID) {
             if (!empty($condition)) {
                 $condition .= ',';
             }
             $condition .= '?';
             $statementParameters[] = $languageID;
         }
         $statementParameters[] = $this->installation->getPackageID();
         $sql = "INSERT INTO\twcf" . WCF_N . "_language_to_package\n\t\t\t\t\t\t(languageID, packageID)\n\t\t\t\tSELECT\t\tlanguageID, ?\n\t\t\t\tFROM\t\twcf" . WCF_N . "_language\n\t\t\t\tWHERE\t\tlanguageID IN (" . $condition . ")\n\t\t\t\t\t\tAND languageID NOT IN (\n\t\t\t\t\t\t\tSELECT\tlanguageID\n\t\t\t\t\t\t\tFROM\twcf" . WCF_N . "_language_to_package\n\t\t\t\t\t\t\tWHERE\tpackageID = ?\n\t\t\t\t\t\t)";
         $statement = WCF::getDB()->prepareStatement($sql);
         $statement->execute($statementParameters);
     }
 }
 /**
  * Deletes the sql tables or columns which where installed by the package.
  */
 public function uninstall()
 {
     // get logged sql tables/columns
     $sql = "SELECT\t\t*\n\t\t\tFROM\t\twcf" . WCF_N . "_package_installation_sql_log\n\t\t\tWHERE\t\tpackageID = ?\n\t\t\tORDER BY \tsqlIndex DESC, sqlColumn DESC";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array($this->installation->getPackageID()));
     $entries = array();
     while ($row = $statement->fetchArray()) {
         $entries[] = $row;
     }
     // get all tablenames from database
     $existingTableNames = WCF::getDB()->getEditor()->getTablenames();
     // delete or alter tables
     foreach ($entries as $entry) {
         // don't alter table if it should be dropped
         if (!empty($entry['sqlColumn'])) {
             $isDropped = false;
             foreach ($entries as $entry2) {
                 if ($entry['sqlTable'] == $entry2['sqlTable'] && empty($entry2['sqlColumn']) && empty($entry2['sqlIndex'])) {
                     $isDropped = true;
                 }
             }
             if ($isDropped) {
                 continue;
             }
         }
         // drop table
         if (!empty($entry['sqlTable']) && empty($entry['sqlColumn']) && empty($entry['sqlIndex'])) {
             WCF::getDB()->getEditor()->dropTable($entry['sqlTable']);
         } else {
             if (in_array($entry['sqlTable'], $existingTableNames) && !empty($entry['sqlColumn'])) {
                 WCF::getDB()->getEditor()->dropColumn($entry['sqlTable'], $entry['sqlColumn']);
             } else {
                 if (in_array($entry['sqlTable'], $existingTableNames) && !empty($entry['sqlIndex'])) {
                     if (substr($entry['sqlIndex'], -3) == '_fk') {
                         WCF::getDB()->getEditor()->dropForeignKey($entry['sqlTable'], $entry['sqlIndex']);
                     } else {
                         WCF::getDB()->getEditor()->dropIndex($entry['sqlTable'], $entry['sqlIndex']);
                     }
                 }
             }
         }
     }
     // delete from log table
     parent::uninstall();
 }
 /**
  * @see	\wcf\system\package\plugin\IPackageInstallationPlugin::uninstall()
  */
 public function uninstall()
 {
     // fetch files from log
     $sql = "SELECT\tfilename, application\n\t\t\tFROM\twcf" . WCF_N . "_package_installation_file_log\n\t\t\tWHERE\tpackageID = ?";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array($this->installation->getPackageID()));
     $files = array();
     while ($row = $statement->fetchArray()) {
         if (!isset($files[$row['application']])) {
             $files[$row['application']] = array();
         }
         $files[$row['application']][] = $row['filename'];
     }
     foreach ($files as $application => $filenames) {
         $this->installation->deleteFiles(Application::getDirectory($application), $filenames);
         // delete log entries
         parent::uninstall();
     }
 }
	/**
	 * @see	wcf\system\package\plugin\IPackageInstallationPlugin::uninstall()
	 */
	public function uninstall() {
		parent::uninstall();
		
		// execute cleanup
		$this->cleanup();
	}
 /**
  * Uninstalls the files of this package.
  */
 public function uninstall()
 {
     // get absolute package dir
     $packageDir = FileUtil::addTrailingSlash(FileUtil::unifyDirSeperator(realpath(WCF_DIR . $this->installation->getPackage()->packageDir)));
     // create file list
     $files = array();
     // get files from log
     $sql = "SELECT\t*\n\t\t\tFROM\twcf" . WCF_N . "_package_installation_file_log\n\t\t\tWHERE \tpackageID = ?";
     $statement = WCF::getDB()->prepareStatement($sql);
     $statement->execute(array($this->installation->getPackageID()));
     while ($row = $statement->fetchArray()) {
         $files[] = $row['filename'];
     }
     if (count($files) > 0) {
         // delete files
         $this->installation->deleteFiles($packageDir, $files);
         // delete log entries
         parent::uninstall();
     }
 }
	/**
	 * @see	wcf\system\package\plugin\IPackageInstallationPlugin::install()
	 */
	public function install() {
		AbstractPackageInstallationPlugin::install();
		
		// get language files
		$languageFiles = array();
		$multipleFiles = false;
		$filename = $this->instruction['value'];
		if (strpos($filename, '*') !== false) {
			// wildcard syntax; import multiple files
			$multipleFiles = true;
			$files = $this->installation->getArchive()->getTar()->getContentList();
			$pattern = str_replace("\*", ".*", preg_quote($filename));
			
			foreach ($files as $file) {
				if (preg_match('!'.$pattern.'!i', $file['filename'])) {
					if (preg_match('~([a-z-]+)\.xml$~i', $file['filename'], $match)) {
						$languageFiles[$match[1]] = $file['filename'];
					}
					else {
						throw new SystemException("Can not determine language code of language file '".$file['filename']."'");
					}
				}
			}
		}
		else {
			if (!empty($this->instruction['attributes']['languagecode'])) {
				$languageCode = $this->instruction['attributes']['languagecode'];
			}
			else if (!empty($this->instruction['attributes']['language'])) {
				$languageCode = $this->instruction['attributes']['language'];
			}
			else if (preg_match('~([a-z-]+)\.xml$~i', $filename, $match)) {
				$languageCode = $match[1];
			}
			else {
				throw new SystemException("Can not determine language code of language file '".$filename."'");
			}
			
			$languageFiles[$languageCode] = $filename;
		}
		
		// get installed languages
		$installedLanguages = array();
		$sql = "SELECT		*
			FROM		wcf".WCF_N."_language
			ORDER BY	isDefault DESC";
		$statement = WCF::getDB()->prepareStatement($sql);
		$statement->execute();
		while ($row = $statement->fetchArray()) {
			$installedLanguages[] = $row;
		}
		
		// install language
		foreach ($installedLanguages as $installedLanguage) {
			$languageFile = null;
			if (isset($languageFiles[$installedLanguage['languageCode']])) {
				$languageFile = $languageFiles[$installedLanguage['languageCode']];
			}
			else if ($multipleFiles) {
				// use default language
				if (isset($languageFiles[$installedLanguages[0]['languageCode']])) {
					$languageFile = $languageFiles[$installedLanguages[0]['languageCode']];
				}
				
				// use english (if installed)
				else if (isset($languageFiles['en'])) {
					foreach ($installedLanguages as $installedLanguage2) {
						if ($installedLanguage2['languageCode'] == 'en') {
							$languageFile = $languageFiles['en'];
							break;
						}
					}
				}
				
				// use any installed language
				if ($languageFile === null) {
					foreach ($installedLanguages as $installedLanguage2) {
						if (isset($languageFiles[$installedLanguage2['languageCode']])) {
							$languageFile = $languageFiles[$installedLanguage2['languageCode']];
							break;
						}
					}
				}
				
				// use first delivered language
				if ($languageFile === null) {
					foreach ($languageFiles as $languageFile) break;
				}
			}
			
			// save language
			if ($languageFile !== null) {
				if ($xml = $this->readLanguage($languageFile)) {
					// get language object
					$language = LanguageFactory::getInstance()->getLanguageByCode($installedLanguage['languageCode']);
					$languageEditor = new LanguageEditor($language);
					
					// import xml
					// don't update language files if package is an application
					$languageEditor->updateFromXML($xml, $this->installation->getPackageID(), !$this->installation->getPackage()->isApplication);
				}
			}
		}
	}