/**
  * @brief 특정 디렉토리를 복사
  **/
 function copyDir($source_dir, $target_dir, $filter = null, $type = null)
 {
     $source_dir = FileHandler::getRealPath($source_dir);
     $target_dir = FileHandler::getRealPath($target_dir);
     if (!is_dir($source_dir)) {
         return false;
     }
     // target이 없을땐 생성
     if (!file_exists($target_dir)) {
         FileHandler::makeDir($target_dir);
     }
     if (substr($source_dir, -1) != '/') {
         $source_dir .= '/';
     }
     if (substr($target_dir, -1) != '/') {
         $target_dir .= '/';
     }
     $oDir = dir($source_dir);
     while ($file = $oDir->read()) {
         if (substr($file, 0, 1) == '.') {
             continue;
         }
         if ($filter && preg_match($filter, $file)) {
             continue;
         }
         if (is_dir($source_dir . $file)) {
             FileHandler::copyDir($source_dir . $file, $target_dir . $file, $type);
         } else {
             if ($type == 'force') {
                 @unlink($target_dir . $file);
             } else {
                 if (!file_exists($target_dir . $file)) {
                     @copy($source_dir . $file, $target_dir . $file);
                 }
             }
         }
     }
 }
 /**
  * export user layout
  * @return void
  */
 function procLayoutAdminUserLayoutExport()
 {
     $layout_srl = Context::get('layout_srl');
     if (!$layout_srl) {
         return new Object('-1', 'msg_invalid_request');
     }
     require_once _XE_PATH_ . 'libs/tar.class.php';
     $oLayoutModel = getModel('layout');
     // Copy files to temp path
     $file_path = $oLayoutModel->getUserLayoutPath($layout_srl);
     $target_path = $oLayoutModel->getUserLayoutPath(0);
     FileHandler::copyDir($file_path, $target_path);
     // replace path and ini config
     $ini_config = $oLayoutModel->getUserLayoutIniConfig(0);
     $file_list = $oLayoutModel->getUserLayoutFileList($layout_srl);
     unset($file_list[2]);
     foreach ($file_list as $file) {
         if (strncasecmp('images', $file, 6) === 0) {
             continue;
         }
         // replace path
         $file = $target_path . $file;
         $content = FileHandler::readFile($file);
         $pattern = '/(http:\\/\\/[^ ]+)?(\\.\\/)?' . str_replace('/', '\\/', str_replace('./', '', $file_path)) . '/';
         if (basename($file) == 'faceoff.css' || basename($file) == 'layout.css') {
             $content = preg_replace($pattern, '../', $content);
         } else {
             $content = preg_replace($pattern, './', $content);
         }
         // replace ini config
         foreach ($ini_config as $key => $value) {
             $content = str_replace('{$layout_info->faceoff_ini_config[\'' . $key . '\']}', $value, $content);
         }
         FileHandler::writeFile($file, $content);
     }
     // make info.xml
     $info_file = $target_path . 'conf/info.xml';
     FileHandler::copyFile('./modules/layout/faceoff/conf/info.xml', $info_file);
     $content = FileHandler::readFile($info_file);
     $content = str_replace('type="faceoff"', '', $content);
     FileHandler::writeFile($info_file, $content);
     $file_list[] = 'conf/info.xml';
     // make css file
     $css_file = $target_path . 'css/layout.css';
     FileHandler::copyFile('./modules/layout/faceoff/css/layout.css', $css_file);
     $content = FileHandler::readFile('./modules/layout/tpl/css/widget.css');
     FileHandler::writeFile($css_file, "\n" . $content, 'a');
     $content = FileHandler::readFile($target_path . 'faceoff.css');
     FileHandler::writeFile($css_file, "\n" . $content, 'a');
     $content = FileHandler::readFile($target_path . 'layout.css');
     FileHandler::writeFile($css_file, "\n" . $content, 'a');
     // css load
     $content = FileHandler::readFile($target_path . 'layout.html');
     $content = "<load target=\"css/layout.css\" />\n" . $content;
     FileHandler::writeFile($target_path . 'layout.html', $content);
     unset($file_list[3]);
     unset($file_list[1]);
     $file_list[] = 'css/layout.css';
     // Compress the files
     $tar = new tar();
     $user_layout_path = FileHandler::getRealPath($oLayoutModel->getUserLayoutPath(0));
     chdir($user_layout_path);
     foreach ($file_list as $key => $file) {
         $tar->addFile($file);
     }
     $stream = $tar->toTarStream();
     $filename = 'faceoff_' . date('YmdHis') . '.tar';
     header("Cache-Control: ");
     header("Pragma: ");
     header("Content-Type: application/x-compressed");
     header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
     //            header("Content-Length: " .strlen($stream)); ?? why??
     header('Content-Disposition: attachment; filename="' . $filename . '"');
     header("Content-Transfer-Encoding: binary\n");
     echo $stream;
     // Close Context and then exit
     Context::close();
     // delete temp path
     FileHandler::removeDir($target_path);
     exit;
 }
 function initTextyle($site_srl)
 {
     $oCounterController =& getController('counter');
     $oDocumentController =& getController('document');
     $oCommentController =& getController('comment');
     $oTagController =& getController('tag');
     $oAddonController =& getController('addon');
     $oEditorController =& getController('editor');
     $oTrackbackController =& getController('trackback');
     $oModuleModel =& getModel('module');
     $oTextyleModel =& getModel('textyle');
     $oMemberModel =& getModel('member');
     $site_info = $oModuleModel->getSiteInfo($site_srl);
     $module_srl = $site_info->index_module_srl;
     $args->site_srl = $site_srl;
     $oTextyle = new TextyleInfo($module_srl);
     if ($oTextyle->module_srl != $module_srl) {
         return new Object(-1, 'msg_invalid_request');
     }
     $oCounterController->deleteSiteCounterLogs($args->site_srl);
     $oAddonController->removeAddonConfig($args->site_srl);
     $args->module_srl = $module_srl;
     $output = executeQuery('textyle.deleteTextyleFavorites', $args);
     $output = executeQuery('textyle.deleteTextyleTags', $args);
     $output = executeQuery('textyle.deleteTextyleVoteLogs', $args);
     $output = executeQuery('textyle.deleteTextyleMemos', $args);
     $output = executeQuery('textyle.deleteTextyleReferer', $args);
     $output = executeQuery('textyle.deleteTextyleApis', $args);
     $output = executeQuery('textyle.deleteTextyleGuestbook', $args);
     $output = executeQuery('textyle.deleteTextyleSupporters', $args);
     $output = executeQuery('textyle.deletePublishLogs', $args);
     FileHandler::removeFile(sprintf("./files/cache/textyle/textyle_deny/%d.php", $module_srl));
     FileHandler::removeDir($oTextyleModel->getTextylePath($module_srl));
     // delete document comment tag
     $output = $oDocumentController->triggerDeleteModuleDocuments($args);
     $output = $oCommentController->triggerDeleteModuleComments($args);
     $output = $oTagController->triggerDeleteModuleTags($args);
     $output = $oTrackbackController->triggerDeleteModuleTrackbacks($args);
     $args->module_srl = $args->module_srl * -1;
     $output = $oDocumentController->triggerDeleteModuleDocuments($args);
     $output = $oCommentController->triggerDeleteModuleComments($args);
     $output = $oTagController->triggerDeleteModuleTags($args);
     $args->module_srl = $args->module_srl * -1;
     // set category
     $obj->module_srl = $module_srl;
     $obj->title = Context::getLang('init_category_title');
     $oDocumentController->insertCategory($obj);
     FileHandler::copyDir($this->module_path . 'skins/' . $this->skin, $oTextyleModel->getTextylePath($module_srl));
     $langType = Context::getLangType();
     $file = sprintf('%ssample/%s.html', $this->module_path, $langType);
     if (!file_exists(FileHandler::getRealPath($file))) {
         $file = sprintf('%ssample/ko.html', $this->module_path);
     }
     $member_info = $oMemberModel->getMemberInfoByEmailAddress($oTextyle->getUserId());
     $doc->module_srl = $module_srl;
     $doc->title = Context::getLang('sample_title');
     $doc->tags = Context::getLang('sample_tags');
     $doc->content = FileHandler::readFile($file);
     $doc->member_srl = $member_info->member_srl;
     $doc->user_id = $member_info->user_id;
     $doc->user_name = $member_info->user_name;
     $doc->nick_name = $member_info->nick_name;
     $doc->email_address = $member_info->email_address;
     $doc->homepage = $member_info->homepage;
     $output = $oDocumentController->insertDocument($doc, true);
     return new Object(1, 'success_textyle_init');
 }
 /**
  * reset skin
  * @param $module_srl
  * @param null $skin
  */
 public function resetSkin($module_srl,$skin=NULL){
     if(!$skin) $skin = $this->skin;
     if(!file_exists($this->module_path.'skins/'.$skin)) $skin = $this->skin;
     $oShopModel = $this->model;
     FileHandler::removeDir($oShopModel->getShopPath($module_srl));
     FileHandler::copyDir($this->module_path.'skins/'.$skin, $oShopModel->getShopPath($module_srl));
 }
 function resetSkin($module_srl, $skin = null)
 {
     if (!$skin) {
         $skin = $this->skin;
     }
     if (!file_exists($this->module_path . 'skins/' . $skin)) {
         $skin = $this->skin;
     }
     $oTextyleModel =& getModel('textyle');
     FileHandler::removeDir($oTextyleModel->getTextylePath($module_srl));
     FileHandler::copyDir($this->module_path . 'skins/' . $skin, $oTextyleModel->getTextylePath($module_srl));
 }