Integrated OpenCandy (as an option; secret key needed).

This commit is contained in:
William Kendrick 2011-06-17 01:37:53 +00:00
parent c263d3a6bc
commit 8cef9db16a
6 changed files with 1588 additions and 384 deletions

BIN
win32/OCSetupHlp.dll Normal file

Binary file not shown.

719
win32/OCSetupHlp.iss Normal file
View file

@ -0,0 +1,719 @@
//
// OCSetupHlp.iss
// --------------
//
// OpenCandy Helper Include File
//
// This file defines functions and procedures that need to
// be called from your main installer script in order to
// initialize and setup OpenCandy.
//
// Please consult the accompanying SDK documentation for
// integration details and contact partner support for
// assistance with any advanced integration needs.
//
// IMPORTANT:
// ----------
// Publishers should have no need to modify the content
// of this file. If you are modifying this file for any
// reason other than as directed by partner support
// you are probably making a mistake. Please contact
// partner support instead.
//
// Copyright (c) 2008 - 2011 OpenCandy, Inc.
//
[Code]
//--------------------------------
// OpenCandy types
//--------------------------------
#ifdef UNICODE
type OCWString = String;
type OCAString = AnsiString;
type OCTString = OCWString;
#else
type OCAString = String;
type OCTString = OCAString;
#endif
//--------------------------------
// OpenCandy definitions
//--------------------------------
// Size of strings (including terminating character)
#define OC_STR_CHARS 1024
// Values used with OCInit2A(), OCInit2W() APIs
#define OC_INIT_SUCCESS 0
#define OC_INIT_MODE_NORMAL 0
#define OC_INIT_MODE_REMNANT 1
// Values used with OCGetNoCandy() API
#define OC_CANDY_ENABLED 0
#define OC_CANDY_DISABLED 1
// Offer types returned by OCGetOfferType() API
# define OC_OFFER_TYPE_NORMAL 1
# define OC_OFFER_TYPE_EMBEDDED 2
// Values returned by OCGetBannerInfo() API
#define OC_OFFER_BANNER_FOUNDNEITHER 0
#define OC_OFFER_BANNER_FOUNDTITLE 1
#define OC_OFFER_BANNER_FOUNDDESCRIPTION 2
#define OC_OFFER_BANNER_FOUNDBOTH 3
// User choice indicators returned by OCGetOfferState() API
#define OC_OFFER_CHOICE_ACCEPTED 1
#define OC_OFFER_CHOICE_DECLINED 0
#define OC_OFFER_CHOICE_NOCHOICE -1
// Values used with OCCanLeaveOfferPage() API
#define OC_OFFER_LEAVEPAGE_ALLOWED 1
#define OC_OFFER_LEAVEPAGE_DISALLOWED 0
// Values used for OCGetAsyncOfferStatus() API
#define OC_OFFER_STATUS_CANOFFER_READY 0
#define OC_OFFER_STATUS_CANOFFER_NOTREADY 1
#define OC_OFFER_STATUS_QUERYING_NOTREADY 2
#define OC_OFFER_STATUS_NOOFFERSAVAILABLE 3
// Values returned by OCRunDialog() API
#define OC_OFFER_RUNDIALOG_FAILURE -1
// Values returned by OCLoadOpenCandyDLL() API
#define OC_LOADOCDLL_FAILURE 0
// Values used with LogDevModeMessage() API
#define OC_DEVMSG_ERROR_TRUE 1
#define OC_DEVMSG_ERROR_FALSE 0
// Values used in the sample installer script
//
// IMPORTANT:
// Do not modify these definitions or disable the warnings below.
// If you see warnings when you compile your script you must
// modify the values you set where you !insertmacro OpenCandyInit
// (i.e. in your .iss file) before releasing your installer publicly.
#define OC_SAMPLE_PUBLISHERNAME "Open Candy Sample"
#define OC_SAMPLE_KEY "748ad6d80864338c9c03b664839d8161"
#define OC_SAMPLE_SECRET "dfb3a60d6bfdb55c50e1ef53249f1198"
// Compile-time checks and defaults
#if OC_STR_MY_PRODUCT_NAME == OC_SAMPLE_PUBLISHERNAME
#pragma warning "Do not forget to change the product name from '" + OC_SAMPLE_PUBLISHERNAME + "' to your company's product name before releasing this installer."
#endif
#if OC_STR_KEY == OC_SAMPLE_KEY
#pragma warning "Do not forget to change the sample key '" + OC_SAMPLE_KEY + "' to your company's product key before releasing this installer."
#endif
#if OC_STR_SECRET == OC_SAMPLE_SECRET
#pragma warning "Do not forget to change the sample secret '" + OC_SAMPLE_SECRET + "' to your company's product secret before releasing this installer."
#endif
#if Pos(LowerCase("\OCSetupHlp.dll"),LowerCase(OC_OCSETUPHLP_FILE_PATH)) == 0
#pragma error "The definition OC_OCSETUPHLP_FILE_PATH does not use ""OCSetupHlp.dll"" for the file part."
#endif
// OC_MAX_INIT_TIME is the maximum time in milliseconds that OCInit may block when fetching offers.
// Note that under normal network conditions OCInit may return sooner. Setting this value too low
// may reduce offer rate. Values of 5000 or greater are recommended. If you intend to override this
// default do so by defining it in your .iss file before #include'ing this header. Be certain to
// make OpenCandy partner support aware of any override you apply because this can affect your metrics.
#ifndef OC_MAX_INIT_TIME
#define OC_MAX_INIT_TIME 8000
#endif
// OC_INSERT_PAGE_AFTER is the PageID after which the OpenCandy offer screen should be inserted.
// If you intend to override this default do so by defining it in your .iss file before #include'ing this header.
#ifndef OC_INSERT_PAGE_AFTER
#define OC_INSERT_PAGE_AFTER "wpSelectTasks"
#endif
//--------------------------------
// OpenCandy global variables
//--------------------------------
// IMPORTANT:
// Never modify or reference these directly, they are used
// completely internally to this helper script.
var
gl_OC_bAttached:Boolean; // Is the OpenCandy offer window attached?
gl_OC_objOCOfferPage: TWizardPage; // Handle to the offer page wizard page
gl_OC_bHasBeenInitialized: Boolean ; // Has the OpenCandy client been initialized?
gl_OC_bNoCandy: Boolean; // Is OpenCandy disabled?
gl_OC_bUseOfferPage: Boolean; // Should shown an offer?
gl_OC_bHasReachedOCPage: Boolean; // Has the user reached the OpenCandy offer page?
gl_OC_bProductInstallSuccess: Boolean; // Has the publisher product install completed succesfully?
gl_OC_bHasAdjustedPage: Boolean; // The the offer page window been adjusted?
//-----------------------------------------
// OpenCandy external procedure definitions
//-----------------------------------------
procedure _OCDLL_OCStartDLMgr2Download();
external 'OCPRD379StartDLMgr2Download@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCLoadOpenCandyDLL():Integer;
external 'OCPRD379LoadOpenCandyDLL@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCInit(szPubId, szProdId, szSecret, szInstallLang:OCAString; bAsyncMode:Boolean; iMaxWait, iRemnant:Integer):Integer;
external 'OCPRD379Init2A@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
#ifdef UNICODE
function _OCDLL_OCInitW(wszPubId, wszProdId, wszSecret, wszInstallLang:OCWString; bAsyncMode:Boolean; iMaxWait, iRemnant:Integer):Integer;
external 'OCPRD379Init2W@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
#endif
function _OCDLL_OCGetBannerInfo(szTitle, szDesc:OCAString):Integer;
external 'OCPRD379GetBannerInfo@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
#ifdef UNICODE
function _OCDLL_OCGetBannerInfoW(wszTitle, wszDesc:OCWString):Integer;
external 'OCPRD379GetBannerInfoW@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
#endif
function _OCDLL_OCRunDialog(iHwnd:Integer): Integer;
external 'OCPRD379RunDialog@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCAdjustPage(iHwnd, iX, iY, iW, iH:Integer):Integer;
external 'OCPRD379InnoAdjust@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCRestorePage(iHwnd:Integer):Integer;
external 'OCPRD379InnoRestore@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCGetOfferState():Integer;
external 'OCPRD379GetOfferState@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCGetOfferType():Integer;
external 'OCPRD379GetOfferType@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCPrepareDownload():Integer;
external 'OCPRD379PrepareDownload@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCShutdown():Integer;
external 'OCPRD379Shutdown@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCDetach():Integer;
external 'OCPRD379Detach@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCSignalProductInstalled():Integer;
external 'OCPRD379SignalProductInstalled@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCSignalProductFailed():Integer;
external 'OCPRD379SignalProductFailed@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCGetAsyncOfferStatus(bWantToShowOffer:Boolean):Integer;
external 'OCPRD379GetAsyncOfferStatus@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCCanLeaveOfferPage():Integer;
external 'OCPRD379CanLeaveOfferPage@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
function _OCDLL_OCSetCmdLineValues(szValue:OCAString):Integer;
external 'OCPRD379SetCmdLineValues@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
#ifdef UNICODE
function _OCDLL_OCSetCmdLineValuesW(wszValue:OCWString):Integer;
external 'OCPRD379SetCmdLineValuesW@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
#endif
function _OCDLL_OCGetNoCandy():Integer;
external 'OCPRD379GetNoCandy@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
procedure _OCDLL_SetOCOfferEnabled(bEnabled:Boolean);
external 'OCPRD379SetOCOfferEnabled@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
procedure _OCDLL_LogDevModeMessage(szMessage:OCAString; iError, iFaqID:Integer);
external 'OCPRD379LogDevModeMessage@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
#ifdef UNICODE
procedure _OCDLL_LogDevModeMessageW(wszMessage:OCWString; iError, iFaqID:Integer);
external 'OCPRD379LogDevModeMessageW@files:OCSetupHlp.dll cdecl loadwithalteredsearchpath delayload';
#endif
//-------------------------------------------
// OpenCandy runtime functions and procedures
//-------------------------------------------
//
// _OpenCandyDevModeMsg
// --------------------
// This function is internal to this helper script. Do not
// call if from your own code.
//
// The function code is intentionally unguarded with respect
// to gl_OC_bHasBeenInitialized and gl_OC_bNoCandy. Calling
// code is responsible for ensuring appropriate conditions.
//
// Parameters:
//
// tszMessage : Message to display
// bIsError : True if the message represents an error
// iFaqID : ID of the FAQ associated with the message, or 0 if there is no FAQ associated
//
// Usage:
//
// _OpenCandyDevModeMsg('This is an error with associated FAQ #500', true, 500);
//
procedure _OpenCandyDevModeMsg(tszMessage: OCTString; bIsError: Boolean; iFaqID: Integer);
var
iError:Integer;
begin
if bIsError then
begin
iError := {#OC_DEVMSG_ERROR_TRUE};
tszMessage := '{\rtf1 {\colortbl;\red0\green0\blue0;\red255\green0\blue0;}\cf2Status ERROR! \cf1' + tszMessage + '\par}';
end
else
iError := {#OC_DEVMSG_ERROR_FALSE};
#ifdef UNICODE
_OCDLL_LogDevModeMessageW(tszMessage, iError, iFaqID);
#else
_OCDLL_LogDevModeMessage(tszMessage, iError, iFaqID);
#endif
end;
//
// _OCEnabledAndReady
// ------------------
// This function is internal to this helper script. Do not
// call if from your own code.
//
function _OCEnabledAndReady(): Boolean;
begin
Result := gl_OC_bHasBeenInitialized and not gl_OC_bNoCandy;
end;
//
// _OpenCandyInitInternal
// ----------------------
// This procedure is internal to this helper script. Do not
// call if from your own code. Instead see OpenCandyInit
// and OpenCandyAsyncInit.
//
procedure _OpenCandyInitInternal(tszPublisher, tszKey, tszSecret, tszLanguage:OCTString; bUseAsyncMode: Boolean; iInitMode:Integer);
var
i:Integer;
iRes:Integer;
tszDesc: OCTString;
tszTitle: OCTString;
begin
gl_OC_bAttached := false;
gl_OC_bHasBeenInitialized := false;
gl_OC_bNoCandy := false;
gl_OC_bUseOfferPage := false;
gl_OC_bHasReachedOCPage := false;
gl_OC_bProductInstallSuccess := false;
gl_OC_bHasAdjustedPage := false;
// Load OpenCandy SDK DLL
try
iRes := _OCDLL_OCLoadOpenCandyDLL();
except
iRes := {#OC_LOADOCDLL_FAILURE};
end;
if {#OC_LOADOCDLL_FAILURE} = iRes then
gl_OC_bNoCandy := True
else
begin
// Handle command line options and silent installations
for i := 0 to ParamCount() do
begin
#ifdef UNICODE
_OCDLL_OCSetCmdLineValuesW(ParamStr(i));
#else
_OCDLL_OCSetCmdLineValues(ParamStr(i));
#endif
// OpenCandy is disabled during a silent installation
if WizardSilent() then
#ifdef UNICODE
_OCDLL_OCSetCmdLineValuesW('/NOCANDY');
#else
_OCDLL_OCSetCmdLineValues('/NOCANDY');
#endif
end;
gl_OC_bNoCandy := {#OC_CANDY_DISABLED} = _OCDLL_OCGetNoCandy();
if not gl_OC_bNoCandy then
begin
#ifdef UNICODE
if {#OC_INIT_SUCCESS} = _OCDLL_OCInitW(tszPublisher, tszKey, tszSecret, tszLanguage, bUseAsyncMode, {#OC_MAX_INIT_TIME}, iInitMode) then
#else
if {#OC_INIT_SUCCESS} = _OCDLL_OCInit(tszPublisher, tszKey, tszSecret, tszLanguage, bUseAsyncMode, {#OC_MAX_INIT_TIME}, iInitMode) then
#endif
begin
gl_OC_bHasBeenInitialized := true;
tszTitle := StringOfChar(' ',{#OC_STR_CHARS});
tszDesc := StringOfChar(' ',{#OC_STR_CHARS});
#ifdef UNICODE
case _OCDLL_OCGetBannerInfoW(tszTitle, tszDesc) of
#else
case _OCDLL_OCGetBannerInfo(tszTitle, tszDesc) of
#endif
{#OC_OFFER_BANNER_FOUNDTITLE}: tszDesc := '';
{#OC_OFFER_BANNER_FOUNDDESCRIPTION}: tszTitle := '';
{#OC_OFFER_BANNER_FOUNDNEITHER}:
begin
tszTitle := '';
tszDesc := '';
end;
end;
gl_OC_objOCOfferPage := CreateCustomPage({#OC_INSERT_PAGE_AFTER}, tszTitle, tszDesc);
end;
end;
end;
end;
//
// OpenCandyInit (Deprecated) / OpenCandyAsyncInit
// -----------------------------------------------
// Performs initialization of the OpenCandy DLL
// and checks for offers to present.
//
// Parameters:
//
// tszPublisher : Your publisher name (will be provided by OpenCandy)
// tszKey : Your product key (will be provided by OpenCandy)
// tszSecret : Your product secret (will be provided by OpenCandy)
// tszLanguage : The installation language as an ISO 639-1 Alpha-2 Code
// iInitMode : The operating mode. Pass OC_INIT_MODE_NORMAL for normal operation
// or OC_INIT_MODE_REMNANT if OpenCandy should not show offers. Do not
// use iInitMode to handle /NOCANDY, this is done automatically for you.
//
// Usage (Using sample values for internal testing purposes only):
//
// procedure InitializeWizard;
// var
// OCtszInstallerLanguage: OCTString;
// begin
// // Translate language from the value of the "Name"
// // parameter assigned in the "[Languages]" section
// // into ISO 639-1 Alpha-2 codes for the OpenCandy API
// OCtszInstallerLanguage := ActiveLanguage();
// if(OCtszInstallerLanguage = 'default') then
// OCtszInstallerLanguage := 'en';
// OpenCandyAsyncInit('{#OC_STR_MY_PRODUCT_NAME}', '{#OC_STR_KEY}', '{#OC_STR_SECRET}', OCtszInstallerLanguage, {#OC_INIT_MODE_NORMAL});
// end;
//
procedure OpenCandyAsyncInit(tszPublisher, tszKey, tszSecret, tszLanguage:OCTString; iInitMode:Integer);
begin
if not (gl_OC_bNoCandy or gl_OC_bHasBeenInitialized) then
_OpenCandyInitInternal(tszPublisher, tszKey, tszSecret, tszLanguage, true, iInitMode);
end;
procedure OpenCandyInit(tszPublisher, tszKey, tszSecret, tszLanguage:OCTString; iInitMode:Integer);
begin
if not (gl_OC_bNoCandy or gl_OC_bHasBeenInitialized) then
_OpenCandyInitInternal(tszPublisher, tszKey, tszSecret, tszLanguage, false, iInitMode);
end;
//
// GetOCOfferStatus
// -----------------
// Allows you to determine if an offer is currently available. This is
// done automatically for you before the offer screen is shown. Typically
// you do not need to call this function from your own code directly.
//
// The offer status is placed on the stack and may be one of:
// {#OC_OFFER_STATUS_CANOFFER_READY} - An OpenCandy offer is available and ready to be shown
// {#OC_OFFER_STATUS_CANOFFER_NOTREADY} - An offer is available but is not yet ready to be shown
// {#OC_OFFER_STATUS_QUERYING_NOTREADY} - The remote API is still being queried for offers
// {#OC_OFFER_STATUS_NOOFFERSAVAILABLE} - No offers are available
//
// When calling this function you must indicate whether the information returned
// will be used to decide whether the OpenCandy offer screen will be shown, e.g.
// if the information may result in a call to SetOCOfferEnabled. This helps
// to optimize future OpenCandy SDKs for better performance with your product.
//
// Usage:
//
// // Test if OpenCandy is ready to show an offer.
// // Indicate the result is informative only and does not directly
// // determine whether offers from OpenCandy are enabled.
// if {#OC_OFFER_STATUS_CANOFFER_READY} = GetOCOfferStatus(false) then
//
Function GetOCOfferStatus(bDeterminesOfferEnabled: Boolean): Integer;
begin
if _OCEnabledAndReady() then
Result := _OCDLL_OCGetAsyncOfferStatus(bDeterminesOfferEnabled)
else
Result := {#OC_OFFER_STATUS_NOOFFERSAVAILABLE};
end;
//
// SetOCOfferEnabled
// -----------------
// Allows you to disable the OpenCandy offer screen easily from your
// installer code. Note that this is not the recommended method - you
// ought to determine during initialization whether OpenCandy should be
// disabled and specify an appropriate mode when calling OpenCandyInit
// or OpenCandyAsyncInit in that case. If you must use this method please
// be sure to inform the OpenCandy partner support team. Never directly
// place logical conditions around other OpenCandy functions and macros because
// this can have unforseen consequences. You should call this procedure only
// after calling OpenCandyInit / OpenCandyAsyncInit.
//
// Usage:
//
// // This turns off offers from the OpenCandy network
// SetOCOfferEnabled(false);
//
procedure SetOCOfferEnabled(bEnabled: Boolean);
begin
if _OCEnabledAndReady() then
_OCDLL_SetOCOfferEnabled(bEnabled);
end;
//
// OpenCandyShouldSkipPage()
// -------------------------
//
// This function needs to be called from the ShouldSkipPage Inno script
// event function so that Inno Setup can determine whether the OpenCandy
// offer page should be displayed. The function returns true if the
// current page is the OpenCandy offer page and no offer is to be
// presented.
//
// Usage:
//
// function ShouldSkipPage(PageID: Integer): Boolean;
// begin
// Result := false; // Don't skip pages by default
//
//
// if OpenCandyShouldSkipPage(PageID) then
// Result := true;
// end;
//
function OpenCandyShouldSkipPage(CurPageID: Integer) : Boolean;
begin
Result := false;
if _OCEnabledAndReady() then
if CurPageID = gl_OC_objOCOfferPage.ID then
begin
if (not gl_OC_bUseOfferPage) and (not gl_OC_bHasReachedOCPage) then
gl_OC_bUseOfferPage := {#OC_OFFER_STATUS_CANOFFER_READY} = _OCDLL_OCGetAsyncOfferStatus(true);
gl_OC_bHasReachedOCPage := true;
Result := not gl_OC_bUseOfferPage;
end;
end;
//
// OpenCandyCurPageChanged()
// -------------------------
// This function needs to be called from CurPageChanged() Inno script
// event function so that the OpenCandy offer page is displayed correctly.
//
// Usage:
//
// procedure CurPageChanged(CurPageID: Integer);
// begin
// OpenCandyCurPageChanged(CurPageID);
// end;
//
procedure OpenCandyCurPageChanged(CurPageID: Integer);
begin
if _OCEnabledAndReady() and gl_OC_bUseOfferPage then
begin
if (CurPageID <> gl_OC_objOCOfferPage.ID) and gl_OC_bAttached then
begin
_OCDLL_OCDetach();
gl_OC_bAttached := false;
end;
if (CurPageID = gl_OC_objOCOfferPage.ID) and not gl_OC_bAttached then
begin
_OCDLL_OCAdjustPage(gl_OC_objOCOfferPage.Surface.Handle,8,60,480,250);
if {#OC_OFFER_RUNDIALOG_FAILURE} <> _OCDLL_OCRunDialog(gl_OC_objOCOfferPage.Surface.Handle) then
gl_OC_bAttached := true
else
gl_OC_bUseOfferPage := false;
end;
end;
end;
//
// OpenCandyNextButtonClick()
// --------------------------
// This function needs to be called be called from the NextButtonClick()
// Inno script event function so that Inno Setup does not allow an end user
// to proceed past the OpenCandy offer screen in the event that the user
// must make a selection and hasn't yet done so. The function returns false
// if the user should not be allowed to proceed.
//
// Usage:
//
// function NextButtonClick(CurPageID: Integer): Boolean;
// begin
// Result := true; // Allow action by default
// if not OpenCandyNextButtonClick(CurPageID) then
// Result := false;
// end;
//
function OpenCandyNextButtonClick(CurPageID: Integer): Boolean;
begin
Result := true;
if _OCEnabledAndReady() and gl_OC_bUseOfferPage and (CurPageID = gl_OC_objOCOfferPage.ID) then
begin
// user must make a selection
if {#OC_OFFER_LEAVEPAGE_DISALLOWED} = _OCDLL_OCCanLeaveOfferPage() then
Result := false
else
begin
_OCDLL_OCRestorePage(gl_OC_objOCOfferPage.Surface.Handle);
Result := true;
end;
end;
end;
//
// OpenCandyBackButtonClick()
// --------------------------
// This function should be called from BackButtonClick() Inno script
// event function. It restores the layout of the installer window after
// an OpenCandy offer page has been displayed.
//
// Usage:
//
// function BackButtonClick(CurPageID: Integer): Boolean;
// begin
// Result := true; // Allow action by default
// OpenCandyBackButtonClick(CurPageID);
// end;
//
procedure OpenCandyBackButtonClick(CurPageID: Integer);
begin
if _OCEnabledAndReady() and gl_OC_bUseOfferPage and (CurPageID = gl_OC_objOCOfferPage.ID) then
_OCDLL_OCRestorePage(gl_OC_objOCOfferPage.Surface.Handle);
end;
//
// _OpenCandyExecOfferInternal()
// -----------------------------
// This procedure is internal to this helper script. Do not
// call if from your own code.
//
procedure _OpenCandyExecOfferInternal();
begin
_OCDLL_OCPrepareDownload();
if _OCDLL_OCGetOfferState() = {#OC_OFFER_CHOICE_ACCEPTED} then
_OCDLL_OCStartDLMgr2Download();
end;
//
// OpenCandyCurStepChanged()
// -------------------------
// This should be called from CurStepChanged() Inno script event function.
// It handles necesary operations at the various different stages of the setup,
// such as installing any offer the user may have accepted.
//
// Usage:
//
// procedure CurStepChanged(CurStep: TSetupStep);
// begin
// OpenCandyCurStepChanged(CurStep);
// end;
//
procedure OpenCandyCurStepChanged(CurStep: TSetupStep);
begin
if _OCEnabledAndReady() then
begin
// ssInstall is just before the product installation starts
if (CurStep = ssInstall) and gl_OC_bUseOfferPage then
if {#OC_OFFER_TYPE_EMBEDDED} = _OCDLL_OCGetOfferType() then
_OpenCandyExecOfferInternal();
// ssDone is just before Setup terminates after a successful install
if CurStep = ssDone then
begin
if gl_OC_bUseOfferPage and ({#OC_OFFER_TYPE_NORMAL} = _OCDLL_OCGetOfferType()) then
_OpenCandyExecOfferInternal();
gl_OC_bProductInstallSuccess := true;
_OCDLL_OCSignalProductInstalled();
end;
end;
end;
//
// OpenCandyDeinitializeSetup()
// ----------------------------
// This should be called from DeinitializeSetup() Inno script event function.
// It signals product installation success or failure, and cleans up the
// OpenCandy library.
//
// Usage:
// procedure DeinitializeSetup();
// begin
// OpenCandyDeinitializeSetup();
// end;
//
procedure OpenCandyDeinitializeSetup();
begin
if _OCEnabledAndReady() then
begin
if not gl_OC_bProductInstallSuccess then
_OCDLL_OCSignalProductFailed();
if gl_OC_bUseOfferPage then
begin
if gl_OC_bAttached then
begin
_OCDLL_OCDetach();
gl_OC_bAttached := false;
end;
_OCDLL_OCShutdown();
end;
end;
end;
//---------------------------------------------------------------------------//
// END of OpenCandy Helper Include file //
//---------------------------------------------------------------------------//

View file

@ -0,0 +1,2 @@
#define OpenCandy 1
#include "tuxpaint.iss"

View file

@ -1,383 +1,483 @@
;
; This script needs the InnoSetup PreProcessor (ISPP) to compile correctly.
; I downloaded a combined 'QuickStart Pack' from here:
; http://www.jrsoftware.org/isdl.php#qsp
;
; The version string is extracted from the executable.
;
#define PublisherName "New Breed Software"
#define PublisherURL "{code:MyPublisherURL}"
#define AppName "Tux Paint"
#define AppDirName "TuxPaint"
#define AppPrefix "tuxpaint"
#define AppRegKey AppDirName
#define AppRegValue "Install_Dir"
#define AppRegVersion "Version"
#define AppGroupName AppName
#define AppExe AppPrefix+".exe"
#define AppConfigName AppName+" Config"
#define AppConfigExe AppPrefix+"-config.exe"
#define AppReadme "{code:MyReadme}"
#define AppLicence "{code:MyLicence}"
#define BdistDir ".\bdist"
#define AppVersion GetStringFileInfo(BdistDir+"\"+AppExe, "FileVersion")
[Setup]
AppName={#AppName}
AppVerName={#AppName} {#AppVersion}
AppPublisher={#PublisherName}
AppPublisherURL={#PublisherURL}
AppSupportURL={#PublisherURL}
AppUpdatesURL={#PublisherURL}
DefaultDirName={pf}\{#AppDirName}
DefaultGroupName={#AppGroupName}
LicenseFile={#BdistDir}\docs\COPYING.txt
OutputDir=.\
OutputBaseFilename={#AppPrefix}-{#AppVersion}-win32-installer
SetupIconFile={#BdistDir}\data\images\tuxpaint-installer.ico
Compression=lzma
SolidCompression=yes
[Languages]
Name: "eng"; MessagesFile: "compiler:Default.isl"
Name: "bra"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl"; LicenseFile: {#BdistDir}\docs\pt_br\COPYING_pt_BR.txt;
Name: "cat"; MessagesFile: "compiler:Languages\Catalan.isl"; LicenseFile: {#BdistDir}\docs\ca\COPYING.txt;
Name: "cze"; MessagesFile: "compiler:Languages\Czech.isl"; LicenseFile: {#BdistDir}\docs\cs\COPYING.txt;
Name: "dan"; MessagesFile: "compiler:Languages\Danish.isl"; LicenseFile: {#BdistDir}\docs\da\COPYING.txt;
Name: "dut"; MessagesFile: "compiler:Languages\Dutch.isl"; LicenseFile: {#BdistDir}\docs\nl\COPYING_nl.txt;
Name: "fre"; MessagesFile: "compiler:Languages\French.isl"; LicenseFile: {#BdistDir}\docs\fr\COPIER.txt;
Name: "ger"; MessagesFile: "compiler:Languages\German.isl"; LicenseFile: {#BdistDir}\docs\de\KOPIE.txt;
Name: "hun"; MessagesFile: "compiler:Languages\Hungarian.isl"
Name: "ita"; MessagesFile: "compiler:Languages\Italian.isl"; LicenseFile: {#BdistDir}\docs\it\COPIATURA.txt;
Name: "nor"; MessagesFile: "compiler:Languages\Norwegian.isl"
Name: "pol"; MessagesFile: "compiler:Languages\Polish.isl"; LicenseFile: {#BdistDir}\docs\pl\LICENCJA-GNU.txt;
Name: "por"; MessagesFile: "compiler:Languages\Portuguese.isl"
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "slo"; MessagesFile: "compiler:Languages\Slovenian.isl"
Name: "esp"; MessagesFile: "compiler:Languages\Spanish.isl"; LicenseFile: {#BdistDir}\docs\es\COPIADO.txt;
; Additional, Candidate official translations
Name: "chs"; MessagesFile: "compiler:Languages\ChineseSimp-12-5.1.11.isl"
; Additional, Unofficial translations
Name: "gal"; MessagesFile: "compiler:Languages\Galician-2-5.1.11.isl"
Name: "cht"; MessagesFile: "compiler:Languages\ChineseTrad-2-5.1.11.isl"
Name: "jpn"; MessagesFile: "compiler:Languages\Japanese-5-5.1.11.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}";
[Files]
Source: "{#BdistDir}\*.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#BdistDir}\*.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#BdistDir}\data\*"; DestDir: "{app}\data"; Excludes: "CVS"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\docs\*"; DestDir: "{app}\docs"; Excludes: "CVS,Makefile,*~"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\etc\*"; DestDir: "{app}\etc"; Flags: skipifsourcedoesntexist ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\lib\*"; DestDir: "{app}\lib"; Flags: skipifsourcedoesntexist ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\im\*"; DestDir: "{app}\im"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\plugins\*"; DestDir: "{app}\plugins"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\locale\*"; DestDir: "{app}\locale"; Excludes: "CVS"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\..\libdocs\*"; DestDir: "{app}\docs\libdocs"; Excludes: "CVS,Makefile,*~"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[INI]
Filename: "{code:MyGroupDir}\{groupname}\{cm:ProgramOnTheWeb,{#AppName}}.url"; Section: "InternetShortcut"; Key: "URL"; String: "{#PublisherURL}"
[Icons]
Name: "{code:MyGroupDir}\{groupname}\Configure {#AppName}"; Filename: "{app}\{#AppConfigExe}"; Comment: "{#AppConfigName}"
Name: "{code:MyGroupDir}\{groupname}\{#AppName} (Full Screen)"; Filename: "{app}\{#AppExe}"; Parameters: "--fullscreen"; Comment: "Start {#AppName} in Fullscreen mode"
Name: "{code:MyGroupDir}\{groupname}\{#AppName} (Windowed)"; Filename: "{app}\{#AppExe}"; Parameters: "--windowed"; Comment: "Start {#AppName} in a Window"
Name: "{code:MyGroupDir}\{groupname}\Readme"; Filename: "{app}\{#AppReadme}"; Comment: "View ReadMe"
Name: "{code:MyGroupDir}\{groupname}\Licence"; Filename: "{app}\{#AppLicence}"; Comment: "View License"
Name: "{code:MyGroupDir}\{groupname}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"; IconFilename: "{app}\data\images\tuxpaint-installer.ico"; Comment: "Remove {#AppName}"
Name: "{code:MyDesktopDir}\{#AppName}"; Filename: "{app}\{#AppExe}"; Tasks: desktopicon
[Registry]
Root: HKLM; Subkey: "SOFTWARE\{#AppRegKey}"; Flags: uninsdeletekey; ValueName: "{#AppRegValue}"; ValueType: string; ValueData: "{app}"; Check: AllUsers;
Root: HKCU; Subkey: "SOFTWARE\{#AppRegKey}"; Flags: uninsdeletekey; ValueName: "{#AppRegValue}"; ValueType: string; ValueData: "{app}"; Check: ThisUserOnly;
Root: HKLM; Subkey: "SOFTWARE\{#AppRegKey}"; Flags: uninsdeletekey; ValueName: "{#AppRegVersion}"; ValueType: string; ValueData: "{#AppVersion}"; Check: AllUsers;
Root: HKCU; Subkey: "SOFTWARE\{#AppRegKey}"; Flags: uninsdeletekey; ValueName: "{#AppRegVersion}"; ValueType: string; ValueData: "{#AppVersion}"; Check: ThisUserOnly;
[Run]
Filename: "{app}\{#AppReadme}"; Description: "View the README file"; Flags: postinstall shellexec skipifsilent
Filename: "{app}\{#AppConfigExe}"; Description: "{cm:LaunchProgram,{#AppConfigName}}"; Flags: nowait postinstall skipifsilent
[UninstallDelete]
Type: files; Name: "{code:MyGroupDir}\{groupname}\{cm:ProgramOnTheWeb,{#AppName}}.url"
[code]
const
CSIDL_PROFILE = $0028;
CSIDL_COMMON_PROGRAMS = $0017;
CSIDL_COMMON_DESKTOPDIRECTORY = $0019;
var
InstallTypePageID: Integer;
CheckListBox2: TNewCheckListBox;
function Restricted(): Boolean;
begin
Result := not (IsAdminLoggedOn() or IsPowerUserLoggedOn())
end;
function NotRestricted(): Boolean;
begin
Result := not Restricted()
end;
function Is9xME(): Boolean;
begin
Result := not UsingWinNT()
end;
function CurrentUserOnly(): Boolean;
begin
Result := CheckListBox2.Checked[2]
end;
function ThisUserOnly(): Boolean;
begin
Result := (Restricted() or CurrentUserOnly()) and UsingWinNT()
end;
function AllUsers(): Boolean;
begin
Result := not ThisUserOnly()
end;
function MyAppDir(): String;
var
Path: String;
begin
Path := ExpandConstant('{reg:HKLM\SOFTWARE\{#AppRegKey},{#AppRegValue}|{pf}\{#AppDirName}}');
if ThisUserOnly() then
begin
Path := ExpandConstant('{reg:HKCU\SOFTWARE\{#AppRegKey},{#AppRegValue}|__MissingKey__}');
if Path = '__MissingKey__' then
begin
Path := GetShellFolderByCSIDL(CSIDL_PROFILE, True);
if Path = '' then
Path := RemoveBackslashUnlessRoot(ExtractFilePath(ExpandConstant('{userdocs}')));
Path := Path + '\Programs\{#AppDirName}'
end
end
Result := Path
end;
function MyGroupDir(Default: String): String;
var
Path: String;
begin
if ThisUserOnly() then
Path := ExpandConstant('{userprograms}')
else
Path := ExpandConstant('{commonprograms}')
Result := Path
end;
function MyDesktopDir(Default: String): String;
var
Path: String;
begin
if ThisUserOnly() then
Path := ExpandConstant('{userdesktop}')
else
Path := ExpandConstant('{commondesktop}')
Result := Path
end;
procedure CreateTheWizardPages;
var
Page: TWizardPage;
Enabled, InstallAllUsers: Boolean;
begin
Page := CreateCustomPage(wpLicense, 'Choose Installation Type', 'Who do you want to be able to use this program?');
InstallTypePageID := Page.ID;
Enabled := NotRestricted();
InstallAllUsers := NotRestricted();
CheckListBox2 := TNewCheckListBox.Create(Page);
CheckListBox2.Width := Page.SurfaceWidth;
CheckListBox2.Height := ScaleY(97);
CheckListBox2.BorderStyle := bsNone;
CheckListBox2.ParentColor := True;
CheckListBox2.MinItemHeight := WizardForm.TasksList.MinItemHeight;
CheckListBox2.ShowLines := False;
CheckListBox2.WantTabs := True;
CheckListBox2.Parent := Page.Surface;
CheckListBox2.AddGroup('Installation Type:', '', 0, nil);
CheckListBox2.AddRadioButton('All Users', '', 0, InstallAllUsers, Enabled, nil);
CheckListBox2.AddRadioButton('Current User Only', '', 0, not InstallAllUsers, True, nil);
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectDir then
begin
WizardForm.DirEdit.Text := MyAppDir();
end
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
Result := (PageID = InstallTypePageID) and Is9xME();
end;
procedure InitializeWizard();
begin
CreateTheWizardPages;
end;
function Lang2Gettext(): String;
var
lang, lc: String;
begin
lang := ActiveLanguage();
if lang = 'bra' then
lc := 'pt_br'
else
if lang = 'cat' then
lc := 'ca'
else
if lang = 'cze' then
lc := 'cs'
else
if lang = 'dan' then
lc := 'da'
else
if lang = 'dut' then
lc := 'nl'
else
if lang = 'fre' then
lc := 'fr'
else
if lang = 'ger' then
lc := 'de'
else
if lang = 'hun' then
lc := 'hu'
else
if lang = 'ita' then
lc := 'it'
else
if lang = 'nor' then
lc := 'nn'
else
if lang = 'pol' then
lc := 'pl'
else
if lang = 'por' then
lc := 'pt'
else
if lang = 'rus' then
lc := 'ru'
else
if lang = 'slo' then
lc := 'sk'
else
if lang = 'chs' then
lc := 'zh_cn'
else
if lang = 'esp' then
lc := 'es'
else
if lang = 'gal' then
lc := 'gl'
else
if lang = 'cht' then
lc := 'zh_tw'
else
lc := 'en'
Result := lc
end;
function MyReadme(Default: String): String;
var
lang, readme: String;
begin
lang := Lang2Gettext();
if lang = 'nl' then
readme := 'nl\html\README.html'
else
if lang = 'fr' then
readme := 'fr\html\README1.html'
else
if lang = 'it' then
readme := 'it\html\README.html'
else
if lang = 'es' then
readme := 'es\html\LEEME.html'
else
if lang = 'gl' then
readme := 'gl\html\README.html'
else
if lang = 'zh_tw' then
readme := 'zh_tw\html\README.html'
else
readme := 'html\README.html'
Result := 'docs\'+readme
end;
function MyLicence(Default: String): String;
var
lang, licence: String;
begin
lang := Lang2Gettext();
if lang = 'pt_br' then
licence := 'pt_br\COPYING_pt_BR.txt'
else
if lang = 'ca' then
licence := 'ca\COPYING.txt'
else
if lang = 'cs' then
licence := 'cs\COPYING.txt'
else
if lang = 'da' then
licence := 'da\COPYING.txt'
else
if lang = 'nl' then
licence := 'nl\COPYING_nl.txt'
else
if lang = 'fr' then
licence := 'fr\COPIER.txt'
else
if lang = 'de' then
licence := 'de\KOPIE.txt'
else
if lang = 'it' then
licence := 'it\COPIATURA.txt'
else
if lang = 'pl' then
licence := 'pl\LICENCJA-GNU.txt'
else
if lang = 'es' then
licence := 'es\COPIADO.txt'
else
licence := 'COPYING.txt'
Result := 'docs\'+licence
end;
function MyPublisherURL(Default: String): String;
var
lang: String;
begin
lang := Lang2Gettext();
if lang = 'chs' then
lang := 'zh-cn'
else
if lang = 'cht' then
lang := 'zh-tw'
Result := 'http://www.tuxpaint.org/?lang='+lang
end;
#expr SaveToFile(AddBackslash(SourcePath) + 'Preprocessed.iss')
;
; This script needs the InnoSetup PreProcessor (ISPP) to compile correctly.
; I downloaded a combined 'QuickStart Pack' from here:
; http://www.jrsoftware.org/isdl.php#qsp
;
; The version string is extracted from the executable.
;
; As of 2011.06.15, this integrates OpenCandy advertising module.
; However, by default, using "tuxpaint.iss", the standard Tux Paint installer
; will be built. Use "tuxpaint-opencandy.iss" (and you will need the
; product key and secret, stored in a "tuxpaint-opencandy-secrets.iss" file;
; Bill Kendrick has access to these), which sets up a #define and then
; #include's this file, to produce an installer with OpenCandy built-in.
; -bjk
; Should we change this to Tux4Kids? -bjk 2011.06.15
#define PublisherName "New Breed Software"
#define PublisherURL "{code:MyPublisherURL}"
#define AppName "Tux Paint"
#define AppDirName "TuxPaint"
#define AppPrefix "tuxpaint"
#define AppRegKey AppDirName
#define AppRegValue "Install_Dir"
#define AppRegVersion "Version"
#define AppGroupName AppName
#define AppExe AppPrefix+".exe"
#define AppConfigName AppName+" Config"
#define AppConfigExe AppPrefix+"-config.exe"
#define AppReadme "{code:MyReadme}"
#define AppLicence "{code:MyLicence}"
#define BdistDir ".\bdist"
#define AppVersion GetStringFileInfo(BdistDir+"\"+AppExe, "FileVersion")
#ifdef OpenCandy
#define OC_STR_MY_PRODUCT_NAME "Tux Paint"
;// Note: Please change the registry path to match your company name
;#define OC_STR_REGISTRY_PATH "Software\Tux Paint\OpenCandy"
#define OC_OCSETUPHLP_FILE_PATH ".\OCSetupHlp.dll"
#include 'tuxpaint-opencandy-secrets.iss'
;#if OC_STR_MY_PRODUCT_NAME == "Open Candy Sample"
; #pragma warning "Do not forget to change the product name from 'Open Candy Sample' to your company's product name before releasing this installer."
;#endif
;#if OC_STR_KEY == "1401d0bd8048e1f0f4628dbec1a73092"
; #pragma warning "Do not forget to change the test key '1401d0bd8048e1f0f4628dbec1a73092' to your company's product key before releasing this installer."
;#endif
;#if OC_STR_SECRET == "4564bdaf826bbe2115718d1643ecc19e"
; #pragma warning "Do not forget to change the test secret '4564bdaf826bbe2115718d1643ecc19e' to your company's product secret before releasing this installer."
;#endif
;#if OC_STR_REGISTRY_PATH == "Software\Your Company\OpenCandy"
; #pragma warning "Do not forget to change the test registry path 'Your Company' to your companies name before releasing this installer."
;#endif
;#if Pos(LowerCase("Software\OpenCandy"),LowerCase(OC_STR_REGISTRY_PATH)) != 0
; #pragma warning "ERROR, your registry path has OpenCandy before your company name. Please place your company name before OpenCandy. eg Software\Your Company\OpenCandy"
;#endif
#endif
[Setup]
AppName={#AppName}
AppVerName={#AppName} {#AppVersion}
AppPublisher={#PublisherName}
AppPublisherURL={#PublisherURL}
AppSupportURL={#PublisherURL}
AppUpdatesURL={#PublisherURL}
DefaultDirName={pf}\{#AppDirName}
DefaultGroupName={#AppGroupName}
OutputDir=.\
;FIXME - It would be good if we showed the localized license -bjk 2011.06.15
#ifdef OpenCandy
LicenseFile={#BdistDir}\docs\COPYING-OC.txt
OutputBaseFilename={#AppPrefix}-{#AppVersion}-win32-installer-opencandy
#else
LicenseFile={#BdistDir}\docs\COPYING.txt
OutputBaseFilename={#AppPrefix}-{#AppVersion}-win32-installer
#endif
SetupIconFile={#BdistDir}\data\images\tuxpaint-installer.ico
Compression=lzma
SolidCompression=yes
PrivilegesRequired=admin
[Languages]
Name: "eng"; MessagesFile: "compiler:Default.isl"
Name: "bra"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl"
Name: "cat"; MessagesFile: "compiler:Languages\Catalan.isl"
Name: "cze"; MessagesFile: "compiler:Languages\Czech.isl"
Name: "dan"; MessagesFile: "compiler:Languages\Danish.isl"
Name: "dut"; MessagesFile: "compiler:Languages\Dutch.isl"
Name: "fre"; MessagesFile: "compiler:Languages\French.isl"
Name: "ger"; MessagesFile: "compiler:Languages\German.isl"
Name: "hun"; MessagesFile: "compiler:Languages\Hungarian.isl"
Name: "ita"; MessagesFile: "compiler:Languages\Italian.isl"
Name: "nor"; MessagesFile: "compiler:Languages\Norwegian.isl"
Name: "pol"; MessagesFile: "compiler:Languages\Polish.isl"
Name: "por"; MessagesFile: "compiler:Languages\Portuguese.isl"
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "slo"; MessagesFile: "compiler:Languages\Slovenian.isl"
Name: "esp"; MessagesFile: "compiler:Languages\Spanish.isl"
Name: "jpn"; MessagesFile: "compiler:Languages\Japanese.isl"
; Additional, Candidate official translations
Name: "chs"; MessagesFile: "compiler:Languages\ChineseSimp-12-5.1.11.isl"
; Additional, Unofficial translations
Name: "gal"; MessagesFile: "compiler:Languages\Galician-2-5.1.11.isl"
Name: "cht"; MessagesFile: "compiler:Languages\ChineseTrad-2-5.1.11.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}";
[Files]
Source: "{#BdistDir}\*.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#BdistDir}\*.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#BdistDir}\data\*"; DestDir: "{app}\data"; Excludes: "CVS"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\docs\*"; DestDir: "{app}\docs"; Excludes: "CVS,Makefile,*~"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\etc\*"; DestDir: "{app}\etc"; Flags: skipifsourcedoesntexist ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\lib\*"; DestDir: "{app}\lib"; Flags: skipifsourcedoesntexist ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\im\*"; DestDir: "{app}\im"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\plugins\*"; DestDir: "{app}\plugins"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\locale\*"; DestDir: "{app}\locale"; Excludes: "CVS"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{#BdistDir}\..\libdocs\*"; DestDir: "{app}\docs\libdocs"; Excludes: "CVS,Makefile,*~"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
#ifdef OpenCandy
Source: "{#OC_OCSETUPHLP_FILE_PATH}"; Flags: dontcopy ignoreversion;
#endif
[INI]
Filename: "{code:MyGroupDir}\{groupname}\{cm:ProgramOnTheWeb,{#AppName}}.url"; Section: "InternetShortcut"; Key: "URL"; String: "{#PublisherURL}"
[Icons]
Name: "{code:MyGroupDir}\{groupname}\Configure {#AppName}"; Filename: "{app}\{#AppConfigExe}"; Comment: "{#AppConfigName}"
Name: "{code:MyGroupDir}\{groupname}\{#AppName} (Full Screen)"; Filename: "{app}\{#AppExe}"; Parameters: "--fullscreen"; Comment: "Start {#AppName} in Fullscreen mode"
Name: "{code:MyGroupDir}\{groupname}\{#AppName} (Windowed)"; Filename: "{app}\{#AppExe}"; Parameters: "--windowed"; Comment: "Start {#AppName} in a Window"
Name: "{code:MyGroupDir}\{groupname}\Readme"; Filename: "{app}\{#AppReadme}"; Comment: "View ReadMe"
Name: "{code:MyGroupDir}\{groupname}\Licence"; Filename: "{app}\{#AppLicence}"; Comment: "View License"
Name: "{code:MyGroupDir}\{groupname}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"; IconFilename: "{app}\data\images\tuxpaint-installer.ico"; Comment: "Remove {#AppName}"
Name: "{code:MyDesktopDir}\{#AppName}"; Filename: "{app}\{#AppExe}"; Tasks: desktopicon
[Registry]
Root: HKLM; Subkey: "SOFTWARE\{#AppRegKey}"; Flags: uninsdeletekey; ValueName: "{#AppRegValue}"; ValueType: string; ValueData: "{app}"; Check: AllUsers;
Root: HKCU; Subkey: "SOFTWARE\{#AppRegKey}"; Flags: uninsdeletekey; ValueName: "{#AppRegValue}"; ValueType: string; ValueData: "{app}"; Check: ThisUserOnly;
Root: HKLM; Subkey: "SOFTWARE\{#AppRegKey}"; Flags: uninsdeletekey; ValueName: "{#AppRegVersion}"; ValueType: string; ValueData: "{#AppVersion}"; Check: AllUsers;
Root: HKCU; Subkey: "SOFTWARE\{#AppRegKey}"; Flags: uninsdeletekey; ValueName: "{#AppRegVersion}"; ValueType: string; ValueData: "{#AppVersion}"; Check: ThisUserOnly;
[Run]
Filename: "{app}\{#AppReadme}"; Description: "View the README file"; Flags: postinstall shellexec skipifsilent
Filename: "{app}\{#AppConfigExe}"; Description: "{cm:LaunchProgram,{#AppConfigName}}"; Flags: nowait postinstall skipifsilent
[UninstallDelete]
Type: files; Name: "{code:MyGroupDir}\{groupname}\{cm:ProgramOnTheWeb,{#AppName}}.url"
[code]
#ifdef OpenCandy
#include 'OCSetupHlp.iss'
#endif
const
CSIDL_PROFILE = $0028;
CSIDL_COMMON_PROGRAMS = $0017;
CSIDL_COMMON_DESKTOPDIRECTORY = $0019;
var
InstallTypePageID: Integer;
CheckListBox2: TNewCheckListBox;
#ifdef OpenCandy
OCtszInstallerLanguage: OCTString;
#endif
function Restricted(): Boolean;
begin
Result := not (IsAdminLoggedOn() or IsPowerUserLoggedOn())
end;
function NotRestricted(): Boolean;
begin
Result := not Restricted()
end;
function Is9xME(): Boolean;
begin
Result := not UsingWinNT()
end;
function CurrentUserOnly(): Boolean;
begin
Result := CheckListBox2.Checked[2]
end;
function ThisUserOnly(): Boolean;
begin
Result := (Restricted() or CurrentUserOnly()) and UsingWinNT()
end;
function AllUsers(): Boolean;
begin
Result := not ThisUserOnly()
end;
function MyAppDir(): String;
var
Path: String;
begin
Path := ExpandConstant('{reg:HKLM\SOFTWARE\{#AppRegKey},{#AppRegValue}|{pf}\{#AppDirName}}');
if ThisUserOnly() then
begin
Path := ExpandConstant('{reg:HKCU\SOFTWARE\{#AppRegKey},{#AppRegValue}|__MissingKey__}');
if Path = '__MissingKey__' then
begin
Path := GetShellFolderByCSIDL(CSIDL_PROFILE, True);
if Path = '' then
Path := RemoveBackslashUnlessRoot(ExtractFilePath(ExpandConstant('{userdocs}')));
Path := Path + '\Programs\{#AppDirName}'
end;
end;
Result := Path
end;
function MyGroupDir(Default: String): String;
var
Path: String;
begin
if ThisUserOnly() then
Path := ExpandConstant('{userprograms}')
else
Path := ExpandConstant('{commonprograms}');
Result := Path;
end;
function MyDesktopDir(Default: String): String;
var
Path: String;
begin
if ThisUserOnly() then
Path := ExpandConstant('{userdesktop}')
else
Path := ExpandConstant('{commondesktop}');
Result := Path;
end;
procedure CreateTheWizardPages;
var
Page: TWizardPage;
Enabled, InstallAllUsers: Boolean;
begin
Page := CreateCustomPage(wpLicense, 'Choose Installation Type', 'Who do you want to be able to use this program?');
InstallTypePageID := Page.ID;
Enabled := NotRestricted();
InstallAllUsers := NotRestricted();
CheckListBox2 := TNewCheckListBox.Create(Page);
CheckListBox2.Width := Page.SurfaceWidth;
CheckListBox2.Height := ScaleY(97);
CheckListBox2.BorderStyle := bsNone;
CheckListBox2.ParentColor := True;
CheckListBox2.MinItemHeight := WizardForm.TasksList.MinItemHeight;
CheckListBox2.ShowLines := False;
CheckListBox2.WantTabs := True;
CheckListBox2.Parent := Page.Surface;
CheckListBox2.AddGroup('Installation Type:', '', 0, nil);
CheckListBox2.AddRadioButton('All Users', '', 0, InstallAllUsers, Enabled, nil);
CheckListBox2.AddRadioButton('Current User Only', '', 0, not InstallAllUsers, True, nil);
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectDir then
begin
WizardForm.DirEdit.Text := MyAppDir();
end;
begin
#ifdef OpenCandy
OpenCandyCurPageChanged(CurPageID);
#endif
end;
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
Result := (PageID = InstallTypePageID) and Is9xME();
begin
#ifdef OpenCandy
Result := OpenCandyShouldSkipPage(PageID);
#endif
end;
end;
#ifdef OpenCandy
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := OpenCandyNextButtonClick(CurPageID);
end;
#endif
function BackButtonClick(CurPageID: Integer): Boolean;
begin
Result := true; // Allow action by default
#ifdef OpenCandy
OpenCandyBackButtonClick(CurPageID);
#endif
end;
procedure DeinitializeSetup();
begin
#ifdef OpenCandy
OpenCandyDeinitializeSetup();
#endif
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
#ifdef OpenCandy
OpenCandyCurStepChanged(CurStep);
#endif
end;
function Lang2Gettext(): String;
var
lang, lc: String;
begin
lang := ActiveLanguage();
if lang = 'bra' then
lc := 'pt_br'
else
if lang = 'cat' then
lc := 'ca'
else
if lang = 'cze' then
lc := 'cs'
else
if lang = 'dan' then
lc := 'da'
else
if lang = 'dut' then
lc := 'nl'
else
if lang = 'fre' then
lc := 'fr'
else
if lang = 'ger' then
lc := 'de'
else
if lang = 'hun' then
lc := 'hu'
else
if lang = 'ita' then
lc := 'it'
else
if lang = 'nor' then
lc := 'nn'
else
if lang = 'pol' then
lc := 'pl'
else
if lang = 'por' then
lc := 'pt'
else
if lang = 'rus' then
lc := 'ru'
else
if lang = 'slo' then
lc := 'sk'
else
if lang = 'chs' then
lc := 'zh_cn'
else
if lang = 'esp' then
lc := 'es'
else
if lang = 'gal' then
lc := 'gl'
else
if lang = 'cht' then
lc := 'zh_tw'
else
lc := 'en';
Result := lc
end;
procedure InitializeWizard();
#ifdef OpenCandy
Var OCstrInstallerLanguage: String;
#endif
begin
begin
CreateTheWizardPages;
end
#ifdef OpenCandy
OCstrInstallerLanguage := Lang2Gettext();
OpenCandyAsyncInit('{#OC_STR_MY_PRODUCT_NAME}', '{#OC_STR_KEY}', '{#OC_STR_SECRET}', OCtszInstallerLanguage, {#OC_INIT_MODE_NORMAL});
#endif
end;
function MyReadme(Default: String): String;
var
lang, readme: String;
begin
lang := Lang2Gettext();
if lang = 'nl' then
readme := 'nl\html\README.html'
else
if lang = 'fr' then
readme := 'fr\html\README1.html'
else
if lang = 'it' then
readme := 'it\html\README.html'
else
if lang = 'es' then
readme := 'es\html\LEEME.html'
else
if lang = 'gl' then
readme := 'gl\html\README.html'
else
if lang = 'zh_tw' then
readme := 'zh_tw\html\README.html'
else
readme := 'html\README.html';
Result := 'docs\'+readme
end;
function MyLicence(Default: String): String;
var
lang, licence: String;
begin
lang := Lang2Gettext();
if lang = 'pt_br' then
licence := 'pt_br\COPYING_pt_BR.txt'
else
if lang = 'ca' then
licence := 'ca\COPYING.txt'
else
if lang = 'cs' then
licence := 'cs\COPYING.txt'
else
if lang = 'da' then
licence := 'da\COPYING.txt'
else
if lang = 'nl' then
licence := 'nl\COPYING_nl.txt'
else
if lang = 'fr' then
licence := 'fr\COPIER.txt'
else
if lang = 'de' then
licence := 'de\KOPIE.txt'
else
if lang = 'it' then
licence := 'it\COPIATURA.txt'
else
if lang = 'pl' then
licence := 'pl\LICENCJA-GNU.txt'
else
if lang = 'es' then
licence := 'es\COPIADO.txt'
else
licence := 'COPYING.txt';
Result := 'docs\'+licence
end;
function MyPublisherURL(Default: String): String;
var
lang: String;
begin
lang := Lang2Gettext();
if lang = 'chs' then
lang := 'zh-cn'
else
if lang = 'cht' then
lang := 'zh-tw';
Result := 'http://www.tuxpaint.org/?lang='+lang
end;
#expr SaveToFile(AddBackslash(SourcePath) + 'Preprocessed.iss')