📄 cydia.mm
字号:
- (Address *) sponsor {
return sponsor_;
}
- (Address *) author {
return author_;
}
- (NSArray *) relationships {
return relationships_;
}
- (Source *) source {
if (!cached_) {
source_ = file_.end() ? nil : [[database_ getSource:file_.File()] retain];
cached_ = true;
}
return source_;
}
- (NSString *) role {
return role_;
}
- (BOOL) matches:(NSString *)text {
if (text == nil)
return NO;
NSRange range;
range = [[self id] rangeOfString:text options:NSCaseInsensitiveSearch];
if (range.location != NSNotFound)
return YES;
range = [[self name] rangeOfString:text options:NSCaseInsensitiveSearch];
if (range.location != NSNotFound)
return YES;
range = [[self tagline] rangeOfString:text options:NSCaseInsensitiveSearch];
if (range.location != NSNotFound)
return YES;
return NO;
}
- (bool) hasSupportingRole {
if (role_ == nil)
return true;
if ([role_ isEqualToString:@"enduser"])
return true;
if ([Role_ isEqualToString:@"User"])
return false;
if ([role_ isEqualToString:@"hacker"])
return true;
if ([Role_ isEqualToString:@"Hacker"])
return false;
if ([role_ isEqualToString:@"developer"])
return true;
if ([Role_ isEqualToString:@"Developer"])
return false;
_assert(false);
}
- (BOOL) hasTag:(NSString *)tag {
return tags_ == nil ? NO : [tags_ containsObject:tag];
}
- (NSString *) primaryPurpose {
for (NSString *tag in tags_)
if ([tag hasPrefix:@"purpose::"])
return [tag substringFromIndex:9];
return nil;
}
- (NSComparisonResult) compareByName:(Package *)package {
NSString *lhs = [self name];
NSString *rhs = [package name];
if ([lhs length] != 0 && [rhs length] != 0) {
unichar lhc = [lhs characterAtIndex:0];
unichar rhc = [rhs characterAtIndex:0];
if (isalpha(lhc) && !isalpha(rhc))
return NSOrderedAscending;
else if (!isalpha(lhc) && isalpha(rhc))
return NSOrderedDescending;
}
return [lhs compare:rhs options:CompareOptions_];
}
- (NSComparisonResult) compareBySection:(Package *)package {
NSString *lhs = [self section];
NSString *rhs = [package section];
if (lhs == NULL && rhs != NULL)
return NSOrderedAscending;
else if (lhs != NULL && rhs == NULL)
return NSOrderedDescending;
else if (lhs != NULL && rhs != NULL) {
NSComparisonResult result = [lhs compare:rhs options:CompareOptions_];
if (result != NSOrderedSame)
return result;
}
return NSOrderedSame;
}
- (NSComparisonResult) compareBySectionAndName:(Package *)package {
NSString *lhs = [self section];
NSString *rhs = [package section];
if (lhs == NULL && rhs != NULL)
return NSOrderedAscending;
else if (lhs != NULL && rhs == NULL)
return NSOrderedDescending;
else if (lhs != NULL && rhs != NULL) {
NSComparisonResult result = [lhs compare:rhs];
if (result != NSOrderedSame)
return result;
}
return [self compareByName:package];
}
- (NSComparisonResult) compareForChanges:(Package *)package {
BOOL lhs = [self upgradableAndEssential:YES];
BOOL rhs = [package upgradableAndEssential:YES];
if (lhs != rhs)
return lhs ? NSOrderedAscending : NSOrderedDescending;
else if (!lhs) {
switch ([[self seen] compare:[package seen]]) {
case NSOrderedAscending:
return NSOrderedDescending;
case NSOrderedSame:
break;
case NSOrderedDescending:
return NSOrderedAscending;
default:
_assert(false);
}
}
return [self compareByName:package];
}
- (void) install {
pkgProblemResolver *resolver = [database_ resolver];
resolver->Clear(iterator_);
resolver->Protect(iterator_);
pkgCacheFile &cache([database_ cache]);
cache->MarkInstall(iterator_, false);
pkgDepCache::StateCache &state((*cache)[iterator_]);
if (!state.Install())
cache->SetReInstall(iterator_, true);
}
- (void) remove {
pkgProblemResolver *resolver = [database_ resolver];
resolver->Clear(iterator_);
resolver->Protect(iterator_);
resolver->Remove(iterator_);
[database_ cache]->MarkDelete(iterator_, true);
}
- (NSNumber *) isUnfilteredAndSearchedForBy:(NSString *)search {
return [NSNumber numberWithBool:(
[self unfiltered] && [self matches:search]
)];
}
- (NSNumber *) isInstalledAndVisible:(NSNumber *)number {
return [NSNumber numberWithBool:(
(![number boolValue] || [self visible]) && [self installed] != nil
)];
}
- (NSNumber *) isVisiblyUninstalledInSection:(NSString *)name {
NSString *section = [self section];
return [NSNumber numberWithBool:(
[self visible] &&
[self installed] == nil && (
name == nil ||
section == nil && [name length] == 0 ||
[name isEqualToString:section]
)
)];
}
- (NSNumber *) isVisibleInSource:(Source *)source {
return [NSNumber numberWithBool:([self source] == source && [self visible])];
}
@end
/* }}} */
/* Section Class {{{ */
@interface Section : NSObject {
NSString *name_;
size_t row_;
size_t count_;
}
- (NSComparisonResult) compareByName:(Section *)section;
- (Section *) initWithName:(NSString *)name;
- (Section *) initWithName:(NSString *)name row:(size_t)row;
- (NSString *) name;
- (size_t) row;
- (size_t) count;
- (void) addToCount;
@end
@implementation Section
- (void) dealloc {
[name_ release];
[super dealloc];
}
- (NSComparisonResult) compareByName:(Section *)section {
NSString *lhs = [self name];
NSString *rhs = [section name];
if ([lhs length] != 0 && [rhs length] != 0) {
unichar lhc = [lhs characterAtIndex:0];
unichar rhc = [rhs characterAtIndex:0];
if (isalpha(lhc) && !isalpha(rhc))
return NSOrderedAscending;
else if (!isalpha(lhc) && isalpha(rhc))
return NSOrderedDescending;
}
return [lhs compare:rhs options:CompareOptions_];
}
- (Section *) initWithName:(NSString *)name {
return [self initWithName:name row:0];
}
- (Section *) initWithName:(NSString *)name row:(size_t)row {
if ((self = [super init]) != nil) {
name_ = [name retain];
row_ = row;
} return self;
}
- (NSString *) name {
return name_;
}
- (size_t) row {
return row_;
}
- (size_t) count {
return count_;
}
- (void) addToCount {
++count_;
}
@end
/* }}} */
int Finish_;
NSArray *Finishes_;
/* Database Implementation {{{ */
@implementation Database
- (void) dealloc {
_assert(false);
[super dealloc];
}
- (void) _readCydia:(NSNumber *)fd {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
__gnu_cxx::stdio_filebuf<char> ib([fd intValue], std::ios::in);
std::istream is(&ib);
std::string line;
static Pcre finish_r("^finish:([^:]*)$");
while (std::getline(is, line)) {
const char *data(line.c_str());
size_t size = line.size();
lprintf("C:%s\n", data);
if (finish_r(data, size)) {
NSString *finish = finish_r[1];
int index = [Finishes_ indexOfObject:finish];
if (index != INT_MAX && index > Finish_)
Finish_ = index;
}
}
[pool release];
_assert(false);
}
- (void) _readStatus:(NSNumber *)fd {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
__gnu_cxx::stdio_filebuf<char> ib([fd intValue], std::ios::in);
std::istream is(&ib);
std::string line;
static Pcre conffile_r("^status: [^ ]* : conffile-prompt : (.*?) *$");
static Pcre pmstatus_r("^([^:]*):([^:]*):([^:]*):(.*)$");
while (std::getline(is, line)) {
const char *data(line.c_str());
size_t size = line.size();
lprintf("S:%s\n", data);
if (conffile_r(data, size)) {
[delegate_ setConfigurationData:conffile_r[1]];
} else if (strncmp(data, "status: ", 8) == 0) {
NSString *string = [NSString stringWithUTF8String:(data + 8)];
[delegate_ setProgressTitle:string];
} else if (pmstatus_r(data, size)) {
std::string type([pmstatus_r[1] UTF8String]);
NSString *id = pmstatus_r[2];
float percent([pmstatus_r[3] floatValue]);
[delegate_ setProgressPercent:(percent / 100)];
NSString *string = pmstatus_r[4];
if (type == "pmerror")
[delegate_ performSelectorOnMainThread:@selector(_setProgressError:)
withObject:[NSArray arrayWithObjects:string, id, nil]
waitUntilDone:YES
];
else if (type == "pmstatus")
[delegate_ setProgressTitle:string];
else if (type == "pmconffile")
[delegate_ setConfigurationData:string];
else _assert(false);
} else _assert(false);
}
[pool release];
_assert(false);
}
- (void) _readOutput:(NSNumber *)fd {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
__gnu_cxx::stdio_filebuf<char> ib([fd intValue], std::ios::in);
std::istream is(&ib);
std::string line;
while (std::getline(is, line)) {
lprintf("O:%s\n", line.c_str());
[delegate_ addProgressOutput:[NSString stringWithUTF8String:line.c_str()]];
}
[pool release];
_assert(false);
}
- (FILE *) input {
return input_;
}
- (Package *) packageWithName:(NSString *)name {
if (static_cast<pkgDepCache *>(cache_) == NULL)
return nil;
pkgCache::PkgIterator iterator(cache_->FindPkg([name UTF8String]));
return iterator.end() ? nil : [Package packageWithIterator:iterator database:self];
}
- (Database *) init {
if ((self = [super init]) != nil) {
policy_ = NULL;
records_ = NULL;
resolver_ = NULL;
fetcher_ = NULL;
lock_ = NULL;
sources_ = [[NSMutableDictionary dictionaryWithCapacity:16] retain];
packages_ = [[NSMutableArray arrayWithCapacity:16] retain];
int fds[2];
_assert(pipe(fds) != -1);
cydiafd_ = fds[1];
_config->Set("APT::Keep-Fds::", cydiafd_);
setenv("CYDIA", [[[[NSNumber numberWithInt:cydiafd_] stringValue] stringByAppendingString:@" 1"] UTF8String], _not(int));
[NSThread
detachNewThreadSelector:@selector(_readCydia:)
toTarget:self
withObject:[[NSNumber numberWithInt:fds[0]] retain]
];
_assert(pipe(fds) != -1);
statusfd_ = fds[1];
[NSThread
detachNewThreadSelector:@selector(_readStatus:)
toTarget:self
withObject:[[NSNumber numberWithInt:fds[0]] retain]
];
_assert(pipe(fds) != -1);
_assert(dup2(fds[0], 0) != -1);
_assert(close(fds[0]) != -1);
input_ = fdopen(fds[1], "a");
_assert(pipe(fds) != -1);
_assert(dup2(fds[1], 1) != -1);
_assert(close(fds[1]) != -1);
[NSThread
detachNewThreadSelector:@selector(_readOutput:)
toTarget:self
withObject:[[NSNumber numberWithInt:fds[0]] retain]
];
} return self;
}
- (pkgCacheFile &) cache {
return cache_;
}
- (pkgDepCache::Policy *) policy {
return policy_;
}
- (pkgRecords *) records {
return records_;
}
- (pkgProblemResolver *) resolver {
return resolver_;
}
- (pkgAcquire &) fetcher {
return *fetcher_;
}
- (NSArray *) packages {
return packages_;
}
- (NSArray *) sources {
return [sources_ allValues];
}
- (void) reloadData {
_error->Discard();
delete list_;
list_ = NULL;
manager_ = NULL;
delete lock_;
lock_ = NULL;
delete fetcher_;
fetcher_ = NULL;
delete resolver_;
resolver_ = NULL;
delete records_;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -