diff options
| author | 2011-01-01 20:19:56 +0000 | |
|---|---|---|
| committer | 2011-01-01 20:19:56 +0000 | |
| commit | c601b5a27f74b16158adafe429faefbe573e64a2 (patch) | |
| tree | a3cde3206a45628f8ac86e8dfbdab70b20c3a831 /src/modules/addon/AddonFunctions.cpp | |
| parent | probable compilation fix for rijndaled/crypto++ (diff) | |
| download | KVIrc-c601b5a27f74b16158adafe429faefbe573e64a2.tar.gz KVIrc-c601b5a27f74b16158adafe429faefbe573e64a2.tar.bz2 KVIrc-c601b5a27f74b16158adafe429faefbe573e64a2.zip | |
The big rename for modules. Still some details remaining.
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@5284 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src/modules/addon/AddonFunctions.cpp')
| -rw-r--r-- | src/modules/addon/AddonFunctions.cpp | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/src/modules/addon/AddonFunctions.cpp b/src/modules/addon/AddonFunctions.cpp new file mode 100644 index 000000000..83641d90e --- /dev/null +++ b/src/modules/addon/AddonFunctions.cpp @@ -0,0 +1,272 @@ +//============================================================================= +// +// File : AddonFunctions.cpp +// Creation date : Fri 02 May 2008 17:36:07 by Elvio Basello +// +// This file is part of the KVIrc IRC Client distribution +// Copyright (C) 2008 Elvio Basello <hellvis69 at netsons dot org> +// +// 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 opinion) 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. If not, write to the Free Software Foundation, +// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +//============================================================================= + +#include "AddonFunctions.h" + +#include "KviPackageReader.h" +#include "KviLocale.h" +#include "KviMessageBox.h" +#include "KviApplication.h" +#include "KviHtmlDialog.h" +#include "KviIconManager.h" +#include "KviFileUtils.h" +#include "KviMiscUtils.h" +#include "kvi_sourcesdate.h" +#include "KviMainWindow.h" +#include "KviKvsScript.h" + +#include <QDir> + +#include <stdlib.h> + +namespace AddonFunctions +{ + bool notAValidAddonPackage(QString &szError) + { + szError = __tr2qs_ctx("The selected file does not seem to be a valid KVIrc addon package","addon"); + return false; + } + + bool installAddonPackage(const QString &szAddonPackageFileName,QString &szError,QWidget * pDialogParent) + { + KviPointerHashTable<QString,QString> * pInfoFields; + QString * pValue; + QString szErr; + QPixmap pix; + QByteArray * pByteArray; + bool bInstall; + KviHtmlDialogData hd; + + const char * check_fields[] = { "Name", "Version", "Author", "Description", "Date", "Application" }; + + // check if it is a valid addon file + KviPackageReader r; + if(!r.readHeader(szAddonPackageFileName)) + { + szErr = r.lastError(); + KviQString::sprintf(szError,__tr2qs_ctx("The selected file does not seem to be a valid KVIrc package: %Q","addon"),&szErr); + return false; + } + + pInfoFields = r.stringInfoFields(); + + pValue = pInfoFields->find("PackageType"); + + if(!pValue) + return notAValidAddonPackage(szError); + + if(!KviQString::equalCI(*pValue,"AddonPack")) + return notAValidAddonPackage(szError); + + pValue = pInfoFields->find("AddonPackVersion"); + + if(!pValue) + return notAValidAddonPackage(szError); + + // make sure the default fields exist + for(int i=0;i<6;i++) + { + pValue = pInfoFields->find(check_fields[i]); + if(!pValue) + return notAValidAddonPackage(szError); + } + + // ok.. it should be really valid at this point + // load its picture + pByteArray = r.binaryInfoFields()->find("Image"); + if(pByteArray) + pix.loadFromData(*pByteArray,0,0); + + if(pix.isNull()) + { + // load the default icon + pix = *(g_pIconManager->getBigIcon(KVI_BIGICON_ADDONS)); + } + + QString szPackageName; + QString szPackageVersion; + QString szPackageAuthor; + QString szPackageDescription; + QString szPackageDate; + QString szAddonPackVersion; + QString szPackageApplication; + + QString szAuthor = __tr2qs_ctx("Author","addon"); + QString szCreatedAt = __tr2qs_ctx("Created at","addon"); + QString szCreatedWith = __tr2qs_ctx("Created with","addon"); + + r.getStringInfoField("Name",szPackageName); + r.getStringInfoField("Version",szPackageVersion); + r.getStringInfoField("Author",szPackageAuthor); + r.getStringInfoField("Description",szPackageDescription); + r.getStringInfoField("Application",szPackageApplication); + r.getStringInfoField("Date",szPackageDate); + r.getStringInfoField("AddonPackVersion",szAddonPackVersion); + + QString szWarnings; + QString szTmp; + + bool bValid = true; + + if(szPackageName.isEmpty() || szPackageVersion.isEmpty() || szAddonPackVersion.isEmpty()) + bValid = false; + + if(KviMiscUtils::compareVersions(szAddonPackVersion,KVI_CURRENT_ADDONS_ENGINE_VERSION) < 0) + bValid = false; + + + if(!bValid) + { + szWarnings += "<p><center><font color=\"#ff0000\"><b>"; + szWarnings += __tr2qs_ctx("Warning: The addon might be incompatible with this version of KVIrc","addon"); + szWarnings += "</b></font></center></p>"; + } + + KviQString::sprintf(hd.szHtmlText, + "<html bgcolor=\"#ffffff\">" \ + "<body bgcolor=\"#ffffff\">" \ + "<p><center>" \ + "<h2>%Q %Q</h2>" \ + "</center></p>" \ + "<p><center>" \ + "<img src=\"addon_dialog_pack_image\">" \ + "</center></p>" \ + "<p><center>" \ + "<i>%Q</i>" \ + "</center></p>" \ + "<p><center>" \ + "%Q: <b>%Q</b><br>" \ + "%Q: <b>%Q</b><br>" \ + "</center></p>" \ + "<p><center>" \ + "<font color=\"#808080\">" \ + "%Q: %Q<br>" \ + "</font>" \ + "</center></p>" \ + "%Q" \ + "<br>" \ + "</body>" \ + "</html>", + &szPackageName, + &szPackageVersion, + &szPackageDescription, + &szAuthor, + &szPackageAuthor, + &szCreatedAt, + &szPackageDate, + &szCreatedWith, + &szPackageApplication, + &szWarnings + ); + + hd.addImageResource("addon_dialog_pack_image",pix); + hd.addHtmlResource("addon_dialog_main",hd.szHtmlText); + + QString beginCenter = "<center>"; + QString endCenter = "</center>"; + + hd.szCaption = __tr2qs_ctx("Install Addon Pack - KVIrc","addon"); + hd.szUpperLabelText = beginCenter + __tr2qs_ctx("You're about to install the following addon package","addon") + endCenter; + hd.szLowerLabelText = beginCenter + __tr2qs_ctx("Do you want to proceed with the installation ?","addon") + endCenter; + hd.szButton1Text = __tr2qs_ctx("Do Not Install","addon"); + hd.szButton2Text = __tr2qs_ctx("Yes, Proceed","addon"); + hd.iDefaultButton = 2; + hd.iCancelButton = 1; + hd.pixIcon = *(g_pIconManager->getSmallIcon(KVI_SMALLICON_ADDONS)); + hd.iMinimumWidth = 350; + hd.iMinimumHeight = 420; + hd.iFlags = KviHtmlDialogData::ForceMinimumSize; + + bInstall = KviHtmlDialog::display(pDialogParent,&hd) == 2; + + if(!bInstall) + return true; + + // Create a random extraction dir + QString szTmpPath, szUnpackPath; + QString szRandomDir = createRandomDir(); + + g_pApp->getLocalKvircDirectory(szTmpPath,KviApplication::Tmp); + KviQString::ensureLastCharIs(szTmpPath,QChar(KVI_PATH_SEPARATOR_CHAR)); + szUnpackPath = szTmpPath + szRandomDir; + QDir szTmpDir(szUnpackPath); + + // Check for dir existence + while(szTmpDir.exists()) + { + szRandomDir = createRandomDir(); + szUnpackPath = szTmpPath + szRandomDir; + szTmpDir = QDir(szUnpackPath); + } + + // Unpack addon package into the random tmp dir + if(!r.unpack(szAddonPackageFileName,szUnpackPath)) + { + szErr = r.lastError(); + KviQString::sprintf(szError,__tr2qs_ctx("Failed to unpack the selected file: %Q","addon"),&szErr); + return false; + } + + // Now we have all stuff in ~/.config/KVIrc/tmp/$rand + KviQString::escapeKvs(&szUnpackPath, KviQString::EscapeSpace); + if(!KviKvsScript::run(QString::fromAscii("parse %1/install.kvs").arg(szUnpackPath), g_pActiveWindow)) + { + // Parsing the script failed + // However, the user should already be notified via normal script output. + } + + if(!KviFileUtils::deleteDir(szUnpackPath)) + { + // FIXME: Just warn the user and assume success? + szErr = __tr2qs_ctx("One or more files can't be deleted","addon"); + KviQString::sprintf(szError,__tr2qs_ctx("Failed to unpack the selected file: %Q","addon"),&szErr); + return false; + } + + return true; + } + + QString createRandomDir() + { + QString szDirName; + char chars[] = { + 'A','B','C','D','E','F','G','H', + 'I','J','K','L','M','N','O','P', + 'Q','R','S','T','U','V','W','X', + 'Y','Z','a','b','c','d','e','f', + 'g','h','i','j','k','l','m','n', + 'o','p','q','r','s','t','u','v', + 'w','x','y','z','-','_','.' + }; + + // Generate dir name + for(int i=0;i<10;i++) + { + int n = rand() % sizeof(chars); + szDirName.append(chars[n]); + } + + return szDirName; + } +} |
