summaryrefslogtreecommitdiff
path: root/Cydia.mm
diff options
context:
space:
mode:
Diffstat (limited to 'Cydia.mm')
-rw-r--r--Cydia.mm279
1 files changed, 191 insertions, 88 deletions
diff --git a/Cydia.mm b/Cydia.mm
index fd83416..8fc833f 100644
--- a/Cydia.mm
+++ b/Cydia.mm
@@ -1,4 +1,5 @@
/* #include Directives {{{ */
+#include <Foundation/NSURL.h>
#include <UIKit/UIKit.h>
#import <GraphicsServices/GraphicsServices.h>
@@ -31,6 +32,10 @@
while (false)
/* }}} */
+@interface NSString (CydiaBypass)
+- (NSString *) stringByAddingPercentEscapes;
+@end
+
@protocol ProgressDelegate
- (void) setError:(NSString *)error;
- (void) setTitle:(NSString *)title;
@@ -60,15 +65,13 @@ class Status :
}
virtual void IMSHit(pkgAcquire::ItemDesc &item) {
- [delegate_ performSelectorOnMainThread:@selector(setStatusIMSHit) withObject:nil waitUntilDone:YES];
}
virtual void Fetch(pkgAcquire::ItemDesc &item) {
- [delegate_ setTitle:[NSString stringWithCString:item.Description.c_str()]];
+ [delegate_ setTitle:[NSString stringWithCString:("Downloading " + item.ShortDesc).c_str()]];
}
virtual void Done(pkgAcquire::ItemDesc &item) {
- [delegate_ performSelectorOnMainThread:@selector(setStatusDone) withObject:nil waitUntilDone:YES];
}
virtual void Fail(pkgAcquire::ItemDesc &item) {
@@ -248,6 +251,33 @@ inline float interpolate(float begin, float end, float fraction) {
}
/* }}} */
+/* Reset View {{{ */
+@interface ResetView : UIView {
+ UINavigationBar *navbar_;
+ bool resetting_;
+}
+
+- (void) dealloc;
+- (void) resetView;
+@end
+
+@implementation ResetView
+
+- (void) dealloc {
+ [navbar_ release];
+ [super dealloc];
+}
+
+- (void) resetView {
+ resetting_ = true;
+ while ([[navbar_ navigationItems] count] != 1)
+ [navbar_ popNavigationItem];
+ resetting_ = false;
+}
+
+@end
+/* }}} */
+
@interface Database : NSObject {
pkgCacheFile cache_;
pkgRecords *records_;
@@ -435,10 +465,12 @@ inline float interpolate(float begin, float end, float fraction) {
@end
/* }}} */
/* Package View {{{ */
-@interface PackageView : UIPreferencesTable {
+@interface PackageView : UIView {
+ UIPreferencesTable *table_;
Package *package_;
Database *database_;
NSMutableArray *cells_;
+ id delegate_;
}
- (void) dealloc;
@@ -447,8 +479,12 @@ inline float interpolate(float begin, float end, float fraction) {
- (int) preferencesTable:(UIPreferencesTable *)table numberOfRowsInGroup:(int)group;
- (UIPreferencesTableCell *) preferencesTable:(UIPreferencesTable *)table cellForRow:(int)row inGroup:(int)group;
-- (PackageView *) initWithFrame:(struct CGRect)frame database:(Database *)database;
+- (BOOL) canSelectRow:(int)row;
+- (void) tableRowSelected:(NSNotification *)notification;
+
+- (id) initWithFrame:(struct CGRect)frame database:(Database *)database;
- (void) setPackage:(Package *)package;
+- (void) setDelegate:(id)delegate;
@end
@implementation PackageView
@@ -456,6 +492,7 @@ inline float interpolate(float begin, float end, float fraction) {
- (void) dealloc {
if (package_ != nil)
[package_ release];
+ [table_ release];
[database_ release];
[cells_ release];
[super dealloc];
@@ -560,15 +597,35 @@ inline float interpolate(float begin, float end, float fraction) {
return cell;
}
-- (PackageView *) initWithFrame:(struct CGRect)frame database:(Database *)database {
+- (BOOL) canSelectRow:(int)row {
+ return YES;
+}
+
+- (void) tableRowSelected:(NSNotification *)notification {
+ switch ([table_ selectedRow]) {
+ case 5:
+ [delegate_ openURL:[NSURL URLWithString:[NSString stringWithFormat:@"mailto:%@?subject=%@",
+ [[package_ maintainer] email],
+ [[NSString stringWithFormat:@"regarding apt package \"%@\"", [package_ name]] stringByAddingPercentEscapes]
+ ]]];
+ break;
+ }
+}
+
+- (id) initWithFrame:(struct CGRect)frame database:(Database *)database {
if ((self = [super initWithFrame:frame]) != nil) {
database_ = [database retain];
- [self setDataSource:self];
+
+ table_ = [[UIPreferencesTable alloc] initWithFrame:[self bounds]];
+ [self addSubview:table_];
+
+ [table_ setDataSource:self];
+ [table_ setDelegate:self];
cells_ = [[NSMutableArray arrayWithCapacity:16] retain];
for (unsigned i = 0; i != 6; ++i) {
- struct CGRect frame = [self frameOfPreferencesCellAtRow:0 inGroup:0];
+ struct CGRect frame = [table_ frameOfPreferencesCellAtRow:0 inGroup:0];
UIPreferencesTableCell *cell = [[[UIPreferencesTableCell alloc] init] autorelease];
[cell setShowSelection:NO];
[cells_ addObject:cell];
@@ -578,7 +635,11 @@ inline float interpolate(float begin, float end, float fraction) {
- (void) setPackage:(Package *)package {
package_ = [package retain];
- [self reloadData];
+ [table_ reloadData];
+}
+
+- (void) setDelegate:(id)delegate {
+ delegate_ = delegate;
}
@end
@@ -688,6 +749,86 @@ inline float interpolate(float begin, float end, float fraction) {
@end
/* }}} */
+/* Sources View {{{ */
+@interface SourcesView : ResetView {
+ UISectionList *list_;
+ Database *database_;
+ id delegate_;
+ NSMutableArray *sources_;
+}
+
+- (void) navigationBar:(UINavigationBar *)navbar buttonClicked:(int)button;
+- (void) dealloc;
+- (id) initWithFrame:(CGRect)frame database:(Database *)database;
+- (void) setDelegate:(id)delegate;
+- (void) reloadData;
+@end
+
+@implementation SourcesView
+
+- (void) navigationBar:(UINavigationBar *)navbar buttonClicked:(int)button {
+ switch (button) {
+ case 0:
+ break;
+
+ case 1:
+ [delegate_ update];
+ break;
+ }
+}
+
+- (void) dealloc {
+ if (sources_ != nil)
+ [sources_ release];
+ [list_ release];
+ [super dealloc];
+}
+
+- (id) initWithFrame:(CGRect)frame database:(Database *)database {
+ if ((self = [super initWithFrame:frame]) != nil) {
+ database_ = database;
+ sources_ = nil;
+
+ CGSize navsize = [UINavigationBar defaultSize];
+ CGRect navrect = {{0, 0}, navsize};
+ CGRect bounds = [self bounds];
+
+ navbar_ = [[UINavigationBar alloc] initWithFrame:navrect];
+ [self addSubview:navbar_];
+
+ [navbar_ setBarStyle:1];
+ [navbar_ setDelegate:self];
+
+ UINavigationItem *navitem = [[[UINavigationItem alloc] initWithTitle:@"Sources"] autorelease];
+ [navbar_ pushNavigationItem:navitem];
+
+ [navbar_ showButtonsWithLeftTitle:@"Refresh All" rightTitle:@"Edit"];
+
+ list_ = [[UISectionList alloc] initWithFrame:CGRectMake(
+ 0, navsize.height, bounds.size.width, bounds.size.height - navsize.height
+ )];
+
+ [list_ setDataSource:self];
+ } return self;
+}
+
+- (void) setDelegate:(id)delegate {
+ delegate_ = delegate;
+}
+
+- (void) reloadData {
+ pkgSourceList list;
+ _assert(list.ReadMainList());
+
+ sources_ = [[NSMutableArray arrayWithCapacity:16] retain];
+
+ for (pkgSourceList::const_iterator source = list.begin(); source != list.end(); ++source) {
+ fprintf(stderr, "\"%s\" \"%s\" \"%s\"\n", (*source)->GetURI().c_str(), (*source)->GetDist().c_str(), (*source)->GetType());
+ }
+}
+
+@end
+/* }}} */
@implementation Database
@@ -709,23 +850,24 @@ inline float interpolate(float begin, float end, float fraction) {
while (std::getline(is, line)) {
const char *data(line.c_str());
- fprintf(stderr, "fd(%s)\n", data);
_assert(pcre_exec(code, study, data, line.size(), 0, 0, matches, sizeof(matches) / sizeof(matches[0])) >= 0);
- std::string type(line.substr(matches[2], matches[3] - matches[2]));
-
std::istringstream buffer(line.substr(matches[6], matches[7] - matches[6]));
float percent;
buffer >> percent;
[delegate_ setPercent:(percent / 100)];
NSString *string = [NSString stringWithCString:(data + matches[8]) length:(matches[9] - matches[8])];
+ std::string type(line.substr(matches[2], matches[3] - matches[2]));
if (type == "pmerror")
[delegate_ setError:string];
else if (type == "pmstatus")
[delegate_ setTitle:string];
+ else if (type == "pmconffile")
+ ;
+ else _assert(false);
}
[pool release];
@@ -752,7 +894,6 @@ inline float interpolate(float begin, float end, float fraction) {
int fds[2];
_assert(pipe(fds) != -1);
- printf("%d %d\n", fds[0], fds[1]);
statusfd_ = fds[1];
[NSThread
@@ -762,7 +903,6 @@ inline float interpolate(float begin, float end, float fraction) {
];
_assert(pipe(fds) != -1);
- printf("%d %d\n", fds[0], fds[1]);
_assert(dup2(fds[1], 1) != -1);
_assert(close(fds[1]) != -1);
@@ -787,44 +927,31 @@ inline float interpolate(float begin, float end, float fraction) {
}
- (void) reloadData {
- _trace();
_error->Discard();
- _trace();
delete resolver_;
- _trace();
delete records_;
- _trace();
cache_.Close();
- _trace();
cache_.Open(progress_, true);
- _trace();
records_ = new pkgRecords(cache_);
- _trace();
resolver_ = new pkgProblemResolver(cache_);
- _trace();
}
- (void) perform {
- _trace();
pkgRecords records(cache_);
- _trace();
FileFd lock;
lock.Fd(GetLock(_config->FindDir("Dir::Cache::Archives") + "lock"));
_assert(!_error->PendingError());
- _trace();
pkgAcquire fetcher(&status_);
pkgSourceList list;
_assert(list.ReadMainList());
- _trace();
SPtr<pkgPackageManager> manager(_system->CreatePM(cache_));
_assert(manager->GetArchives(&fetcher, &list, &records));
_assert(!_error->PendingError());
_assert(fetcher.Run() != pkgAcquire::Failed);
- _trace();
_system->UnLock();
pkgPackageManager::OrderResult result = manager->DoInstall(statusfd_);
@@ -927,6 +1054,7 @@ inline float interpolate(float begin, float end, float fraction) {
ProgressDelegate
> {
UIView *view_;
+ UIView *background_;
UITransitionView *transition_;
UIView *overlay_;
UINavigationBar *navbar_;
@@ -961,12 +1089,7 @@ inline float interpolate(float begin, float end, float fraction) {
- (void) addOutput:(NSString *)output;
- (void) _addOutput:(NSString *)output;
-- (void) setStatusIMSHit;
-- (void) setStatusDone;
- (void) setStatusFail;
-
-- (void) setStatusStart;
-- (void) setStatusStop;
@end
@protocol ProgressViewDelegate
@@ -977,6 +1100,7 @@ inline float interpolate(float begin, float end, float fraction) {
- (void) dealloc {
[view_ release];
+ [background_ release];
[transition_ release];
[overlay_ release];
[navbar_ release];
@@ -991,16 +1115,19 @@ inline float interpolate(float begin, float end, float fraction) {
delegate_ = delegate;
alert_ = nil;
- transition_ = [[UITransitionView alloc] initWithFrame:[self bounds]];
- [self addSubview:transition_];
-
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
float black[] = {0.0, 0.0, 0.0, 1.0};
float white[] = {1.0, 1.0, 1.0, 1.0};
float clear[] = {0.0, 0.0, 0.0, 0.0};
+ background_ = [[UIView alloc] initWithFrame:[self bounds]];
+ [background_ setBackgroundColor:CGColorCreate(space, black)];
+ [self addSubview:background_];
+
+ transition_ = [[UITransitionView alloc] initWithFrame:[self bounds]];
+ [self addSubview:transition_];
+
overlay_ = [[UIView alloc] initWithFrame:[transition_ bounds]];
- [overlay_ setBackgroundColor:CGColorCreate(space, black)];
CGSize navsize = [UINavigationBar defaultSize];
CGRect navrect = {{0, 0}, navsize};
@@ -1036,6 +1163,7 @@ inline float interpolate(float begin, float end, float fraction) {
[status_ setBackgroundColor:CGColorCreate(space, clear)];
[status_ setCentersHorizontally:YES];
+ //[status_ setFont:font];
output_ = [[UITextView alloc] initWithFrame:CGRectMake(
10,
@@ -1066,7 +1194,6 @@ inline float interpolate(float begin, float end, float fraction) {
- (void) resetView {
[transition_ transition:6 toView:view_];
- _trace();
}
- (void) alertSheet:(UIAlertSheet *)sheet buttonClicked:(int)button {
@@ -1076,21 +1203,15 @@ inline float interpolate(float begin, float end, float fraction) {
}
- (void) _retachThread {
- _trace();
[delegate_ progressViewIsComplete:self];
- _trace();
[self resetView];
- _trace();
}
- (void) _detachNewThreadData:(ProgressData *)data {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- _trace();
[[data target] performSelector:[data selector] withObject:[data object]];
- _trace();
[self performSelectorOnMainThread:@selector(_retachThread) withObject:nil waitUntilDone:YES];
- _trace();
[data release];
[pool release];
@@ -1114,16 +1235,7 @@ inline float interpolate(float begin, float end, float fraction) {
];
}
-- (void) setStatusIMSHit {
- _trace();
-}
-
-- (void) setStatusDone {
- _trace();
-}
-
- (void) setStatusFail {
- _trace();
}
- (void) setError:(NSString *)error {
@@ -1183,26 +1295,21 @@ inline float interpolate(float begin, float end, float fraction) {
- (void) _addOutput:(NSString *)output {
[output_ setText:[NSString stringWithFormat:@"%@\n%@", [output_ text], output]];
-}
-
-- (void) setStatusStart {
- _trace();
-}
-
-- (void) setStatusStop {
- _trace();
+ CGSize size = [output_ contentSize];
+ CGRect rect = {{0, size.height}, {size.width, 0}};
+ [output_ scrollRectToVisible:rect animated:YES];
}
@end
/* }}} */
@protocol PackagesDelegate
-
- (void) perform;
-
+- (void) update;
+- (void) openURL:(NSString *)url;
@end
-@interface Packages : UIView {
+@interface Packages : ResetView {
NSString *title_;
Database *database_;
bool (*filter_)(Package *package);
@@ -1210,7 +1317,6 @@ inline float interpolate(float begin, float end, float fraction) {
NSMutableArray *sections_;
id delegate_;
UISectionList *list_;
- UINavigationBar *navbar_;
UITransitionView *transition_;
Package *package_;
PackageView *pkgview_;
@@ -1352,25 +1458,24 @@ inline float interpolate(float begin, float end, float fraction) {
- (void) setDelegate:(id)delegate {
delegate_ = delegate;
+ [pkgview_ setDelegate:delegate];
}
- (void) deselect {
- [transition_ transition:2 toView:list_];
+ [transition_ transition:(resetting_ ? 0 : 2) toView:list_];
UITable *table = [list_ table];
- [table selectRow:-1 byExtendingSelection:NO withFade:YES];
+ [table selectRow:-1 byExtendingSelection:NO withFade:(resetting_ ? NO : YES)];
package_ = nil;
}
- (void) reloadData {
packages_ = [[NSMutableArray arrayWithCapacity:16] retain];
- _trace();
if (sections_ != nil) {
[sections_ release];
sections_ = nil;
}
- _trace();
for (pkgCache::PkgIterator iterator = [database_ cache]->PkgBegin(); !iterator.end(); ++iterator) {
Package *package = [Package packageWithIterator:iterator database:database_];
if (package == nil)
@@ -1379,36 +1484,24 @@ inline float interpolate(float begin, float end, float fraction) {
[packages_ addObject:package];
}
- _trace();
[packages_ sortUsingSelector:@selector(compareBySectionAndName:)];
sections_ = [[NSMutableArray arrayWithCapacity:16] retain];
- _trace();
Section *section = nil;
- _trace();
for (size_t offset = 0, count = [packages_ count]; offset != count; ++offset) {
- _trace();
Package *package = [packages_ objectAtIndex:offset];
- _trace();
NSString *name = [package section];
- _trace();
if (section == nil || ![[section name] isEqual:name]) {
section = [[Section alloc] initWithName:name row:offset];
[sections_ addObject:section];
}
- _trace();
[section addPackage:package];
- _trace();
}
- _trace();
[list_ reloadData];
- _trace();
- if (package_ != nil)
- [navbar_ popNavigationItem];
- _trace();
+ [self resetView];
}
@end
@@ -1441,11 +1534,13 @@ bool IsNotInstalled(Package *package) {
Packages *install_;
Packages *uninstall_;
+ SourcesView *sources_;
}
- (void) loadNews;
- (void) reloadData;
- (void) perform;
+- (void) update;
- (void) progressViewIsComplete:(ProgressView *)progress;
@@ -1470,17 +1565,13 @@ bool IsNotInstalled(Package *package) {
}
- (void) reloadData {
- _trace();
[database_ reloadData];
- _trace();
[install_ reloadData];
- _trace();
[uninstall_ reloadData];
- _trace();
+ [sources_ reloadData];
}
- (void) perform {
- _trace();
[progress_
detachNewThreadSelector:@selector(perform)
toTarget:database_
@@ -1488,10 +1579,16 @@ bool IsNotInstalled(Package *package) {
];
}
+- (void) update {
+ [progress_
+ detachNewThreadSelector:@selector(update)
+ toTarget:database_
+ withObject:nil
+ ];
+}
+
- (void) progressViewIsComplete:(ProgressView *)progress {
- _trace();
[self reloadData];
- _trace();
}
- (void) navigationBar:(UINavigationBar *)navbar buttonClicked:(int)button {
@@ -1550,11 +1647,14 @@ bool IsNotInstalled(Package *package) {
case 1: view = featured_; break;
case 2: view = install_; break;
case 4: view = uninstall_; break;
+ case 5: view = sources_; break;
default:
_assert(false);
}
+ if ([view respondsToSelector:@selector(resetView)])
+ [(id) view resetView];
[transition_ transition:0 toView:view];
}
@@ -1722,6 +1822,9 @@ bool IsNotInstalled(Package *package) {
uninstall_ = [[Packages alloc] initWithFrame:[transition_ bounds] title:@"Uninstall" database:database_ filter:&IsInstalled selector:@selector(remove)];
[uninstall_ setDelegate:self];
+ sources_ = [[SourcesView alloc] initWithFrame:[transition_ bounds] database:database_];
+ [sources_ setDelegate:self];
+
#if 0
UIAlertSheet *alert = [[UIAlertSheet alloc]