#include <QuartzCore/CALayer.h>
#include <WebCore/WebCoreThread.h>
-#include <WebKit/DOMHTMLIFrameElement.h>
#include <algorithm>
+#include <fstream>
#include <iomanip>
#include <set>
#include <sstream>
#include <string>
-#include <ext/stdio_filebuf.h>
+#include "fdstream.hpp"
#undef ABS
+#include "apt.h"
#include <apt-pkg/acquire.h>
#include <apt-pkg/acquire-item.h>
#include <apt-pkg/algorithms.h>
#include "Substrate.hpp"
#include "Menes/Menes.h"
-#include "CyteKit/IndirectDelegate.h"
#include "CyteKit/RegEx.hpp"
#include "CyteKit/TableViewCell.h"
#include "CyteKit/TabBarController.h"
};
// }}}
+@implementation NSDictionary (Cydia)
+- (id) invokeUndefinedMethodFromWebScript:(NSString *)name withArguments:(NSArray *)arguments {
+ if (false);
+ else if ([name isEqualToString:@"get"])
+ return [self objectForKey:[arguments objectAtIndex:0]];
+ else if ([name isEqualToString:@"keys"])
+ return [self allKeys];
+ return nil;
+} @end
+
static NSString *Colon_;
NSString *Elision_;
static NSString *Error_;
CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast<const uint8_t *>(data), size, kCFStringEncodingISOLatin1, NO, kCFAllocatorNull);
}
+static _finline CFStringRef CYStringCreate(const std::string &data) {
+ return CYStringCreate(data.data(), data.size());
+}
+
static _finline CFStringRef CYStringCreate(const char *data) {
return CYStringCreate(data, strlen(data));
}
+ (Database *) sharedInstance;
- (unsigned) era;
+- (bool) hasPackages;
- (void) _readCydia:(NSNumber *)fd;
- (void) _readStatus:(NSNumber *)fd;
char version_[8];
char name_[];
-};
+} _packed;
struct MetaValue :
Cytore::Block
{
uint32_t active_;
Cytore::Offset<PackageValue> packages_[1 << 16];
-};
+} _packed;
static Cytore::File<MetaValue> MetaFile_;
// }}}
_end
_profile(Package$parse$Tagline)
- const char *start, *end;
- if (parser->ShortDesc(start, end)) {
- const char *stop(reinterpret_cast<const char *>(memchr(start, '\n', end - start)));
- if (stop == NULL)
- stop = end;
- while (stop != start && stop[-1] == '\r')
- --stop;
- parsed->tagline_.set(pool_, start, stop - start);
- }
+ parsed->tagline_.set(pool_, parser->ShortDesc());
_end
_profile(Package$parse$Retain)
version_ = version;
- pkgCache::PkgIterator iterator(version.ParentPkg());
+ pkgCache::PkgIterator iterator(version_.ParentPkg());
iterator_ = iterator;
_profile(Package$initWithVersion$Version)
_end
_profile(Package$initWithVersion$Cache)
- name_.set(NULL, iterator.Display());
+ name_.set(NULL, version_.Display());
latest_.set(NULL, StripVersion_(version_.VerStr()));
} while (false); _end
_profile(Package$initWithVersion$Tags)
+#ifdef __arm64__
+ pkgCache::TagIterator tag(version_.TagList());
+#else
pkgCache::TagIterator tag(iterator.TagList());
+#endif
if (!tag.end()) {
tags_ = [NSMutableArray arrayWithCapacity:8];
return iterator_;
}
+- (NSArray *) downgrades {
+ NSMutableArray *versions([NSMutableArray arrayWithCapacity:4]);
+
+ for (auto version(iterator_.VersionList()); !version.end(); ++version) {
+ if (version == version_)
+ continue;
+ Package *package([[[Package allocWithZone:NULL] initWithVersion:version withZone:NULL inPool:NULL database:database_] autorelease]);
+ if ([package source] == nil)
+ continue;
+ [versions addObject:package];
+ }
+
+ return versions;
+}
+
- (NSString *) section {
if (section$_ == nil) {
if (section_ == NULL)
}
- (NSString *) longSection {
- return LocalizeSection([self section]);
+ if (NSString *section = [self section])
+ return LocalizeSection(section);
+ else
+ return nil;
}
- (NSString *) shortSection {
@synchronized (database_) {
pkgRecords::Parser &parser([database_ records]->Lookup(file_));
-
- const char *start, *end;
- if (!parser.ShortDesc(start, end))
+ std::string value(parser.ShortDesc());
+ if (value.empty())
return nil;
-
- if (end - start > 200)
- end = start + 200;
-
- /*
- if (const char *stop = reinterpret_cast<const char *>(memchr(start, '\n', end - start)))
- end = stop;
-
- while (end != start && end[-1] == '\r')
- --end;
- */
-
- return [(id) CYStringCreate(start, end - start) autorelease];
+ if (value.size() > 200)
+ value.resize(200);
+ return [(id) CYStringCreate(value) autorelease];
} }
- (unichar) index {
- (void) clear {
@synchronized (database_) {
+ if ([database_ era] != era_ || file_.end())
+ return;
+
pkgProblemResolver *resolver = [database_ resolver];
resolver->Clear(iterator_);
- (void) install {
@synchronized (database_) {
+ if ([database_ era] != era_ || file_.end())
+ return;
+
pkgProblemResolver *resolver = [database_ resolver];
resolver->Clear(iterator_);
resolver->Protect(iterator_);
pkgCacheFile &cache([database_ cache]);
+ cache->SetCandidateVersion(version_);
cache->SetReInstall(iterator_, false);
cache->MarkInstall(iterator_, false);
- (void) remove {
@synchronized (database_) {
+ if ([database_ era] != era_ || file_.end())
+ return;
+
pkgProblemResolver *resolver = [database_ resolver];
resolver->Clear(iterator_);
resolver->Remove(iterator_);
CFArrayRemoveAllValues(packages_);
}
+- (bool) hasPackages {
+ return CFArrayGetCount(packages_) != 0;
+}
+
- (void) dealloc {
// XXX: actually implement this thing
_assert(false);
}
- (void) _readCydia:(NSNumber *)fd {
- __gnu_cxx::stdio_filebuf<char> ib([fd intValue], std::ios::in);
- std::istream is(&ib);
+ boost::fdistream is([fd intValue]);
std::string line;
static RegEx finish_r("finish:([^:]*)");
}
- (void) _readStatus:(NSNumber *)fd {
- __gnu_cxx::stdio_filebuf<char> ib([fd intValue], std::ios::in);
- std::istream is(&ib);
+ boost::fdistream is([fd intValue]);
std::string line;
static RegEx conffile_r("status: [^ ]* : conffile-prompt : (.*?) *");
}
- (void) _readOutput:(NSNumber *)fd {
- __gnu_cxx::stdio_filebuf<char> ib([fd intValue], std::ios::in);
- std::istream is(&ib);
+ boost::fdistream is([fd intValue]);
std::string line;
while (std::getline(is, line)) {
@synchronized (self) {
if (static_cast<pkgDepCache *>(cache_) == NULL)
return nil;
- pkgCache::PkgIterator iterator(cache_->FindPkg([name UTF8String]));
+ pkgCache::PkgIterator iterator(cache_->FindPkg([name UTF8String]
+#ifdef __arm64__
+ , "any"
+#endif
+ ));
return iterator.end() ? nil : [Package packageWithIterator:iterator withZone:NULL inPool:NULL database:self];
} }
opened = cache_.Open(progress, false);
_end
if (!opened) {
- // XXX: what if there are errors, but Open() == true? this should be merged with popError:
+ // XXX: this block should probably be merged with popError: in some way
while (!_error->empty()) {
std::string error;
bool warning(!_error->PopMessage(error));
}
return;
- }
+ } else if ([self popErrorWithTitle:title forOperation:true])
+ return;
_trace();
unlink("/tmp/cydia.chk");
NSString *nextended(Cache("extended_states"));
struct stat info;
- if (stat([nextended UTF8String], &info) != -1 && (info.st_mode & S_IFMT) == S_IFREG) {
- system([[NSString stringWithFormat:@"/usr/libexec/cydia/cydo /bin/mv -f %@ %@", ShellEscape(nextended), ShellEscape(oextended)] UTF8String]);
- system([[NSString stringWithFormat:@"/usr/libexec/cydia/cydo /bin/chown 0:0 %@", ShellEscape(oextended)] UTF8String]);
- }
+ if (stat([nextended UTF8String], &info) != -1 && (info.st_mode & S_IFMT) == S_IFREG)
+ system([[NSString stringWithFormat:@"/usr/libexec/cydia/cydo /bin/cp --remove-destination %@ %@", ShellEscape(nextended), ShellEscape(oextended)] UTF8String]);
unlink([nextended UTF8String]);
symlink([oextended UTF8String], [nextended UTF8String]);
_transient id delegate_;
}
-- (id) initWithDelegate:(IndirectDelegate *)indirect;
+- (id) initWithDelegate:(CyteWebViewController *)indirect;
@end
/* Web Scripting {{{ */
@implementation CydiaObject
-- (id) initWithDelegate:(IndirectDelegate *)indirect {
+- (id) initWithDelegate:(CyteWebViewController *)indirect {
if ((self = [super init]) != nil) {
- indirect_ = (CyteWebViewController *) indirect;
+ indirect_ = indirect;
} return self;
}
+ (NSArray *) _attributeKeys {
return [NSArray arrayWithObjects:
+ @"bittage",
@"bbsnum",
@"build",
+ @"cells",
@"coreFoundationVersionNumber",
@"device",
@"ecid",
return Cydia_;
}
+- (unsigned) bittage {
+#if 0
+#elif defined(__arm64__)
+ return 64;
+#elif defined(__arm__)
+ return 32;
+#else
+ return 0;
+#endif
+}
+
- (NSString *) build {
return System_;
}
return (id) Idiom_ ?: [NSNull null];
}
+- (NSArray *) cells {
+ auto *$_CTServerConnectionCreate(reinterpret_cast<id (*)(void *, void *, void *)>(dlsym(RTLD_DEFAULT, "_CTServerConnectionCreate")));
+ if ($_CTServerConnectionCreate == NULL)
+ return nil;
+
+ struct CTResult { int flag; int error; };
+ auto *$_CTServerConnectionCellMonitorCopyCellInfo(reinterpret_cast<CTResult (*)(CFTypeRef, void *, CFArrayRef *)>(dlsym(RTLD_DEFAULT, "_CTServerConnectionCellMonitorCopyCellInfo")));
+ if ($_CTServerConnectionCellMonitorCopyCellInfo == NULL)
+ return nil;
+
+ _H<const void> connection($_CTServerConnectionCreate(NULL, NULL, NULL), true);
+ if (connection == nil)
+ return nil;
+
+ int count(0);
+ CFArrayRef cells(NULL);
+ auto result($_CTServerConnectionCellMonitorCopyCellInfo(connection, &count, &cells));
+ if (result.flag != 0)
+ return nil;
+
+ return [(NSArray *) cells autorelease];
+}
+
- (NSString *) mcc {
if (CFStringRef (*$CTSIMSupportCopyMobileSubscriberCountryCode)(CFAllocatorRef) = reinterpret_cast<CFStringRef (*)(CFAllocatorRef)>(dlsym(RTLD_DEFAULT, "CTSIMSupportCopyMobileSubscriberCountryCode")))
return [(NSString *) (*$CTSIMSupportCopyMobileSubscriberCountryCode)(kCFAllocatorDefault) autorelease];
}
- (NSArray *) getDisplayIdentifiers {
- NSSet *set([SBSCopyDisplayIdentifiers() autorelease]);
- if (set == nil || ![set isKindOfClass:[NSSet class]])
- return [NSArray array];
- return [set allObjects];
+ return SBSCopyApplicationDisplayIdentifiers(false, false);
}
- (NSString *) getLocalizedNameForDisplayIdentifier:(NSString *)identifier {
}
- (NSString *) substitutePackageNames:(NSString *)message {
+ auto database([Database sharedInstance]);
+
+ // XXX: this check is less racy than you'd expect, but this entire concept is a little awkward
+ if (![database hasPackages])
+ return message;
+
NSMutableArray *words([[[message componentsSeparatedByString:@" "] mutableCopy] autorelease]);
for (size_t i(0), e([words count]); i != e; ++i) {
NSString *word([words objectAtIndex:i]);
- if (Package *package = [[Database sharedInstance] packageWithName:word])
+ if (Package *package = [database packageWithName:word])
[words replaceObjectAtIndex:i withObject:[package name]];
}
@implementation CydiaWebViewController
- (NSURL *) navigationURL {
- return request_ == nil ? nil : [NSURL URLWithString:[NSString stringWithFormat:@"cydia://url/%@", [[request_ URL] absoluteString]]];
+ if (NSURLRequest *request = self.request)
+ return [NSURL URLWithString:[NSString stringWithFormat:@"cydia://url/%@", [[request URL] absoluteString]]];
+ else
+ return nil;
}
+ (void) _initialize {
- (id) init {
if ((self = [super initWithWidth:0 ofClass:[CydiaWebViewController class]]) != nil) {
- cydia_ = [[[CydiaObject alloc] initWithDelegate:indirect_] autorelease];
+ cydia_ = [[[CydiaObject alloc] initWithDelegate:self.indirect] autorelease];
} return self;
}
- (void) complete {
if (substrate_)
RestartSubstrate_ = true;
- [delegate_ confirmWithNavigationController:[self navigationController]];
+ [self.delegate confirmWithNavigationController:[self navigationController]];
}
- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)button {
}
- (void) _doContinue {
- [delegate_ cancelAndClear:NO];
+ [self.delegate cancelAndClear:NO];
[self dismissModalViewControllerAnimated:YES];
}
#endif
- (void) cancelButtonClicked {
- [delegate_ cancelAndClear:YES];
+ [self.delegate cancelAndClear:YES];
[self dismissModalViewControllerAnimated:YES];
}
- (id) initWithDatabase:(Database *)database delegate:(id)delegate {
if ((self = [super init]) != nil) {
database_ = database;
- delegate_ = delegate;
+ self.delegate = delegate;
[database_ setProgressDelegate:self];
[self setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/#!/progress/", UI_]]];
- [scroller_ setBackgroundColor:[UIColor blackColor]];
+ [self setPageColor:[UIColor blackColor]];
[[self navigationItem] setHidesBackButton:YES];
UpdateExternalStatus(0);
if (Finish_ > 1)
- [delegate_ saveState];
+ [self.delegate saveState];
switch (Finish_) {
case 0:
- [delegate_ returnToCydia];
+ [self.delegate returnToCydia];
break;
case 1:
- [delegate_ terminateWithSuccess];
- /*if ([delegate_ respondsToSelector:@selector(suspendWithAnimation:)])
- [delegate_ suspendWithAnimation:YES];
+ [self.delegate terminateWithSuccess];
+ /*if ([self.delegate respondsToSelector:@selector(suspendWithAnimation:)])
+ [self.delegate suspendWithAnimation:YES];
else
- [delegate_ suspend];*/
+ [self.delegate suspend];*/
break;
case 2:
goto reload;
reload: {
- UIProgressHUD *hud([delegate_ addProgressHUD]);
+ UIProgressHUD *hud([self.delegate addProgressHUD]);
[hud setText:UCLocalize("LOADING")];
- [delegate_ performSelector:@selector(reloadSpringBoard) withObject:nil afterDelay:0.5];
+ [self.delegate performSelector:@selector(reloadSpringBoard) withObject:nil afterDelay:0.5];
return;
}
UIView *content([self contentView]);
CGRect bounds([content bounds]);
- content_ = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease];
- [content_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
- [content addSubview:content_];
+ self.content = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease];
+ [self.content setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [content addSubview:self.content];
- [content_ setDelegate:self];
- [content_ setOpaque:YES];
+ [self.content setDelegate:self];
+ [self.content setOpaque:YES];
} return self;
}
placard_ = nil;
if (package == nil)
- [content_ setBackgroundColor:[UIColor whiteColor]];
+ [self.content setBackgroundColor:[UIColor whiteColor]];
else {
[package parse];
placard = nil;
}
- [content_ setBackgroundColor:color];
+ [self.content setBackgroundColor:color];
if (placard != nil)
placard_ = [UIImage imageAtPath:[NSString stringWithFormat:@"%@/%@.png", App_, placard]];
}
[self setNeedsDisplay];
- [content_ setNeedsDisplay];
+ [self.content setNeedsDisplay];
}
- (void) drawSummaryContentRect:(CGRect)rect {
- bool highlighted(highlighted_);
+ bool highlighted(self.highlighted);
float width([self bounds].size.width);
if (icon_ != nil) {
}
- (void) drawNormalContentRect:(CGRect)rect {
- bool highlighted(highlighted_);
+ bool highlighted(self.highlighted);
float width([self bounds].size.width);
if (icon_ != nil) {
UIView *content([self contentView]);
CGRect bounds([content bounds]);
- content_ = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease];
- [content_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
- [content addSubview:content_];
- [content_ setBackgroundColor:[UIColor whiteColor]];
+ self.content = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease];
+ [self.content setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [content addSubview:self.content];
+ [self.content setBackgroundColor:[UIColor whiteColor]];
- [content_ setDelegate:self];
+ [self.content setDelegate:self];
} return self;
}
[self setAccessoryType:editing ? UITableViewCellAccessoryNone : UITableViewCellAccessoryDisclosureIndicator];
[self setSelectionStyle:editing ? UITableViewCellSelectionStyleNone : UITableViewCellSelectionStyleBlue];
- [content_ setNeedsDisplay];
+ [self.content setNeedsDisplay];
}
- (void) setFrame:(CGRect)frame {
}
- (void) drawContentRect:(CGRect)rect {
- bool highlighted(highlighted_ && !editing_);
+ bool highlighted(self.highlighted && !editing_);
[icon_ drawInRect:CGRectMake(7, 7, 32, 32)];
NSString *directory = [stack lastObject];
[stack addObject:[file stringByAppendingString:@"/"]];
[files_ replaceObjectAtIndex:i withObject:[NSString stringWithFormat:@"%*s%@",
- ([stack count] - 2) * 3, "",
+ int(([stack count] - 2) * 3), "",
[file substringFromIndex:[directory length]]
]];
}
_H<NSString> name_;
bool commercial_;
std::vector<std::pair<_H<NSString>, _H<NSString>>> buttons_;
+ _H<UIActionSheet> sheet_;
_H<UIBarButtonItem> button_;
+ _H<NSArray> versions_;
}
- (id) initWithDatabase:(Database *)database forPackage:(NSString *)name withReferrer:(NSString *)referrer;
return [NSURL URLWithString:[NSString stringWithFormat:@"cydia://package/%@", (id) name_]];
}
+- (void) _clickButtonWithPackage:(Package *)package {
+ [self.delegate installPackage:package];
+}
+
- (void) _clickButtonWithName:(NSString *)name {
if ([name isEqualToString:@"CLEAR"])
- [delegate_ clearPackage:package_];
- else if ([name isEqualToString:@"INSTALL"])
- [delegate_ installPackage:package_];
- else if ([name isEqualToString:@"REINSTALL"])
- [delegate_ installPackage:package_];
+ return [self.delegate clearPackage:package_];
else if ([name isEqualToString:@"REMOVE"])
- [delegate_ removePackage:package_];
- else if ([name isEqualToString:@"UPGRADE"])
- [delegate_ installPackage:package_];
+ return [self.delegate removePackage:package_];
+ else if ([name isEqualToString:@"DOWNGRADE"]) {
+ sheet_ = [[[UIActionSheet alloc]
+ initWithTitle:nil
+ delegate:self
+ cancelButtonTitle:nil
+ destructiveButtonTitle:nil
+ otherButtonTitles:nil
+ ] autorelease];
+
+ for (Package *version in (id) versions_)
+ [sheet_ addButtonWithTitle:[version latest]];
+ [sheet_ setContext:@"version"];
+
+ [self.delegate showActionSheet:sheet_ fromItem:[[self navigationItem] rightBarButtonItem]];
+ return;
+ }
+
+ else if ([name isEqualToString:@"INSTALL"]);
+ else if ([name isEqualToString:@"REINSTALL"]);
+ else if ([name isEqualToString:@"UPGRADE"]);
else _assert(false);
+
+ [self.delegate installPackage:package_];
}
- (void) actionSheet:(UIActionSheet *)sheet clickedButtonAtIndex:(NSInteger)button {
NSString *context([sheet context]);
+ if (sheet_ == sheet)
+ sheet_ = nil;
if ([context isEqualToString:@"modify"]) {
if (button != [sheet cancelButtonIndex]) {
[self _clickButtonWithName:buttons_[button].first];
}
+ [sheet dismissWithClickedButtonIndex:button animated:YES];
+ } else if ([context isEqualToString:@"version"]) {
+ if (button != [sheet cancelButtonIndex]) {
+ Package *version([versions_ objectAtIndex:button]);
+ if (IsWildcat_)
+ [self performSelector:@selector(_clickButtonWithPackage:) withObject:version afterDelay:0];
+ else
+ [self _clickButtonWithPackage:version];
+ }
+
[sheet dismissWithClickedButtonIndex:button animated:YES];
}
}
#if !AlwaysReload
- (void) _customButtonClicked {
+ if (commercial_ && [package_ uninstalled])
+ return [self reloadURLWithCache:NO];
+
size_t count(buttons_.size());
if (count == 0)
return;
for (const auto &button : buttons_)
[buttons addObject:button.second];
- UIActionSheet *sheet = [[[UIActionSheet alloc]
+ sheet_ = [[[UIActionSheet alloc]
initWithTitle:nil
delegate:self
cancelButtonTitle:nil
otherButtonTitles:nil
] autorelease];
- for (NSString *button in buttons) [sheet addButtonWithTitle:button];
- if (!IsWildcat_) {
- [sheet addButtonWithTitle:UCLocalize("CANCEL")];
- [sheet setCancelButtonIndex:[sheet numberOfButtons] - 1];
- }
- [sheet setContext:@"modify"];
+ for (NSString *button in buttons)
+ [sheet_ addButtonWithTitle:button];
+ [sheet_ setContext:@"modify"];
- [delegate_ showActionSheet:sheet fromItem:[[self navigationItem] rightBarButtonItem]];
+ [self.delegate showActionSheet:sheet_ fromItem:[[self navigationItem] rightBarButtonItem]];
}
}
-- (void) reloadButtonClicked {
- if (commercial_ && function_ == nil && [package_ uninstalled])
- return;
- [self customButtonClicked];
-}
-
- (void) applyLoadingTitle {
// Don't show "Loading" as the title. Ever.
}
- (void) reloadData {
[super reloadData];
+ [sheet_ dismissWithClickedButtonIndex:[sheet_ cancelButtonIndex] animated:YES];
+ sheet_ = nil;
+
package_ = [database_ packageWithName:name_];
+ versions_ = [package_ downgrades];
buttons_.clear();
buttons_.push_back(std::make_pair(@"REINSTALL", UCLocalize("REINSTALL")));
if (![package_ uninstalled])
buttons_.push_back(std::make_pair(@"REMOVE", UCLocalize("REMOVE")));
+ if ([versions_ count] != 0)
+ buttons_.push_back(std::make_pair(@"DOWNGRADE", UCLocalize("DOWNGRADE")));
}
NSString *title;
}
- (id) initWithDatabase:(Database *)database title:(NSString *)title;
-- (void) setDelegate:(id)delegate;
- (void) resetCursor;
- (void) clearData;
- (void) didSelectPackage:(Package *)package {
CYPackageController *view([[[CYPackageController alloc] initWithDatabase:database_ forPackage:[package id] withReferrer:[[self referrerURL] absoluteString]] autorelease]);
- [view setDelegate:delegate_];
+ [view setDelegate:self.delegate];
[[self navigationController] pushViewController:view animated:YES];
}
[super releaseSubviews];
}
-- (void) setDelegate:(id)delegate {
- delegate_ = delegate;
-}
-
- (bool) shouldYield {
return false;
}
if (![self shouldBlock])
hud = nil;
else {
- hud = [delegate_ addProgressHUD];
+ hud = [self.delegate addProgressHUD];
[hud setText:UCLocalize("LOADING")];
}
packages = [self yieldToSelector:@selector(_reloadPackages)];
if (hud != nil)
- [delegate_ removeProgressHUD:hud];
+ [self.delegate removeProgressHUD:hud];
} while (reloading_ == 2);
} else {
packages = [self _reloadPackages];
if (editing)
[list_ reloadData];
else
- [delegate_ updateData];
+ [self.delegate updateData];
[self updateNavigationItem];
}
source:[self source]
section:[section name]
] autorelease];
- [controller setDelegate:delegate_];
+ [controller setDelegate:self.delegate];
[[self navigationController] pushViewController:controller animated:YES];
}
}
- (void) setLeftBarButtonItem {
- if ([delegate_ updating])
+ if ([self.delegate updating])
[[self navigationItem] setLeftBarButtonItem:[[[UIBarButtonItem alloc]
initWithTitle:UCLocalize("CANCEL")
style:UIBarButtonItemStyleDone
}
- (void) refreshButtonClicked {
- if ([delegate_ requestUpdate])
+ if ([self.delegate requestUpdate])
[self setLeftBarButtonItem];
}
- (void) cancelButtonClicked {
- [delegate_ cancelUpdate];
+ [self.delegate cancelUpdate];
}
- (void) upgradeButtonClicked {
- [delegate_ distUpgrade];
+ [self.delegate distUpgrade];
[[self navigationItem] setRightBarButtonItem:nil animated:YES];
}
if (package_ == nil)
return;
if ([package_ setSubscribed:value])
- [delegate_ updateData];
+ [self.delegate updateData];
}
- (void) _updateIgnored {
[invocation setTarget:self];
[invocation setSelector:@selector(_updateIgnored)];
- [delegate_ reloadDataWithInvocation:invocation];
+ [self.delegate reloadDataWithInvocation:invocation];
}
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
#if !AlwaysReload
- (void) queueButtonClicked {
- [delegate_ queue];
+ [self.delegate queue];
}
#endif
- (void) _setImage:(NSArray *)data {
if ([url_ isEqual:[data objectAtIndex:0]]) {
icon_ = [data objectAtIndex:1];
- [content_ setNeedsDisplay];
+ [self.content setNeedsDisplay];
}
}
origin_ = [source name];
label_ = [source rooturi];
- [content_ setNeedsDisplay];
+ [self.content setNeedsDisplay];
url_ = [source iconURL];
[NSThread detachNewThreadSelector:@selector(_setSource:) toTarget:self withObject:url_];
icon_ = [UIImage imageNamed:@"folder.png"];
origin_ = UCLocalize("ALL_SOURCES");
label_ = UCLocalize("ALL_SOURCES_EX");
- [content_ setNeedsDisplay];
+ [self.content setNeedsDisplay];
}
- (SourceCell *) initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
UIView *content([self contentView]);
CGRect bounds([content bounds]);
- content_ = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease];
- [content_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
- [content_ setBackgroundColor:[UIColor whiteColor]];
- [content addSubview:content_];
+ self.content = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease];
+ [self.content setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [self.content setBackgroundColor:[UIColor whiteColor]];
+ [content addSubview:self.content];
- [content_ setDelegate:self];
- [content_ setOpaque:YES];
+ [self.content setDelegate:self];
+ [self.content setOpaque:YES];
indicator_ = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGraySmall] autorelease];
[indicator_ setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin];// | UIViewAutoresizingFlexibleBottomMargin];
[content addSubview:indicator_];
- [[content_ layer] setContentsGravity:kCAGravityTopLeft];
+ [[self.content layer] setContentsGravity:kCAGravityTopLeft];
} return self;
}
}
- (void) drawContentRect:(CGRect)rect {
- bool highlighted(highlighted_);
+ bool highlighted(self.highlighted);
float width(rect.size.width);
if (icon_ != nil) {
source:[self sourceAtIndexPath:indexPath]
] autorelease]);
- [controller setDelegate:delegate_];
+ [controller setDelegate:self.delegate];
[[self navigationController] pushViewController:controller animated:YES];
}
[Sources_ removeObjectForKey:[source key]];
- [delegate_ _saveConfig];
- [delegate_ reloadDataWithInvocation:nil];
+ [self.delegate syncData];
}
}
}
- (void) complete {
- [delegate_ addTrivialSource:href_];
+ [self.delegate addTrivialSource:href_];
href_ = nil;
- [delegate_ syncData];
+ [self.delegate syncData];
}
- (NSString *) getWarning {
) {
NSString *warning(cydia_ ? [self yieldToSelector:@selector(getWarning)] : nil);
- [delegate_ releaseNetworkActivityIndicator];
+ [self.delegate releaseNetworkActivityIndicator];
- [delegate_ removeProgressHUD:hud_];
+ [self.delegate removeProgressHUD:hud_];
hud_ = nil;
if (cydia_) {
cydia_ = false;
// XXX: this is stupid
- hud_ = [delegate_ addProgressHUD];
+ hud_ = [self.delegate addProgressHUD];
[hud_ setText:UCLocalize("VERIFYING_URL")];
- [delegate_ retainNetworkActivityIndicator];
+ [self.delegate retainNetworkActivityIndicator];
} break;
case 0:
target:self
action:@selector(addButtonClicked)
] autorelease] animated:animated];
- else if ([delegate_ updating])
+ else if ([self.delegate updating])
[[self navigationItem] setLeftBarButtonItem:[[[UIBarButtonItem alloc]
initWithTitle:UCLocalize("CANCEL")
style:UIBarButtonItemStyleDone
[alert setNumberOfRows:1];
[alert addTextFieldWithValue:@"http://" label:@""];
- UITextInputTraits *traits = [[alert textField] textInputTraits];
+ NSObject<UITextInputTraits> *traits = [[alert textField] textInputTraits];
[traits setAutocapitalizationType:UITextAutocapitalizationTypeNone];
[traits setAutocorrectionType:UITextAutocorrectionTypeNo];
[traits setKeyboardType:UIKeyboardTypeURL];
}
- (void) refreshButtonClicked {
- if ([delegate_ requestUpdate])
+ if ([self.delegate requestUpdate])
[self updateButtonsForEditingStatusAnimated:YES];
}
- (void) cancelButtonClicked {
- [delegate_ cancelUpdate];
+ [self.delegate cancelUpdate];
}
- (void) editButtonClicked {
- (void) reloadSpringBoard {
if (kCFCoreFoundationVersionNumber >= 700) // XXX: iOS 6.x
- system("/bin/launchctl stop com.apple.backboardd");
+ system("/usr/libexec/cydia/cydo /bin/launchctl stop com.apple.backboardd");
else
- system("/bin/launchctl stop com.apple.SpringBoard");
+ system("/usr/libexec/cydia/cydo /bin/launchctl stop com.apple.SpringBoard");
sleep(15);
system("/usr/bin/killall backboardd SpringBoard");
}
[super applicationSuspend];
}
-- (void) applicationSuspend:(__GSEvent *)event {
+- (void) applicationSuspend:(GSEventRef)event {
if ([self isSafeToSuspend])
[super applicationSuspend:event];
}
}
- (void) showActionSheet:(UIActionSheet *)sheet fromItem:(UIBarButtonItem *)item {
+ if (!IsWildcat_) {
+ [sheet addButtonWithTitle:UCLocalize("CANCEL")];
+ [sheet setCancelButtonIndex:[sheet numberOfButtons] - 1];
+ }
+
if (item != nil && IsWildcat_) {
[sheet showFromBarButtonItem:item animated:YES];
} else {
return [(NSMutableDictionary *) copy autorelease];
}
+int main_store(int, char *argv[]);
+
int main(int argc, char *argv[]) {
+#ifdef __arm64__
+ const char *argv0(argv[0]);
+ if (const char *slash = strrchr(argv0, '/'))
+ argv0 = slash + 1;
+ if (false);
+ else if (!strcmp(argv0, "store"))
+ return main_store(argc, argv);
+#endif
+
int fd(open("/tmp/cydia.log", O_WRONLY | O_APPEND | O_CREAT, 0644));
dup2(fd, 2);
close(fd);
Locale_ = CFLocaleCopyCurrent();
Languages_ = [NSLocale preferredLanguages];
- //CFStringRef locale(CFLocaleGetIdentifier(Locale_));
- //NSLog(@"%@", [Languages_ description]);
+ std::string languages;
+ const char *translation(NULL);
- const char *lang;
+ // XXX: this isn't really a language, but this is compatible with older Cydia builds
if (Locale_ != NULL)
- lang = [(NSString *) CFLocaleGetIdentifier(Locale_) UTF8String];
- else if (Languages_ != nil && [Languages_ count] != 0)
- lang = [[Languages_ objectAtIndex:0] UTF8String];
- else
- // XXX: consider just setting to C and then falling through?
- lang = NULL;
-
- if (lang != NULL) {
- RegEx pattern("([a-z][a-z])(?:-[A-Za-z]*)?(_[A-Z][A-Z])?");
- lang = !pattern(lang) ? NULL : [pattern->*@"%1$@%2$@" UTF8String];
- }
+ if (const char *language = [(NSString *) CFLocaleGetIdentifier(Locale_) UTF8String]) {
+ RegEx pattern("([a-z][a-z])(?:-[A-Za-z]*)?(_[A-Z][A-Z])?");
+ if (pattern(language)) {
+ translation = strdup([pattern->*@"%1$@%2$@" UTF8String]);
+ languages += translation;
+ languages += ",";
+ }
+ }
- NSLog(@"Setting Language: %s", lang);
+ if (Languages_ != nil)
+ for (NSString *language : Languages_) {
+ languages += [language UTF8String];
+ languages += ",";
+ }
- if (lang != NULL) {
- setenv("LANG", lang, true);
- std::setlocale(LC_ALL, lang);
- }
+ languages += "en";
+ NSLog(@"Setting Language: [%s] %s", translation, languages.c_str());
/* }}} */
/* Index Collation {{{ */
if (Class $UILocalizedIndexedCollation = objc_getClass("UILocalizedIndexedCollation")) { @try {
Advanced_ = YES;
Cache_ = [[NSString stringWithFormat:@"%@/Library/Caches/com.saurik.Cydia", @"/var/mobile"] retain];
+ mkdir([Cache_ UTF8String], 0755);
/*Method alloc = class_getClassMethod([NSObject class], @selector(alloc));
alloc_ = alloc->method_imp;
_assert(pkgInitConfig(*_config));
_assert(pkgInitSystem(*_config, _system));
- if (lang != NULL)
- _config->Set("APT::Acquire::Translation", lang);
+ _config->Set("Acquire::AllowInsecureRepositories", true);
+ _config->Set("Acquire::Check-Valid-Until", false);
+ _config->Set("Dir::Bin::Methods::store", "/Applications/Cydia.app/store");
+
+ _config->Set("pkgCacheGen::ForceEssential", "");
+
+ if (translation != NULL)
+ _config->Set("APT::Acquire::Translation", translation);
+ _config->Set("Acquire::Languages", languages);
// XXX: this timeout might be important :(
//_config->Set("Acquire::http::Timeout", 15);
_config->Set("Acquire::http::MaxParallel", usermem >= 384 * 1024 * 1024 ? 16 : 3);
- mkdir([Cache_ UTF8String], 0755);
mkdir([Cache("archives") UTF8String], 0755);
mkdir([Cache("archives/partial") UTF8String], 0755);
_config->Set("Dir::Cache", [Cache_ UTF8String]);
std::string logs("/var/mobile/Library/Logs/Cydia");
mkdir(logs.c_str(), 0755);
- _config->Set("Dir::Log::Terminal", logs + "/apt.log");
+ _config->Set("Dir::Log", logs);
_config->Set("Dir::Bin::dpkg", "/usr/libexec/cydia/cydo");
/* }}} */