diff --git a/src/Models/d3watermarkImageGenerator.php b/src/Models/d3watermarkImageGenerator.php
new file mode 100644
index 0000000..6a0b948
--- /dev/null
+++ b/src/Models/d3watermarkImageGenerator.php
@@ -0,0 +1,174 @@
+1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'ionCube')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'get-loader.ioncube.com')." for install assistance.\n\n");exit(199);
+?>
+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
\ No newline at end of file
diff --git a/src/bin/d3watermark b/src/bin/d3watermark
new file mode 100644
index 0000000..2f93831
--- /dev/null
+++ b/src/bin/d3watermark
@@ -0,0 +1,211 @@
+#!/usr/bin/env php
+
+ * @link http://www.oxidmodule.com
+ */
+
+namespace D3\Watermark;
+
+use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
+use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
+use D3\ModCfg\Application\Model\Maintenance\d3clrtmp;
+use D3\Watermark\Models\d3watermarkImageGenerator;
+use Dariuszp\CliProgressBar;
+use Doctrine\DBAL\DBALException;
+use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
+use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
+use OxidEsales\Eshop\Core\Exception\StandardException;
+use OxidEsales\Eshop\Core\Module\Module;
+use splitbrain\phpcli\CLI;
+use splitbrain\phpcli\Options;
+
+$bootstrapFileName = getenv('ESHOP_BOOTSTRAP_PATH');
+if (!empty($bootstrapFileName)) {
+ $bootstrapFileName = realpath(trim(getenv('ESHOP_BOOTSTRAP_PATH')));
+} else {
+ $count = 0;
+ $bootstrapFileName = '../../../../../source/bootstrap.php';
+ $currentDirectory = __DIR__ . '/';
+ while ($count < 5) {
+ $count++;
+ if (file_exists($currentDirectory . $bootstrapFileName)) {
+ $bootstrapFileName = $currentDirectory . $bootstrapFileName;
+ break;
+ }
+ $bootstrapFileName = '../' . $bootstrapFileName;
+ }
+}
+
+if (!(file_exists($bootstrapFileName) && !is_dir($bootstrapFileName))) {
+ $items = [
+ "Unable to find eShop bootstrap.php file.",
+ "You can override the path by using ESHOP_BOOTSTRAP_PATH environment variable.",
+ "\n"
+ ];
+
+ $message = implode(" ", $items);
+
+ die($message);
+}
+
+require_once($bootstrapFileName);
+
+ini_set('error_reporting', E_ERROR);
+
+class d3watermark extends CLI
+{
+ // register options and arguments
+ protected function setup(Options $options)
+ {
+ $options->setHelp('Provides maintenance functions for article images');
+ $options->registerCommand('delete', 'delete generated object images');
+ $options->registerCommand('generate', 'call object images to start generation of not existing one');
+ $options->registerCommand('renew', 'renew object images');
+ $options->registerOption('version', 'print version', 'v');
+ $options->registerArgument('types', 'affected image types - possible types are: '.d3watermarkImageGenerator::ALL.', '.d3watermarkImageGenerator::PRODUCT.', '.d3watermarkImageGenerator::CATEGORY.', '.d3watermarkImageGenerator::MANUFACTURER.', '.d3watermarkImageGenerator::VENDOR.', '.d3watermarkImageGenerator::WRAPPING, false);
+ }
+
+ /**
+ * @param Options $options
+ *
+ * @throws DBALException
+ * @throws DatabaseConnectionException
+ * @throws DatabaseErrorException
+ * @throws StandardException
+ * @throws d3ShopCompatibilityAdapterException
+ * @throws d3_cfg_mod_exception
+ */
+ protected function main(Options $options)
+ {
+ if ($options->getOpt('version')) {
+ $oModule = oxNew(Module::class);
+ $oModule->load('d3_watermark');
+ $this->info($oModule->getModuleData()['version']);
+ }
+
+ switch ($options->getCmd()) {
+ case 'delete':
+ $this->startDeleting($options);
+ break;
+ case 'generate':
+ $this->startGenerating($options);
+ break;
+ case 'renew':
+ $this->startDeleting($options);
+ $this->startGenerating($options);
+ break;
+ default:
+ echo $options->help();
+ }
+ }
+
+ /**
+ * @param Options $options
+ *
+ * @throws DBALException
+ * @throws d3ShopCompatibilityAdapterException
+ * @throws d3_cfg_mod_exception
+ * @throws DatabaseConnectionException
+ * @throws DatabaseErrorException
+ * @throws StandardException
+ */
+ public function startDeleting(Options $options)
+ {
+ /** @var $oClrTmp d3clrtmp */
+ $oClrTmp = oxNew(d3clrtmp::class);
+ switch (trim(strtolower($options->getArgs()[0]))) {
+ case d3watermarkImageGenerator::PRODUCT:
+ $oClrTmp->clearGeneratedProductImgs();
+ $this->info('generated product images are deleted');
+ break;
+ case d3watermarkImageGenerator::CATEGORY:
+ $oClrTmp->clearGeneratedCategoryImgs();
+ $this->info('generated category images are deleted');
+ break;
+ case d3watermarkImageGenerator::MANUFACTURER:
+ $oClrTmp->clearGeneratedManufacturerImgs();
+ $this->info('generated manufacturer images are deleted');
+ break;
+ case d3watermarkImageGenerator::VENDOR:
+ $oClrTmp->clearGeneratedVendorImgs();
+ $this->info('generated vendor images are deleted');
+ break;
+ case d3watermarkImageGenerator::WRAPPING:
+ $oClrTmp->clearGeneratedWrappingImgs();
+ $this->info('generated wrapping images are deleted');
+ break;
+ case d3watermarkImageGenerator::ALL:
+ $oClrTmp->clearGeneratedAllImgs();
+ $this->info('all generated images are deleted');
+ break;
+ default:
+ $this->error('no valid image type specified, check argument "type"');
+ };
+ }
+
+ /**
+ * @param Options $options
+ *
+ * @throws DBALException
+ */
+ public function startGenerating(Options $options)
+ {
+ switch (trim(strtolower($options->getArgs()[0]))) {
+ case d3watermarkImageGenerator::PRODUCT:
+ case d3watermarkImageGenerator::CATEGORY:
+ case d3watermarkImageGenerator::MANUFACTURER:
+ case d3watermarkImageGenerator::VENDOR:
+ case d3watermarkImageGenerator::WRAPPING:
+ case d3watermarkImageGenerator::ALL:
+ $oWMImageGenerator = oxNew( d3watermarkImageGenerator::class, $options->getArgs()[0] );
+
+ $blBar = $this->canShowProgressBar( $options );
+
+ if ( $blBar ) {
+ $bar = new CliProgressBar( $oWMImageGenerator->getImagesListCount(), 0, "processing:" );
+ $bar->display();
+ }
+
+ for ( $i = 0; $i < $oWMImageGenerator->getImagesListCount(); $i ++ ) {
+ if ( $blBar ) {
+ $bar->progress( 1 );
+ }
+ $oWMImageGenerator->generateProductImagesRange( $i );
+ }
+ if ( $blBar ) {
+ $bar->end();
+ }
+
+ break;
+ default:
+ $this->error( 'no valid image type specified, check argument "type"' );
+ }
+ }
+
+ public function canShowProgressBar(Options $options)
+ {
+ return in_array(
+ strtolower($options->getOpt('loglevel')),
+ [
+ '',
+ 'info',
+ 'debug'
+ ]
+ );
+ }
+}
+
+$cli = new d3watermark();
+$cli->run();
\ No newline at end of file
diff --git a/src/public/.htaccess b/src/public/.htaccess
new file mode 100644
index 0000000..3b48aac
--- /dev/null
+++ b/src/public/.htaccess
@@ -0,0 +1,11 @@
+
+
+ # Apache 2.4
+ Require all granted
+
+
+ # Apache 2.2
+ order deny,allow
+ allow from all
+
+
\ No newline at end of file