Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/win32/OCSetupHlp.iss
diff options
context:
space:
mode:
Diffstat (limited to 'win32/OCSetupHlp.iss')
-rw-r--r--win32/OCSetupHlp.iss719
1 files changed, 719 insertions, 0 deletions
diff --git a/win32/OCSetupHlp.iss b/win32/OCSetupHlp.iss
new file mode 100644
index 0000000..a7fea26
--- /dev/null
+++ b/win32/OCSetupHlp.iss
@@ -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 //
+//---------------------------------------------------------------------------// \ No newline at end of file