1 line
14 KiB
C
Executable File
1 line
14 KiB
C
Executable File
/* Copyright (c) 2017, Computer History Museum
|
|
All rights reserved.
|
|
Redistribution and use in source and binary forms, with or without modification, are permitted (subject to
|
|
the limitations in the disclaimer below) provided that the following conditions are met:
|
|
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
|
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
|
|
disclaimer in the documentation and/or other materials provided with the distribution.
|
|
* Neither the name of Computer History Museum nor the names of its contributors may be used to endorse or promote products
|
|
derived from this software without specific prior written permission.
|
|
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE
|
|
COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
|
DAMAGE. */
|
|
|
|
#ifndef NAG_H
|
|
#define NAG_H
|
|
#ifdef NAG
|
|
|
|
#define kTEXTResIDFollowsChar '~'
|
|
#define kSecondsPerDay (24*60*60)
|
|
#define kDeadbeatDays 14
|
|
#define kAdGracePeriod 2
|
|
#define kDaysUntilNoAdsNag 3
|
|
|
|
typedef enum {
|
|
noDialogPending = 0,
|
|
paymentRegPending = 1,
|
|
codeEntryPending = 2,
|
|
repayPending = 3,
|
|
gracelessRepayPending = 4
|
|
} InitNagResultType;
|
|
|
|
//
|
|
// User states
|
|
//
|
|
// These states should have the same values as the 'Nag#' resources stored in
|
|
// the application.
|
|
//
|
|
// Removed all references to defunct user states (like ep4User, etc...)
|
|
//
|
|
|
|
typedef enum {
|
|
ep4User = NAG_EP4_USER,
|
|
ep4RegUser = NAG_EP4_REG_USER,
|
|
newUser = NAG_NEW_USER, // User trying Eudora for the first time
|
|
paidUser = NAG_PAID_USER, // User who has paid, entered his registration code, and is using the entitled version of Eudora
|
|
freeUser = NAG_FREE_USER, // User who has chosen to use Freeware, but who has not entered a Freeware registration number
|
|
adwareUser = NAG_AD_USER, // User who is using the version that displays ads
|
|
regFreeUser = NAG_REG_FREE_USER, // Free user who has entered a Freeware registration code
|
|
regAdwareUser = NAG_REG_ADD_USER, // Ad user who has entered a Freeware registration code
|
|
deadbeatUser = NAG_DEADBEAT_USER, // A dead beat
|
|
boxUser = NAG_BOX_USER, // User who got their reg code from an installer
|
|
profileDeadbeatUser = NAG_PROFILE_DEADBEAT_USER, // User who got their reg code from an installer
|
|
unpaidUser = NAG_UNPAID_USER, // User who is using a version of Eudora for which they are not entitled
|
|
repayUser = NAG_REPAY_USER, // User who is subject to repaying and who has clicked on "Pay Now". They will turn to sponsored in an hour or at their next restart
|
|
userStateLimit
|
|
} UserStateType;
|
|
|
|
// Added paranoia for the death build
|
|
#ifdef DEATH_BUILD
|
|
#define GetNagState() paidUser
|
|
#define ValidUser(state) true
|
|
#define EP4User(state) false
|
|
#define NewUser(state) false
|
|
#define FreeUser(state) false
|
|
#define PayUser(state) true
|
|
#define RepayUser(state) false
|
|
#define AdwareUser(state) false
|
|
#define RegisteredUser(state) true
|
|
#define DeadbeatUser(state) false
|
|
#define ProfileDeadbeatUser(state) false
|
|
#define UnpaidUser(state) false
|
|
#define BoxUser(state) true
|
|
#define PayMode(state) true
|
|
#define AdwareMode(state) false
|
|
#define FreeMode(state) false
|
|
|
|
#define IsValidUser() true
|
|
#define IsEP4User() false
|
|
#define IsNewUser() false
|
|
#define IsFreeUser() false
|
|
#define IsPayUser() true
|
|
#define IsRepayUser() false
|
|
#define IsAdwareUser() false
|
|
#define IsRegisteredUser() true
|
|
#define IsDeadbeatUser() false
|
|
#define IsProfileDeadbeatUser() false
|
|
#define IsUnpaidUser() false
|
|
#define IsBoxUser() true
|
|
#define IsPayMode() true
|
|
#define IsAdwareMode() false
|
|
#define IsFreeMode() false
|
|
|
|
#define IsProfiledUser() true
|
|
#else
|
|
#define GetNagState() (nagState ? (*nagState)->state : adwareUser)
|
|
#define ValidUser(state) ((state) == ep4User || (state) == ep4RegUser || (state) == newUser || (state) == paidUser || (state) == freeUser || (state) == adwareUser || (state) == regFreeUser || (state) == regAdwareUser || (state) == deadbeatUser || (state) == profileDeadbeatUser || (state) == boxUser || (state) == profileDeadbeatUser || (state) == unpaidUser || (state) == repayUser)
|
|
#define EP4User(state) ((state) == ep4User || (state) == ep4RegUser)
|
|
#define NewUser(state) ((state) == newUser)
|
|
#define FreeUser(state) ((state) == freeUser || (state) == regFreeUser || (state) == deadbeatUser || (state) == profileDeadbeatUser)
|
|
#define PayUser(state) ((state) == paidUser || (state) == repayUser)
|
|
#define RepayUser(state) ((state) == repayUser)
|
|
#define AdwareUser(state) ((state) == adwareUser || (state) == regAdwareUser)
|
|
#define RegisteredUser(state) ((state) == paidUser || (state) == regFreeUser || (state) == regAdwareUser)
|
|
#define DeadbeatUser(state) ((state) == deadbeatUser || (state) == profileDeadbeatUser)
|
|
#define ProfileDeadbeatUser(state) ((state) == profileDeadbeatUser)
|
|
#define UnpaidUser(state) ((state) == unpaidUser)
|
|
#define BoxUser(state) ((state) == boxUser)
|
|
#define PayMode(state) (PayUser (state) || BoxUser (state))
|
|
#define AdwareMode(state) (AdwareUser (state) || NewUser (state) || UnpaidUser (state))
|
|
#define FreeMode(state) (!(PayMode (state) || AdwareMode (state)))
|
|
|
|
#define IsValidUser() (nagState ? ValidUser((*nagState)->state) : false)
|
|
#define IsEP4User() (nagState ? EP4User((*nagState)->state) : false)
|
|
#define IsNewUser() (nagState ? NewUser((*nagState)->state) : false)
|
|
#define IsNewUser() (nagState ? NewUser((*nagState)->state) : false)
|
|
#define IsFreeUser() (nagState ? FreeUser((*nagState)->state) : false)
|
|
#define IsPayUser() (nagState ? PayUser((*nagState)->state) : false)
|
|
#define IsRepayUser() (nagState ? RepayUser((*nagState)->state) : false)
|
|
#define IsAdwareUser() (nagState ? AdwareUser((*nagState)->state) : true)
|
|
#define IsRegisteredUser() (nagState ? RegisteredUser((*nagState)->state) : false)
|
|
#define IsDeadbeatUser() (nagState ? DeadbeatUser((*nagState)->state) : false)
|
|
#define IsProfileDeadbeatUser() (nagState ? ProfileDeadbeatUser((*nagState)->state) : false)
|
|
#define IsUnpaidUser() (nagState ? UnpaidUser((*nagState)->state) : false)
|
|
#define IsBoxUser() (nagState ? BoxUser((*nagState)->state) : false)
|
|
#define IsPayMode() (nagState ? PayMode((*nagState)->state) : false)
|
|
#define IsAdwareMode() (nagState ? AdwareMode((*nagState)->state) : true)
|
|
#define IsFreeMode() (nagState ? FreeMode((*nagState)->state) : false)
|
|
#define CanPayMode() (gCanPayMode || IsPayMode())
|
|
|
|
#define IsProfiledUser() (*GetProfileID(GlobalTemp)>1)
|
|
Boolean UserHasValidPaidModeRegcode(void);
|
|
#endif
|
|
|
|
//
|
|
// NagUsageRec
|
|
//
|
|
// A record of this type exists for each of the nag dialogs and will
|
|
// be stored in the settings file ('NagU') to keep track of which nags
|
|
// have been displayed and when.
|
|
//
|
|
|
|
#define NAG_USAGE_VERS 0
|
|
|
|
typedef struct {
|
|
short version; // Version of the NagUsageRec
|
|
uLong nagBase; // Base from which all nags are determined (0 means not yet nagged)
|
|
uLong lastNag; // Date/time of the last nag
|
|
UInt32 aux; // auxilliary field for use by any nag (but specifically by the no ads nags)
|
|
} NagUsageRec, *NagUsagePtr, **NagUsageHandle;
|
|
|
|
// Must be 32 bits
|
|
typedef struct {
|
|
UInt8 unused:4;
|
|
UInt8 checkedMailToday:1; // did we check mail today?
|
|
UInt8 checkedMail:1; // did we check mail 'yesterday'?
|
|
UInt8 adsAreSucceeding:1; // we got significant facetime and ad facetime
|
|
UInt8 adsAreFailing:1; // we got significant facetime, but insufficient ad facetime
|
|
// They will neither succeed nor fail if there is only a tiny amount of facetime
|
|
// on a given day.
|
|
UInt8 consecutiveDays; // Number of consecutive days (up to 'kAdGracePeriod') we've received ads
|
|
UInt16 deadbeatCounter; // Running counter used to determine when someone not getting ads should become a deadbeat
|
|
} NoAdsAuxRec, *NoAdsAuxPtr, **NoAdsAuxHandle;
|
|
|
|
//
|
|
// NagStateRec
|
|
//
|
|
// Maintains the current nagging state between launches of Eudora. The
|
|
// content of this structure is stored in a resource of type 'NagS' in
|
|
// the settings file. Currently, there's not much in here... but it
|
|
// could grow, so it's a struct.
|
|
//
|
|
|
|
#define NAG_STATE_VERS 0
|
|
|
|
typedef struct {
|
|
short version; // Version of the NagStateRec
|
|
UserStateType state; // Current state of nagging for this user
|
|
uLong regDate; // The date/time of the most recent RegCode file
|
|
} NagStateRec, *NagStatePtr, **NagStateHandle;
|
|
|
|
|
|
//
|
|
// Nag Records
|
|
//
|
|
// Nag records are store in resources of type 'Nag '. This resource
|
|
// contains information about the schedules and dialogs to be used for each
|
|
// nag state.
|
|
//
|
|
// The format of the 'Nag ' resource is as follows:
|
|
//
|
|
// UInt32 schedule;
|
|
// UInt16 interval;
|
|
// short dialogID;
|
|
// UInt32 flags;
|
|
//
|
|
// Where each bit of the 'schedule' represents whether or not we're due to nag on that
|
|
// particular day following the nag base. The nag base is therefore bit 0, the
|
|
// following day is bit 1, and so on. A set bit indicates that we will nag on that
|
|
// particular day following the nag base.
|
|
//
|
|
// The repeat interval is the frequency with which we'll nag after the initial month
|
|
// of nags has been exhausted.
|
|
//
|
|
// The dialogID is the resourceID of the 'DLOG' resource used to display this nag.
|
|
//
|
|
// 'flag' is intended to be used to define various special attributes of a nag. So
|
|
// far, it doesn't do a whole lot, but could be useful in the future to override
|
|
// certain nagging behaviors (get it? nagging behaviors? bad habits? Oh nevermind).
|
|
//
|
|
// 0x00000001 Check for Eudora application updates with the next mail check
|
|
//
|
|
|
|
#define nagFlagSilentUpdate 0x00000001
|
|
#define nagFlagUpdate 0x00000002
|
|
#define nagFlagAdFailureCheck 0x00000004
|
|
|
|
typedef struct {
|
|
UInt32 schedule;
|
|
UInt16 interval;
|
|
short dialogID;
|
|
UInt32 flags;
|
|
} NagRec, *NagPtr, **NagHandle;
|
|
|
|
typedef struct {
|
|
short count;
|
|
short nagID[];
|
|
} NagListRec, *NagListPtr, **NagListHandle;
|
|
|
|
typedef OSErr (*NagDialogInitProcPtr) (DialogPtr dlog, long refcon);
|
|
typedef Boolean (*NagDialogHitProcPtr) (EventRecord *event, DialogPtr dlog, short item, long refcon);
|
|
|
|
typedef struct {
|
|
Str255 text;
|
|
OSErr error;
|
|
} AdFailureRec, *AdFailurePtr, **AdFailureHandle;
|
|
|
|
InitNagResultType InitNagging (void);
|
|
void DoPendingNagDialog (InitNagResultType pendingNagResult);
|
|
void CheckNagging (UserStateType state);
|
|
OSErr Nag (short dialogID, NagDialogInitProcPtr initProc, NagDialogHitProcPtr hitProc, ModalFilterUPP theFilterProc, Boolean ignoreDefaultItem, long refcon);
|
|
MyWindowPtr FindNag (short dialogID);
|
|
Boolean IntroDlogHit (EventRecord *event, DialogPtr theDialog, short itemHit, long dialogRefcon);
|
|
Boolean AdUserHit (EventRecord *event, DialogPtr theDialog, short itemHit, long dialogRefcon);
|
|
Boolean DowngradeDlogHit (EventRecord *event, DialogPtr theDialog, short itemHit, long dialogRefcon);
|
|
OSErr DowngradeDlogInit (DialogPtr dlog, long refcon);
|
|
OSErr FeaturesDlogInit (DialogPtr dlog, long refcon);
|
|
Boolean FeaturesDlogHit (EventRecord *event, DialogPtr theDialog, short itemHit, long dialogRefcon);
|
|
OSErr NotGettingAdsDlogInit (DialogPtr dlog, AdFailurePtr adFailurePtr);
|
|
Boolean NotGettingAdsDlogHit (EventRecord *event, DialogPtr theDialog, short itemHit, long dialogRefcon);
|
|
Boolean NoAdsRevertToFreeDlogHit (EventRecord *event, DialogPtr theDialog, short itemHit, long dialogRefcon);
|
|
FeatureCellHandle BuildFeatureList (Boolean ignoreUsage);
|
|
OSErr SetFeatureCell (FeatureCellPtr *featureCellsPtr, FeatureRecPtr featurePtr, Boolean ignoreUsage);
|
|
void DownGradeDialog (void);
|
|
void NotifyDownGradeDialog (void);
|
|
void RepayDialog (InitNagResultType pendingNagResult);
|
|
OSErr SubstituteLongStaticTextItems (DialogPtr theDialog);
|
|
OSErr GetIndNagID (short *nagID, short nagListID, short index);
|
|
OSErr GetIndNagState (NagPtr theNag, short *nagID, UserStateType state, short index);
|
|
void TransitionState (UserStateType newState);
|
|
uLong DaysSinceNagBase (short dialogID);
|
|
uLong DurationOfSchedule (UserStateType state, short whichSchedule);
|
|
uLong SecondsToWholeDay (uLong secs);
|
|
short MostSignificantSetBit (UInt32 value);
|
|
|
|
void RelaunchEudora (UserStateType newState);
|
|
OSErr UpdateCheck (Boolean silently, Boolean archives);
|
|
void FinishedUpdateCheck (long silently, OSErr theError, DownloadInfo *info);
|
|
uLong HashFile (FSSpec *spec);
|
|
OSErr AdFailureCheck (NagUsageHandle nagUsage, uLong currentTime, Boolean *nagMe, short *dialogID, PStr errString);
|
|
Boolean HitMeHitMeHitMe (EventRecord *event, DialogPtr theDialog, short itemHit, long dialogRefcon); // just returns true
|
|
short GrowGroupItems(WindowPtr win,ControlHandle parentCntl);
|
|
Boolean IsGroupControl(ControlHandle cntl);
|
|
|
|
void AutoSwitchClientMode(void);
|
|
Boolean DoPlaylistNag(short nagID);
|
|
void JunkDownDialog (void);
|
|
|
|
#ifdef DEBUG
|
|
void DebugNagging (void);
|
|
#endif
|
|
|
|
#endif
|
|
#endif |