📄 cydia.mm
字号:
- (NSString *) version {
return version_;
}
- (NSString *) defaultIcon {
return defaultIcon_;
}
@end
/* }}} */
/* Relationship Class {{{ */
@interface Relationship : NSObject {
NSString *type_;
NSString *id_;
}
- (NSString *) type;
- (NSString *) id;
- (NSString *) name;
@end
@implementation Relationship
- (void) dealloc {
[type_ release];
[id_ release];
[super dealloc];
}
- (NSString *) type {
return type_;
}
- (NSString *) id {
return id_;
}
- (NSString *) name {
_assert(false);
return nil;
}
@end
/* }}} */
/* Package Class {{{ */
NSString *Scour(const char *field, const char *begin, const char *end) {
size_t i(0), l(strlen(field));
for (;;) {
const char *name = begin + i;
const char *colon = name + l;
const char *value = colon + 1;
if (
value < end &&
*colon == ':' &&
memcmp(name, field, l) == 0
) {
while (value != end && value[0] == ' ')
++value;
const char *line = std::find(value, end, '\n');
while (line != value && line[-1] == ' ')
--line;
return [NSString stringWithUTF8Bytes:value length:(line - value)];
} else {
begin = std::find(begin, end, '\n');
if (begin == end)
return nil;
++begin;
}
}
}
@interface Package : NSObject {
pkgCache::PkgIterator iterator_;
_transient Database *database_;
pkgCache::VerIterator version_;
pkgCache::VerFileIterator file_;
Source *source_;
bool cached_;
NSString *latest_;
NSString *installed_;
NSString *id_;
NSString *name_;
NSString *tagline_;
NSString *icon_;
NSString *depiction_;
NSString *homepage_;
Address *sponsor_;
Address *author_;
NSArray *tags_;
NSString *role_;
NSArray *relationships_;
}
- (Package *) initWithIterator:(pkgCache::PkgIterator)iterator database:(Database *)database;
+ (Package *) packageWithIterator:(pkgCache::PkgIterator)iterator database:(Database *)database;
- (pkgCache::PkgIterator) iterator;
- (NSString *) section;
- (Address *) maintainer;
- (size_t) size;
- (NSString *) description;
- (NSString *) index;
- (NSDate *) seen;
- (NSString *) latest;
- (NSString *) installed;
- (BOOL) valid;
- (BOOL) upgradableAndEssential:(BOOL)essential;
- (BOOL) essential;
- (BOOL) broken;
- (BOOL) unfiltered;
- (BOOL) visible;
- (BOOL) half;
- (BOOL) halfConfigured;
- (BOOL) halfInstalled;
- (BOOL) hasMode;
- (NSString *) mode;
- (NSString *) id;
- (NSString *) name;
- (NSString *) tagline;
- (NSString *) icon;
- (NSString *) homepage;
- (NSString *) depiction;
- (Address *) author;
- (NSArray *) relationships;
- (Source *) source;
- (NSString *) role;
- (BOOL) matches:(NSString *)text;
- (bool) hasSupportingRole;
- (BOOL) hasTag:(NSString *)tag;
- (NSString *) primaryPurpose;
- (NSComparisonResult) compareByName:(Package *)package;
- (NSComparisonResult) compareBySection:(Package *)package;
- (NSComparisonResult) compareBySectionAndName:(Package *)package;
- (NSComparisonResult) compareForChanges:(Package *)package;
- (void) install;
- (void) remove;
- (NSNumber *) isUnfilteredAndSearchedForBy:(NSString *)search;
- (NSNumber *) isInstalledAndVisible:(NSNumber *)number;
- (NSNumber *) isVisiblyUninstalledInSection:(NSString *)section;
- (NSNumber *) isVisibleInSource:(Source *)source;
@end
@implementation Package
- (void) dealloc {
if (source_ != nil)
[source_ release];
[latest_ release];
if (installed_ != nil)
[installed_ release];
[id_ release];
if (name_ != nil)
[name_ release];
[tagline_ release];
if (icon_ != nil)
[icon_ release];
if (depiction_ != nil)
[depiction_ release];
if (homepage_ != nil)
[homepage_ release];
if (sponsor_ != nil)
[sponsor_ release];
if (author_ != nil)
[author_ release];
if (tags_ != nil)
[tags_ release];
if (role_ != nil)
[role_ release];
if (relationships_ != nil)
[relationships_ release];
[super dealloc];
}
+ (NSArray *) _attributeKeys {
return [NSArray arrayWithObjects:@"author", @"depiction", @"description", @"essential", @"homepage", @"icon", @"id", @"installed", @"latest", @"maintainer", @"name", @"section", @"size", @"source", @"sponsor", @"tagline", nil];
}
- (NSArray *) attributeKeys {
return [[self class] _attributeKeys];
}
+ (BOOL) isKeyExcludedFromWebScript:(const char *)name {
return ![[self _attributeKeys] containsObject:[NSString stringWithUTF8String:name]] && [super isKeyExcludedFromWebScript:name];
}
- (Package *) initWithIterator:(pkgCache::PkgIterator)iterator database:(Database *)database {
if ((self = [super init]) != nil) {
iterator_ = iterator;
database_ = database;
version_ = [database_ policy]->GetCandidateVer(iterator_);
latest_ = version_.end() ? nil : [StripVersion([NSString stringWithUTF8String:version_.VerStr()]) retain];
if (!version_.end())
file_ = version_.FileList();
else {
pkgCache &cache([database_ cache]);
file_ = pkgCache::VerFileIterator(cache, cache.VerFileP);
}
pkgCache::VerIterator current = iterator_.CurrentVer();
installed_ = current.end() ? nil : [StripVersion([NSString stringWithUTF8String:current.VerStr()]) retain];
id_ = [[[NSString stringWithUTF8String:iterator_.Name()] lowercaseString] retain];
if (!file_.end()) {
pkgRecords::Parser *parser = &[database_ records]->Lookup(file_);
const char *begin, *end;
parser->GetRec(begin, end);
name_ = Scour("Name", begin, end);
if (name_ != nil)
name_ = [name_ retain];
tagline_ = [[NSString stringWithUTF8String:parser->ShortDesc().c_str()] retain];
icon_ = Scour("Icon", begin, end);
if (icon_ != nil)
icon_ = [icon_ retain];
depiction_ = Scour("Depiction", begin, end);
if (depiction_ != nil)
depiction_ = [depiction_ retain];
homepage_ = Scour("Homepage", begin, end);
if (homepage_ == nil)
homepage_ = Scour("Website", begin, end);
if ([homepage_ isEqualToString:depiction_])
homepage_ = nil;
if (homepage_ != nil)
homepage_ = [homepage_ retain];
NSString *sponsor = Scour("Sponsor", begin, end);
if (sponsor != nil)
sponsor_ = [[Address addressWithString:sponsor] retain];
NSString *author = Scour("Author", begin, end);
if (author != nil)
author_ = [[Address addressWithString:author] retain];
NSString *tags = Scour("Tag", begin, end);
if (tags != nil)
tags_ = [[tags componentsSeparatedByString:@", "] retain];
}
if (tags_ != nil)
for (int i(0), e([tags_ count]); i != e; ++i) {
NSString *tag = [tags_ objectAtIndex:i];
if ([tag hasPrefix:@"role::"]) {
role_ = [[tag substringFromIndex:6] retain];
break;
}
}
NSMutableDictionary *metadata = [Packages_ objectForKey:id_];
if (metadata == nil || [metadata count] == 0) {
metadata = [NSMutableDictionary dictionaryWithObjectsAndKeys:
now_, @"FirstSeen",
nil];
[Packages_ setObject:metadata forKey:id_];
Changed_ = true;
}
} return self;
}
+ (Package *) packageWithIterator:(pkgCache::PkgIterator)iterator database:(Database *)database {
return [[[Package alloc]
initWithIterator:iterator
database:database
] autorelease];
}
- (pkgCache::PkgIterator) iterator {
return iterator_;
}
- (NSString *) section {
const char *section = iterator_.Section();
if (section == NULL)
return nil;
NSString *name = [[NSString stringWithUTF8String:section] stringByReplacingCharacter:' ' withCharacter:'_'];
lookup:
if (NSDictionary *value = [SectionMap_ objectForKey:name])
if (NSString *rename = [value objectForKey:@"Rename"]) {
name = rename;
goto lookup;
}
return [name stringByReplacingCharacter:'_' withCharacter:' '];
}
- (Address *) maintainer {
if (file_.end())
return nil;
pkgRecords::Parser *parser = &[database_ records]->Lookup(file_);
return [Address addressWithString:[NSString stringWithUTF8String:parser->Maintainer().c_str()]];
}
- (size_t) size {
return version_.end() ? 0 : version_->InstalledSize;
}
- (NSString *) description {
if (file_.end())
return nil;
pkgRecords::Parser *parser = &[database_ records]->Lookup(file_);
NSString *description([NSString stringWithUTF8String:parser->LongDesc().c_str()]);
NSArray *lines = [description componentsSeparatedByString:@"\n"];
NSMutableArray *trimmed = [NSMutableArray arrayWithCapacity:([lines count] - 1)];
if ([lines count] < 2)
return nil;
NSCharacterSet *whitespace = [NSCharacterSet whitespaceCharacterSet];
for (size_t i(1); i != [lines count]; ++i) {
NSString *trim = [[lines objectAtIndex:i] stringByTrimmingCharactersInSet:whitespace];
[trimmed addObject:trim];
}
return [trimmed componentsJoinedByString:@"\n"];
}
- (NSString *) index {
NSString *index = [[[self name] substringToIndex:1] uppercaseString];
return [index length] != 0 && isalpha([index characterAtIndex:0]) ? index : @"123";
}
- (NSDate *) seen {
return [[Packages_ objectForKey:id_] objectForKey:@"FirstSeen"];
}
- (NSString *) latest {
return latest_;
}
- (NSString *) installed {
return installed_;
}
- (BOOL) valid {
return !version_.end();
}
- (BOOL) upgradableAndEssential:(BOOL)essential {
pkgCache::VerIterator current = iterator_.CurrentVer();
if (current.end())
return essential && [self essential];
else {
pkgCache::VerIterator candidate = [database_ policy]->GetCandidateVer(iterator_);
return !candidate.end() && candidate != current;
}
}
- (BOOL) essential {
return (iterator_->Flags & pkgCache::Flag::Essential) == 0 ? NO : YES;
}
- (BOOL) broken {
return [database_ cache][iterator_].InstBroken();
}
- (BOOL) unfiltered {
NSString *section = [self section];
return section == nil || isSectionVisible(section);
}
- (BOOL) visible {
return [self hasSupportingRole] && [self unfiltered];
}
- (BOOL) half {
unsigned char current = iterator_->CurrentState;
return current == pkgCache::State::HalfConfigured || current == pkgCache::State::HalfInstalled;
}
- (BOOL) halfConfigured {
return iterator_->CurrentState == pkgCache::State::HalfConfigured;
}
- (BOOL) halfInstalled {
return iterator_->CurrentState == pkgCache::State::HalfInstalled;
}
- (BOOL) hasMode {
pkgDepCache::StateCache &state([database_ cache][iterator_]);
return state.Mode != pkgDepCache::ModeKeep;
}
- (NSString *) mode {
pkgDepCache::StateCache &state([database_ cache][iterator_]);
switch (state.Mode) {
case pkgDepCache::ModeDelete:
if ((state.iFlags & pkgDepCache::Purge) != 0)
return @"Purge";
else
return @"Remove";
_assert(false);
case pkgDepCache::ModeKeep:
if ((state.iFlags & pkgDepCache::AutoKept) != 0)
return nil;
else
return nil;
_assert(false);
case pkgDepCache::ModeInstall:
if ((state.iFlags & pkgDepCache::ReInstall) != 0)
return @"Reinstall";
else switch (state.Status) {
case -1:
return @"Downgrade";
case 0:
return @"Install";
case 1:
return @"Upgrade";
case 2:
return @"New Install";
default:
_assert(false);
}
default:
_assert(false);
}
}
- (NSString *) id {
return id_;
}
- (NSString *) name {
return name_ == nil ? id_ : name_;
}
- (NSString *) tagline {
return tagline_;
}
- (NSString *) icon {
return icon_;
}
- (NSString *) homepage {
return homepage_;
}
- (NSString *) depiction {
return depiction_;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -