From 9d8dbcc95c9e3ea959f034d5ddb2edcc71fe1f59 Mon Sep 17 00:00:00 2001 From: Joseph Spiros Date: Tue, 30 Sep 2003 01:48:31 +0000 Subject: [PATCH] Adding loads of neato registration stuff! --- English.lproj/Localizable.strings | 7 +- MTBlingController.h | 33 +++++ MTBlingController.m | 146 ++++++++++++++++++ MTShizzleWindow.h | 18 +++ MTShizzleWindow.m | 180 ++++++++++++++++++++++ MTeSerialNumber.h | 132 +++++++++++++++++ MTeSerialNumber.m | 239 ++++++++++++++++++++++++++++++ MainController.h | 8 + MainController.m | 30 ++++ MenuController.h | 3 +- MenuController.m | 16 ++ esellerate.gif | Bin 0 -> 1169 bytes libValidate.a | Bin 0 -> 8032 bytes validate.h | 36 +++++ 14 files changed, 846 insertions(+), 2 deletions(-) create mode 100755 MTBlingController.h create mode 100755 MTBlingController.m create mode 100755 MTShizzleWindow.h create mode 100755 MTShizzleWindow.m create mode 100755 MTeSerialNumber.h create mode 100755 MTeSerialNumber.m create mode 100755 esellerate.gif create mode 100755 libValidate.a create mode 100755 validate.h diff --git a/English.lproj/Localizable.strings b/English.lproj/Localizable.strings index fc317b5..b501a3f 100755 --- a/English.lproj/Localizable.strings +++ b/English.lproj/Localizable.strings @@ -27,4 +27,9 @@ autolaunch_msg = "Would you like MenuTunes to automatically launch at login?"; duplicateCombo = "Duplicate Key Combo"; duplicateCombo_msg = "The specified key combo is already in use..."; replace = "Replace"; -cancel = "Cancel"; \ No newline at end of file +cancel = "Cancel"; +register = "Register MenuTunes..."; +validated_title = "Registration Successful"; +validated_msg = "Your license key has been validated and stored. Thank you for your support."; +failed_title = "Registration Failed"; +failed_msg = "Your license key could not be validated. Be sure that the name you entered matches the license key."; \ No newline at end of file diff --git a/MTBlingController.h b/MTBlingController.h new file mode 100755 index 0000000..642bdc9 --- /dev/null +++ b/MTBlingController.h @@ -0,0 +1,33 @@ +// +// MTBlingController.h +// MenuTunes +// +// Created by Matthew L. Judy on Tue Aug 19 2003. +// Copyright (c) 2003 NibFile.com. All rights reserved. +// + +#import +#import "MTShizzleWindow.h" + +@interface MTBlingController : NSObject { + + MTShizzleWindow *window; + + int checkDone; + +} + + +- (void)showPanel; +- (void)showPanelIfNeeded; + +- (void)goToTheStore:(id)sender; +- (void)registerLater:(id)sender; +- (void)verifyKey:(id)sender; + +- (int)checkKeyFile; +- (int)checkDone; + +- (void)test:(id)sender; + +@end diff --git a/MTBlingController.m b/MTBlingController.m new file mode 100755 index 0000000..bc20477 --- /dev/null +++ b/MTBlingController.m @@ -0,0 +1,146 @@ +// +// MTBlingController.m +// MenuTunes +// +// Created by Matthew L. Judy on Tue Aug 19 2003. +// Copyright (c) 2003 iThink Software. All rights reserved. +// + +#import "MTBlingController.h" +#import "MTeSerialNumber.h" + +#define APP_SUPPORT_PATH_STRING [@"~/Library/Application Support/MenuTunes/" stringByExpandingTildeInPath] +#define LICENSE_PATH_STRING [APP_SUPPORT_PATH_STRING stringByAppendingString:@"/.license"] + + +@interface MTBlingController (Private) +- (void)showPanel; +@end + + +@implementation MTBlingController + + +- (void)_HEY {} +- (void)_SUCKA {} +- (void)_QUIT {} +- (void)_HACKING {} +- (void)_AND {} +- (void)_GO {} +- (void)_BUY {} +- (void)_IT {} +- (void)_YOU {} +- (void)_TIGHTWAD {} + +- (id)init +{ + if ( ( self = [super init] ) ) { + checkDone = 0; + } + return self; +} + + +- (void)showPanel +{ + if ( ! window ) { + window = [MTShizzleWindow sharedWindowForSender:self]; + } + + [window center]; + [window makeKeyAndOrderFront:nil]; + [window setLevel:NSStatusWindowLevel]; +} + +- (void)showPanelIfNeeded +{ + if ( ! (checkDone == 2475) ) { + if ( ! ([self checkKeyFile] == 7465) ) { + [self showPanel]; + } else { + checkDone = 2475; + } + } +} + +- (void)goToTheStore:(id)sender +{ + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://store.eSellerate.net/s.asp?s=STR090894476"]]; +} + +- (void)registerLater:(id)sender +{ + [window orderOut:self]; +} + +- (void)verifyKey:(id)sender +{ + NSString *o = [window owner]; + NSString *k = [window key]; + + MTeSerialNumber *s = [[[MTeSerialNumber alloc] initWithSerialNumber:k + name:o + extra:nil + publisher:@"04611"] autorelease]; + if ( [s isValid] == ITeSerialNumberIsValid && ( [[s infoDictionary] objectForKey:@"appIdentifier"] == @"MT" ) ) { + + NSFileManager *fm = [NSFileManager defaultManager]; + + if ( ! [fm fileExistsAtPath:APP_SUPPORT_PATH_STRING] ) { + [fm createDirectoryAtPath:APP_SUPPORT_PATH_STRING attributes:nil]; + } + + [[NSDictionary dictionaryWithObjectsAndKeys: + o, @"Owner", + k, @"Key", + nil] writeToFile:LICENSE_PATH_STRING atomically:YES]; + + checkDone = 2475; + + NSBeginInformationalAlertSheet(NSLocalizedString(@"validated_title", @"Validated Title"), + @"Thank You!", nil, nil, + window, + self, + @selector(finishValidSheet:returnCode:contextInfo:), + nil, + nil, + NSLocalizedString(@"validated_msg", @"Validated Message")); + + } else { + + NSBeginAlertSheet(NSLocalizedString(@"failed_title", @"Failed Title"), + @"Try Again", nil, nil, + window, + self, + nil, nil, nil, + NSLocalizedString(@"failed_msg", @"Failed Message")); + } + +} + +- (int)checkKeyFile +{ + NSString *p = LICENSE_PATH_STRING; + MTeSerialNumber *k = [[[MTeSerialNumber alloc] initWithContentsOfFile:p + extra:@"" + publisher:@"04611"] autorelease]; + if ( k && [k isValid] == ITeSerialNumberIsValid && ( [[k infoDictionary] objectForKey:@"appIdentifier"] == @"MT" )) { + return 7465; + } else { + [[NSFileManager defaultManager] removeFileAtPath:p handler:nil]; + return 0; + } + +} + +- (int)checkDone +{ + return checkDone; +} + +- (void)finishValidSheet:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + [window orderOut:self]; +} + +@end diff --git a/MTShizzleWindow.h b/MTShizzleWindow.h new file mode 100755 index 0000000..ea1fac4 --- /dev/null +++ b/MTShizzleWindow.h @@ -0,0 +1,18 @@ +#import + +@interface MTShizzleWindow : NSWindow +{ + NSTextField *regMessage, *regBenefits, *enterInfo, *owner, *key; + NSTextField *ownerEntry, *keyEntry; + NSView *contentView; + NSBox *box; + NSButton *registerButton, *regLater, *verifyKey; + + id _sender; +} + ++ (id)sharedWindowForSender:(id)sender; +- (NSString *)owner; +- (NSString *)key; + +@end \ No newline at end of file diff --git a/MTShizzleWindow.m b/MTShizzleWindow.m new file mode 100755 index 0000000..b5241c8 --- /dev/null +++ b/MTShizzleWindow.m @@ -0,0 +1,180 @@ +#import "MTShizzleWindow.h" + +@interface MTShizzleWindow (Private) +- (void)setBling:(id)bling; +- (void)buildWindow; +- (void)setTargets; +@end + +@implementation MTShizzleWindow + +static MTShizzleWindow *_privateSharedWindow = nil; + ++ (id)sharedWindowForSender:(id)sender +{ + if( _privateSharedWindow ) { + [_privateSharedWindow setBling:sender]; + return _privateSharedWindow; + } else { + _privateSharedWindow = [[MTShizzleWindow alloc] + initWithContentRect:NSMakeRect(0, 0, 385, 353) + styleMask:NSTitledWindowMask + backing:NSBackingStoreBuffered + defer:YES]; + [_privateSharedWindow setBling:sender]; + return _privateSharedWindow; + } +} + +- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag +{ + if ( (self = [super initWithContentRect:contentRect + styleMask:styleMask + backing:backingType + defer:flag]) ) { + [self buildWindow]; + } + return self; +} + +- (void)dealloc +{ + [regMessage release]; + [regBenefits release]; + [enterInfo release]; + [owner release]; + [key release]; + [ownerEntry release]; + [keyEntry release]; + [registerButton release]; + [regLater release]; + [verifyKey release]; + [contentView release]; + [box release]; + [super dealloc]; +} + +- (void)setBling:(id)bling +{ + _sender = bling; + [self setTargets]; +} + +- (void)buildWindow +{ + unichar returnChar = '\r'; + + [self setReleasedWhenClosed:NO]; + [self setTitle:[NSString stringWithFormat:@"Register %@", @"MenuTunes"]]; + contentView = [self contentView]; + + regMessage = [[NSTextField alloc] initWithFrame:NSMakeRect(20, 282, 345, 51)]; + [regMessage setStringValue:[NSString stringWithFormat:@"%@ is shareware. If you find it to be a valuable tool, please click the button below to buy your copy. Your support is greatly appreciated.", @"MenuTunes"]]; + [regMessage setBordered:NO]; + [regMessage setBezeled:NO]; + [regMessage setEditable:NO]; + [regMessage setSelectable:NO]; + [regMessage setDrawsBackground:NO]; + [contentView addSubview:regMessage]; + + //Make me gray! + box = [[NSBox alloc] initWithFrame:NSMakeRect(20, 181, 345, 81)]; + [box setTitlePosition:NSNoTitle]; + [box setBorderType:NSBezelBorder]; + [contentView addSubview:box]; + + //This isn't tall enough + registerButton = [[NSButton alloc] initWithFrame:NSMakeRect(24, 13, 115, 49)]; + [registerButton setImage:[NSImage imageNamed:@"esellerate"]]; + [registerButton setButtonType:NSMomentaryPushButton]; + [registerButton setBezelStyle:NSRegularSquareBezelStyle]; + [registerButton setTarget:_sender]; + [registerButton setAction:@selector(goToTheStore:)]; + [[box contentView] addSubview:registerButton]; + + regBenefits = [[NSTextField alloc] initWithFrame:NSMakeRect(152, 16, 175, 42)]; + [regBenefits setStringValue:[NSString stringWithUTF8String:"• Register instantly and easily.\n• Fast, secure transaction.\n• Major credit cards accepted."]]; + [regBenefits setBordered:NO]; + [regBenefits setBezeled:NO]; + [regBenefits setEditable:NO]; + [regBenefits setSelectable:NO]; + [regBenefits setDrawsBackground:NO]; + [regBenefits setFont:[NSFont fontWithName:@"Lucida Grande" size:11]]; + [[box contentView] addSubview:regBenefits]; + + enterInfo = [[NSTextField alloc] initWithFrame:NSMakeRect(20, 148, 345, 17)]; + [enterInfo setStringValue:@"Please enter your registration information below."]; + [enterInfo setBordered:NO]; + [enterInfo setBezeled:NO]; + [enterInfo setEditable:NO]; + [enterInfo setSelectable:NO]; + [enterInfo setDrawsBackground:NO]; + [enterInfo setFont:[NSFont fontWithName:@"Lucida Grande" size:13]]; + [contentView addSubview:enterInfo]; + + owner = [[NSTextField alloc] initWithFrame:NSMakeRect(20, 126, 345, 14)]; + [owner setStringValue:@"License Owner:"]; + [owner setBordered:NO]; + [owner setBezeled:NO]; + [owner setEditable:NO]; + [owner setSelectable:NO]; + [owner setDrawsBackground:NO]; + [owner setFont:[NSFont fontWithName:@"Lucida Grande" size:11]]; + [contentView addSubview:owner]; + + key = [[NSTextField alloc] initWithFrame:NSMakeRect(20, 82, 345, 14)]; + [key setStringValue:@"License Key:"]; + [key setBordered:NO]; + [key setBezeled:NO]; + [key setEditable:NO]; + [key setSelectable:NO]; + [key setDrawsBackground:NO]; + [key setFont:[NSFont fontWithName:@"Lucida Grande" size:11]]; + [contentView addSubview:key]; + + ownerEntry = [[NSTextField alloc] initWithFrame:NSMakeRect(20, 104, 345, 22)]; + [ownerEntry setTarget:_sender]; + [ownerEntry setAction:@selector(verifyKey:)]; + [contentView addSubview:ownerEntry]; + + keyEntry = [[NSTextField alloc] initWithFrame:NSMakeRect(20, 60, 345, 22)]; + [keyEntry setTarget:_sender]; + [keyEntry setAction:@selector(verifyKey:)]; + [contentView addSubview:keyEntry]; + + regLater = [[NSButton alloc] initWithFrame:NSMakeRect(138, 16, 116, 25)]; + [regLater setTitle:@"Register Later"]; + [regLater setTarget:_sender]; + [regLater setAction:@selector(registerLater:)]; + [regLater setBezelStyle:NSRoundedBezelStyle]; + [contentView addSubview:regLater]; + + verifyKey = [[NSButton alloc] initWithFrame:NSMakeRect(255, 16, 116, 25)]; + [verifyKey setTitle:@"Verify Key"]; + [verifyKey setTarget:_sender]; + [verifyKey setAction:@selector(verifyKey:)]; + [verifyKey setBezelStyle:NSRoundedBezelStyle]; + [verifyKey setKeyEquivalent:[NSString stringWithCharacters:&returnChar length:1]]; + [contentView addSubview:verifyKey]; +} + +- (void)setTargets +{ + [registerButton setTarget:_sender]; + [ownerEntry setTarget:_sender]; + [keyEntry setTarget:_sender]; + [regLater setTarget:_sender]; + [verifyKey setTarget:_sender]; +} + +- (NSString *)owner +{ + return [ownerEntry stringValue]; +} + +- (NSString *)key +{ + return [keyEntry stringValue]; +} + +@end diff --git a/MTeSerialNumber.h b/MTeSerialNumber.h new file mode 100755 index 0000000..3529dea --- /dev/null +++ b/MTeSerialNumber.h @@ -0,0 +1,132 @@ +/* + * MenuTunes + * MTeSerialNumber + * Object which represents, and operates on, + * an eSellerate serial number. + * + * Original Author : Matt Judy + * Responsibility : Matt Judy + * + * Copyright (c) 2003 iThink Software. + * All Rights Reserved + * + */ + +#import + + +typedef enum { + ITeSerialNumberIsDead = -1 , + ITeSerialNumberIsInvalid = 0 , + ITeSerialNumberIsValid = 1 +} MTeSerialNumberValidationResult; + +typedef enum { + ITeSerialNumberWillNotExpire = -1 , + ITeSerialNumberHasExpired = 0 , + ITeSerialNumberWillExpire = 1 +} MTeSerialNumberExpirationResult; + + +@interface MTeSerialNumber : NSObject { + NSString *_serialNumber; + NSString *_nameBasedKey; + NSString *_extraDataKey; + NSString *_publisherKey; + + NSArray *_deadSerials; +} + +/*************************************************************************/ +#pragma mark - +#pragma mark INITIALIZATION METHODS +/*************************************************************************/ + +/*! + @method initWithSerialNumber:name:extra:publisher: + @abstract Creates an ITeSerialNumber with the information provided. + @discussion This is the designated initializer for this class. + @param serial The eSellerate serial number + @param name The name-based key for the serial number + @param extra This is present for future use. eSellerate does not use this data yet. Pass nil. + @param publisher The publisher key, provided by the Serial Number management part of eSellerate. + @result The newly initialized object. +*/ +- (id)initWithSerialNumber:(NSString *)serial + name:(NSString *)name + extra:(NSString *)extra // Extra data not used. Pass nil. + publisher:(NSString *)publisher; + +/*! + @method initWithDictionary: + @abstract Creates an ITeSerialNumber with the information provided in dictionary form + @discussion Utilizes initWithSerialNumber:name:extra:publisher: + @param dict Consists of 4 keys, and 4 NSStrings. The keys must be named + "Key", "Owner", "Extra", and "Publisher". + @result The newly initialized object. +*/ +- (id)initWithDictionary:(NSDictionary *)dict; + +/*! + @method initWithContentsOfFile:extra:publisher: + @abstract Creates an ITeSerialNumber from the combination of a plist, and arguments. + @discussion Only the serial (Key) and name (Owner) should ever be stored in the plist, + for security. This method will ignore any other data present in the file. + @param path Path to the file on disk. This file must be a plist containing one dictionary. + @param extra eSellerate extra data. Currently unused by eSellerate. Pass nil. + @param publisher The publisher key, provided by the Serial Number management part of eSellerate. + @result The newly initialized object. +*/ +- (id)initWithContentsOfFile:(NSString *)path + extra:(NSString *)extra + publisher:(NSString *)publisher; + + +/*************************************************************************/ +#pragma mark - +#pragma mark ACCESSOR METHODS +/*************************************************************************/ + +- (NSString *)serialNumber; +- (void)setSerialNumber:(NSString *)newSerial; + +- (NSString *)nameBasedKey; +- (void)setNameBasedKey:(NSString *)newName; + +- (NSString *)extraDataKey; +- (void)setExtraDataKey:(NSString *)newData; + +- (NSString *)publisherKey; +- (void)setPublisherKey:(NSString *)newPublisher; + +- (NSArray *)deadSerials; +- (void)setDeadSerials:(NSArray *)newList; + + +/*************************************************************************/ +#pragma mark - +#pragma mark INSTANCE METHODS +/*************************************************************************/ + +/*! + @method isValid + @abstract Checks the current serial for validity. + @result ITeSerialNumberValidationResult, based on the current serial's validity. +*/ +- (MTeSerialNumberValidationResult)isValid; + +/*! + @method isExpired + @abstract Tests for validity, and returns whether or not the + serial is expired, or will expire. + @result YES if the serial will expire, NO if it will not. +*/ +- (MTeSerialNumberExpirationResult)isExpired; + +- (NSDate *)storedDate; + +- (NSTimeInterval)secondsRemaining; + +- (NSDictionary *)infoDictionary; + +@end diff --git a/MTeSerialNumber.m b/MTeSerialNumber.m new file mode 100755 index 0000000..9d8da42 --- /dev/null +++ b/MTeSerialNumber.m @@ -0,0 +1,239 @@ +#import "MTeSerialNumber.h" +#import "validate.h" + + +@interface MTeSerialNumber (Private) +- (short)validate; +- (eSellerate_String)eSellerateStringForString:(NSString *)string; +@end + +@implementation MTeSerialNumber + +/*************************************************************************/ +#pragma mark - +#pragma mark INITIALIZATION METHODS +/*************************************************************************/ + +- (id)initWithSerialNumber:(NSString *)serial + name:(NSString *)name + extra:(NSString *)extra + publisher:(NSString *)publisher +{ + if ( self = [super init] ) { + _serialNumber = serial; + _nameBasedKey = name; + _extraDataKey = nil; //extra data is currently unused. + _publisherKey = publisher; + _deadSerials = nil; + } + return self; +} + +- (id)initWithDictionary:(NSDictionary *)dict +{ + return [self initWithSerialNumber:[dict objectForKey:@"Key"] + name:[dict objectForKey:@"Owner"] + extra:[dict objectForKey:@"Extra"] + publisher:[dict objectForKey:@"Publisher"]]; +} + +- (id)initWithContentsOfFile:(NSString *)path + extra:(NSString *)extra + publisher:(NSString *)publisher +{ + NSDictionary *fileDict = [[[NSDictionary alloc] initWithContentsOfFile:path] autorelease]; + + if ( fileDict ) { + NSMutableDictionary *dict = [[[NSMutableDictionary alloc] initWithCapacity:4] autorelease]; + + [dict setObject:[fileDict objectForKey:@"Key"] forKey:@"Key"]; + [dict setObject:[fileDict objectForKey:@"Owner"] forKey:@"Owner"]; + [dict setObject:extra forKey:@"Extra"]; + [dict setObject:publisher forKey:@"Publisher"]; + + return [self initWithDictionary:dict]; + } else { + return nil; + } +} + + +/*************************************************************************/ +#pragma mark - +#pragma mark ACCESSOR METHODS +/*************************************************************************/ + +- (NSString *)serialNumber +{ + return _serialNumber; +} + +- (void)setSerialNumber:(NSString *)newSerial +{ + [_serialNumber autorelease]; + _serialNumber = [newSerial copy]; +} + +- (NSString *)nameBasedKey +{ + return _nameBasedKey; +} + +- (void)setNameBasedKey:(NSString *)newName +{ + [_nameBasedKey autorelease]; + _nameBasedKey = [newName copy]; +} + +- (NSString *)extraDataKey +{ + return _extraDataKey; +} + +- (void)setExtraDataKey:(NSString *)newData +{ + [_extraDataKey autorelease]; + _extraDataKey = [newData copy]; +} + +- (NSString *)publisherKey +{ + return _publisherKey; +} + +- (void)setPublisherKey:(NSString *)newPublisher +{ + [_publisherKey autorelease]; + _publisherKey = [newPublisher copy]; +} + +- (NSArray *)deadSerials +{ + return _deadSerials; +} + +- (void)setDeadSerials:(NSArray *)newList +{ + [_deadSerials autorelease]; + _deadSerials = [newList copy]; +} + + +/*************************************************************************/ +#pragma mark - +#pragma mark INSTANCE METHODS +/*************************************************************************/ + +- (MTeSerialNumberValidationResult)isValid +{ + if ( _serialNumber ) { + + BOOL dead = NO; + + if ( [_deadSerials count] ) { + NSEnumerator *deadEnum = [_deadSerials objectEnumerator]; + id aDeadSerial; + + while ( aDeadSerial = [deadEnum nextObject] ) { + if ( [aDeadSerial isEqualToString:_serialNumber] ) { + dead = YES; + } + } + } + + if ( dead ) { + return ITeSerialNumberIsDead; + } else { + return ( ( [self validate] > 0 ) ? ITeSerialNumberIsValid : ITeSerialNumberIsInvalid ); + } + } else { + return nil; + } +} + +- (MTeSerialNumberExpirationResult)isExpired; +{ + return ( ! [self secondsRemaining] > 0 ); +} + +- (NSDate *)storedDate +{ + NSCalendarDate *refDate = [NSCalendarDate dateWithYear:2000 month:1 day:1 + hour:0 minute:0 second:0 + timeZone:[NSTimeZone systemTimeZone]]; + + NSTimeInterval secondsFromRefToExp = ([self validate] * 86400); + + return [[[NSDate alloc] initWithTimeInterval:secondsFromRefToExp + sinceDate:refDate] autorelease]; +} + +- (NSTimeInterval)secondsRemaining +{ + return [[self storedDate] timeIntervalSinceDate:[NSDate date]]; +} + +- (NSDictionary *)infoDictionary +{ + NSString *prefix = [[_serialNumber componentsSeparatedByString:@"-"] objectAtIndex:0]; + NSString *appIdentifier = nil; + NSString *version = nil; + NSString *typeCode = nil; + NSString *quantity = nil; + + if ( ( [prefix length] == 10 ) || ( [prefix length] == 7 ) ) { + appIdentifier = [_serialNumber substringWithRange:NSMakeRange(0,2)]; + version = [_serialNumber substringWithRange:NSMakeRange(2,3)]; + typeCode = [_serialNumber substringWithRange:NSMakeRange(5,2)]; + } else { + return nil; + } + + if ( [prefix length] == 10 ) { + quantity = [_serialNumber substringWithRange:NSMakeRange(7,3)]; + } + + return [NSDictionary dictionaryWithObjectsAndKeys: + appIdentifier, @"appIdentifier", + version, @"version", + typeCode, @"typeCode", + quantity, @"quantity", nil]; +} + + +/*************************************************************************/ +#pragma mark - +#pragma mark PRIVATE IMPLEMENTATIONS +/*************************************************************************/ + +- (short)validate +{ + eSellerate_String pSerial = [self eSellerateStringForString:_serialNumber]; + eSellerate_String pName = [self eSellerateStringForString:_nameBasedKey]; + eSellerate_String pExtraData = [self eSellerateStringForString:_extraDataKey]; + eSellerate_String pPublisher = [self eSellerateStringForString:_publisherKey]; + + return eSellerate_ValidateSerialNumber(pSerial, + pName, + pExtraData, + pPublisher); +} + +- (eSellerate_String)eSellerateStringForString:(NSString *)string +{ + if ( string ) { + NSMutableData *buffer = [[[NSMutableData alloc] initWithCapacity:256] autorelease]; + + CFStringGetPascalString( (CFStringRef)string, + [buffer mutableBytes], + 256, + CFStringGetSystemEncoding()); + + return (eSellerate_String)[buffer bytes]; + } else { + return nil; + } +} + + +@end diff --git a/MainController.h b/MainController.h index 6383a8d..c6fd5f3 100755 --- a/MainController.h +++ b/MainController.h @@ -17,6 +17,7 @@ #import #import #import +#import "MTBlingController.h" @class StatusWindowController, MenuController; @@ -36,12 +37,19 @@ StatusWindowController *statusWindowController; //Shows status windows MenuController *menuController; NSUserDefaults *df; + + NSDate *blingDate; + MTBlingController *bling; } + (MainController *)sharedController; - (void)menuClicked; //Methods called from MenuController by menu items +- (void)blingTime; +- (void)blingNow; +- (BOOL)blingBling; + - (void)playPause; - (void)nextSong; - (void)prevSong; diff --git a/MainController.m b/MainController.m index a480e3b..06ae1d9 100755 --- a/MainController.m +++ b/MainController.m @@ -50,6 +50,9 @@ static MainController *sharedController; SetITDebugMode(YES); } + bling = [[MTBlingController alloc] init]; + blingDate = nil; + currentRemote = [self loadRemote]; [currentRemote begin]; @@ -142,6 +145,32 @@ static MainController *sharedController; [pool release]; }*/ +- (void)blingTime +{ + NSDate *now = [NSDate date]; + if ( (! blingDate) || ([now timeIntervalSinceDate:blingDate] >= 86400) ) { + [bling showPanelIfNeeded]; + [blingDate autorelease]; + blingDate = [now retain]; + } +} + +- (void)blingNow +{ + [bling showPanel]; + [blingDate autorelease]; + blingDate = [[NSDate date] retain]; +} + +- (BOOL)blingBling +{ + if ( ! ([bling checkDone] == 2475) ) { + return NO; + } else { + return YES; + } +} + - (BOOL)songIsPlaying { return ( ! ([[currentRemote playerStateUniqueIdentifier] isEqualToString:@"0-0"]) ); @@ -688,6 +717,7 @@ static MainController *sharedController; - (void)dealloc { [self applicationTerminated:nil]; + [bling release]; [statusItem release]; [statusWindowController release]; [menuController release]; diff --git a/MenuController.h b/MenuController.h index a3da9e5..55ae240 100755 --- a/MenuController.h +++ b/MenuController.h @@ -35,7 +35,8 @@ typedef enum { MTMenuNextTrackItem, MTMenuShowPlayerItem, MTMenuPreferencesItem, - MTMenuQuitItem + MTMenuQuitItem, + MTMenuRegisterItem } MTMenuItemTag; @interface MenuController : NSObject diff --git a/MenuController.m b/MenuController.m index 332e7f8..f57f331 100755 --- a/MenuController.m +++ b/MenuController.m @@ -199,6 +199,12 @@ keyEquivalent:@""]; [tempItem setTag:MTMenuQuitItem]; [tempItem setTarget:self]; + if ([[MainController sharedController] blingBling] == NO) { + ITDebugLog(@"Add \"Register MenuTunes...\" menu item."); + tempItem = [menu addItemWithTitle:NSLocalizedString(@"register", @"Register MenuTunes...") action:@selector(performMainMenuAction:) keyEquivalent:@""]; + [tempItem setTag:MTMenuRegisterItem]; + [tempItem setTarget:self]; + } } else if ([nextObject isEqualToString:@"trackInfo"]) { ITDebugLog(@"Check to see if a Track is playing..."); //Handle playing radio too @@ -352,6 +358,12 @@ tempItem = [menu addItemWithTitle:NSLocalizedString(@"preferences", @"Preferences...") action:@selector(performMainMenuAction:) keyEquivalent:@""]; [tempItem setTag:MTMenuPreferencesItem]; [tempItem setTarget:self]; + if ([[MainController sharedController] blingBling] == NO) { + ITDebugLog(@"Add \"Register MenuTunes...\" menu item."); + tempItem = [menu addItemWithTitle:NSLocalizedString(@"register", @"Register MenuTunes...") action:@selector(performMainMenuAction:) keyEquivalent:@""]; + [tempItem setTag:MTMenuRegisterItem]; + [tempItem setTarget:self]; + } ITDebugLog(@"Add \"Quit\" menu item."); tempItem = [menu addItemWithTitle:NSLocalizedString(@"quit", @"Quit") action:@selector(performMainMenuAction:) keyEquivalent:@""]; [tempItem setTag:MTMenuQuitItem]; @@ -526,6 +538,10 @@ ITDebugLog(@"Performing Menu Action: Quit"); [[MainController sharedController] quitMenuTunes]; break; + case MTMenuRegisterItem: + ITDebugLog(@"Performing Menu Action: Register"); + [[MainController sharedController] blingNow]; + break; default: ITDebugLog(@"Performing Menu Action: Unimplemented Menu Item OR Child-bearing Menu Item"); break; diff --git a/esellerate.gif b/esellerate.gif new file mode 100755 index 0000000000000000000000000000000000000000..5b5c5d9d7f5719c72013c99239cede9705e642c3 GIT binary patch literal 1169 zcmbV{|3A}t0LR~-nc3E?5Ba+5^qEXy?wlTvkh(rrGSmY-`u-4?l+n&1ii;kz&tfeq zBBHcq9M+IyP4v07ZpA1n`Ig72$UU^`H0N8T-F1J$y?%K9_Ix}aub|*9zJ3Q{feUyF zfXQS!T3FGn>jD6jHmHYRzVh+$QMR;;3zG>;G@e1>%1q`wPE(0wj}0ki=y(&UMIB zI{E9a_SU2hN0RFYEDDlYL^a`C$m922X9somewVXz6(@W3wnKUj&LdLM$%-OmZ2ZUJ-E$AXt(u$Ex#`GO>h)(YYl}^2ts(~%Q95?lU93FOD_}unuRjpW@o(^tHd06y z_|_&?sA-Hrw=w1)S?_9+ZrtxxhVS`Fl_Y7F7E-*;(!M2e}m|JrC}n+`sHJ+2TEvFz(F^E-2s_^WM2eRjaJy z_iBFJsa_v3^hr{m6xz&>keP+6uRBXX-}?R?ryF1V7L|3S(B5d+yY0rw7u54}(nH%B zBK97>QXE$&O>@R2`udu*GIr+l>pe*Hb~e^tj(m5WO z(~l*%=iR0s;VX_i9n^sCi*=pE_=h1}<%2}2hqzcZ{N|T7YA99l@K%Q>vuo{%s-`hq zThF1ket*P}&P2+jRj#qV-U%&B7ic|Ji&0MdrKn-3XxS6P_+6WBMKX>Iw6j1;!UqYt z+j*;AZ`LvFRoyT?S(R_UeJh#dNDDuD&uU=cS81-b5L{{4ig>!Ye&RAoI}AQr1xQqO Up7vC|J+@(5=XujA0094g00}nt<^TWy literal 0 HcmV?d00001 diff --git a/libValidate.a b/libValidate.a new file mode 100755 index 0000000000000000000000000000000000000000..344ebc52b863a162c6236eab4e439196b392bd13 GIT binary patch literal 8032 zcmeHMe|%Hdbw5v%CD|Bbf&qh#ErMyB;y5z4L10Jq51BZz0fPm$DUBpc0xL1LV~Zd! z&q&7Zst&ffg>6ntioF1#g}Q9ZR+7-f36OS8*RqanbRlWdcr{z-Mi;h0Vyu17dsnt> zh}Z7(S^w($e4frZ_xwKh-21NHTUzXDcQ;uRmgPN|x5_km<(XF%SS%|G3(Y1|p*atX zmB37+iF6#~vvA*~hAFQ7}n zYysB^m>}RH0e>XmEdehGcwNAk1cYnFZ<(O$1+5WqqZmIS;1|Srn`47F;IH+1J>+=U z+v06^`Mpf#O(j=OlI5Gr?XJdVFFDFvceU;IdoeJ{t#oxXmA87pt!>)9V}~l%@|3sT z|456!wanGw&4;b>R%K{id+V;~5WF@wEAAazUClm^5=Xnw)x2T%u10S=IbsCttsYk= zIjURtc-zZik{pk;`23q)ElLssDeLrmJJ`dPmJZ*}7O$taskPnDTD48S9Y8950;%=4 z``Ti|Q&f3in(7_n)vYZ%$x+kp-Qf$Yclq5-g90QE9&i0DhlHdsQQF{npcg{twg#g z6E@tfu4ZqC+v{;);#>}gt<+vR!3GlFhac!BHUlE&iECCAb10foisQP&Mn6o1VS}TM zwK1U-8wY1~XD*2**gz~vV^Bgo^BK-XE-`Vm`P?0yyBb@Y9UcDNjd$8eI*n4J9&>TC zjRn1cWg*fj^#q>fa5TFd!bY1Py?aM4$;FV%K`m2N8>xo?IR>5^B^HOH1p%mWe1eT8 z$YK)a*#Hs8#H9zefGLNgv7=*R_--}je$cUvYKXl^%{tUF#`%J8#Tudz84ug_*&%V!NJIlgWZwqeG(bVj!<0i zs^)lckSL^0w%bW(%^WU$zV3Xlb#koNnogz92ajq}>dx*TuREu+7P~`KHxPPE)@o8@ z=g(3sT9R144>qEDm;fpXQMy9AF%BJzHWHaG$3C+uL?!zu(c&aRAyT3?m?vuu1tG*L z8@0!KkV6l0=s^xW$YDc>Owrt8^Re$}8mZZFZQTBOz18m2Tjc>wp!iiH%Q53AIgW

2`S4M1SxPn2yu)hUh`<3 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 Gg#Q68)(A)d literal 0 HcmV?d00001 diff --git a/validate.h b/validate.h new file mode 100755 index 0000000..4e5f639 --- /dev/null +++ b/validate.h @@ -0,0 +1,36 @@ +/* + *validate.h + * Copyright 2000-2002, eSellerate Inc. + * All rights reserved worldwide. + */ + +#ifndef _VALIDATE_API_H_ +#define _VALIDATE_API_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned char* eSellerate_String; + +typedef short eSellerate_DaysSince2000; + +eSellerate_DaysSince2000 eSellerate_ValidateSerialNumber ( + eSellerate_String serialNumber, /* ASCII Pascal string */ + eSellerate_String nameBasedKey, /* ASCII Pascal string (nil if unneeded) */ + eSellerate_String extraDataKey, /* ASCII Pascal string (nil if unneeded) */ + eSellerate_String publisherKey /* ASCII Pascal string (nil if unneeded) */ +); +/* + * return codes: + * if valid: date (days since January 1 2000) of expiration or (non-expiring) purchase + * if invalid: 0 + */ + +eSellerate_DaysSince2000 eSellerate_Today ( ); /* days from 1/1/2000 to today */ + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file -- 2.20.1