📄 cydia.mm
字号:
records_ = NULL;
delete policy_;
policy_ = NULL;
cache_.Close();
if (!cache_.Open(progress_, true)) {
std::string error;
if (!_error->PopMessage(error))
_assert(false);
_error->Discard();
lprintf("cache_.Open():[%s]\n", error.c_str());
if (error == "dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem. ")
[delegate_ repairWithSelector:@selector(configure)];
else if (error == "The package lists or status file could not be parsed or opened.")
[delegate_ repairWithSelector:@selector(update)];
// 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);
return;
}
now_ = [[NSDate date] retain];
policy_ = new pkgDepCache::Policy();
records_ = new pkgRecords(cache_);
resolver_ = new pkgProblemResolver(cache_);
fetcher_ = new pkgAcquire(&status_);
lock_ = NULL;
list_ = new pkgSourceList();
_assert(list_->ReadMainList());
_assert(cache_->DelCount() == 0 && cache_->InstCount() == 0);
_assert(pkgApplyStatus(cache_));
if (cache_->BrokenCount() != 0) {
_assert(pkgFixBroken(cache_));
_assert(cache_->BrokenCount() == 0);
_assert(pkgMinimizeUpgrade(cache_));
}
[sources_ removeAllObjects];
for (pkgSourceList::const_iterator source = list_->begin(); source != list_->end(); ++source) {
std::vector<pkgIndexFile *> *indices = (*source)->GetIndexFiles();
for (std::vector<pkgIndexFile *>::const_iterator index = indices->begin(); index != indices->end(); ++index)
[sources_
setObject:[[[Source alloc] initWithMetaIndex:*source] autorelease]
forKey:[NSNumber numberWithLong:reinterpret_cast<uintptr_t>(*index)]
];
}
[packages_ removeAllObjects];
for (pkgCache::PkgIterator iterator = cache_->PkgBegin(); !iterator.end(); ++iterator)
if (Package *package = [Package packageWithIterator:iterator database:self])
[packages_ addObject:package];
[packages_ sortUsingSelector:@selector(compareByName:)];
}
- (void) configure {
NSString *dpkg = [NSString stringWithFormat:@"dpkg --configure -a --status-fd %u", statusfd_];
system([dpkg UTF8String]);
}
- (void) clean {
if (lock_ != NULL)
return;
FileFd Lock;
Lock.Fd(GetLock(_config->FindDir("Dir::Cache::Archives") + "lock"));
_assert(!_error->PendingError());
pkgAcquire fetcher;
fetcher.Clean(_config->FindDir("Dir::Cache::Archives"));
class LogCleaner :
public pkgArchiveCleaner
{
protected:
virtual void Erase(const char *File, std::string Pkg, std::string Ver, struct stat &St) {
unlink(File);
}
} 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());
}
}
- (void) prepare {
pkgRecords records(cache_);
lock_ = new FileFd();
lock_->Fd(GetLock(_config->FindDir("Dir::Cache::Archives") + "lock"));
_assert(!_error->PendingError());
pkgSourceList list;
// XXX: explain this with an error message
_assert(list.ReadMainList());
manager_ = (_system->CreatePM(cache_));
_assert(manager_->GetArchives(fetcher_, &list, &records));
_assert(!_error->PendingError());
}
- (void) perform {
NSMutableArray *before = [NSMutableArray arrayWithCapacity:16]; {
pkgSourceList list;
_assert(list.ReadMainList());
for (pkgSourceList::const_iterator source = list.begin(); source != list.end(); ++source)
[before addObject:[NSString stringWithUTF8String:(*source)->GetURI().c_str()]];
}
if (fetcher_->Run(PulseInterval_) != pkgAcquire::Continue) {
_trace();
return;
}
bool failed = false;
for (pkgAcquire::ItemIterator item = fetcher_->ItemsBegin(); item != fetcher_->ItemsEnd(); item++) {
if ((*item)->Status == pkgAcquire::Item::StatDone && (*item)->Complete)
continue;
std::string uri = (*item)->DescURI();
std::string error = (*item)->ErrorText;
lprintf("pAf:%s:%s\n", uri.c_str(), error.c_str());
failed = true;
[delegate_ performSelectorOnMainThread:@selector(_setProgressError:)
withObject:[NSArray arrayWithObjects:[NSString stringWithUTF8String:error.c_str()], nil]
waitUntilDone:YES
];
}
if (failed) {
_trace();
return;
}
_system->UnLock();
pkgPackageManager::OrderResult result = manager_->DoInstall(statusfd_);
if (_error->PendingError()) {
_trace();
return;
}
if (result == pkgPackageManager::Failed) {
_trace();
return;
}
if (result != pkgPackageManager::Completed) {
_trace();
return;
}
NSMutableArray *after = [NSMutableArray arrayWithCapacity:16]; {
pkgSourceList list;
_assert(list.ReadMainList());
for (pkgSourceList::const_iterator source = list.begin(); source != list.end(); ++source)
[after addObject:[NSString stringWithUTF8String:(*source)->GetURI().c_str()]];
}
if (![before isEqualToArray:after])
[self update];
}
- (void) upgrade {
_assert(pkgDistUpgrade(cache_));
}
- (void) update {
[self updateWithStatus:status_];
}
- (void) updateWithStatus:(Status &)status {
pkgSourceList list;
_assert(list.ReadMainList());
FileFd lock;
lock.Fd(GetLock(_config->FindDir("Dir::State::Lists") + "lock"));
_assert(!_error->PendingError());
pkgAcquire fetcher(&status);
_assert(list.GetIndexes(&fetcher));
if (fetcher.Run(PulseInterval_) != pkgAcquire::Failed) {
bool failed = false;
for (pkgAcquire::ItemIterator item = fetcher.ItemsBegin(); item != fetcher.ItemsEnd(); item++)
if ((*item)->Status != pkgAcquire::Item::StatDone) {
(*item)->Finished();
failed = true;
}
if (!failed && _config->FindB("APT::Get::List-Cleanup", true) == true) {
_assert(fetcher.Clean(_config->FindDir("Dir::State::lists")));
_assert(fetcher.Clean(_config->FindDir("Dir::State::lists") + "partial/"));
}
[Metadata_ setObject:[NSDate date] forKey:@"LastUpdate"];
Changed_ = true;
}
}
- (void) setDelegate:(id)delegate {
delegate_ = delegate;
status_.setDelegate(delegate);
progress_.setDelegate(delegate);
}
- (Source *) getSource:(const pkgCache::PkgFileIterator &)file {
pkgIndexFile *index(NULL);
list_->FindIndex(file, index);
return [sources_ objectForKey:[NSNumber numberWithLong:reinterpret_cast<uintptr_t>(index)]];
}
@end
/* }}} */
/* Pop Up Windows {{{ */
@interface PopUpView : UIView {
_transient id delegate_;
UITransitionView *transition_;
UIView *overlay_;
}
- (void) cancel;
- (id) initWithView:(UIView *)view delegate:(id)delegate;
@end
@implementation PopUpView
- (void) dealloc {
[transition_ setDelegate:nil];
[transition_ release];
[overlay_ release];
[super dealloc];
}
- (void) cancel {
[transition_ transition:UITransitionPushFromTop toView:nil];
}
- (void) transitionViewDidComplete:(UITransitionView*)view fromView:(UIView*)from toView:(UIView*)to {
if (from != nil && to == nil)
[self removeFromSuperview];
}
- (id) initWithView:(UIView *)view delegate:(id)delegate {
if ((self = [super initWithFrame:[view bounds]]) != nil) {
delegate_ = delegate;
transition_ = [[UITransitionView alloc] initWithFrame:[self bounds]];
[self addSubview:transition_];
overlay_ = [[UIView alloc] initWithFrame:[transition_ bounds]];
[view addSubview:self];
[transition_ setDelegate:self];
UIView *blank = [[[UIView alloc] initWithFrame:[transition_ bounds]] autorelease];
[transition_ transition:UITransitionNone toView:blank];
[transition_ transition:UITransitionPushFromBottom toView:overlay_];
} return self;
}
@end
/* }}} */
/* Mail Composition {{{ */
@interface MailToView : PopUpView {
MailComposeController *controller_;
}
- (id) initWithView:(UIView *)view delegate:(id)delegate url:(NSURL *)url;
@end
@implementation MailToView
- (void) dealloc {
[controller_ release];
[super dealloc];
}
#include "internals.h"
- (void) mailComposeControllerWillAttemptToSend:(MailComposeController *)controller {
NSLog(@"will");
}
- (void) mailComposeControllerDidAttemptToSend:(MailComposeController *)controller mailDelivery:(id)delivery {
NSLog(@"did:%@", delivery);
// [UIApp setStatusBarShowsProgress:NO];
if ([controller error]){
NSArray *buttons = [NSArray arrayWithObjects:@"OK", nil];
UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:@"Error" buttons:buttons defaultButtonIndex:0 delegate:self context:self];
[mailAlertSheet setBodyText:[controller error]];
[mailAlertSheet popupAlertAnimated:YES];
}
}
- (void) mailComposeControllerCompositionFinished:(MailComposeController *)controller {
if ([controller needsDelivery])
[controller deliverMessage];
else
[self cancel];
}
- (id) initWithView:(UIView *)view delegate:(id)delegate url:(NSURL *)url {
if ((self = [super initWithView:view delegate:delegate]) != nil) {
controller_ = [[MailComposeController alloc] initForContentSize:[overlay_ bounds].size];
[controller_ setDelegate:self];
[controller_ initializeUI];
[controller_ setupForURL:url];
UIView *view([controller_ view]);
[overlay_ addSubview:view];
} return self;
}
@end
/* }}} */
/* Confirmation View {{{ */
void AddTextView(NSMutableDictionary *fields, NSMutableArray *packages, NSString *key) {
if ([packages count] == 0)
return;
UITextView *text = GetTextView([packages count] == 0 ? @"n/a" : [packages componentsJoinedByString:@", "], 120, false);
[fields setObject:text forKey:key];
CGColor blue(space_, 0, 0, 0.4, 1);
[text setTextColor:[UIColor colorWithCGColor:blue]];
}
bool DepSubstrate(const pkgCache::VerIterator &iterator) {
if (!iterator.end())
for (pkgCache::DepIterator dep(iterator.DependsList()); !dep.end(); ++dep) {
if (dep->Type != pkgCache::Dep::Depends && dep->Type != pkgCache::Dep::PreDepends)
continue;
pkgCache::PkgIterator package(dep.TargetPkg());
if (package.end())
continue;
if (strcmp(package.Name(), "mobilesubstrate") == 0)
return true;
}
return false;
}
@protocol ConfirmationViewDelegate
- (void) cancel;
- (void) confirm;
@end
@interface ConfirmationView : PopUpView {
Database *database_;
UINavigationBar *navbar_;
UIPreferencesTable *table_;
NSMutableDictionary *fields_;
UIActionSheet *essential_;
BOOL substrate_;
}
- (void) cancel;
- (id) initWithView:(UIView *)view delegate:(id)delegate database:(Database *)database;
@end
@implementation ConfirmationView
- (void) dealloc {
[navbar_ setDelegate:nil];
[table_ setDataSource:nil];
[navbar_ release];
[table_ release];
[fields_ release];
if (essential_ != nil)
[essential_ release];
[super dealloc];
}
- (void) cancel {
[super cancel];
[delegate_ cancel];
}
- (void) navigationBar:(UINavigationBar *)navbar buttonClicked:(int)button {
switch (button) {
case 0:
if (essential_ != nil)
[essential_ popupAlertAnimated:YES];
else {
if (substrate_)
Finish_ = 2;
[delegate_ confirm];
}
break;
case 1:
[self cancel];
break;
}
}
- (void) alertSheet:(UIActionSheet *)sheet buttonClicked:(int)button {
NSString *context = [sheet context];
if ([context isEqualToString:@"remove"])
switch (button) {
case 1:
[self cancel];
break;
case 2:
if (substrate_)
Finish_ = 2;
[delegate_ confirm];
break;
default:
_assert(false);
}
else if ([context isEqualToString:@"unable"])
[self cancel];
[sheet dismiss];
}
- (int) numberOfGroupsInPreferencesTable:(UIPreferencesTable *)table {
return 2;
}
- (NSString *) preferencesTable:(UIPreferencesTable *)table titleForGroup:(int)group {
switch (group) {
case 0: return @"Statistics";
case 1: return @"Modifications";
default: _assert(false);
}
}
- (int) preferencesTable:(UIPreferencesTable *)table numberOfRowsInGroup:(int)group {
switch (group) {
case 0: return 3;
case 1: return [fields_ count];
default: _assert(false);
}
}
- (float) preferencesTable:(UIPreferencesTable *)table heightForRow:(int)row inGroup:(int)group withProposedHeight:(float)proposed {
if (group != 1 || row == -1)
return proposed;
else {
_assert(size_t(row) < [fields_ count]);
return [[[fields_ allValues] objectAtIndex:row] visibleTextRect].size.height + TextViewOffset_;
}
}
- (UIPreferencesTableCell *) preferencesTable:(UIPreferencesTable *)table ce
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -