/* Cydia - iPhone UIKit Front-End for Debian APT
- * Copyright (C) 2008-2009 Jay Freeman (saurik)
+ * Copyright (C) 2008-2010 Jay Freeman (saurik)
*/
/* Modified BSD License {{{ */
#include <ext/stdio_filebuf.h>
+#undef ABS
+
#include <apt-pkg/acquire.h>
#include <apt-pkg/acquire-item.h>
#include <apt-pkg/algorithms.h>
#define _end }
/* }}} */
-/* Objective-C Handle<> {{{ */
-template <typename Type_>
-class _H {
- typedef _H<Type_> This_;
-
- private:
- Type_ *value_;
-
- _finline void Retain_() {
- if (value_ != nil)
- [value_ retain];
- }
-
- _finline void Clear_() {
- if (value_ != nil)
- [value_ release];
- }
-
- public:
- _finline _H(const This_ &rhs) :
- value_(rhs.value_ == nil ? nil : [rhs.value_ retain])
- {
- }
-
- _finline _H(Type_ *value = NULL, bool mended = false) :
- value_(value)
- {
- if (!mended)
- Retain_();
- }
-
- _finline ~_H() {
- Clear_();
- }
-
- _finline operator Type_ *() const {
- return value_;
- }
-
- _finline This_ &operator =(Type_ *value) {
- if (value_ != value) {
- Type_ *old(value_);
- value_ = value;
- Retain_();
- if (old != nil)
- [old release];
- } return *this;
- }
-};
-/* }}} */
#define _pooled _H<NSAutoreleasePool> _pool([[NSAutoreleasePool alloc] init], true);
+static const NSUInteger UIViewAutoresizingFlexibleBoth(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
+
void NSLogPoint(const char *fix, const CGPoint &point) {
NSLog(@"%s(%g,%g)", fix, point.x, point.y);
}
NSLog(@"%s(%g,%g)+(%g,%g)", fix, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
}
+static _finline NSString *CydiaURL(NSString *path) {
+ char page[25];
+ page[0] = 'h'; page[1] = 't'; page[2] = 't'; page[3] = 'p'; page[4] = ':';
+ page[5] = '/'; page[6] = '/'; page[7] = 'c'; page[8] = 'y'; page[9] = 'd';
+ page[10] = 'i'; page[11] = 'a'; page[12] = '.'; page[13] = 's'; page[14] = 'a';
+ page[15] = 'u'; page[16] = 'r'; page[17] = 'i'; page[18] = 'k'; page[19] = '.';
+ page[20] = 'c'; page[21] = 'o'; page[22] = 'm'; page[23] = '/'; page[24] = '\0';
+ return [[NSString stringWithUTF8String:page] stringByAppendingString:path];
+}
+
/* [NSObject yieldToSelector:(withObject:)] {{{*/
@interface NSObject (Cydia)
- (id) yieldToSelector:(SEL)selector withObject:(id)object;
@end
/* }}} */
+@interface CYActionSheet : UIActionSheet {
+ unsigned button_;
+}
+
+- (int) yieldToPopupAlertAnimated:(BOOL)animated;
+@end
+
+@implementation CYActionSheet
+
+- (id) initWithTitle:(NSString *)title buttons:(NSArray *)buttons defaultButtonIndex:(int)index {
+ if ((self = [super initWithTitle:title buttons:buttons defaultButtonIndex:index delegate:self context:nil]) != nil) {
+ } return self;
+}
+
+- (void) alertSheet:(UIActionSheet *)sheet buttonClicked:(int)button {
+ button_ = button;
+}
+
+- (int) yieldToPopupAlertAnimated:(BOOL)animated {
+ button_ = 0;
+ [self popupAlertAnimated:animated];
+ NSRunLoop *loop([NSRunLoop currentRunLoop]);
+ NSDate *future([NSDate distantFuture]);
+ while (button_ == 0 && [loop runMode:NSDefaultRunLoopMode beforeDate:future]);
+ return button_;
+}
+
+@end
+
/* NSForcedOrderingSearch doesn't work on the iPhone */
static const NSStringCompareOptions MatchCompareOptions_ = NSLiteralSearch | NSCaseInsensitiveSearch;
static const NSStringCompareOptions LaxCompareOptions_ = NSNumericSearch | NSDiacriticInsensitiveSearch | NSWidthInsensitiveSearch | NSCaseInsensitiveSearch;
- (void) popSubview:(UIView *)view {
UITransitionView *transition([[[PopTransitionView alloc] initWithFrame:[self bounds]] autorelease]);
- [transition setDelegate:transition];
+ [transition setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[self addSubview:transition];
- UIView *blank = [[[UIView alloc] initWithFrame:[transition bounds]] autorelease];
+ [transition setDelegate:transition];
+
+ UIView *blank([[[UIView alloc] initWithFrame:[transition bounds]] autorelease]);
+ [blank setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[transition transition:UITransitionNone toView:blank];
[transition transition:UITransitionPushFromBottom toView:view];
}
#define lprintf(args...) fprintf(stderr, args)
-#define ForRelease 0
+#define ForRelease 1
#define TraceLogging (1 && !ForRelease)
#define HistogramInsertionSort (0 && !ForRelease)
#define ProfileTimes (0 && !ForRelease)
#define ForSaurik (0 && !ForRelease)
-#define LogBrowser (1 && !ForRelease)
+#define LogBrowser (0 && !ForRelease)
#define TrackResize (0 && !ForRelease)
-#define ManualRefresh (1 && !ForRelease)
+#define ManualRefresh (0 && !ForRelease)
#define ShowInternals (0 && !ForRelease)
#define IgnoreInstall (0 && !ForRelease)
#define RecycleWebViews 0
-#define RecyclePackageViews 1
+#define RecyclePackageViews (1 && ForRelease)
#define AlwaysReload (0 && !ForRelease)
#if !TraceLogging
@end
/* }}} */
+NSUInteger WebScriptObject$countByEnumeratingWithState$objects$count$(WebScriptObject *self, SEL sel, NSFastEnumerationState *state, id *objects, NSUInteger count) {
+ size_t length([self count] - state->state);
+ if (length <= 0)
+ return 0;
+ else if (length > count)
+ length = count;
+ for (size_t i(0); i != length; ++i)
+ objects[i] = [self objectAtIndex:state->state++];
+ state->itemsPtr = objects;
+ state->mutationsPtr = (unsigned long *) self;
+ return length;
+}
+
NSUInteger DOMNodeList$countByEnumeratingWithState$objects$count$(DOMNodeList *self, SEL sel, NSFastEnumerationState *state, id *objects, NSUInteger count) {
size_t length([self length] - state->state);
if (length <= 0)
- (NSString *) stringByCachingURLWithCurrentCDN {
return [self
- stringByReplacingOccurrencesOfString:@"://"
- withString:@"://ne.edgecastcdn.net/8003A4/"
- options:0
- /* XXX: this is somewhat inaccurate */
- range:NSMakeRange(0, 10)
+ stringByReplacingOccurrencesOfString:@"://cydia.saurik.com/"
+ withString:@"://cache.cydia.saurik.com/"
];
}
if (size_ == 0)
return nil;
cache_ = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast<uint8_t *>(data_), size_, kCFStringEncodingUTF8, NO, kCFAllocatorNull);
+ if (cache_ == NULL)
+ cache_ = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast<uint8_t *>(data_), size_, kCFStringEncodingISOLatin1, NO, kCFAllocatorNull);
} return cache_;
}
/* Random Global Variables {{{ */
static const int PulseInterval_ = 50000;
+static const int ButtonBarWidth_ = 60;
static const int ButtonBarHeight_ = 48;
static const float KeyboardTime_ = 0.3f;
static NSString *Home_;
static BOOL Advanced_;
-static BOOL Loaded_;
static BOOL Ignored_;
static UIFont *Font12_;
static const NSString *System_ = NULL;
static const NSString *SerialNumber_ = nil;
static const NSString *ChipID_ = nil;
+static const NSString *Token_ = nil;
static const NSString *UniqueID_ = nil;
static const NSString *Build_ = nil;
static const NSString *Product_ = nil;
static bool Changed_;
static NSDate *now_;
+static bool IsWildcat_;
+
#if RecycleWebViews
static NSMutableArray *Documents_;
#endif
@interface NSObject (ProgressDelegate)
@end
-@implementation NSObject(ProgressDelegate)
-
-- (void) _setProgressError:(NSArray *)args {
- [self performSelector:@selector(setProgressError:forPackage:)
- withObject:[args objectAtIndex:0]
- withObject:([args count] == 1 ? nil : [args objectAtIndex:1])
- ];
-}
-
-@end
-
@protocol ProgressDelegate
-- (void) setProgressError:(NSString *)error forPackage:(NSString *)id;
+- (void) setProgressError:(NSString *)error withTitle:(NSString *)id;
- (void) setProgressTitle:(NSString *)title;
- (void) setProgressPercent:(float)percent;
- (void) startProgress;
- (void) setPackageView:(PackageView *)view;
- (void) clearPackage:(Package *)package;
- (void) installPackage:(Package *)package;
+- (void) installPackages:(NSArray *)packages;
- (void) removePackage:(Package *)package;
- (void) slideUp:(UIActionSheet *)alert;
- (void) distUpgrade;
delegate_ = delegate;
}
+ NSObject<ProgressDelegate> *getDelegate() const {
+ return delegate_;
+ }
+
virtual bool MediaChange(std::string media, std::string drive) {
return false;
}
virtual void Fetch(pkgAcquire::ItemDesc &item) {
//NSString *name([NSString stringWithUTF8String:item.ShortDesc.c_str()]);
- [delegate_ setProgressTitle:[NSString stringWithFormat:UCLocalize("DOWNLOADING"), [NSString stringWithUTF8String:item.ShortDesc.c_str()]]];
+ [delegate_ setProgressTitle:[NSString stringWithFormat:UCLocalize("DOWNLOADING_"), [NSString stringWithUTF8String:item.ShortDesc.c_str()]]];
}
virtual void Done(pkgAcquire::ItemDesc &item) {
NSArray *fields([description componentsSeparatedByString:@" "]);
NSString *source([fields count] == 0 ? nil : [fields objectAtIndex:0]);
- [delegate_ performSelectorOnMainThread:@selector(_setProgressError:)
+ [delegate_ performSelectorOnMainThread:@selector(_setProgressErrorPackage:)
withObject:[NSArray arrayWithObjects:
[NSString stringWithUTF8String:error.c_str()],
source,
protected:
virtual void Update() {
- if (abs(Percent - percent_) > 2) {
- NSLog(@"%s:%s:%f", Op.c_str(), SubOp.c_str(), Percent);
+ /*if (abs(Percent - percent_) > 2)
+ //NSLog(@"%s:%s:%f", Op.c_str(), SubOp.c_str(), Percent);
percent_ = Percent;
- }
+ }*/
/*[delegate_ setProgressTitle:[NSString stringWithUTF8String:Op.c_str()]];
[delegate_ setProgressPercent:(Percent / 100)];*/
delegate_ = delegate;
}
+ id getDelegate() const {
+ return delegate_;
+ }
+
virtual void Done() {
- NSLog(@"DONE");
+ //NSLog(@"DONE");
//[delegate_ setProgressPercent:1];
}
};
- (void) reloadData;
- (void) configure;
-- (void) prepare;
+- (bool) prepare;
- (void) perform;
-- (void) upgrade;
+- (bool) upgrade;
- (void) update;
- (void) setVisible;
-- (NSString *) updateWithStatus:(Status &)status;
+- (void) updateWithStatus:(Status &)status;
- (void) setDelegate:(id)delegate;
- (Source *) getSource:(pkgCache::PkgFileIterator)file;
+@end
+/* }}} */
+/* Delegate Helpers {{{ */
+@implementation NSObject(ProgressDelegate)
+
+- (void) _setProgressErrorPackage:(NSArray *)args {
+ [self performSelector:@selector(setProgressError:forPackage:)
+ withObject:[args objectAtIndex:0]
+ withObject:([args count] == 1 ? nil : [args objectAtIndex:1])
+ ];
+}
+
+- (void) _setProgressErrorTitle:(NSArray *)args {
+ [self performSelector:@selector(setProgressError:withTitle:)
+ withObject:[args objectAtIndex:0]
+ withObject:([args count] == 1 ? nil : [args objectAtIndex:1])
+ ];
+}
+
+- (void) _setProgressError:(NSString *)error withTitle:(NSString *)title {
+ [self performSelectorOnMainThread:@selector(_setProgressErrorTitle:)
+ withObject:[NSArray arrayWithObjects:error, title, nil]
+ waitUntilDone:YES
+ ];
+}
+
+- (void) setProgressError:(NSString *)error forPackage:(NSString *)id {
+ Package *package = id == nil ? nil : [[Database sharedInstance] packageWithName:id];
+ // XXX: holy typecast batman!
+ [(id<ProgressDelegate>)self setProgressError:error withTitle:(package == nil ? id : [package name])];
+}
+
@end
/* }}} */
host_ = [[host_ lowercaseString] retain];
if (host_ != nil)
- authority_ = [host_ retain];
+ authority_ = host_;
else
authority_ = [url path];
+
+ if (authority_ != nil)
+ authority_ = [authority_ retain];
}
- (Source *) initWithMetaIndex:(metaIndex *)index inPool:(apr_pool_t *)pool {
bool essential_;
bool required_;
bool visible_;
+ bool obsolete_;
NSString *latest_;
CYString installed_;
- (void) remove;
- (bool) isUnfilteredAndSearchedForBy:(NSString *)search;
+- (bool) isUnfilteredAndSelectedForBy:(NSString *)search;
- (bool) isInstalledAndVisible:(NSNumber *)number;
-- (bool) isVisiblyUninstalledInSection:(NSString *)section;
+- (bool) isVisibleInSection:(NSString *)section;
- (bool) isVisibleInSource:(Source *)source;
@end
CYString &rhi(PackageName(rhs, @selector(cyname)));
CFStringRef lhn(lhi), rhn(rhi);
+ if (lhn == NULL)
+ return rhn == NULL ? NSOrderedSame : NSOrderedAscending;
+ else if (rhn == NULL)
+ return NSOrderedDescending;
+
_profile(PackageNameCompare$NumbersLast)
if (!lhi.empty() && !rhi.empty()) {
UniChar lhc(CFStringGetCharacterAtIndex(lhn, 0));
}
- (void) setVisible {
- visible_ = required_ && [self hasSupportingRole] && [self unfiltered];
+ visible_ = required_ && [self unfiltered];
}
- (Package *) initWithVersion:(pkgCache::VerIterator)version withZone:(NSZone *)zone inPool:(apr_pool_t *)pool database:(Database *)database {
if (version == nil) {
[metadata_ setObject:latest_ forKey:@"LastVersion"];
changed = true;
- } else {
- if (![version isEqualToString:latest_]) {
+ } else if (![version isEqualToString:latest_]) {
[metadata_ setObject:latest_ forKey:@"LastVersion"];
lastSeen_ = now_;
[metadata_ setObject:lastSeen_ forKey:@"LastSeen"];
changed = true;
- } }
+ }
}
metadata_ = [metadata_ retain];
section_.set(pool_, iterator_.Section());
_end
+ obsolete_ = [self hasTag:@"cydia::obsolete"];
essential_ = ((iterator_->Flags & pkgCache::Flag::Essential) == 0 ? NO : YES) || [self hasTag:@"cydia::essential"];
[self setVisible];
} _end } return self;
- (BOOL) unfiltered {
NSString *section([self section]);
- return section == nil || isSectionVisible(section);
+ return !obsolete_ && [self hasSupportingRole] && (section == nil || isSectionVisible(section));
}
- (BOOL) visible {
return @"UPGRADE";
case 2:
return @"NEW_INSTALL";
- default:
- _assert(false);
+ _nodefault
}
- default:
- _assert(false);
+ _nodefault
}
}
_end
}
+- (bool) isUnfilteredAndSelectedForBy:(NSString *)search {
+ if ([search length] == 0)
+ return false;
+
+ _profile(Package$isUnfilteredAndSelectedForBy)
+ bool value(true);
+
+ _profile(Package$isUnfilteredAndSelectedForBy$Unfiltered)
+ value &= [self unfiltered];
+ _end
+
+ _profile(Package$isUnfilteredAndSelectedForBy$Match)
+ value &= [[self name] compare:search options:MatchCompareOptions_ range:NSMakeRange(0, [search length])] == NSOrderedSame;
+ _end
+
+ return value;
+ _end
+}
+
- (bool) isInstalledAndVisible:(NSNumber *)number {
return (![number boolValue] || [self visible]) && ![self uninstalled];
}
-- (bool) isVisiblyUninstalledInSection:(NSString *)name {
+- (bool) isVisibleInSection:(NSString *)name {
NSString *section = [self section];
return
- [self visible] &&
- [self uninstalled] && (
+ [self visible] && (
name == nil ||
section == nil && [name length] == 0 ||
[name isEqualToString:section]
@end
/* }}} */
+static NSString *Colon_;
+static NSString *Error_;
+static NSString *Warning_;
+
/* Database Implementation {{{ */
@implementation Database
}
}
- _assert(false);
+ _assume(false);
}
- (void) _readStatus:(NSNumber *)fd { _pooled
while (std::getline(is, line)) {
const char *data(line.c_str());
- size_t size = line.size();
+ size_t size(line.size());
lprintf("S:%s\n", data);
if (conffile_r(data, size)) {
NSString *string = pmstatus_r[4];
if (type == "pmerror")
- [delegate_ performSelectorOnMainThread:@selector(_setProgressError:)
+ [delegate_ performSelectorOnMainThread:@selector(_setProgressErrorPackage:)
withObject:[NSArray arrayWithObjects:string, id, nil]
waitUntilDone:YES
];
[delegate_ setProgressTitle:string];
} else if (type == "pmconffile")
[delegate_ setConfigurationData:string];
- else _assert(false);
- } else _assert(false);
+ else
+ lprintf("E:unknown pmstatus\n");
+ } else
+ lprintf("E:unknown status\n");
}
- _assert(false);
+ _assume(false);
}
- (void) _readOutput:(NSNumber *)fd { _pooled
[delegate_ addProgressOutput:[NSString stringWithUTF8String:line.c_str()]];
}
- _assert(false);
+ _assume(false);
}
- (FILE *) input {
return issues;
}
+- (bool) popErrorWithTitle:(NSString *)title {
+ bool fatal(false);
+ std::string message;
+
+ while (!_error->empty()) {
+ std::string error;
+ bool warning(!_error->PopMessage(error));
+ if (!warning)
+ fatal = true;
+ for (;;) {
+ size_t size(error.size());
+ if (size == 0 || error[size - 1] != '\n')
+ break;
+ error.resize(size - 1);
+ }
+ lprintf("%c:[%s]\n", warning ? 'W' : 'E', error.c_str());
+
+ if (!message.empty())
+ message += "\n\n";
+ message += error;
+ }
+
+ if (fatal && !message.empty())
+ [delegate_ _setProgressError:[NSString stringWithUTF8String:message.c_str()] withTitle:[NSString stringWithFormat:Colon_, fatal ? Error_ : Warning_, title]];
+
+ return fatal;
+}
+
+- (bool) popErrorWithTitle:(NSString *)title forOperation:(bool)success {
+ return [self popErrorWithTitle:title] || !success;
+}
+
- (void) reloadData { _pooled
@synchronized ([Database class]) {
-
@synchronized (self) {
++era_;
}
if (chk != -1)
close(chk);
+ NSString *title(UCLocalize("DATABASE"));
+
_trace();
- if (!cache_.Open(progress_, true)) {
+ if (!cache_.Open(progress_, true)) { pop:
std::string error;
- if (!_error->PopMessage(error))
- _assert(false);
- _error->Discard();
+ bool warning(!_error->PopMessage(error));
lprintf("cache_.Open():[%s]\n", error.c_str());
if (error == "dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem. ")
// else if (error == "Could not open lock file /var/lib/dpkg/lock - open (13 Permission denied)")
// else if (error == "Could not get lock /var/lib/dpkg/lock - open (35 Resource temporarily unavailable)")
// else if (error == "The list of sources could not be read.")
- else _assert(false);
+ else
+ [delegate_ _setProgressError:[NSString stringWithUTF8String:error.c_str()] withTitle:[NSString stringWithFormat:Colon_, warning ? Warning_ : Error_, title]];
+ if (warning)
+ goto pop;
+ _error->Discard();
return;
}
_trace();
lock_ = NULL;
list_ = new pkgSourceList();
- _assert(list_->ReadMainList());
+ if ([self popErrorWithTitle:title forOperation:list_->ReadMainList()])
+ return;
+
+ if (cache_->DelCount() != 0 || cache_->InstCount() != 0) {
+ [delegate_ _setProgressError:@"COUNTS_NONZERO_EX" withTitle:title];
+ return;
+ }
- _assert(cache_->DelCount() == 0 && cache_->InstCount() == 0);
- _assert(pkgApplyStatus(cache_));
+ if ([self popErrorWithTitle:title forOperation:pkgApplyStatus(cache_)])
+ return;
if (cache_->BrokenCount() != 0) {
- _assert(pkgFixBroken(cache_));
- _assert(cache_->BrokenCount() == 0);
- _assert(pkgMinimizeUpgrade(cache_));
+ if ([self popErrorWithTitle:title forOperation:pkgFixBroken(cache_)])
+ return;
+
+ if (cache_->BrokenCount() != 0) {
+ [delegate_ _setProgressError:@"STILL_BROKEN_EX" withTitle:title];
+ return;
+ }
+
+ if ([self popErrorWithTitle:title forOperation:pkgMinimizeUpgrade(cache_)])
+ return;
}
_trace();
system([dpkg UTF8String]);
}
-- (void) clean {
+- (bool) clean {
+ // XXX: I don't remember this condition
if (lock_ != NULL)
- return;
+ return false;
FileFd Lock;
Lock.Fd(GetLock(_config->FindDir("Dir::Cache::Archives") + "lock"));
- _assert(!_error->PendingError());
+
+ NSString *title(UCLocalize("CLEAN_ARCHIVES"));
+
+ if ([self popErrorWithTitle:title])
+ return false;
pkgAcquire fetcher;
fetcher.Clean(_config->FindDir("Dir::Cache::Archives"));
}
} cleaner;
- if (!cleaner.Go(_config->FindDir("Dir::Cache::Archives") + "partial/", cache_)) {
- std::string error;
- while (_error->PopMessage(error))
- lprintf("ArchiveCleaner: %s\n", error.c_str());
- }
+ if ([self popErrorWithTitle:title forOperation:cleaner.Go(_config->FindDir("Dir::Cache::Archives") + "partial/", cache_)])
+ return false;
+
+ return true;
}
-- (void) prepare {
+- (bool) prepare {
fetcher_->Shutdown();
pkgRecords records(cache_);
lock_ = new FileFd();
lock_->Fd(GetLock(_config->FindDir("Dir::Cache::Archives") + "lock"));
- _assert(!_error->PendingError());
+
+ NSString *title(UCLocalize("PREPARE_ARCHIVES"));
+
+ if ([self popErrorWithTitle:title])
+ return false;
pkgSourceList list;
- // XXX: explain this with an error message
- _assert(list.ReadMainList());
+ if ([self popErrorWithTitle:title forOperation:list.ReadMainList()])
+ return false;
manager_ = (_system->CreatePM(cache_));
- _assert(manager_->GetArchives(fetcher_, &list, &records));
- _assert(!_error->PendingError());
+ if ([self popErrorWithTitle:title forOperation:manager_->GetArchives(fetcher_, &list, &records)])
+ return false;
+
+ return true;
}
- (void) perform {
+ NSString *title(UCLocalize("PERFORM_SELECTIONS"));
+
NSMutableArray *before = [NSMutableArray arrayWithCapacity:16]; {
pkgSourceList list;
- _assert(list.ReadMainList());
+ if ([self popErrorWithTitle:title forOperation:list.ReadMainList()])
+ return;
for (pkgSourceList::const_iterator source = list.begin(); source != list.end(); ++source)
[before addObject:[NSString stringWithUTF8String:(*source)->GetURI().c_str()]];
}
lprintf("pAf:%s:%s\n", uri.c_str(), error.c_str());
failed = true;
- [delegate_ performSelectorOnMainThread:@selector(_setProgressError:)
+ [delegate_ performSelectorOnMainThread:@selector(_setProgressErrorPackage:)
withObject:[NSArray arrayWithObjects:
[NSString stringWithUTF8String:error.c_str()],
nil]
NSMutableArray *after = [NSMutableArray arrayWithCapacity:16]; {
pkgSourceList list;
- _assert(list.ReadMainList());
+ if ([self popErrorWithTitle:title forOperation:list.ReadMainList()])
+ return;
for (pkgSourceList::const_iterator source = list.begin(); source != list.end(); ++source)
[after addObject:[NSString stringWithUTF8String:(*source)->GetURI().c_str()]];
}
[self update];
}
-- (void) upgrade {
- _assert(pkgDistUpgrade(cache_));
+- (bool) upgrade {
+ NSString *title(UCLocalize("UPGRADE"));
+ if ([self popErrorWithTitle:title forOperation:pkgDistUpgrade(cache_)])
+ return false;
+ return true;
}
- (void) update {
[package setVisible];
}
-- (NSString *) updateWithStatus:(Status &)status {
+- (void) updateWithStatus:(Status &)status {
+ _transient NSObject<ProgressDelegate> *delegate(status.getDelegate());
+ NSString *title(UCLocalize("REFRESHING_DATA"));
+
pkgSourceList list;
- _assert(list.ReadMainList());
+ if (!list.ReadMainList())
+ [delegate _setProgressError:@"Unable to read source list." withTitle:title];
FileFd lock;
lock.Fd(GetLock(_config->FindDir("Dir::State::Lists") + "lock"));
+ if ([self popErrorWithTitle:title])
+ return;
- if (_error->PendingError()) error: {
- std::string error;
- if (!_error->PopMessage(error))
- _assert(false);
- _error->Discard();
- return [NSString stringWithUTF8String:error.c_str()];
- }
-
- if (!ListUpdate(status, list, PulseInterval_))
- goto error;
+ if ([self popErrorWithTitle:title forOperation:ListUpdate(status, list, PulseInterval_)])
+ /* XXX: ignore this because users suck and don't understand why refreshing is important: return */;
[Metadata_ setObject:[NSDate date] forKey:@"LastUpdate"];
Changed_ = true;
-
- return nil;
}
- (void) setDelegate:(id)delegate {
/* Web Scripting {{{ */
@interface CydiaObject : NSObject {
id indirect_;
+ id delegate_;
}
- (id) initWithDelegate:(IndirectDelegate *)indirect;
} return self;
}
+- (void) setDelegate:(id)delegate {
+ delegate_ = delegate;
+}
+
+ (NSArray *) _attributeKeys {
return [NSArray arrayWithObjects:@"device", @"firewire", @"imei", @"mac", @"serial", nil];
}
+ (NSString *) webScriptNameForSelector:(SEL)selector {
if (selector == @selector(close))
return @"close";
+ else if (selector == @selector(getInstalledPackages))
+ return @"getInstalledPackages";
else if (selector == @selector(getPackageById:))
return @"getPackageById";
+ else if (selector == @selector(installPackages:))
+ return @"installPackages";
else if (selector == @selector(setAutoPopup:))
return @"setAutoPopup";
else if (selector == @selector(setButtonImage:withStyle:toFunction:))
return @"setPopupHook";
else if (selector == @selector(setSpecial:))
return @"setSpecial";
+ else if (selector == @selector(setToken:))
+ return @"setToken";
else if (selector == @selector(setViewportWidth:))
return @"setViewportWidth";
else if (selector == @selector(supports:))
return [feature isEqualToString:@"window.open"];
}
+- (NSArray *) getInstalledPackages {
+ NSArray *packages([[Database sharedInstance] packages]);
+ NSMutableArray *installed([NSMutableArray arrayWithCapacity:[packages count]]);
+ for (Package *package in packages)
+ if ([package installed] != nil)
+ [installed addObject:package];
+ return installed;
+}
+
- (Package *) getPackageById:(NSString *)id {
Package *package([[Database sharedInstance] packageWithName:id]);
[package parse];
[indirect_ close];
}
+- (void) installPackages:(NSArray *)packages {
+ [delegate_ performSelectorOnMainThread:@selector(installPackages:) withObject:packages waitUntilDone:NO];
+}
+
- (void) setAutoPopup:(BOOL)popup {
[indirect_ setAutoPopup:popup];
}
[indirect_ setSpecial:function];
}
+- (void) setToken:(NSString *)token {
+ if (Token_ != nil)
+ [Token_ release];
+ Token_ = [token retain];
+
+ [Metadata_ setObject:Token_ forKey:@"Token"];
+ Changed_ = true;
+}
+
- (void) setFinishHook:(id)function {
[indirect_ setFinishHook:function];
}
[super dealloc];
}
+- (void) setHeaders:(NSDictionary *)headers forHost:(NSString *)host {
+}
+
- (void) webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)window forFrame:(WebFrame *)frame {
[super webView:sender didClearWindowObject:window forFrame:frame];
- [window setValue:cydia_ forKey:@"cydia"];
+
+ WebDataSource *source([frame dataSource]);
+ NSURLResponse *response([source response]);
+ NSURL *url([response URL]);
+ NSString *scheme([url scheme]);
+
+ NSHTTPURLResponse *http;
+ if (scheme != nil && ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"]))
+ http = (NSHTTPURLResponse *) response;
+ else
+ http = nil;
+
+ NSDictionary *headers([http allHeaderFields]);
+ NSString *host([url host]);
+ [self setHeaders:headers forHost:host];
+
+ if (
+ [host isEqualToString:@"cydia.saurik.com"] ||
+ [host hasSuffix:@".cydia.saurik.com"] ||
+ [scheme isEqualToString:@"file"]
+ )
+ [window setValue:cydia_ forKey:@"cydia"];
}
- (void) _setMoreHeaders:(NSMutableURLRequest *)request {
[request setValue:System_ forHTTPHeaderField:@"X-System"];
if (Machine_ != NULL)
[request setValue:[NSString stringWithUTF8String:Machine_] forHTTPHeaderField:@"X-Machine"];
- if (UniqueID_ != nil)
- [request setValue:UniqueID_ forHTTPHeaderField:@"X-Unique-ID"];
+ if (Token_ != nil)
+ [request setValue:Token_ forHTTPHeaderField:@"X-Cydia-Token"];
if (Role_ != nil)
[request setValue:Role_ forHTTPHeaderField:@"X-Role"];
}
return copy;
}
+- (void) setDelegate:(id)delegate {
+ [super setDelegate:delegate];
+ [cydia_ setDelegate:delegate];
+}
+
- (id) initWithBook:(RVBook *)book forWidth:(float)width {
if ((self = [super initWithBook:book forWidth:width ofClass:[CydiaBrowserView class]]) != nil) {
cydia_ = [[CydiaObject alloc] initWithDelegate:indirect_];
Finish_ = 2;
[delegate_ confirm];
break;
- default:
- _assert(false);
+ _nodefault
}
[sheet dismiss];
context:@"remove"
];
+ [essential_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[essential_ setDestructiveButtonIndex:1];
[essential_ setBodyText:UCLocalize("REMOVING_ESSENTIALS_EX")];
} else {
context:@"unable"
];
+ [essential_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[essential_ setBodyText:UCLocalize("UNABLE_TO_COMPLY_EX")];
}
nil];
[self loadURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"confirm" ofType:@"html"]]];
+
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
BOOL running_;
SHA1SumValue springlist_;
SHA1SumValue notifyconf_;
+ NSString *title_;
}
- (id) initWithFrame:(struct CGRect)frame database:(Database *)database delegate:(id)delegate;
[output_ release];
[status_ release];
[close_ release];
+ if (title_ != nil)
+ [title_ release];
[super dealloc];
}
delegate_ = delegate;
transition_ = [[UITransitionView alloc] initWithFrame:[self bounds]];
+ [transition_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[transition_ setDelegate:self];
overlay_ = [[UIView alloc] initWithFrame:[transition_ bounds]];
+ [overlay_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
background_ = [[UIView alloc] initWithFrame:[self bounds]];
[background_ setBackgroundColor:[UIColor blackColor]];
CGRect navrect = {{0, 0}, navsize};
navbar_ = [[UINavigationBar alloc] initWithFrame:navrect];
+ [navbar_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[overlay_ addSubview:navbar_];
[navbar_ setBarStyle:1];
}, prgsize};
progress_ = [[UIProgressBar alloc] initWithFrame:prgrect];
+ [progress_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin)];
[progress_ setStyle:0];
status_ = [[UITextLabel alloc] initWithFrame:CGRectMake(
24
)];
+ [status_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin)];
+
[status_ setColor:[UIColor whiteColor]];
[status_ setBackgroundColor:[UIColor clearColor]];
bounds.size.height - navsize.height - 62 - navrect.size.height
)];
+ [output_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [overlay_ addSubview:output_];
+
//[output_ setTextFont:@"Courier New"];
[output_ setFont:[[output_ font] fontWithSize:12]];
[output_ setAllowsRubberBanding:YES];
[output_ setEditable:NO];
- [overlay_ addSubview:output_];
-
close_ = [[UIPushButton alloc] initWithFrame:CGRectMake(
10,
bounds.size.height - prgsize.height - 50,
32 + prgsize.height
)];
+ [close_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin)];
+
[close_ setAutosizesToFit:NO];
[close_ setDrawsShadow:YES];
[close_ setStretchBackground:YES];
[transition_ transition:6 toView:view_];
}
-- (void) _checkError {
- if (_error->PendingError()) {
- std::string error;
- if (!_error->PopMessage(error))
- _assert(false);
+- (void) alertSheet:(UIActionSheet *)sheet buttonClicked:(int)button {
+ NSString *context([sheet context]);
- UIActionSheet *sheet = [[[UIActionSheet alloc]
- initWithTitle:UCLocalize("ERROR")
- buttons:[NSArray arrayWithObjects:UCLocalize("OKAY"), nil]
- defaultButtonIndex:0
- delegate:self
- context:@"_error"
- ] autorelease];
+ if ([context isEqualToString:@"conffile"]) {
+ FILE *input = [database_ input];
- [sheet setBodyText:[NSString stringWithUTF8String:error.c_str()]];
- [sheet popupAlertAnimated:YES];
+ switch (button) {
+ case 1:
+ fprintf(input, "N\n");
+ fflush(input);
+ break;
+ case 2:
+ fprintf(input, "Y\n");
+ fflush(input);
+ break;
+ _nodefault
+ }
- return;
+ [sheet dismiss];
}
+}
- [delegate_ progressViewIsComplete:self];
-
- if (Finish_ < 4) {
- FileFd file;
- if (!file.Open(NotifyConfig_, FileFd::ReadOnly))
- _error->Discard();
- else {
- MMap mmap(file, MMap::ReadOnly);
- SHA1Summation sha1;
- sha1.Add(reinterpret_cast<uint8_t *>(mmap.Data()), mmap.Size());
- if (!(notifyconf_ == sha1.Result()))
- Finish_ = 4;
- }
- }
-
- if (Finish_ < 3) {
- FileFd file;
- if (!file.Open(SpringBoard_, FileFd::ReadOnly))
- _error->Discard();
- else {
- MMap mmap(file, MMap::ReadOnly);
- SHA1Summation sha1;
- sha1.Add(reinterpret_cast<uint8_t *>(mmap.Data()), mmap.Size());
- if (!(springlist_ == sha1.Result()))
- Finish_ = 3;
- }
- }
-
- switch (Finish_) {
- case 0: [close_ setTitle:UCLocalize("RETURN_TO_CYDIA")]; break;
- case 1: [close_ setTitle:UCLocalize("CLOSE_CYDIA")]; break;
- case 2: [close_ setTitle:UCLocalize("RESTART_SPRINGBOARD")]; break;
- case 3: [close_ setTitle:UCLocalize("RELOAD_SPRINGBOARD")]; break;
- case 4: [close_ setTitle:UCLocalize("REBOOT_DEVICE")]; break;
- }
-
-#define ListCache_ "/User/Library/Caches/com.apple.mobile.installation.plist"
-#define IconCache_ "/User/Library/Caches/com.apple.springboard-imagecache-icons.plist"
-
- unlink(IconCache_);
-
- if (NSMutableDictionary *cache = [[NSMutableDictionary alloc] initWithContentsOfFile:@ListCache_]) {
- [cache autorelease];
-
- NSFileManager *manager = [NSFileManager defaultManager];
- NSError *error = nil;
-
- id system = [cache objectForKey:@"System"];
- if (system == nil)
- goto error;
-
- struct stat info;
- if (stat(ListCache_, &info) == -1)
- goto error;
-
- [system removeAllObjects];
-
- if (NSArray *apps = [manager contentsOfDirectoryAtPath:@"/Applications" error:&error]) {
- for (NSString *app in apps)
- if ([app hasSuffix:@".app"]) {
- NSString *path = [@"/Applications" stringByAppendingPathComponent:app];
- NSString *plist = [path stringByAppendingPathComponent:@"Info.plist"];
- if (NSMutableDictionary *info = [[NSMutableDictionary alloc] initWithContentsOfFile:plist]) {
- [info autorelease];
- if ([info objectForKey:@"CFBundleIdentifier"] != nil) {
- [info setObject:path forKey:@"Path"];
- [info setObject:@"System" forKey:@"ApplicationType"];
- [system addInfoDictionary:info];
- }
- }
- }
- } else goto error;
-
- [cache writeToFile:@ListCache_ atomically:YES];
-
- if (chown(ListCache_, info.st_uid, info.st_gid) == -1)
- goto error;
- if (chmod(ListCache_, info.st_mode) == -1)
- goto error;
-
- if (false) error:
- lprintf("%s\n", error == nil ? strerror(errno) : [[error localizedDescription] UTF8String]);
- }
-
- notify_post("com.apple.mobile.application_installed");
-
- [delegate_ setStatusBarShowsProgress:NO];
-}
-
-- (void) alertSheet:(UIActionSheet *)sheet buttonClicked:(int)button {
- NSString *context([sheet context]);
-
- if ([context isEqualToString:@"error"])
- [sheet dismiss];
- else if ([context isEqualToString:@"_error"]) {
- [sheet dismiss];
- [self _checkError];
- } else if ([context isEqualToString:@"conffile"]) {
- FILE *input = [database_ input];
-
- switch (button) {
- case 1:
- fprintf(input, "N\n");
- fflush(input);
- break;
- case 2:
- fprintf(input, "Y\n");
- fflush(input);
- break;
- default:
- _assert(false);
- }
-
- [sheet dismiss];
- }
-}
-
-- (void) closeButtonPushed {
- running_ = NO;
+- (void) closeButtonPushed {
+ running_ = NO;
switch (Finish_) {
case 0:
break;
case 1:
- [delegate_ suspendWithAnimation:YES];
+ [delegate_ terminateWithSuccess];
+ /*if ([delegate_ respondsToSelector:@selector(suspendWithAnimation:)])
+ [delegate_ suspendWithAnimation:YES];
+ else
+ [delegate_ suspend];*/
break;
case 2:
}
- (void) _retachThread {
- UINavigationItem *item = [navbar_ topItem];
+ UINavigationItem *item([navbar_ topItem]);
[item setTitle:UCLocalize("COMPLETE")];
[overlay_ addSubview:close_];
[progress_ removeFromSuperview];
[status_ removeFromSuperview];
- [self _checkError];
+ [database_ popErrorWithTitle:title_];
+ [delegate_ progressViewIsComplete:self];
+
+ if (Finish_ < 4) {
+ FileFd file;
+ if (!file.Open(NotifyConfig_, FileFd::ReadOnly))
+ _error->Discard();
+ else {
+ MMap mmap(file, MMap::ReadOnly);
+ SHA1Summation sha1;
+ sha1.Add(reinterpret_cast<uint8_t *>(mmap.Data()), mmap.Size());
+ if (!(notifyconf_ == sha1.Result()))
+ Finish_ = 4;
+ }
+ }
+
+ if (Finish_ < 3) {
+ FileFd file;
+ if (!file.Open(SpringBoard_, FileFd::ReadOnly))
+ _error->Discard();
+ else {
+ MMap mmap(file, MMap::ReadOnly);
+ SHA1Summation sha1;
+ sha1.Add(reinterpret_cast<uint8_t *>(mmap.Data()), mmap.Size());
+ if (!(springlist_ == sha1.Result()))
+ Finish_ = 3;
+ }
+ }
+
+ switch (Finish_) {
+ case 0: [close_ setTitle:UCLocalize("RETURN_TO_CYDIA")]; break;
+ case 1: [close_ setTitle:UCLocalize("CLOSE_CYDIA")]; break;
+ case 2: [close_ setTitle:UCLocalize("RESTART_SPRINGBOARD")]; break;
+ case 3: [close_ setTitle:UCLocalize("RELOAD_SPRINGBOARD")]; break;
+ case 4: [close_ setTitle:UCLocalize("REBOOT_DEVICE")]; break;
+ }
+
+ system("su -c /usr/bin/uicache mobile");
+
+ [delegate_ setStatusBarShowsProgress:NO];
}
- (void) _detachNewThreadData:(ProgressData *)data { _pooled
}
- (void) detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)object title:(NSString *)title {
- UINavigationItem *item = [navbar_ topItem];
- [item setTitle:title];
+ if (title_ != nil)
+ [title_ release];
+ if (title == nil)
+ title_ = nil;
+ else
+ title_ = [title retain];
+
+ UINavigationItem *item([navbar_ topItem]);
+ [item setTitle:title_];
[status_ setText:nil];
[output_ setText:@""];
];
}
-- (void) setProgressError:(NSString *)error forPackage:(NSString *)id {
- Package *package = id == nil ? nil : [database_ packageWithName:id];
-
- UIActionSheet *sheet = [[[UIActionSheet alloc]
- initWithTitle:(package == nil ? id : [package name])
+- (void) setProgressError:(NSString *)error withTitle:(NSString *)title {
+ CYActionSheet *sheet([[[CYActionSheet alloc]
+ initWithTitle:title
buttons:[NSArray arrayWithObjects:UCLocalize("OKAY"), nil]
defaultButtonIndex:0
- delegate:self
- context:@"error"
- ] autorelease];
+ ] autorelease]);
[sheet setBodyText:error];
- [sheet popupAlertAnimated:YES];
+ [sheet yieldToPopupAlertAnimated:YES];
+ [sheet dismiss];
}
- (void) setProgressTitle:(NSString *)title {
- (void) _setConfigurationData:(NSString *)data {
static Pcre conffile_r("^'(.*)' '(.*)' ([01]) ([01])$");
- _assert(conffile_r(data));
+ if (!conffile_r(data)) {
+ lprintf("E:invalid conffile\n");
+ return;
+ }
NSString *ofile = conffile_r[1];
//NSString *nfile = conffile_r[2];
context:@"conffile"
] autorelease];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[sheet setBodyText:[NSString stringWithFormat:@"%@\n\n%@", UCLocalize("CONFIGURATION_UPGRADE_EX"), ofile]];
[sheet popupAlertAnimated:YES];
}
ContentView *content_;
BOOL faded_;
float fade_;
+ UIImage *placard_;
}
- (PackageCell *) init;
badge_ = nil;
}
+ if (placard_ != nil) {
+ [placard_ release];
+ placard_ = nil;
+ }
+
[package_ release];
package_ = nil;
}
if ((self = [super initWithFrame:frame reuseIdentifier:@"Package"]) != nil) {
UIView *content([self contentView]);
CGRect bounds([content bounds]);
+
content_ = [[ContentView alloc] initWithFrame:bounds];
+ [content_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [content addSubview:content_];
+
[content_ setDelegate:self];
- [content_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[content_ setOpaque:YES];
- [content addSubview:content_];
if ([self respondsToSelector:@selector(selectionPercent)])
faded_ = YES;
+
+ [self setNeedsDisplayOnBoundsChange:YES];
} return self;
}
icon_ = [[package icon] retain];
name_ = [[package name] retain];
- description_ = [[package shortDescription] retain];
+
+ if (IsWildcat_)
+ description_ = [package longDescription];
+ if (description_ == nil)
+ description_ = [package shortDescription];
+ if (description_ != nil)
+ description_ = [description_ retain];
+
commercial_ = [package isCommercial];
package_ = [package retain];
if ((badge_ = [UIImage imageAtPath:[NSString stringWithFormat:@"%@/Purposes/%@.png", App_, purpose]]) != nil)
badge_ = [badge_ retain];
+ if ([package installed] != nil)
+ if ((placard_ = [UIImage imageAtPath:[NSString stringWithFormat:@"%@/installed.png", App_]]) != nil)
+ placard_ = [placard_ retain];
+
[self _setBackgroundColor];
[content_ setNeedsDisplay];
}
- (void) drawContentRect:(CGRect)rect {
bool selected([self isSelected]);
+ float width([self bounds].size.width);
#if 0
CGContextRef context(UIGraphicsGetCurrentContext());
if (!selected)
UISetColor(commercial_ ? Purple_ : Black_);
- [name_ drawAtPoint:CGPointMake(48, 8) forWidth:240 withFont:Font18Bold_ ellipsis:2];
- [source_ drawAtPoint:CGPointMake(58, 29) forWidth:225 withFont:Font12_ ellipsis:2];
+ [name_ drawAtPoint:CGPointMake(48, 8) forWidth:(width - (placard_ == nil ? 80 : 106)) withFont:Font18Bold_ ellipsis:2];
+ [source_ drawAtPoint:CGPointMake(58, 29) forWidth:(width - 95) withFont:Font12_ ellipsis:2];
if (!selected)
UISetColor(commercial_ ? Purplish_ : Gray_);
- [description_ drawAtPoint:CGPointMake(12, 46) forWidth:280 withFont:Font14_ ellipsis:2];
+ [description_ drawAtPoint:CGPointMake(12, 46) forWidth:(width - 46) withFont:Font14_ ellipsis:2];
+
+ if (placard_ != nil)
+ [placard_ drawAtPoint:CGPointMake(width - 52, 9)];
}
- (void) setSelected:(BOOL)selected animated:(BOOL)fade {
/* }}} */
/* Section Cell {{{ */
@interface SectionCell : UISimpleTableCell {
+ NSString *basic_;
NSString *section_;
NSString *name_;
NSString *count_;
@implementation SectionCell
- (void) clearSection {
+ if (basic_ != nil) {
+ [basic_ release];
+ basic_ = nil;
+ }
+
if (section_ != nil) {
[section_ release];
section_ = nil;
- (id) init {
if ((self = [super init]) != nil) {
icon_ = [[UIImage applicationImageNamed:@"folder.png"] retain];
-
switch_ = [[_UISwitchSlider alloc] initWithFrame:CGRectMake(218, 9, 60, 25)];
[switch_ addTarget:self action:@selector(onSwitch:) forEvents:UIControlEventTouchUpInside];
} return self;
}
- (void) onSwitch:(id)sender {
- NSMutableDictionary *metadata = [Sections_ objectForKey:section_];
+ NSMutableDictionary *metadata = [Sections_ objectForKey:basic_];
if (metadata == nil) {
metadata = [NSMutableDictionary dictionaryWithCapacity:2];
- [Sections_ setObject:metadata forKey:section_];
+ [Sections_ setObject:metadata forKey:basic_];
}
Changed_ = true;
name_ = [UCLocalize("ALL_PACKAGES") retain];
count_ = nil;
} else {
+ basic_ = [section name];
+ if (basic_ != nil)
+ basic_ = [basic_ retain];
+
section_ = [section localized];
if (section_ != nil)
section_ = [section_ retain];
+
name_ = [(section_ == nil || [section_ length] == 0 ? UCLocalize("NO_SECTION") : section_) retain];
count_ = [[NSString stringWithFormat:@"%d", [section count]] retain];
if (editing_)
- [switch_ setValue:(isSectionVisible(section_) ? 1 : 0) animated:NO];
+ [switch_ setValue:(isSectionVisible(basic_) ? 1 : 0) animated:NO];
}
}
+- (void) setFrame:(CGRect)frame {
+ [super setFrame:frame];
+ CGRect rect([switch_ frame]);
+ [switch_ setFrame:CGRectMake(frame.size.width - 102, 9, rect.size.width, rect.size.height)];
+}
+
- (void) drawContentInRect:(CGRect)rect selected:(BOOL)selected {
[icon_ drawInRect:CGRectMake(8, 7, 32, 32)];
if (!selected)
UISetColor(Black_);
- [name_ drawAtPoint:CGPointMake(48, 9) forWidth:(editing_ ? 164 : 250) withFont:Font22Bold_ ellipsis:2];
+
+ float width(rect.size.width + 23);
+ if (editing_)
+ width -= 110;
+
+ [name_ drawAtPoint:CGPointMake(48, 9) forWidth:(width - 70) withFont:Font22Bold_ ellipsis:2];
CGSize size = [count_ sizeWithFont:Font14_];
#if !AlwaysReload
- (void) __rightButtonClicked {
- int count = [buttons_ count];
- _assert(count != 0);
+ int count([buttons_ count]);
+ if (count == 0)
+ return;
if (count == 1)
[self _clickButtonWithName:[buttons_ objectAtIndex:0]];
frame.size.height = 0;
[webview_ setFrame:frame];
- [scroller_ scrollPointVisibleAtTopLeft:CGPointZero];
+ if ([scroller_ respondsToSelector:@selector(scrollPointVisibleAtTopLeft:)])
+ [scroller_ scrollPointVisibleAtTopLeft:CGPointZero];
+ else
+ [scroller_ scrollRectToVisible:CGRectZero animated:NO];
WebThreadLock();
[[[webview_ webView] windowScriptObject] setValue:package_ forKey:@"package"];
sections_ = [[NSMutableArray arrayWithCapacity:16] retain];
list_ = [[UITableView alloc] initWithFrame:[self bounds] style:UITableViewStylePlain];
+ [list_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [self addSubview:list_];
+
[list_ setDataSource:self];
[list_ setDelegate:self];
- [self addSubview:list_];
-
- [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
- [list_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
}
- (void) setObject:(id)object;
+- (void) setObject:(id)object forFilter:(SEL)filter;
- (id) initWithBook:(RVBook *)book database:(Database *)database title:(NSString *)title filter:(SEL)filter with:(id)object;
[super dealloc];
}
+- (void) setFilter:(SEL)filter {
+ filter_ = filter;
+
+ /* XXX: this is an unsafe optimization of doomy hell */
+ Method method(class_getInstanceMethod([Package class], filter));
+ _assert(method != NULL);
+ imp_ = method_getImplementation(method);
+ _assert(imp_ != NULL);
+}
+
- (void) setObject:(id)object {
if (object_ != nil)
[object_ release];
object_ = [object retain];
}
+- (void) setObject:(id)object forFilter:(SEL)filter {
+ [self setFilter:filter];
+ [self setObject:object];
+
+}
+
- (bool) hasPackage:(Package *)package {
_profile(FilteredPackageTable$hasPackage)
return [package valid] && (*reinterpret_cast<bool (*)(id, SEL, id)>(imp_))(package, filter_, object_);
- (id) initWithBook:(RVBook *)book database:(Database *)database title:(NSString *)title filter:(SEL)filter with:(id)object {
if ((self = [super initWithBook:book database:database title:title]) != nil) {
- filter_ = filter;
+ [self setFilter:filter];
object_ = object == nil ? nil : [object retain];
-
- /* XXX: this is an unsafe optimization of doomy hell */
- Method method = class_getInstanceMethod([Package class], filter);
- _assert(method != NULL);
- imp_ = method_getImplementation(method);
- _assert(imp_ != NULL);
-
[self reloadData];
} return self;
}
}
- (void) drawContentInRect:(CGRect)rect selected:(BOOL)selected {
+ float width(rect.size.width);
+
if (icon_ != nil)
[icon_ drawInRect:CGRectMake(10, 10, 30, 30)];
if (!selected)
UISetColor(Black_);
- [origin_ drawAtPoint:CGPointMake(48, 8) forWidth:240 withFont:Font18Bold_ ellipsis:2];
+ [origin_ drawAtPoint:CGPointMake(48, 8) forWidth:(width - 80) withFont:Font18Bold_ ellipsis:2];
if (!selected)
UISetColor(Blue_);
- [label_ drawAtPoint:CGPointMake(58, 29) forWidth:225 withFont:Font12_ ellipsis:2];
+ [label_ drawAtPoint:CGPointMake(58, 29) forWidth:(width - 95) withFont:Font12_ ellipsis:2];
if (!selected)
UISetColor(Gray_);
- [description_ drawAtPoint:CGPointMake(12, 46) forWidth:280 withFont:Font14_ ellipsis:2];
+ [description_ drawAtPoint:CGPointMake(12, 46) forWidth:(width - 40) withFont:Font14_ ellipsis:2];
[super drawContentInRect:rect selected:selected];
}
NSError *error_;
//NSURLConnection *installer_;
+ NSURLConnection *trivial_;
NSURLConnection *trivial_bz2_;
NSURLConnection *trivial_gz_;
//NSURLConnection *automatic_;
- BOOL trivial_;
+ BOOL cydia_;
}
- (id) initWithBook:(RVBook *)book database:(Database *)database;
[error_ release];
//[self _deallocConnection:installer_];
+ [self _deallocConnection:trivial_];
[self _deallocConnection:trivial_gz_];
[self _deallocConnection:trivial_bz2_];
//[self _deallocConnection:automatic_];
case 0: return UCLocalize("ENTERED_BY_USER");
case 1: return UCLocalize("INSTALLED_BY_PACKAGE");
- default:
- _assert(false);
- return nil;
+ _nodefault
}
}
case 0: return 0;
case 1: return offset_;
- default:
- _assert(false);
- return -1;
+ _nodefault
}
}
if (colon.location != NSNotFound)
href = [href substringFromIndex:(colon.location + 3)];
href = [href stringByAddingPercentEscapes];
- href = [@"http://cydia.saurik.com/api/repotag/" stringByAppendingString:href];
+ href = [CydiaURL(@"api/repotag/") stringByAppendingString:href];
href = [href stringByCachingURLWithCurrentCDN];
NSURL *url([NSURL URLWithString:href]);
- (void) _endConnection:(NSURLConnection *)connection {
NSURLConnection **field = NULL;
- if (connection == trivial_bz2_)
+ if (connection == trivial_)
+ field = &trivial_;
+ else if (connection == trivial_bz2_)
field = &trivial_bz2_;
else if (connection == trivial_gz_)
field = &trivial_gz_;
*field = nil;
if (
+ trivial_ == nil &&
trivial_bz2_ == nil &&
trivial_gz_ == nil
) {
bool defer(false);
- if (trivial_) {
+ if (cydia_) {
if (NSString *warning = [self yieldToSelector:@selector(getWarning)]) {
defer = true;
context:@"warning"
] autorelease];
- [sheet setNumberOfRows:1];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+ [sheet setNumberOfRows:1];
[sheet setBodyText:warning];
[sheet popupAlertAnimated:YES];
} else
context:@"urlerror"
] autorelease];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[sheet setBodyText:[error_ localizedDescription]];
[sheet popupAlertAnimated:YES];
} else {
context:@"trivial"
] autorelease];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[sheet setBodyText:UCLocalize("NOT_REPOSITORY_EX")];
[sheet popupAlertAnimated:YES];
}
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response {
switch ([response statusCode]) {
case 200:
- trivial_ = YES;
+ cydia_ = YES;
}
}
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:[NSURL URLWithString:href]
cachePolicy:NSURLRequestUseProtocolCachePolicy
- timeoutInterval:20.0
+ timeoutInterval:120.0
];
[request setHTTPMethod:method];
[request setValue:[NSString stringWithUTF8String:Machine_] forHTTPHeaderField:@"X-Machine"];
if (UniqueID_ != nil)
[request setValue:UniqueID_ forHTTPHeaderField:@"X-Unique-ID"];
-
if (Role_ != nil)
[request setValue:Role_ forHTTPHeaderField:@"X-Role"];
href_ = href;
href_ = [href_ retain];
- trivial_bz2_ = [[self _requestHRef:[href_ stringByAppendingString:@"Packages"] method:@"HEAD"] retain];
+ trivial_ = [[self _requestHRef:[href_ stringByAppendingString:@"Packages"] method:@"HEAD"] retain];
trivial_bz2_ = [[self _requestHRef:[href_ stringByAppendingString:@"Packages.bz2"] method:@"HEAD"] retain];
trivial_gz_ = [[self _requestHRef:[href_ stringByAppendingString:@"Packages.gz"] method:@"HEAD"] retain];
//trivial_bz2_ = [[self _requestHRef:[href stringByAppendingString:@"dists/Release"] method:@"HEAD"] retain];
- trivial_ = false;
+ cydia_ = false;
hud_ = [[delegate_ addProgressHUD] retain];
[hud_ setText:UCLocalize("VERIFYING_URL")];
case 2:
break;
- default:
- _assert(false);
+ _nodefault
}
[sheet dismiss];
case 2:
break;
- default:
- _assert(false);
+ _nodefault
}
[href_ release];
//list_ = [[UITable alloc] initWithFrame:[self bounds]];
list_ = [[UISectionList alloc] initWithFrame:[self bounds] showSectionIndex:NO];
- [list_ setShouldHideHeaderInShortLists:NO];
-
+ [list_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[self addSubview:list_];
+
+ [list_ setShouldHideHeaderInShortLists:NO];
[list_ setDataSource:self];
UITableColumn *column = [[UITableColumn alloc]
[self reloadData];
- [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
- [list_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
- (void) reloadData {
pkgSourceList list;
- _assert(list.ReadMainList());
+ if (!list.ReadMainList())
+ return;
[sources_ removeAllObjects];
[sources_ addObjectsFromArray:[database_ sources]];
[sources_ sortUsingSelector:@selector(compareByNameAndType:)];
_trace();
- int count = [sources_ count];
+ int count([sources_ count]);
for (offset_ = 0; offset_ != count; ++offset_) {
Source *source = [sources_ objectAtIndex:offset_];
if ([source record] == nil)
context:@"source"
] autorelease];
- [sheet setNumberOfRows:1];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+ [sheet setNumberOfRows:1];
[sheet addTextFieldWithValue:@"http://" label:@""];
UITextInputTraits *traits = [[sheet textField] textInputTraits];
with:[NSNumber numberWithBool:YES]
];
+ [packages_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[self addSubview:packages_];
- [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
- [packages_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
[super _setMoreHeaders:request];
if (ChipID_ != nil)
[request setValue:ChipID_ forHTTPHeaderField:@"X-Chip-ID"];
+ if (UniqueID_ != nil)
+ [request setValue:UniqueID_ forHTTPHeaderField:@"X-Unique-ID"];
}
- (void) _leftButtonClicked {
- UIActionSheet *sheet = [[[UIActionSheet alloc]
- initWithTitle:UCLocalize("ABOUT_CYDIA")
- buttons:[NSArray arrayWithObjects:UCLocalize("CLOSE"), nil]
- defaultButtonIndex:0
- delegate:self
- context:@"about"
- ] autorelease];
+ UIAlertView *alert = [[[UIAlertView alloc] init] autorelease];
+ [alert setTitle:UCLocalize("ABOUT_CYDIA")];
+ [alert addButtonWithTitle:UCLocalize("CLOSE")];
+ [alert setCancelButtonIndex:0];
- [sheet setBodyText:
- @"Copyright (C) 2008-2009\n"
+ [alert setMessage:
+ @"Copyright (C) 2008-2010\n"
"Jay Freeman (saurik)\n"
"saurik@saurik.com\n"
- "http://www.saurik.com/\n"
- "\n"
- "The Okori Group\n"
- "http://www.theokorigroup.com/\n"
- "\n"
- "College of Creative Studies,\n"
- "University of California,\n"
- "Santa Barbara\n"
- "http://www.ccs.ucsb.edu/"
+ "http://www.saurik.com/"
];
- [sheet popupAlertAnimated:YES];
+ [alert show];
}
- (NSString *) leftButtonTitle {
- (void) _leftButtonClicked {
[delegate_ askForSettings];
+ [delegate_ updateData];
}
- (NSString *) leftButtonTitle {
UIProgressBar *progress_;
UINavigationButton *cancel_;
bool updating_;
+ bool dropped_;
}
- (id) initWithFrame:(CGRect)frame database:(Database *)database;
- (void) update;
- (BOOL) updating;
+- (void) setUpdate:(NSDate *)date;
@end
return updating_;
}
-- (void) update {
+- (void) dropBar {
+ if (dropped_)
+ return;
+ dropped_ = true;
+
[UIView beginAnimations:nil context:NULL];
CGRect ovrframe = [overlay_ frame];
[transition_ setFrame:trnframe];
[UIView endAnimations];
+}
+
+- (void) raiseBar {
+ if (!dropped_)
+ return;
+ dropped_ = false;
+
+ [UIView beginAnimations:nil context:NULL];
+
+ CGRect ovrframe = [overlay_ frame];
+ ovrframe.origin.y = -ovrframe.size.height;
+ [overlay_ setFrame:ovrframe];
+
+ CGRect barframe = [navbar_ frame];
+ barframe.origin.y -= ovrframe.size.height;
+ [navbar_ setFrame:barframe];
+
+ CGRect trnframe = [transition_ frame];
+ trnframe.origin.y -= ovrframe.size.height;
+ trnframe.size.height += ovrframe.size.height;
+ [transition_ setFrame:trnframe];
+
+ [UIView commitAnimations];
+}
+
+- (void) setUpdate:(NSDate *)date {
+ [self update];
+}
+
+- (void) update {
+ [self dropBar];
[indicator_ startAnimation];
[prompt_ setText:UCLocalize("UPDATING_DATABASE")];
[sheet dismiss];
}
-- (void) _update_:(NSString *)error {
+- (void) _update_ {
updating_ = false;
[indicator_ stopAnimation];
- [UIView beginAnimations:nil context:NULL];
-
- CGRect ovrframe = [overlay_ frame];
- ovrframe.origin.y = -ovrframe.size.height;
- [overlay_ setFrame:ovrframe];
-
- CGRect barframe = [navbar_ frame];
- barframe.origin.y -= ovrframe.size.height;
- [navbar_ setFrame:barframe];
-
- CGRect trnframe = [transition_ frame];
- trnframe.origin.y -= ovrframe.size.height;
- trnframe.size.height += ovrframe.size.height;
- [transition_ setFrame:trnframe];
-
- [UIView commitAnimations];
-
- if (error == nil)
- [delegate_ performSelector:@selector(reloadData) withObject:nil afterDelay:0];
- else {
- UIActionSheet *sheet = [[[UIActionSheet alloc]
- initWithTitle:[NSString stringWithFormat:UCLocalize("COLON_DELIMITED"), UCLocalize("ERROR"), UCLocalize("REFRESH")]
- buttons:[NSArray arrayWithObjects:
- UCLocalize("OK"),
- nil]
- defaultButtonIndex:0
- delegate:self
- context:@"refresh"
- ] autorelease];
-
- [sheet setBodyText:error];
- [sheet popupAlertAnimated:YES];
+ [self raiseBar];
- [self reloadButtons];
- }
+ [delegate_ performSelector:@selector(reloadData) withObject:nil afterDelay:0];
}
- (id) initWithFrame:(CGRect)frame database:(Database *)database {
if ((self = [super initWithFrame:frame]) != nil) {
database_ = database;
- CGRect ovrrect = [navbar_ bounds];
+ CGRect ovrrect([navbar_ bounds]);
ovrrect.size.height = [UINavigationBar defaultSize].height;
ovrrect.origin.y = -ovrrect.size.height;
overlay_ = [[UINavigationBar alloc] initWithFrame:ovrrect];
+ [overlay_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[self addSubview:overlay_];
ovrrect.origin.y = frame.size.height;
underlay_ = [[UINavigationBar alloc] initWithFrame:ovrrect];
- [underlay_ setTintColor:[UIColor colorWithRed:0.23 green:0.23 blue:0.23 alpha:1]];
+ [underlay_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[self addSubview:underlay_];
+ [underlay_ setTintColor:[UIColor colorWithRed:0.23 green:0.23 blue:0.23 alpha:1]];
+
[overlay_ setBarStyle:1];
[underlay_ setBarStyle:1];
- int barstyle = [overlay_ _barStyle:NO];
- bool ugly = barstyle == 0;
+ int barstyle([overlay_ _barStyle:NO]);
+ bool ugly(barstyle == 0);
UIProgressIndicatorStyle style = ugly ?
UIProgressIndicatorStyleMediumBrown :
UIProgressIndicatorStyleMediumWhite;
- CGSize indsize = [UIProgressIndicator defaultSizeForStyle:style];
+ CGSize indsize([UIProgressIndicator defaultSizeForStyle:style]);
unsigned indoffset = (ovrrect.size.height - indsize.height) / 2;
CGRect indrect = {{indoffset, indoffset}, indsize};
unsigned(ovrrect.size.height - prmsize.height) / 2 - 1
}, prmsize};
- UIFont *font = [UIFont systemFontOfSize:15];
+ UIFont *font([UIFont systemFontOfSize:15]);
prompt_ = [[UITextLabel alloc] initWithFrame:prmrect];
} , prgsize};
progress_ = [[UIProgressBar alloc] initWithFrame:prgrect];
- [progress_ setStyle:0];
+ [progress_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[overlay_ addSubview:progress_];
+ [progress_ setStyle:0];
+
cancel_ = [[UINavigationButton alloc] initWithTitle:UCLocalize("CANCEL") style:UINavigationButtonStyleHighlighted];
+ [progress_ setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
[cancel_ addTarget:self action:@selector(_onCancel) forControlEvents:UIControlEventTouchUpInside];
CGRect frame = [cancel_ frame];
- (void) _update { _pooled
Status status;
status.setDelegate(self);
-
- NSString *error([database_ updateWithStatus:status]);
+ [database_ updateWithStatus:status];
[self
- performSelectorOnMainThread:@selector(_update_:)
- withObject:error
+ performSelectorOnMainThread:@selector(_update_)
+ withObject:nil
waitUntilDone:NO
];
}
-- (void) setProgressError:(NSString *)error forPackage:(NSString *)id {
+- (void) setProgressError:(NSString *)error withTitle:(NSString *)title {
[prompt_ setText:[NSString stringWithFormat:UCLocalize("COLON_DELIMITED"), UCLocalize("ERROR"), error]];
}
-- (void) setProgressTitle:(NSString *)title {
- [self
- performSelectorOnMainThread:@selector(_setProgressTitle:)
- withObject:title
- waitUntilDone:YES
- ];
-}
-
-- (void) setProgressPercent:(float)percent {
- [self
- performSelectorOnMainThread:@selector(_setProgressPercent:)
- withObject:[NSNumber numberWithFloat:percent]
- waitUntilDone:YES
+/*
+ UIActionSheet *sheet = [[[UIActionSheet alloc]
+ initWithTitle:[NSString stringWithFormat:UCLocalize("COLON_DELIMITED"), UCLocalize("ERROR"), UCLocalize("REFRESH")]
+ buttons:[NSArray arrayWithObjects:
+ UCLocalize("OK"),
+ nil]
+ defaultButtonIndex:0
+ delegate:self
+ context:@"refresh"
+ ] autorelease];
+
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
+ [sheet setBodyText:error];
+ [sheet popupAlertAnimated:YES];
+
+ [self reloadButtons];
+*/
+
+- (void) setProgressTitle:(NSString *)title {
+ [self
+ performSelectorOnMainThread:@selector(_setProgressTitle:)
+ withObject:title
+ waitUntilDone:YES
+ ];
+}
+
+- (void) setProgressPercent:(float)percent {
+ [self
+ performSelectorOnMainThread:@selector(_setProgressPercent:)
+ withObject:[NSNumber numberWithFloat:percent]
+ waitUntilDone:YES
];
}
_transient Database *database_;
NSMutableArray *sections_;
NSMutableArray *filtered_;
- UITransitionView *transition_;
UITable *list_;
UIView *accessory_;
BOOL editing_;
[sections_ release];
[filtered_ release];
- [transition_ release];
[list_ release];
[accessory_ release];
[super dealloc];
initWithBook:book_
database:database_
title:title
- filter:@selector(isVisiblyUninstalledInSection:)
+ filter:@selector(isVisibleInSection:)
with:name
] autorelease];
sections_ = [[NSMutableArray arrayWithCapacity:16] retain];
filtered_ = [[NSMutableArray arrayWithCapacity:16] retain];
- transition_ = [[UITransitionView alloc] initWithFrame:[self bounds]];
- [self addSubview:transition_];
-
- list_ = [[UITable alloc] initWithFrame:[transition_ bounds]];
- [transition_ transition:0 toView:list_];
+ list_ = [[UITable alloc] initWithFrame:[self bounds]];
+ [list_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [self addSubview:list_];
UITableColumn *column = [[[UITableColumn alloc]
initWithTitle:UCLocalize("NAME")
[self reloadData];
- [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
- [list_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
[*section addToCount];
_profile(SectionsView$reloadData$Filter)
- if (![package valid] || ![package uninstalled] || ![package visible])
+ if (![package valid] || ![package visible])
continue;
_end
[section addToCount];
_profile(SectionsView$reloadData$Filter)
- if (![package valid] || ![package uninstalled] || ![package visible])
+ if (![package valid] || ![package visible])
continue;
_end
}
- (NSString *) title {
- return editing_ ? UCLocalize("SECTION_VISIBILITY") : UCLocalize("INSTALL_BY_SECTION");
+ return editing_ ? UCLocalize("SECTION_VISIBILITY") : UCLocalize("SECTIONS");
}
- (NSString *) backButtonTitle {
unsigned upgrades_;
}
-- (id) initWithBook:(RVBook *)book database:(Database *)database;
+- (id) initWithBook:(RVBook *)book database:(Database *)database delegate:(id)delegate;
- (void) reloadData;
@end
[delegate_ distUpgrade];
}
-- (id) initWithBook:(RVBook *)book database:(Database *)database {
+- (id) initWithBook:(RVBook *)book database:(Database *)database delegate:(id)delegate {
if ((self = [super initWithBook:book]) != nil) {
database_ = database;
sections_ = [[NSMutableArray arrayWithCapacity:16] retain];
list_ = [[UITableView alloc] initWithFrame:[self bounds] style:UITableViewStylePlain];
+ [list_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[self addSubview:list_];
//XXX:[list_ setShouldHideHeaderInShortLists:NO];
[list_ setDelegate:self];
//[list_ setSectionListStyle:1];
+ delegate_ = delegate;
[self reloadData];
- [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
- [list_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
-- (void) reloadData {
- NSArray *packages = [database_ packages];
-
- [packages_ removeAllObjects];
- [sections_ removeAllObjects];
-
+- (void) _reloadPackages:(NSArray *)packages {
_trace();
for (Package *package in packages)
if (
_trace();
[packages_ radixSortUsingFunction:reinterpret_cast<SKRadixFunction>(&PackageChangesRadix) withContext:NULL];
_trace();
+}
+
+- (void) reloadData {
+ NSArray *packages = [database_ packages];
+
+ [packages_ removeAllObjects];
+ [sections_ removeAllObjects];
+
+ UIProgressHUD *hud([delegate_ addProgressHUD]);
+ // XXX: localize
+ [hud setText:@"Loading Changes"];
+ NSLog(@"HUD:%@::%@", delegate_, hud);
+ [self yieldToSelector:@selector(_reloadPackages:) withObject:packages];
+ [delegate_ removeProgressHUD:hud];
Section *upgradable = [[[Section alloc] initWithName:UCLocalize("AVAILABLE_UPGRADES") localize:NO] autorelease];
Section *ignored = [[[Section alloc] initWithName:UCLocalize("IGNORED_UPGRADES") localize:NO] autorelease];
UIView *accessory_;
UISearchField *field_;
FilteredPackageTable *table_;
- UIView *dimmed_;
bool reload_;
}
[accessory_ release];
[field_ release];
[table_ release];
- [dimmed_ release];
[super dealloc];
}
if (show)
[animator performSelector:@selector(startAnimation:) withObject:animation afterDelay:delay];
- [delegate_ showKeyboard:show];
+ //[delegate_ showKeyboard:show];
}
- (void) textFieldDidBecomeFirstResponder:(UITextField *)field {
[self _showKeyboard:YES];
+ [table_ setObject:[field_ text] forFilter:@selector(isUnfilteredAndSelectedForBy:)];
+ [self reloadData];
}
- (void) textFieldDidResignFirstResponder:(UITextField *)field {
[self _showKeyboard:NO];
+ [table_ setObject:[field_ text] forFilter:@selector(isUnfilteredAndSearchedForBy:)];
+ [self reloadData];
}
- (void) keyboardInputChanged:(UIFieldEditor *)editor {
if (reload_) {
NSString *text([field_ text]);
[field_ setClearButtonStyle:(text == nil || [text length] == 0 ? 0 : 2)];
+ [table_ setObject:text forFilter:@selector(isUnfilteredAndSelectedForBy:)];
[self reloadData];
reload_ = false;
}
if ((self = [super initWithBook:book]) != nil) {
CGRect pageBounds = [book_ pageBounds];
- dimmed_ = [[UIView alloc] initWithFrame:pageBounds];
- CGColor dimmed(space_, 0, 0, 0, 0.5);
- [dimmed_ setBackgroundColor:[UIColor colorWithCGColor:dimmed]];
-
table_ = [[FilteredPackageTable alloc]
initWithBook:book
database:database
with:nil
];
- [table_ setShouldHideHeaderInShortLists:NO];
+ [table_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[self addSubview:table_];
+ [table_ setShouldHideHeaderInShortLists:NO];
+
CGRect cnfrect = {{7, 38}, {17, 18}};
CGRect area;
area.size.height = [UISearchField defaultHeight];
field_ = [[UISearchField alloc] initWithFrame:area];
+ [field_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
UIFont *font = [UIFont systemFontOfSize:16];
[field_ setFont:font];
CGRect accrect = {{0, 6}, {6 + cnfrect.size.width + 6 + area.size.width + 6, area.size.height}};
accessory_ = [[UIView alloc] initWithFrame:accrect];
+ [accessory_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[accessory_ addSubview:field_];
- [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
- [table_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
}
- (void) reloadData {
- [table_ setObject:[field_ text]];
_profile(SearchView$reloadData)
[table_ reloadData];
_end
case 0: return nil;
case 1: return nil;
- default: _assert(false);
+ _nodefault
}
return nil;
case 0: return NO;
case 1: return YES;
- default: _assert(false);
+ _nodefault
}
return NO;
case 0: return 1;
case 1: return 1;
- default: _assert(false);
+ _nodefault
}
return 0;
return subscribedCell_;
case 1:
return ignoredCell_;
- default: _assert(false);
+ _nodefault
} break;
case 1: switch (row) {
return cell;
}
- default: _assert(false);
+ _nodefault
} break;
- default: _assert(false);
+ _nodefault
}
return nil;
@end
/* }}} */
+@interface CydiaViewController : UIViewController {
+}
+
+@end
+
+@implementation CydiaViewController
+
+- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation {
+ return NO; // XXX: return YES;
+}
+
+@end
+
@interface Cydia : UIApplication <
ConfirmationViewDelegate,
ProgressViewDelegate,
CydiaDelegate
> {
UIWindow *window_;
+ CydiaViewController *root_;
UIView *underlay_;
UIView *overlay_;
#endif
}
+- (RVPage *) _pageForURL:(NSURL *)url withClass:(Class)_class;
+- (void) setPage:(RVPage *)page;
+
@end
+static _finline void _setHomePage(Cydia *self) {
+ [self setPage:[self _pageForURL:[NSURL URLWithString:CydiaURL(@"")] withClass:[HomeView class]]];
+}
+
@implementation Cydia
+- (UIView *) rotatingContentViewForWindow:(UIWindow *)window {
+ return window_;
+}
+
- (void) _loaded {
if ([broken_ count] != 0) {
int count = [broken_ count];
context:@"fixhalf"
] autorelease];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[sheet setBodyText:UCLocalize("HALFINSTALLED_PACKAGE_EX")];
[sheet popupAlertAnimated:YES];
} else if (!Ignored_ && [essential_ count] != 0) {
context:@"upgrade"
] autorelease];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[sheet setBodyText:UCLocalize("ESSENTIAL_UPGRADE_EX")];
[sheet popupAlertAnimated:YES];
}
static bool loaded(false);
UIProgressHUD *hud([self addProgressHUD]);
[hud setText:(loaded ? UCLocalize("RELOADING_DATA") : UCLocalize("LOADING_DATA"))];
- loaded = true;
[database_ yieldToSelector:@selector(reloadData) withObject:nil];
_trace();
[essential_ removeAllObjects];
[broken_ removeAllObjects];
- NSArray *packages = [database_ packages];
+ NSArray *packages([database_ packages]);
for (Package *package in packages) {
if ([package half])
[broken_ addObject:package];
[self _updateData];
- // XXX: what is this line of code for?
- if ([packages count] == 0);
- else if (Loaded_ || ManualRefresh) loaded:
+ if (loaded || ManualRefresh) loaded:
[self _loaded];
else {
- Loaded_ = YES;
+ loaded = true;
+
+ NSDate *update([Metadata_ objectForKey:@"LastUpdate"]);
- if (NSDate *update = [Metadata_ objectForKey:@"LastUpdate"]) {
+ if (update != nil) {
NSTimeInterval interval([update timeIntervalSinceNow]);
- if (interval <= 0 && interval > -600)
+ if (interval <= 0 && interval > -(15*60))
goto loaded;
}
- [book_ update];
+ [book_ setUpdate:update];
}
}
}
- (void) syncData {
- FILE *file = fopen("/etc/apt/sources.list.d/cydia.list", "w");
+ FILE *file(fopen("/etc/apt/sources.list.d/cydia.list", "w"));
_assert(file != NULL);
- NSArray *keys = [Sources_ allKeys];
-
- for (NSString *key in keys) {
- NSDictionary *source = [Sources_ objectForKey:key];
+ for (NSString *key in [Sources_ allKeys]) {
+ NSDictionary *source([Sources_ objectForKey:key]);
fprintf(file, "%s %s %s\n",
[[source objectForKey:@"Type"] UTF8String],
return [underlay_ bounds];
}
-- (void) perform {
- [database_ prepare];
+- (bool) perform {
+ if (![database_ prepare])
+ return false;
confirm_ = [[RVBook alloc] initWithFrame:[self popUpBounds]];
+ [confirm_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[confirm_ setDelegate:self];
ConfirmationView *page([[[ConfirmationView alloc] initWithBook:confirm_ database:database_] autorelease]);
[confirm_ setPage:page];
[self popUpBook:confirm_];
+
+ return true;
}
- (void) queue {
}
}
+- (void) installPackages:(NSArray *)packages {
+ @synchronized (self) {
+ for (Package *package in packages)
+ [package install];
+ [self resolve];
+ [self perform];
+ }
+}
+
- (void) installPackage:(Package *)package {
@synchronized (self) {
[package install];
- (void) distUpgrade {
@synchronized (self) {
- [database_ upgrade];
+ if (![database_ upgrade])
+ return;
[self perform];
}
}
return browser;
}
-- (void) _setHomePage {
- [self setPage:[self _pageForURL:[NSURL URLWithString:@"http://cydia.saurik.com/"] withClass:[HomeView class]]];
-}
-
- (SectionsView *) sectionsView {
if (sections_ == nil)
sections_ = [[SectionsView alloc] initWithBook:book_ database:database_];
return sections_;
}
+- (ChangesView *) changesView {
+ if (changes_ == nil)
+ changes_ = [[ChangesView alloc] initWithBook:book_ database:database_ delegate:self];
+ return changes_;
+}
+
+- (ManageView *) manageView {
+ if (manage_ == nil)
+ manage_ = (ManageView *) [[self
+ _pageForURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"manage" ofType:@"html"]]
+ withClass:[ManageView class]
+ ] retain];
+ return manage_;
+}
+
+- (SearchView *) searchView {
+ if (search_ == nil)
+ search_ = [[SearchView alloc] initWithBook:book_ database:database_];
+ return search_;
+}
+
- (void) buttonBarItemTapped:(id)sender {
unsigned tag = [sender tag];
if (tag == tag_) {
[book_ resetViewAnimated:YES];
return;
- } else if (tag_ == 2 && tag != 2)
+ } else if (tag_ == 2)
[[self sectionsView] resetView];
switch (tag) {
- case 1: [self _setHomePage]; break;
+ case 1: _setHomePage(self); break;
case 2: [self setPage:[self sectionsView]]; break;
- case 3: [self setPage:changes_]; break;
- case 4: [self setPage:manage_]; break;
- case 5: [self setPage:search_]; break;
+ case 3: [self setPage:[self changesView]]; break;
+ case 4: [self setPage:[self manageView]]; break;
+ case 5: [self setPage:[self searchView]]; break;
- default: _assert(false);
+ _nodefault
}
tag_ = tag;
}
-- (void) applicationWillSuspend {
- [database_ clean];
- [super applicationWillSuspend];
-}
-
- (void) askForSettings {
NSString *parenthetical(UCLocalize("PARENTHETICAL"));
- UIActionSheet *role = [[[UIActionSheet alloc]
+ CYActionSheet *role([[[CYActionSheet alloc]
initWithTitle:UCLocalize("WHO_ARE_YOU")
buttons:[NSArray arrayWithObjects:
[NSString stringWithFormat:parenthetical, UCLocalize("USER"), UCLocalize("USER_EX")],
[NSString stringWithFormat:parenthetical, UCLocalize("DEVELOPER"), UCLocalize("DEVELOPER_EX")],
nil]
defaultButtonIndex:-1
- delegate:self
- context:@"role"
- ] autorelease];
+ ] autorelease]);
[role setBodyText:UCLocalize("ROLE_EX")];
- [role popupAlertAnimated:YES];
+
+ int button([role yieldToPopupAlertAnimated:YES]);
+
+ switch (button) {
+ case 1: Role_ = @"User"; break;
+ case 2: Role_ = @"Hacker"; break;
+ case 3: Role_ = @"Developer"; break;
+
+ _nodefault
+ }
+
+ Settings_ = [NSMutableDictionary dictionaryWithObjectsAndKeys:
+ Role_, @"Role",
+ nil];
+
+ [Metadata_ setObject:Settings_ forKey:@"Settings"];
+
+ Changed_ = true;
+
+ [role dismiss];
}
- (void) setPackageView:(PackageView *)view {
#endif
}
-- (void) finish {
- if (hud_ != nil) {
- [self setStatusBarShowsProgress:NO];
- [self removeProgressHUD:hud_];
-
- [hud_ autorelease];
- hud_ = nil;
-
- pid_t pid = ExecFork();
- if (pid == 0) {
- execlp("launchctl", "launchctl", "stop", "com.apple.SpringBoard", NULL);
- perror("launchctl stop");
- }
-
- return;
- }
-
- if (Role_ == nil) {
- [self askForSettings];
- return;
- }
-
- _trace();
- overlay_ = [[UIView alloc] initWithFrame:[underlay_ bounds]];
-
- CGRect screenrect = [UIHardware fullScreenApplicationContentRect];
- book_ = [[CYBook alloc] initWithFrame:CGRectMake(
- 0, 0, screenrect.size.width, screenrect.size.height - 48
- ) database:database_];
-
- [book_ setDelegate:self];
-
- [overlay_ addSubview:book_];
-
- NSArray *buttonitems = [NSArray arrayWithObjects:
- [NSDictionary dictionaryWithObjectsAndKeys:
- @"buttonBarItemTapped:", kUIButtonBarButtonAction,
- @"home-up.png", kUIButtonBarButtonInfo,
- @"home-dn.png", kUIButtonBarButtonSelectedInfo,
- [NSNumber numberWithInt:1], kUIButtonBarButtonTag,
- self, kUIButtonBarButtonTarget,
- @"Cydia", kUIButtonBarButtonTitle,
- @"0", kUIButtonBarButtonType,
- nil],
-
- [NSDictionary dictionaryWithObjectsAndKeys:
- @"buttonBarItemTapped:", kUIButtonBarButtonAction,
- @"install-up.png", kUIButtonBarButtonInfo,
- @"install-dn.png", kUIButtonBarButtonSelectedInfo,
- [NSNumber numberWithInt:2], kUIButtonBarButtonTag,
- self, kUIButtonBarButtonTarget,
- UCLocalize("SECTIONS"), kUIButtonBarButtonTitle,
- @"0", kUIButtonBarButtonType,
- nil],
-
- [NSDictionary dictionaryWithObjectsAndKeys:
- @"buttonBarItemTapped:", kUIButtonBarButtonAction,
- @"changes-up.png", kUIButtonBarButtonInfo,
- @"changes-dn.png", kUIButtonBarButtonSelectedInfo,
- [NSNumber numberWithInt:3], kUIButtonBarButtonTag,
- self, kUIButtonBarButtonTarget,
- UCLocalize("CHANGES"), kUIButtonBarButtonTitle,
- @"0", kUIButtonBarButtonType,
- nil],
-
- [NSDictionary dictionaryWithObjectsAndKeys:
- @"buttonBarItemTapped:", kUIButtonBarButtonAction,
- @"manage-up.png", kUIButtonBarButtonInfo,
- @"manage-dn.png", kUIButtonBarButtonSelectedInfo,
- [NSNumber numberWithInt:4], kUIButtonBarButtonTag,
- self, kUIButtonBarButtonTarget,
- UCLocalize("MANAGE"), kUIButtonBarButtonTitle,
- @"0", kUIButtonBarButtonType,
- nil],
-
- [NSDictionary dictionaryWithObjectsAndKeys:
- @"buttonBarItemTapped:", kUIButtonBarButtonAction,
- @"search-up.png", kUIButtonBarButtonInfo,
- @"search-dn.png", kUIButtonBarButtonSelectedInfo,
- [NSNumber numberWithInt:5], kUIButtonBarButtonTag,
- self, kUIButtonBarButtonTarget,
- UCLocalize("SEARCH"), kUIButtonBarButtonTitle,
- @"0", kUIButtonBarButtonType,
- nil],
- nil];
-
- toolbar_ = [[UIToolbar alloc]
- initInView:overlay_
- withFrame:CGRectMake(
- 0, screenrect.size.height - ButtonBarHeight_,
- screenrect.size.width, ButtonBarHeight_
- )
- withItemList:buttonitems
- ];
-
- [toolbar_ setDelegate:self];
- [toolbar_ setBarStyle:1];
- [toolbar_ setButtonBarTrackingMode:2];
-
- int buttons[5] = {1, 2, 3, 4, 5};
- [toolbar_ registerButtonGroup:0 withButtons:buttons withCount:5];
- [toolbar_ showButtonGroup:0 withDuration:0];
-
- for (int i = 0; i != 5; ++i)
- [[toolbar_ viewWithTag:(i + 1)] setFrame:CGRectMake(
- i * 64 + 2, 1, 60, ButtonBarHeight_
- )];
-
- [toolbar_ showSelectionForButton:1];
- [overlay_ addSubview:toolbar_];
-
- [UIKeyboard initImplementationNow];
- CGSize keysize = [UIKeyboard defaultSize];
- CGRect keyrect = {{0, [overlay_ bounds].size.height}, keysize};
- keyboard_ = [[UIKeyboard alloc] initWithFrame:keyrect];
- [overlay_ addSubview:keyboard_];
-
- [underlay_ addSubview:overlay_];
-
- [self reloadData];
-
- [self sectionsView];
- changes_ = [[ChangesView alloc] initWithBook:book_ database:database_];
- search_ = [[SearchView alloc] initWithBook:book_ database:database_];
-
- manage_ = (ManageView *) [[self
- _pageForURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"manage" ofType:@"html"]]
- withClass:[ManageView class]
- ] retain];
-
-#if RecyclePackageViews
- details_ = [[NSMutableArray alloc] initWithCapacity:4];
- [details_ addObject:[self _packageView]];
- [details_ addObject:[self _packageView]];
-#endif
-
- PrintTimes();
-
- [self _setHomePage];
-}
-
- (void) alertSheet:(UIActionSheet *)sheet buttonClicked:(int)button {
NSString *context([sheet context]);
clear = true;
break;
- default:
- _assert(false);
+ _nodefault
}
[sheet dismiss];
[self _loaded];
break;
- default:
- _assert(false);
+ _nodefault
}
[sheet dismiss];
- } else if ([context isEqualToString:@"role"]) {
- switch (button) {
- case 1: Role_ = @"User"; break;
- case 2: Role_ = @"Hacker"; break;
- case 3: Role_ = @"Developer"; break;
-
- default:
- Role_ = nil;
- _assert(false);
- }
-
- bool reset = Settings_ != nil;
-
- Settings_ = [NSMutableDictionary dictionaryWithObjectsAndKeys:
- Role_, @"Role",
- nil];
-
- [Metadata_ setObject:Settings_ forKey:@"Settings"];
-
- Changed_ = true;
-
- [sheet dismiss];
-
- if (reset)
- [self updateData];
- else
- [self finish];
} else if ([context isEqualToString:@"upgrade"]) {
switch (button) {
case 1:
Ignored_ = YES;
break;
- default:
- _assert(false);
+ _nodefault
}
[sheet dismiss];
}
}
-- (void) reorganize { _pooled
- system("/usr/libexec/cydia/free.sh");
- [self performSelectorOnMainThread:@selector(finish) withObject:nil waitUntilDone:NO];
+- (void) system:(NSString *)command { _pooled
+ system([command UTF8String]);
+}
+
+- (void) applicationWillSuspend {
+ [database_ clean];
+ [super applicationWillSuspend];
}
- (void) applicationSuspend:(__GSEvent *)event {
- (UIProgressHUD *) addProgressHUD {
UIProgressHUD *hud([[[UIProgressHUD alloc] initWithWindow:window_] autorelease]);
+ [hud setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+
[window_ setUserInteractionEnabled:NO];
[hud show:YES];
[progress_ addSubview:hud];
[view setPackage:package];
return view;
} else {
- UIActionSheet *sheet = [[[UIActionSheet alloc]
- initWithTitle:UCLocalize("CANNOT_LOCATE_PACKAGE")
- buttons:[NSArray arrayWithObjects:UCLocalize("CLOSE"), nil]
- defaultButtonIndex:0
- delegate:self
- context:@"missing"
- ] autorelease];
-
- [sheet setBodyText:[NSString stringWithFormat:UCLocalize("PACKAGE_CANNOT_BE_FOUND"), name]];
-
- [sheet popupAlertAnimated:YES];
- return nil;
+ NSURL *url([NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"unknown" ofType:@"html"]]);
+ url = [NSURL URLWithString:[[url absoluteString] stringByAppendingString:[NSString stringWithFormat:@"?%@", name]]];
+ return [self _pageForURL:url withClass:[CydiaBrowserView class]];
}
}
essential_ = [[NSMutableArray alloc] initWithCapacity:4];
broken_ = [[NSMutableArray alloc] initWithCapacity:4];
- window_ = [[UIWindow alloc] initWithContentRect:[UIHardware fullScreenApplicationContentRect]];
+ UIScreen *screen([UIScreen mainScreen]);
+
+ window_ = [[UIWindow alloc] initWithFrame:[screen bounds]];
[window_ orderFront:self];
[window_ makeKey:self];
[window_ setHidden:NO];
+ root_ = [[CydiaViewController alloc] init];
+ [window_ addSubview:[root_ view]];
+
database_ = [Database sharedInstance];
- progress_ = [[ProgressView alloc] initWithFrame:[window_ bounds] database:database_ delegate:self];
+ progress_ = [[ProgressView alloc] initWithFrame:[[root_ view] bounds] database:database_ delegate:self];
+ [progress_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [[root_ view] addSubview:progress_];
+
[database_ setDelegate:progress_];
- [window_ setContentView:progress_];
underlay_ = [[UIView alloc] initWithFrame:[progress_ bounds]];
+ [underlay_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[progress_ setContentView:underlay_];
[progress_ resetView];
) {
[self setIdleTimerDisabled:YES];
- hud_ = [[self addProgressHUD] retain];
+ hud_ = [self addProgressHUD];
[hud_ setText:@"Reorganizing\n\nWill Automatically\nClose When Done"];
-
[self setStatusBarShowsProgress:YES];
- [NSThread
- detachNewThreadSelector:@selector(reorganize)
- toTarget:self
- withObject:nil
- ];
- } else
- [self finish];
+ [self yieldToSelector:@selector(system:) withObject:@"/usr/libexec/cydia/free.sh"];
+
+ [self setStatusBarShowsProgress:NO];
+ [self removeProgressHUD:hud_];
+ hud_ = nil;
+
+ if (ExecFork() == 0) {
+ execlp("launchctl", "launchctl", "stop", "com.apple.SpringBoard", NULL);
+ perror("launchctl stop");
+ }
+
+ return;
+ }
+
+ if (Role_ == nil)
+ [self askForSettings];
+
+ _trace();
+ overlay_ = [[UIView alloc] initWithFrame:[underlay_ bounds]];
+ [overlay_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+
+ CGRect screenrect = [UIHardware fullScreenApplicationContentRect];
+
+ book_ = [[CYBook alloc] initWithFrame:CGRectMake(
+ 0, 0, screenrect.size.width, screenrect.size.height - 48
+ ) database:database_];
+
+ [book_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [overlay_ addSubview:book_];
+
+ [book_ setDelegate:self];
+
+ NSArray *buttonitems = [NSArray arrayWithObjects:
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ @"buttonBarItemTapped:", kUIButtonBarButtonAction,
+ @"home-up.png", kUIButtonBarButtonInfo,
+ @"home-dn.png", kUIButtonBarButtonSelectedInfo,
+ [NSNumber numberWithInt:1], kUIButtonBarButtonTag,
+ self, kUIButtonBarButtonTarget,
+ @"Cydia", kUIButtonBarButtonTitle,
+ @"0", kUIButtonBarButtonType,
+ nil],
+
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ @"buttonBarItemTapped:", kUIButtonBarButtonAction,
+ @"install-up.png", kUIButtonBarButtonInfo,
+ @"install-dn.png", kUIButtonBarButtonSelectedInfo,
+ [NSNumber numberWithInt:2], kUIButtonBarButtonTag,
+ self, kUIButtonBarButtonTarget,
+ UCLocalize("SECTIONS"), kUIButtonBarButtonTitle,
+ @"0", kUIButtonBarButtonType,
+ nil],
+
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ @"buttonBarItemTapped:", kUIButtonBarButtonAction,
+ @"changes-up.png", kUIButtonBarButtonInfo,
+ @"changes-dn.png", kUIButtonBarButtonSelectedInfo,
+ [NSNumber numberWithInt:3], kUIButtonBarButtonTag,
+ self, kUIButtonBarButtonTarget,
+ UCLocalize("CHANGES"), kUIButtonBarButtonTitle,
+ @"0", kUIButtonBarButtonType,
+ nil],
+
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ @"buttonBarItemTapped:", kUIButtonBarButtonAction,
+ @"manage-up.png", kUIButtonBarButtonInfo,
+ @"manage-dn.png", kUIButtonBarButtonSelectedInfo,
+ [NSNumber numberWithInt:4], kUIButtonBarButtonTag,
+ self, kUIButtonBarButtonTarget,
+ UCLocalize("MANAGE"), kUIButtonBarButtonTitle,
+ @"0", kUIButtonBarButtonType,
+ nil],
+
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ @"buttonBarItemTapped:", kUIButtonBarButtonAction,
+ @"search-up.png", kUIButtonBarButtonInfo,
+ @"search-dn.png", kUIButtonBarButtonSelectedInfo,
+ [NSNumber numberWithInt:5], kUIButtonBarButtonTag,
+ self, kUIButtonBarButtonTarget,
+ UCLocalize("SEARCH"), kUIButtonBarButtonTitle,
+ @"0", kUIButtonBarButtonType,
+ nil],
+ nil];
+
+ toolbar_ = [[UIToolbar alloc]
+ initInView:overlay_
+ withFrame:CGRectMake(
+ 0, screenrect.size.height - ButtonBarHeight_,
+ screenrect.size.width, ButtonBarHeight_
+ )
+ withItemList:buttonitems
+ ];
+
+ [toolbar_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin)];
+ [overlay_ addSubview:toolbar_];
+
+ [toolbar_ setDelegate:self];
+ [toolbar_ setBarStyle:1];
+ [toolbar_ setButtonBarTrackingMode:2];
+
+ int buttons[5] = {1, 2, 3, 4, 5};
+ [toolbar_ registerButtonGroup:0 withButtons:buttons withCount:5];
+ [toolbar_ showButtonGroup:0 withDuration:0];
+
+ for (int i = 0; i != 5; ++i) {
+ UIView *button([toolbar_ viewWithTag:(i + 1)]);
+
+ [button setFrame:CGRectMake(
+ i * (screenrect.size.width / 5) + (screenrect.size.width / 5 - ButtonBarWidth_) / 2, 1,
+ ButtonBarWidth_, ButtonBarHeight_
+ )];
+
+ [button setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
+ }
+
+ [toolbar_ showSelectionForButton:1];
+
+ [UIKeyboard initImplementationNow];
+ /*CGSize keysize = [UIKeyboard defaultSize];
+ CGRect keyrect = {{0, [overlay_ bounds].size.height}, keysize};
+ keyboard_ = [[UIKeyboard alloc] initWithFrame:keyrect];
+ [overlay_ addSubview:keyboard_];*/
+
+ [underlay_ addSubview:overlay_];
+
+ [self reloadData];
+
+#if RecyclePackageViews
+ details_ = [[NSMutableArray alloc] initWithCapacity:4];
+ [details_ addObject:[self _packageView]];
+ [details_ addObject:[self _packageView]];
+#endif
+
+ PrintTimes();
+
+ _setHomePage(self);
}
- (void) showKeyboard:(BOOL)show {
}
- (void) slideUp:(UIActionSheet *)alert {
+ [alert setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[alert presentSheetInView:overlay_];
}
int main(int argc, char *argv[]) { _pooled
_trace();
+ if (Class $UIDevice = objc_getClass("UIDevice")) {
+ UIDevice *device([$UIDevice currentDevice]);
+ IsWildcat_ = [device respondsToSelector:@selector(isWildcat)] && [device isWildcat];
+ } else
+ IsWildcat_ = false;
+
PackageName = reinterpret_cast<CYString &(*)(Package *, SEL)>(method_getImplementation(class_getInstanceMethod([Package class], @selector(cyname))));
/* Library Hacks {{{ */
+ class_addMethod(objc_getClass("WebScriptObject"), @selector(countByEnumeratingWithState:objects:count:), (IMP) &WebScriptObject$countByEnumeratingWithState$objects$count$, "I20@0:4^{NSFastEnumerationState}8^@12I16");
class_addMethod(objc_getClass("DOMNodeList"), @selector(countByEnumeratingWithState:objects:count:), (IMP) &DOMNodeList$countByEnumeratingWithState$objects$count$, "I20@0:4^{NSFastEnumerationState}8^@12I16");
$WebDefaultUIKitDelegate = objc_getClass("WebDefaultUIKitDelegate");
Languages_ = [NSLocale preferredLanguages];
//CFStringRef locale(CFLocaleGetIdentifier(Locale_));
//NSLog(@"%@", [Languages_ description]);
+
const char *lang;
if (Languages_ == nil || [Languages_ count] == 0)
+ // XXX: consider just setting to C and then falling through?
lang = NULL;
- else
+ else {
lang = [[Languages_ objectAtIndex:0] UTF8String];
- setenv("LANG", lang, true);
+ setenv("LANG", lang, true);
+ }
+
//std::setlocale(LC_ALL, lang);
NSLog(@"Setting Language: %s", lang);
/* }}} */
Packages_ = [Metadata_ objectForKey:@"Packages"];
Sections_ = [Metadata_ objectForKey:@"Sections"];
Sources_ = [Metadata_ objectForKey:@"Sources"];
+
+ Token_ = [Metadata_ objectForKey:@"Token"];
}
if (Settings_ != nil)
Finishes_ = [NSArray arrayWithObjects:@"return", @"reopen", @"restart", @"reload", @"reboot", nil];
+ if (substrate && access("/Library/MobileSubstrate/DynamicLibraries/SimulatedKeyEvents.dylib", F_OK) == 0)
+ dlopen("/Library/MobileSubstrate/DynamicLibraries/SimulatedKeyEvents.dylib", RTLD_LAZY | RTLD_GLOBAL);
if (substrate && access("/Applications/WinterBoard.app/WinterBoard.dylib", F_OK) == 0)
dlopen("/Applications/WinterBoard.app/WinterBoard.dylib", RTLD_LAZY | RTLD_GLOBAL);
/*if (substrate && access("/Library/MobileSubstrate/MobileSubstrate.dylib", F_OK) == 0)
dlopen("/Library/MobileSubstrate/MobileSubstrate.dylib", RTLD_LAZY | RTLD_GLOBAL);*/
+ int version([[NSString stringWithContentsOfFile:@"/var/lib/cydia/firmware.ver"] intValue]);
+
if (access("/tmp/.cydia.fw", F_OK) == 0) {
unlink("/tmp/.cydia.fw");
goto firmware;
- } else if (access("/User", F_OK) != 0) {
+ } else if (access("/User", F_OK) != 0 || version < 2) {
firmware:
_trace();
system("/usr/libexec/cydia/firmware.sh");
if ($GSFontSetUseLegacyFontMetrics != NULL)
$GSFontSetUseLegacyFontMetrics(YES);
- UIKeyboardDisableAutomaticAppearance();
+ // XXX: I have a feeling this was important
+ //UIKeyboardDisableAutomaticAppearance();
/* }}} */
+ Colon_ = UCLocalize("COLON_DELIMITED");
+ Error_ = UCLocalize("ERROR");
+ Warning_ = UCLocalize("WARNING");
+
_trace();
int value = UIApplicationMain(argc, argv, @"Cydia", @"Cydia");