- path = [path substringFromIndex:8];
- if (![path hasPrefix:@"/"])
- path = [@"/" stringByAppendingString:path];
-
- if ([path isEqualToString:@"/storage"])
- return [self _pageForURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"storage" ofType:@"html"]] withClass:[CYBrowserController class]];
- /*else if ([path isEqualToString:@"/add-source"])
- return [[[AddSourceController alloc] initWithDatabase:database_] autorelease];*/
- else if ([path isEqualToString:@"/sources"])
- return [[[SourceController alloc] initWithDatabase:database_] autorelease];
- else if ([path isEqualToString:@"/packages"])
- return [[[InstalledController alloc] initWithDatabase:database_] autorelease];
- else if ([path hasPrefix:@"/url/"])
- return [self _pageForURL:[NSURL URLWithString:[path substringFromIndex:5]] withClass:[CYBrowserController class]];
- else if ([path hasPrefix:@"/launch/"])
- [self launchApplicationWithIdentifier:[path substringFromIndex:8] suspended:NO];
- else if ([path hasPrefix:@"/package-settings/"])
- return [[[CYPackageSettingsController alloc] initWithDatabase:database_ package:[path substringFromIndex:18]] autorelease];
- else if ([path hasPrefix:@"/package-signature/"])
- return [[[SignatureController alloc] initWithDatabase:database_ package:[path substringFromIndex:19]] autorelease];
- else if ([path hasPrefix:@"/package/"])
- return [self pageForPackage:[path substringFromIndex:9]];
- else if ([path hasPrefix:@"/files/"]) {
- NSString *name = [path substringFromIndex:7];
-
- if (Package *package = [database_ packageWithName:name]) {
- FileTable *files = [[[FileTable alloc] initWithDatabase:database_] autorelease];
- [files setPackage:package];
- return files;
+
+ NSString *base([components objectAtIndex:0]);
+
+ CYViewController *controller = nil;
+
+ if ([base isEqualToString:@"url"]) {
+ // This kind of URL can contain slashes in the argument, so we can't parse them below.
+ NSString *destination = [[url absoluteString] substringFromIndex:([scheme length] + [@"://" length] + [base length] + [@"/" length])];
+ controller = [[[CYBrowserController alloc] init] autorelease];
+ [(CYBrowserController *)controller loadURL:[NSURL URLWithString:destination]];
+ } else if ([components count] == 1) {
+ if ([base isEqualToString:@"storage"]) {
+ controller = [[[CYBrowserController alloc] init] autorelease];
+ [(CYBrowserController *)controller loadURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"storage" ofType:@"html"]]];
+ }
+
+ if ([base isEqualToString:@"manage"]) {
+ controller = [[[ManageController alloc] init] autorelease];
+ }
+
+ if ([base isEqualToString:@"sources"]) {
+ controller = [[[SourcesController alloc] initWithDatabase:database_] autorelease];
+ }
+
+ if ([base isEqualToString:@"home"]) {
+ controller = [[[HomeController alloc] init] autorelease];
+ }
+
+ if ([base isEqualToString:@"sections"]) {
+ controller = [[[SectionsController alloc] initWithDatabase:database_] autorelease];
+ }
+
+ if ([base isEqualToString:@"search"]) {
+ controller = [[[SearchController alloc] initWithDatabase:database_] autorelease];
+ }
+
+ if ([base isEqualToString:@"changes"]) {
+ controller = [[[ChangesController alloc] initWithDatabase:database_] autorelease];
+ }
+
+ if ([base isEqualToString:@"installed"]) {
+ controller = [[[InstalledController alloc] initWithDatabase:database_] autorelease];
+ }
+ } else if ([components count] == 2) {
+ NSString *argument = [components objectAtIndex:1];
+
+ if ([base isEqualToString:@"package"]) {
+ controller = [self pageForPackage:argument];
+ }
+
+ if ([base isEqualToString:@"search"]) {
+ controller = [[[SearchController alloc] initWithDatabase:database_] autorelease];
+ [(SearchController *)controller setSearchTerm:argument];
+ }
+
+ if ([base isEqualToString:@"sections"]) {
+ if ([argument isEqualToString:@"all"])
+ argument = nil;
+ controller = [[[SectionController alloc] initWithDatabase:database_ section:argument] autorelease];
+ }
+
+ if ([base isEqualToString:@"sources"]) {
+ if ([argument isEqualToString:@"add"]) {
+ controller = [[[SourcesController alloc] initWithDatabase:database_] autorelease];
+ [(SourcesController *)controller showAddSourcePrompt];
+ } else {
+ NSArray *sources = [database_ sources];
+ for (Source *source in sources) {
+ if ([[source name] caseInsensitiveCompare:argument] == NSOrderedSame) {
+ controller = [[[SourceController alloc] initWithDatabase:database_ source:source] autorelease];
+ break;
+ }
+ }
+ }
+ }
+
+ if ([base isEqualToString:@"launch"]) {
+ [self launchApplicationWithIdentifier:argument suspended:NO];
+ return nil;
+ }
+ } else if ([components count] == 3) {
+ NSString *arg1 = [components objectAtIndex:1];
+ NSString *arg2 = [components objectAtIndex:2];
+
+ if ([base isEqualToString:@"package"]) {
+ if ([arg2 isEqualToString:@"settings"]) {
+ controller = [[[PackageSettingsController alloc] initWithDatabase:database_ package:arg1] autorelease];
+ } else if ([arg2 isEqualToString:@"files"]) {
+ if (Package *package = [database_ packageWithName:arg1]) {
+ controller = [[[FileTable alloc] initWithDatabase:database_] autorelease];
+ [(FileTable *)controller setPackage:package];
+ }
+ }