Merge branch 'master' of github.com:jeena/Bungloo

This commit is contained in:
Jeena Paradies 2013-02-15 19:12:29 +01:00
commit f0f564a577
39 changed files with 850 additions and 849 deletions

View file

@ -2,7 +2,7 @@
BSD license BSD license
=========== ===========
Copyright (c) 2010, Jeena Paradies Copyright (c) 2013, Jeena Paradies
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without

View file

@ -15,7 +15,7 @@ class Bungloo:
self.preferences = Windows.Preferences(self) self.preferences = Windows.Preferences(self)
self.preferences.show() self.preferences.show()
self.oauth_implementation = Windows.Oauth(self) self.oauth_implementation = Windows.Oauth(self)
if self.controller.stringForKey("user_access_token") != "": if self.controller.stringForKey("user_access_token") != "":
self.authentification_succeded() self.authentification_succeded()
@ -61,7 +61,7 @@ class Controller(QtCore.QObject):
self.app = app self.app = app
os.path.expanduser("~/.bungloo/") os.path.expanduser("~/.bungloo/")
self.config_path = os.path.expanduser('~/.bungloo/bungloo.cfg') self.config_path = os.path.expanduser('~/.bungloo/bungloo.cfg')
if os.access(self.config_path, os.R_OK): if os.access(self.config_path, os.R_OK):
with open(self.config_path, 'r') as f: with open(self.config_path, 'r') as f:
@ -196,7 +196,7 @@ class Controller(QtCore.QObject):
msgBox = QtGui.QMessageBox() msgBox = QtGui.QMessageBox()
msgBox.setText(errorMessage) msgBox.setText(errorMessage)
msgBox.exec_() msgBox.exec_()
@QtCore.pyqtSlot(str, str) @QtCore.pyqtSlot(str, str)
def alertTitleWithMessage(self, title, message): def alertTitleWithMessage(self, title, message):
msgBox = QtGui.QMessageBox() msgBox = QtGui.QMessageBox()
@ -230,6 +230,6 @@ class Console(QtCore.QObject):
def debug(self, string): def debug(self, string):
print "<js DEBUG>: " + string print "<js DEBUG>: " + string
if __name__ == "__main__": if __name__ == "__main__":
Bungloo() Bungloo()

View file

@ -10,119 +10,119 @@ import os
import array import array
class WebPage(QtWebKit.QWebPage): class WebPage(QtWebKit.QWebPage):
def __init__(self, parent=0, app=None): def __init__(self, parent=0, app=None):
super(QtWebKit.QWebPage, self).__init__(parent) super(QtWebKit.QWebPage, self).__init__(parent)
self.setLinkDelegationPolicy(QtWebKit.QWebPage.DelegateExternalLinks) self.setLinkDelegationPolicy(QtWebKit.QWebPage.DelegateExternalLinks)
self.app = app self.app = app
def javaScriptConsoleMessage(self, message, lineNumber, sourceId): def javaScriptConsoleMessage(self, message, lineNumber, sourceId):
print str(message) + " on line: " + str(lineNumber) + " Source: " + str(sourceId) print str(message) + " on line: " + str(lineNumber) + " Source: " + str(sourceId)
def checkRequest(self, request): def checkRequest(self, request):
print request print request
class WebViewCreator(QtWebKit.QWebView): class WebViewCreator(QtWebKit.QWebView):
def __init__(self, app, local=True, parent=None): def __init__(self, app, local=True, parent=None):
if parent != None: if parent != None:
QtGui.QWidget.__init__(self) QtGui.QWidget.__init__(self)
else: else:
QtGui.QWidget.__init__(self) QtGui.QWidget.__init__(self)
self.app = app self.app = app
self.is_local = local self.is_local = local
self.connect(self, SIGNAL("linkClicked (const QUrl&)"), self.app.controller.openQURL) self.connect(self, SIGNAL("linkClicked (const QUrl&)"), self.app.controller.openQURL)
self.setPage(WebPage(self, self.app)) self.setPage(WebPage(self, self.app))
def load_local(self, callback=None):
self.page().settings().setAttribute(QtWebKit.QWebSettings.LocalContentCanAccessRemoteUrls, True)
self.page().settings().setAttribute(QtWebKit.QWebSettings.LocalStorageEnabled, True)
self.loadFinished.connect(lambda ok: self.load_finished(ok, callback))
frame = self.page().mainFrame() def load_local(self, callback=None):
frame.addToJavaScriptWindowObject("controller", self.app.controller) self.page().settings().setAttribute(QtWebKit.QWebSettings.LocalContentCanAccessRemoteUrls, True)
frame.addToJavaScriptWindowObject("__console", self.app.console) self.page().settings().setAttribute(QtWebKit.QWebSettings.LocalStorageEnabled, True)
self.loadFinished.connect(lambda ok: self.load_finished(ok, callback))
url = self.app.resources_uri() + "/index.html" frame = self.page().mainFrame()
self.load(QtCore.QUrl(url)) frame.addToJavaScriptWindowObject("controller", self.app.controller)
frame.addToJavaScriptWindowObject("__console", self.app.console)
def load_url(self, url, callback=None): url = self.app.resources_uri() + "/index.html"
self.loadFinished.connect(lambda ok: self.load_finished(ok, callback)) self.load(QtCore.QUrl(url))
self.load(QtCore.QUrl(url))
def load_finished(self, ok, callback=None): def load_url(self, url, callback=None):
frame = self.page().mainFrame() self.loadFinished.connect(lambda ok: self.load_finished(ok, callback))
if self.is_local: self.load(QtCore.QUrl(url))
frame.evaluateJavaScript("var OS_TYPE = 'linux';")
js_plugin_path = os.path.expanduser('~/.bungloo/Plugin.js') def load_finished(self, ok, callback=None):
if os.access(js_plugin_path, os.R_OK): frame = self.page().mainFrame()
func = "setTimeout(function() { loadJsPlugin('file://localhost" + js_plugin_path + "') }, 1000);" if self.is_local:
frame.evaluateJavaScript(func) frame.evaluateJavaScript("var OS_TYPE = 'linux';")
css_plugin_path = os.path.expanduser('~/.bungloo/Plugin.css') js_plugin_path = os.path.expanduser('~/.bungloo/Plugin.js')
if os.access(css_plugin_path, os.R_OK): if os.access(js_plugin_path, os.R_OK):
func = "setTimeout(function() { loadCssPlugin('file://localhost" + css_plugin_path + "') }, 1000);" func = "setTimeout(function() { loadJsPlugin('file://localhost" + js_plugin_path + "') }, 1000);"
frame.evaluateJavaScript(func) frame.evaluateJavaScript(func)
if callback: css_plugin_path = os.path.expanduser('~/.bungloo/Plugin.css')
callback(ok) if os.access(css_plugin_path, os.R_OK):
func = "setTimeout(function() { loadCssPlugin('file://localhost" + css_plugin_path + "') }, 1000);"
frame.evaluateJavaScript(func)
if callback:
callback(ok)
class NetworkAccessManager(QNetworkAccessManager): class NetworkAccessManager(QNetworkAccessManager):
def __init__(self, old_manager, bungloo_callback): def __init__(self, old_manager, bungloo_callback):
QNetworkAccessManager.__init__(self) QNetworkAccessManager.__init__(self)
self.bungloo_callback = bungloo_callback self.bungloo_callback = bungloo_callback
self.old_manager = old_manager
self.setCache(old_manager.cache())
self.setCookieJar(old_manager.cookieJar())
self.setProxy(old_manager.proxy())
self.setProxyFactory(old_manager.proxyFactory())
def createRequest(self, operation, request, data):
if request.url().scheme() != "bungloo":
return QNetworkAccessManager.createRequest(self, operation, request, data)
else:
self.bungloo_callback(request.url())
return QNetworkAccessManager.createRequest(self, QNetworkAccessManager.GetOperation, QNetworkRequest(QtCore.QUrl()))
self.old_manager = old_manager
self.setCache(old_manager.cache())
self.setCookieJar(old_manager.cookieJar())
self.setProxy(old_manager.proxy())
self.setProxyFactory(old_manager.proxyFactory())
def createRequest(self, operation, request, data):
if request.url().scheme() != "bungloo":
return QNetworkAccessManager.createRequest(self, operation, request, data)
else:
self.bungloo_callback(request.url())
return QNetworkAccessManager.createRequest(self, QNetworkAccessManager.GetOperation, QNetworkRequest(QtCore.QUrl()))
class PostModel: class PostModel:
def __init__(self): def __init__(self):
self.text = None self.text = None
self.inReplyTostatusId = None self.inReplyTostatusId = None
self.inReplyToEntity = None self.inReplyToEntity = None
self.location = None self.location = None
self.imageFilePath = None self.imageFilePath = None
self.isPrivate = False self.isPrivate = False
class RestorableWindow(QtGui.QMainWindow): class RestorableWindow(QtGui.QMainWindow):
def __init__(self, action, app): def __init__(self, action, app):
self.action = action self.action = action
self.app = app self.app = app
QtGui.QMainWindow.__init__(self) QtGui.QMainWindow.__init__(self)
self.restoreGeometry(QtCore.QByteArray.fromRawData(self.app.controller.stringForKey("mainWindowGeometry-" + self.action))) self.restoreGeometry(QtCore.QByteArray.fromRawData(self.app.controller.stringForKey("mainWindowGeometry-" + self.action)))
self.restoreState(QtCore.QByteArray.fromRawData(self.app.controller.stringForKey("mainWindowState-" + self.action))) self.restoreState(QtCore.QByteArray.fromRawData(self.app.controller.stringForKey("mainWindowState-" + self.action)))
def closeEvent(self, event): def closeEvent(self, event):
self._saveGeometry() self._saveGeometry()
def _saveGeometry(self): def _saveGeometry(self):
self.app.controller.setStringForKey(self.saveGeometry(), "mainWindowGeometry-" + self.action) self.app.controller.setStringForKey(self.saveGeometry(), "mainWindowGeometry-" + self.action)
self.app.controller.setStringForKey(self.saveState(), "mainWindowState-" + self.action) self.app.controller.setStringForKey(self.saveState(), "mainWindowState-" + self.action)
def hide(self): def hide(self):
self._saveGeometry() self._saveGeometry()
QtGui.QMainWindow.close(self) QtGui.QMainWindow.close(self)
def sizeHint(self): def sizeHint(self):
return QtCore.QSize(300, 500) return QtCore.QSize(300, 500)
def show(self): def show(self):
QtGui.QMainWindow.show(self) QtGui.QMainWindow.show(self)
self.activateWindow() self.activateWindow()
self.raise_() self.raise_()

View file

@ -99,7 +99,7 @@ class Timeline:
def initUI(self): def initUI(self):
newPostAction = QtGui.QAction("&New Post", self.window) newPostAction = QtGui.QAction("&New Post", self.window)
newPostAction.setShortcut("Ctrl+N") newPostAction.setShortcut("Ctrl+N")
newPostAction.setStatusTip("Open new post window") newPostAction.setStatusTip("Open new post window")
newPostAction.triggered.connect(self.app.controller.openNewMessageWidow) newPostAction.triggered.connect(self.app.controller.openNewMessageWidow)
@ -253,12 +253,12 @@ class NewPost(Helper.RestorableWindow):
self.imageFilePath = None self.imageFilePath = None
def initUI(self): def initUI(self):
newPostAction = QtGui.QAction("&New Post", self) newPostAction = QtGui.QAction("&New Post", self)
newPostAction.setShortcut("Ctrl+N") newPostAction.setShortcut("Ctrl+N")
newPostAction.setStatusTip("Open new post window") newPostAction.setStatusTip("Open new post window")
newPostAction.triggered.connect(self.app.controller.openNewMessageWidow) newPostAction.triggered.connect(self.app.controller.openNewMessageWidow)
sendPostAction = QtGui.QAction("&Send Post", self) sendPostAction = QtGui.QAction("&Send Post", self)
sendPostAction.setShortcut("Ctrl+Return") sendPostAction.setShortcut("Ctrl+Return")
sendPostAction.setStatusTip("Send post") sendPostAction.setStatusTip("Send post")
sendPostAction.triggered.connect(self.sendMessage) sendPostAction.triggered.connect(self.sendMessage)

View file

@ -13,109 +13,109 @@
- (id)init - (id)init
{ {
self = [super init]; self = [super init];
if (self) { if (self) {
// Initialization code here. // Initialization code here.
d = [NSUserDefaults standardUserDefaults]; d = [NSUserDefaults standardUserDefaults];
//[d removeObjectForKey:@"user_access_token"]; //[d removeObjectForKey:@"user_access_token"];
} }
return self; return self;
} }
- (void)setString:(NSString *)string forKey:(NSString *)aKey - (void)setString:(NSString *)string forKey:(NSString *)aKey
{ {
[d setObject:string forKey:aKey]; [d setObject:string forKey:aKey];
[d synchronize]; [d synchronize];
} }
- (NSString *)stringForKey:(NSString *)aKey - (NSString *)stringForKey:(NSString *)aKey
{ {
return [d objectForKey:aKey]; return [d objectForKey:aKey];
} }
- (void)setAccessToken:(NSString *)_accessToken - (void)setAccessToken:(NSString *)_accessToken
{ {
[d synchronize]; [d synchronize];
} }
- (NSString *)accessToken - (NSString *)accessToken
{ {
return [d objectForKey:@"accessToken"]; return [d objectForKey:@"accessToken"];
} }
- (void)setSecret:(NSString *)_secret - (void)setSecret:(NSString *)_secret
{ {
UInt32 _passwordLength = 0; UInt32 _passwordLength = 0;
char *_password = nil; char *_password = nil;
SecKeychainItemRef item = nil; SecKeychainItemRef item = nil;
SecKeychainFindGenericPassword(NULL, 6, "Bungloo", 17, "BunglooUserAccount", &_passwordLength, (void **)&_password, &item); SecKeychainFindGenericPassword(NULL, 6, "Bungloo", 17, "BunglooUserAccount", &_passwordLength, (void **)&_password, &item);
OSStatus status; OSStatus status;
void * passwordData = (void*)[_secret cStringUsingEncoding:NSUTF8StringEncoding]; void * passwordData = (void*)[_secret cStringUsingEncoding:NSUTF8StringEncoding];
UInt32 passwordLength = strlen((char*)passwordData); UInt32 passwordLength = strlen((char*)passwordData);
if (!item) if (!item)
{ {
status = SecKeychainAddGenericPassword( status = SecKeychainAddGenericPassword(
NULL, // default keychain NULL, // default keychain
6, // length of service name 6, // length of service name
"Bungloo", // service name "Bungloo", // service name
17, // length of account name 17, // length of account name
"BunglooUserAccount", // account name "BunglooUserAccount", // account name
passwordLength, // length of password passwordLength, // length of password
passwordData, // pointer to password data passwordData, // pointer to password data
NULL // the item reference NULL // the item reference
); );
} }
else else
{ {
status = SecKeychainItemModifyContent( status = SecKeychainItemModifyContent(
item, item,
NULL, NULL,
passwordLength, passwordLength,
passwordData passwordData
); );
} }
NSLog(@"%@",(NSString *)SecCopyErrorMessageString (status,NULL)); NSLog(@"%@",(NSString *)SecCopyErrorMessageString (status,NULL));
} }
- (NSString *)secret - (NSString *)secret
{ {
UInt32 passwordLength = 0; UInt32 passwordLength = 0;
char *password = nil; char *password = nil;
SecKeychainItemRef item = nil; SecKeychainItemRef item = nil;
SecKeychainFindGenericPassword(NULL, 6, "Bungloo", 17, "BunglooUserAccount", &passwordLength, (void **)&password, &item); SecKeychainFindGenericPassword(NULL, 6, "Bungloo", 17, "BunglooUserAccount", &passwordLength, (void **)&password, &item);
if (!item) { if (!item) {
return nil; return nil;
} }
//Get password //Get password
NSString *passwordString = [[[NSString alloc] initWithData:[NSData dataWithBytes:password length:passwordLength] encoding:NSUTF8StringEncoding] autorelease]; NSString *passwordString = [[[NSString alloc] initWithData:[NSData dataWithBytes:password length:passwordLength] encoding:NSUTF8StringEncoding] autorelease];
SecKeychainItemFreeContent(NULL, password); SecKeychainItemFreeContent(NULL, password);
return passwordString; return passwordString;
} }
- (void)setUserId:(NSString *)_userId - (void)setUserId:(NSString *)_userId
{ {
[d setObject:_userId forKey:@"userId"]; [d setObject:_userId forKey:@"userId"];
[d synchronize]; [d synchronize];
} }
- (NSString *)userId - (NSString *)userId
{ {
return [d objectForKey:@"userId"]; return [d objectForKey:@"userId"];
} }
- (void)setScreenName:(NSString *)_screenName - (void)setScreenName:(NSString *)_screenName
{ {
[d setObject:_screenName forKey:@"screenName"]; [d setObject:_screenName forKey:@"screenName"];
[d synchronize]; [d synchronize];
} }
- (NSString *)screenName - (NSString *)screenName
{ {
return [d objectForKey:@"screenName"]; return [d objectForKey:@"screenName"];
} }
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector { + (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector {

View file

@ -3,5 +3,5 @@
// //
#ifdef __OBJC__ #ifdef __OBJC__
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
#endif #endif

View file

@ -213,7 +213,7 @@
string = nil; string = nil;
break; break;
} }
return string; return string;
} }

View file

@ -21,20 +21,20 @@
IBOutlet NSWindow *timelineViewWindow; IBOutlet NSWindow *timelineViewWindow;
IBOutlet WebView *mentionsView; IBOutlet WebView *mentionsView;
IBOutlet NSWindow *mentionsViewWindow; IBOutlet NSWindow *mentionsViewWindow;
IBOutlet WebView *conversationView; IBOutlet WebView *conversationView;
IBOutlet NSWindow *conversationViewWindow; IBOutlet NSWindow *conversationViewWindow;
WebView *profileView; WebView *profileView;
NSWindow *profileViewWindow; NSWindow *profileViewWindow;
NSPanel *openProfileWindow; NSPanel *openProfileWindow;
NSWindow *loginViewWindow; NSWindow *loginViewWindow;
NSTextField *loginEntityTextField; NSTextField *loginEntityTextField;
NSProgressIndicator *loginActivityIndicator; NSProgressIndicator *loginActivityIndicator;
IBOutlet NSMenuItem *globalHotkeyMenuItem; IBOutlet NSMenuItem *globalHotkeyMenuItem;
IBOutlet NSImageView *logoLayer; IBOutlet NSImageView *logoLayer;
ViewDelegate *viewDelegate; ViewDelegate *viewDelegate;
WebView *oauthView; WebView *oauthView;
AccessToken *accessToken; AccessToken *accessToken;
NSTextField *showProfileTextField; NSTextField *showProfileTextField;
} }

View file

@ -24,59 +24,59 @@
- (void)awakeFromNib - (void)awakeFromNib
{ {
[timelineViewWindow setExcludedFromWindowsMenu:YES]; [timelineViewWindow setExcludedFromWindowsMenu:YES];
[mentionsViewWindow setExcludedFromWindowsMenu:YES]; [mentionsViewWindow setExcludedFromWindowsMenu:YES];
[self initHotKeys]; [self initHotKeys];
[GrowlApplicationBridge setGrowlDelegate:self]; [GrowlApplicationBridge setGrowlDelegate:self];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self [nc addObserver:self
selector:@selector(openNewMessageWindow:) selector:@selector(openNewMessageWindow:)
name:@"openNewMessageWindow" name:@"openNewMessageWindow"
object:nil]; object:nil];
[nc addObserver:self [nc addObserver:self
selector:@selector(sendTweet:) selector:@selector(sendTweet:)
name:@"sendTweet" name:@"sendTweet"
object:nil]; object:nil];
[nc addObserver:self [nc addObserver:self
selector:@selector(authentificationSucceded:) selector:@selector(authentificationSucceded:)
name:@"authentificationSucceded" name:@"authentificationSucceded"
object:nil]; object:nil];
[nc addObserver:self [nc addObserver:self
selector:@selector(getTweetUpdates:) selector:@selector(getTweetUpdates:)
name:@"getTweetUpdates" name:@"getTweetUpdates"
object:nil]; object:nil];
NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager]; NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager];
[appleEventManager setEventHandler:self [appleEventManager setEventHandler:self
andSelector:@selector(handleGetURLEvent:withReplyEvent:) andSelector:@selector(handleGetURLEvent:withReplyEvent:)
forEventClass:kInternetEventClass forEventClass:kInternetEventClass
andEventID:kAEGetURL]; andEventID:kAEGetURL];
viewDelegate = [[ViewDelegate alloc] init]; viewDelegate = [[ViewDelegate alloc] init];
accessToken = [[AccessToken alloc] init]; accessToken = [[AccessToken alloc] init];
BOOL forceLogin = NO; BOOL forceLogin = NO;
/* /*
if (![accessToken stringForKey:@"version-0.6.0-new-login"]) { if (![accessToken stringForKey:@"version-0.6.0-new-login"]) {
[self logout:self]; [self logout:self];
forceLogin = YES; forceLogin = YES;
[accessToken setString:nil forKey:@"entity"]; [accessToken setString:nil forKey:@"entity"];
[accessToken setString:@"yes" forKey:@"version-0.6.0-new-login"]; [accessToken setString:@"yes" forKey:@"version-0.6.0-new-login"];
}*/ }*/
if (forceLogin || ![accessToken stringForKey:@"user_access_token"] || ![accessToken secret]) { if (forceLogin || ![accessToken stringForKey:@"user_access_token"] || ![accessToken secret]) {
[timelineViewWindow performClose:self]; [timelineViewWindow performClose:self];
[mentionsViewWindow performClose:self]; [mentionsViewWindow performClose:self];
[self.loginViewWindow makeKeyAndOrderFront:self]; [self.loginViewWindow makeKeyAndOrderFront:self];
[self initOauth]; [self initOauth];
} else { } else {
[timelineViewWindow makeKeyAndOrderFront:self]; [timelineViewWindow makeKeyAndOrderFront:self];
[self initWebViews]; [self initWebViews];
} }
} }
# pragma mark Init # pragma mark Init
@ -85,113 +85,113 @@
- (void)initOauth - (void)initOauth
{ {
if (!oauthView) { if (!oauthView) {
NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Webkit/"]; NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Webkit/"];
NSURL *url = [NSURL fileURLWithPath:path]; NSURL *url = [NSURL fileURLWithPath:path];
NSString *index_string = [NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@index.html", path] encoding:NSUTF8StringEncoding error:nil]; NSString *index_string = [NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@index.html", path] encoding:NSUTF8StringEncoding error:nil];
oauthView = [[WebView alloc] init];
viewDelegate.oauthView = oauthView;
[[oauthView mainFrame] loadHTMLString:index_string baseURL:url];
[oauthView setFrameLoadDelegate:viewDelegate];
[oauthView setPolicyDelegate:viewDelegate];
[oauthView setUIDelegate:viewDelegate];
[[oauthView windowScriptObject] setValue:self forKey:@"controller"];
} oauthView = [[WebView alloc] init];
viewDelegate.oauthView = oauthView;
[[oauthView mainFrame] loadHTMLString:index_string baseURL:url];
[oauthView setFrameLoadDelegate:viewDelegate];
[oauthView setPolicyDelegate:viewDelegate];
[oauthView setUIDelegate:viewDelegate];
[[oauthView windowScriptObject] setValue:self forKey:@"controller"];
}
} }
- (void)initWebViews - (void)initWebViews
{ {
if (viewDelegate.timelineView != timelineView) if (viewDelegate.timelineView != timelineView)
{ {
[self initOauth]; [self initOauth];
NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Webkit/"];
NSURL *url = [NSURL fileURLWithPath:path];
NSString *index_string = [NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@index.html", path] encoding:NSUTF8StringEncoding error:nil];
viewDelegate.timelineView = timelineView;
[[timelineView mainFrame] loadHTMLString:index_string baseURL:url];
[timelineView setFrameLoadDelegate:viewDelegate];
[timelineView setPolicyDelegate:viewDelegate];
[timelineView setUIDelegate:viewDelegate];
[[timelineView windowScriptObject] setValue:self forKey:@"controller"];
//WebPreferences* prefs = [timelineView preferences];
//[prefs _setLocalStorageDatabasePath:localStoragePath];
//[prefs setLocalStorageEnabled:YES];
viewDelegate.mentionsView = mentionsView;
[[mentionsView mainFrame] loadHTMLString:index_string baseURL:url];
[mentionsView setFrameLoadDelegate:viewDelegate];
[mentionsView setPolicyDelegate:viewDelegate];
[mentionsView setUIDelegate:viewDelegate];
[[mentionsView windowScriptObject] setValue:self forKey:@"controller"];
//prefs = [mentionsView preferences];
//[prefs _setLocalStorageDatabasePath:localStoragePath];
//[prefs setLocalStorageEnabled:YES];
viewDelegate.conversationView = conversationView;
[[conversationView mainFrame] loadHTMLString:index_string baseURL:url];
[conversationView setFrameLoadDelegate:viewDelegate];
[conversationView setPolicyDelegate:viewDelegate];
[conversationView setUIDelegate:viewDelegate];
[[conversationView windowScriptObject] setValue:self forKey:@"controller"];
//prefs = [conversationView preferences];
//[prefs _setLocalStorageDatabasePath:localStoragePath];
//[prefs setLocalStorageEnabled:YES];
viewDelegate.profileView = profileView;
[[profileView mainFrame] loadHTMLString:index_string baseURL:url];
[profileView setFrameLoadDelegate:viewDelegate];
[profileView setPolicyDelegate:viewDelegate];
[profileView setUIDelegate:viewDelegate];
[[profileView windowScriptObject] setValue:self forKey:@"controller"];
//prefs = [profileView preferences];
//[prefs _setLocalStorageDatabasePath:localStoragePath];
//[prefs setLocalStorageEnabled:YES];
} NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Webkit/"];
else NSURL *url = [NSURL fileURLWithPath:path];
{ NSString *index_string = [NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@index.html", path] encoding:NSUTF8StringEncoding error:nil];
[timelineView stringByEvaluatingJavaScriptFromString:@"start('timeline')"];
[mentionsView stringByEvaluatingJavaScriptFromString:@"start('mentions')"]; viewDelegate.timelineView = timelineView;
[conversationView stringByEvaluatingJavaScriptFromString:@"start('conversation')"]; [[timelineView mainFrame] loadHTMLString:index_string baseURL:url];
[profileView stringByEvaluatingJavaScriptFromString:@"start('profile')"]; [timelineView setFrameLoadDelegate:viewDelegate];
} [timelineView setPolicyDelegate:viewDelegate];
[timelineView setUIDelegate:viewDelegate];
[[timelineView windowScriptObject] setValue:self forKey:@"controller"];
//WebPreferences* prefs = [timelineView preferences];
//[prefs _setLocalStorageDatabasePath:localStoragePath];
//[prefs setLocalStorageEnabled:YES];
viewDelegate.mentionsView = mentionsView;
[[mentionsView mainFrame] loadHTMLString:index_string baseURL:url];
[mentionsView setFrameLoadDelegate:viewDelegate];
[mentionsView setPolicyDelegate:viewDelegate];
[mentionsView setUIDelegate:viewDelegate];
[[mentionsView windowScriptObject] setValue:self forKey:@"controller"];
//prefs = [mentionsView preferences];
//[prefs _setLocalStorageDatabasePath:localStoragePath];
//[prefs setLocalStorageEnabled:YES];
viewDelegate.conversationView = conversationView;
[[conversationView mainFrame] loadHTMLString:index_string baseURL:url];
[conversationView setFrameLoadDelegate:viewDelegate];
[conversationView setPolicyDelegate:viewDelegate];
[conversationView setUIDelegate:viewDelegate];
[[conversationView windowScriptObject] setValue:self forKey:@"controller"];
//prefs = [conversationView preferences];
//[prefs _setLocalStorageDatabasePath:localStoragePath];
//[prefs setLocalStorageEnabled:YES];
viewDelegate.profileView = profileView;
[[profileView mainFrame] loadHTMLString:index_string baseURL:url];
[profileView setFrameLoadDelegate:viewDelegate];
[profileView setPolicyDelegate:viewDelegate];
[profileView setUIDelegate:viewDelegate];
[[profileView windowScriptObject] setValue:self forKey:@"controller"];
//prefs = [profileView preferences];
//[prefs _setLocalStorageDatabasePath:localStoragePath];
//[prefs setLocalStorageEnabled:YES];
}
else
{
[timelineView stringByEvaluatingJavaScriptFromString:@"start('timeline')"];
[mentionsView stringByEvaluatingJavaScriptFromString:@"start('mentions')"];
[conversationView stringByEvaluatingJavaScriptFromString:@"start('conversation')"];
[profileView stringByEvaluatingJavaScriptFromString:@"start('profile')"];
}
} }
- (void)initHotKeys - (void)initHotKeys
{ {
NSInteger newTweetKey = kVK_ANSI_M; // http://boredzo.org/blog/archives/2007-05-22/virtual-key-codes NSInteger newTweetKey = kVK_ANSI_M; // http://boredzo.org/blog/archives/2007-05-22/virtual-key-codes
NSInteger newTweetModifierKey = controlKey + cmdKey + optionKey; // cmdKey 256, shitfKey 512, optionKey 2048, controlKey 4096 NSInteger newTweetModifierKey = controlKey + cmdKey + optionKey; // cmdKey 256, shitfKey 512, optionKey 2048, controlKey 4096
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSInteger defaultsNewTweetKey = (NSInteger)[defaults integerForKey:@"newTweetKey"]; NSInteger defaultsNewTweetKey = (NSInteger)[defaults integerForKey:@"newTweetKey"];
if ([defaults objectForKey:@"newTweetKey"] != nil) if ([defaults objectForKey:@"newTweetKey"] != nil)
{ {
newTweetKey = defaultsNewTweetKey; newTweetKey = defaultsNewTweetKey;
} }
else else
{ {
[defaults setInteger:newTweetKey forKey:@"newTweetKey"]; [defaults setInteger:newTweetKey forKey:@"newTweetKey"];
} }
NSInteger defaultsNewTweetModifierKey = (NSInteger)[defaults integerForKey:@"newTweetModifierKey"]; NSInteger defaultsNewTweetModifierKey = (NSInteger)[defaults integerForKey:@"newTweetModifierKey"];
if ([defaults objectForKey:@"newTweetModifierKey"] != nil) if ([defaults objectForKey:@"newTweetModifierKey"] != nil)
{ {
newTweetModifierKey = defaultsNewTweetModifierKey; newTweetModifierKey = defaultsNewTweetModifierKey;
} }
else else
{ {
[defaults setInteger:newTweetModifierKey forKey:@"newTweetModifierKey"]; [defaults setInteger:newTweetModifierKey forKey:@"newTweetModifierKey"];
} }
[defaults synchronize]; [defaults synchronize];
NSUInteger cocoaModifiers = 0; NSUInteger cocoaModifiers = 0;
if (newTweetModifierKey & shiftKey) cocoaModifiers = cocoaModifiers | NSShiftKeyMask; if (newTweetModifierKey & shiftKey) cocoaModifiers = cocoaModifiers | NSShiftKeyMask;
if (newTweetModifierKey & optionKey) cocoaModifiers = cocoaModifiers | NSAlternateKeyMask; if (newTweetModifierKey & optionKey) cocoaModifiers = cocoaModifiers | NSAlternateKeyMask;
@ -200,44 +200,44 @@
[globalHotkeyMenuItem setKeyEquivalent:[Constants stringFromVirtualKeyCode:newTweetKey]]; [globalHotkeyMenuItem setKeyEquivalent:[Constants stringFromVirtualKeyCode:newTweetKey]];
[globalHotkeyMenuItem setKeyEquivalentModifierMask:cocoaModifiers]; [globalHotkeyMenuItem setKeyEquivalentModifierMask:cocoaModifiers];
/* CARBON from http://github.com/Xjs/drama-button/blob/carbon/Drama_ButtonAppDelegate.m */ /* CARBON from http://github.com/Xjs/drama-button/blob/carbon/Drama_ButtonAppDelegate.m */
EventTypeSpec eventType; EventTypeSpec eventType;
eventType.eventClass = kEventClassKeyboard; eventType.eventClass = kEventClassKeyboard;
eventType.eventKind = kEventHotKeyPressed; eventType.eventKind = kEventHotKeyPressed;
InstallApplicationEventHandler(&handler, 1, &eventType, NULL, NULL); InstallApplicationEventHandler(&handler, 1, &eventType, NULL, NULL);
EventHotKeyID g_HotKeyID; EventHotKeyID g_HotKeyID;
g_HotKeyID.id = 1; g_HotKeyID.id = 1;
EventHotKeyRef g_HotKeyRef; EventHotKeyRef g_HotKeyRef;
RegisterEventHotKey(newTweetKey, newTweetModifierKey, g_HotKeyID, GetApplicationEventTarget(), 0, &g_HotKeyRef); RegisterEventHotKey(newTweetKey, newTweetModifierKey, g_HotKeyID, GetApplicationEventTarget(), 0, &g_HotKeyRef);
/* end CARBON */ /* end CARBON */
} }
- (void)alertTitle:(NSString *)title withMessage:(NSString *)message - (void)alertTitle:(NSString *)title withMessage:(NSString *)message
{ {
NSAlert *alert = [NSAlert alertWithMessageText:title NSAlert *alert = [NSAlert alertWithMessageText:title
defaultButton:@"OK" alternateButton:nil otherButton:nil defaultButton:@"OK" alternateButton:nil otherButton:nil
informativeTextWithFormat:@"%@", message]; informativeTextWithFormat:@"%@", message];
[alert runModal]; [alert runModal];
} }
- (void)authentificationSucceded:(id)sender - (void)authentificationSucceded:(id)sender
{ {
[loginActivityIndicator stopAnimation:self]; [loginActivityIndicator stopAnimation:self];
[self initWebViews]; [self initWebViews];
[loginViewWindow performClose:self]; [loginViewWindow performClose:self];
} }
- (void)authentificationDidNotSucceed:(NSString *)errorMessage - (void)authentificationDidNotSucceed:(NSString *)errorMessage
{ {
[loginActivityIndicator stopAnimation:self]; [loginActivityIndicator stopAnimation:self];
[self alertTitle:@"Authenication error" withMessage:errorMessage]; [self alertTitle:@"Authenication error" withMessage:errorMessage];
} }
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector + (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector
@ -252,21 +252,21 @@
- (void)setString:(NSString *)string forKey:(NSString *)aKey - (void)setString:(NSString *)string forKey:(NSString *)aKey
{ {
[self.accessToken setString:string forKey:aKey]; [self.accessToken setString:string forKey:aKey];
} }
- (void)setSecret:(NSString *)string - (void)setSecret:(NSString *)string
{ {
[self.accessToken setSecret:string]; [self.accessToken setSecret:string];
} }
- (NSString *)secret - (NSString *)secret
{ {
return [self.accessToken secret]; return [self.accessToken secret];
} }
- (NSString *)stringForKey:(NSString *)aKey - (NSString *)stringForKey:(NSString *)aKey
{ {
return [self.accessToken stringForKey:aKey]; return [self.accessToken stringForKey:aKey];
} }
@ -274,43 +274,43 @@
-(BOOL)applicationShouldOpenUntitledFile:(NSApplication *)theApplication -(BOOL)applicationShouldOpenUntitledFile:(NSApplication *)theApplication
{ {
return NO; return NO;
} }
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag - (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag
{ {
[timelineViewWindow makeKeyAndOrderFront:self]; [timelineViewWindow makeKeyAndOrderFront:self];
return NO; return NO;
} }
- (IBAction)openNewMessageWindow:(id)sender - (IBAction)openNewMessageWindow:(id)sender
{ {
[NSApp activateIgnoringOtherApps:YES]; [NSApp activateIgnoringOtherApps:YES];
[[NSDocumentController sharedDocumentController] openUntitledDocumentAndDisplay:YES error:nil]; [[NSDocumentController sharedDocumentController] openUntitledDocumentAndDisplay:YES error:nil];
} }
- (void)openNewMessageWindowInReplyTo:(NSString *)userName statusId:(NSString *)statusId withString:(NSString *)string isPrivate:(BOOL)isPrivate - (void)openNewMessageWindowInReplyTo:(NSString *)userName statusId:(NSString *)statusId withString:(NSString *)string isPrivate:(BOOL)isPrivate
{ {
[NSApp activateIgnoringOtherApps:YES]; [NSApp activateIgnoringOtherApps:YES];
NewMessageWindow *newMessage = (NewMessageWindow *)[[NSDocumentController sharedDocumentController] openUntitledDocumentAndDisplay:YES error:nil]; NewMessageWindow *newMessage = (NewMessageWindow *)[[NSDocumentController sharedDocumentController] openUntitledDocumentAndDisplay:YES error:nil];
[newMessage inReplyTo:userName statusId:statusId withString:string]; [newMessage inReplyTo:userName statusId:statusId withString:string];
[newMessage setIsPrivate:isPrivate]; [newMessage setIsPrivate:isPrivate];
} }
- (void)openNewMessageWindowWithString:(NSString *)aString - (void)openNewMessageWindowWithString:(NSString *)aString
{ {
[NSApp activateIgnoringOtherApps:YES]; [NSApp activateIgnoringOtherApps:YES];
NSRange range = [aString rangeOfString:@"oauthtoken"]; NSRange range = [aString rangeOfString:@"oauthtoken"];
if (range.length > 0) if (range.length > 0)
{ {
[oauthView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"bungloo_instance.requestAccessToken('%@')", aString]]; [oauthView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"bungloo_instance.requestAccessToken('%@')", aString]];
} }
else else
{ {
NewMessageWindow *newTweet = (NewMessageWindow *)[[NSDocumentController sharedDocumentController] openUntitledDocumentAndDisplay:YES error:nil]; NewMessageWindow *newTweet = (NewMessageWindow *)[[NSDocumentController sharedDocumentController] openUntitledDocumentAndDisplay:YES error:nil];
[newTweet withString:aString]; [newTweet withString:aString];
} }
} }
@ -323,47 +323,47 @@
- (IBAction)sendTweet:(id)sender - (IBAction)sendTweet:(id)sender
{ {
PostModel *post = (PostModel *)[sender object]; PostModel *post = (PostModel *)[sender object];
NSString *text = [[post.text stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"] stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]; NSString *text = [[post.text stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"] stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
text = [text stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"]; text = [text stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"];
NSString *locationObject = @"null";
if (post.location) {
locationObject = [NSString stringWithFormat:@"[%f, %f]", post.location.coordinate.latitude, post.location.coordinate.longitude];
}
NSString *imageFilePath = @"null";
if (post.imageFilePath) {
NSError *error;
NSString *mimeType = [MimeType mimeTypeForFileAtPath:post.imageFilePath error:&error];
NSData *data = [[NSData alloc] initWithContentsOfFile:post.imageFilePath];
NSString *base64 = [data base64Encoding_xcd];
[data release];
imageFilePath = [NSString stringWithFormat:@"\"data:%@;base64,%@\"", mimeType, base64];
}
NSString *isPrivate = @"false";
if (post.isPrivate) {
isPrivate = @"true";
}
NSString *func = [NSString stringWithFormat:@"bungloo_instance.sendNewMessage(\"%@\", \"%@\", \"%@\", %@, %@, %@)",
text,
post.inReplyTostatusId,
post.inReplyToEntity,
locationObject,
imageFilePath,
isPrivate];
[timelineView stringByEvaluatingJavaScriptFromString:func]; NSString *locationObject = @"null";
if (post.location) {
locationObject = [NSString stringWithFormat:@"[%f, %f]", post.location.coordinate.latitude, post.location.coordinate.longitude];
}
NSString *imageFilePath = @"null";
if (post.imageFilePath) {
NSError *error;
NSString *mimeType = [MimeType mimeTypeForFileAtPath:post.imageFilePath error:&error];
NSData *data = [[NSData alloc] initWithContentsOfFile:post.imageFilePath];
NSString *base64 = [data base64Encoding_xcd];
[data release];
imageFilePath = [NSString stringWithFormat:@"\"data:%@;base64,%@\"", mimeType, base64];
}
NSString *isPrivate = @"false";
if (post.isPrivate) {
isPrivate = @"true";
}
NSString *func = [NSString stringWithFormat:@"bungloo_instance.sendNewMessage(\"%@\", \"%@\", \"%@\", %@, %@, %@)",
text,
post.inReplyTostatusId,
post.inReplyToEntity,
locationObject,
imageFilePath,
isPrivate];
[timelineView stringByEvaluatingJavaScriptFromString:func];
} }
- (NSString *)pluginURL - (NSString *)pluginURL
{ {
NSFileManager *fileManager = [NSFileManager defaultManager]; NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *pathToPlugin = [@"~/Library/Application Support/Bungloo/Plugin.js" stringByExpandingTildeInPath]; NSString *pathToPlugin = [@"~/Library/Application Support/Bungloo/Plugin.js" stringByExpandingTildeInPath];
if([fileManager fileExistsAtPath:pathToPlugin]) if([fileManager fileExistsAtPath:pathToPlugin])
{ {
return [NSString stringWithFormat:@"%@", [NSURL fileURLWithPath:pathToPlugin]]; return [NSString stringWithFormat:@"%@", [NSURL fileURLWithPath:pathToPlugin]];
} }
return nil; return nil;
@ -372,12 +372,12 @@
- (void)unreadMentions:(int)count - (void)unreadMentions:(int)count
{ {
if (![mentionsViewWindow isVisible] && count > 0) if (![mentionsViewWindow isVisible] && count > 0)
{ {
[timelineViewWindow setTitle:[NSString stringWithFormat:@"Bungloo (^%i)", count]]; [timelineViewWindow setTitle:[NSString stringWithFormat:@"Bungloo (^%i)", count]];
[[[NSApplication sharedApplication] dockTile] setBadgeLabel:[NSString stringWithFormat:@"%i", count]]; [[[NSApplication sharedApplication] dockTile] setBadgeLabel:[NSString stringWithFormat:@"%i", count]];
} }
else else
{ {
[timelineViewWindow setTitle:[NSString stringWithFormat:@"Bungloo"]]; [timelineViewWindow setTitle:[NSString stringWithFormat:@"Bungloo"]];
[[[NSApplication sharedApplication] dockTile] setBadgeLabel:nil]; [[[NSApplication sharedApplication] dockTile] setBadgeLabel:nil];
[mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.unread_mentions = 0;"]; [mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.unread_mentions = 0;"];
@ -386,95 +386,95 @@
- (void)notificateUserAboutMention:(NSString *)text fromName:(NSString *)name withPostId:(NSString *)postId andEntity:(NSString *)entity - (void)notificateUserAboutMention:(NSString *)text fromName:(NSString *)name withPostId:(NSString *)postId andEntity:(NSString *)entity
{ {
[GrowlApplicationBridge [GrowlApplicationBridge
notifyWithTitle:[NSString stringWithFormat:@"Mentioned by %@ on Tent", name] notifyWithTitle:[NSString stringWithFormat:@"Mentioned by %@ on Tent", name]
description:text description:text
notificationName:@"Mention" notificationName:@"Mention"
iconData:nil iconData:nil
priority:0 priority:0
isSticky:NO isSticky:NO
clickContext:[NSDictionary dictionaryWithObjectsAndKeys: clickContext:[NSDictionary dictionaryWithObjectsAndKeys:
entity, @"entity", entity, @"entity",
postId, @"postId", nil]]; postId, @"postId", nil]];
} }
- (void)openURL:(NSString *)url - (void)openURL:(NSString *)url
{ {
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]]; [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]];
} }
- (IBAction)showProfile:(id)sender - (IBAction)showProfile:(id)sender
{ {
NSString *entity = [self.showProfileTextField stringValue]; NSString *entity = [self.showProfileTextField stringValue];
if ([entity rangeOfString:@"."].location != NSNotFound && ([entity hasPrefix:@"http://"] || [entity hasPrefix:@"https://"])) { if ([entity rangeOfString:@"."].location != NSNotFound && ([entity hasPrefix:@"http://"] || [entity hasPrefix:@"https://"])) {
NSString *func = [NSString stringWithFormat:@"bungloo_instance.showProfileForEntity('%@')", entity]; NSString *func = [NSString stringWithFormat:@"bungloo_instance.showProfileForEntity('%@')", entity];
[profileView stringByEvaluatingJavaScriptFromString:func]; [profileView stringByEvaluatingJavaScriptFromString:func];
[profileViewWindow makeKeyAndOrderFront:self]; [profileViewWindow makeKeyAndOrderFront:self];
[openProfileWindow performClose:self]; [openProfileWindow performClose:self];
} }
} }
- (void)notificateViewsAboutDeletedPostWithId:(NSString *)postId byEntity:(NSString*)entity - (void)notificateViewsAboutDeletedPostWithId:(NSString *)postId byEntity:(NSString*)entity
{ {
NSString *fun = [NSString stringWithFormat:@"bungloo_instance.postDeleted('%@', '%@')", postId, entity]; NSString *fun = [NSString stringWithFormat:@"bungloo_instance.postDeleted('%@', '%@')", postId, entity];
[timelineView stringByEvaluatingJavaScriptFromString:fun]; [timelineView stringByEvaluatingJavaScriptFromString:fun];
[mentionsView stringByEvaluatingJavaScriptFromString:fun]; [mentionsView stringByEvaluatingJavaScriptFromString:fun];
[conversationView stringByEvaluatingJavaScriptFromString:fun]; [conversationView stringByEvaluatingJavaScriptFromString:fun];
[profileView stringByEvaluatingJavaScriptFromString:fun]; [profileView stringByEvaluatingJavaScriptFromString:fun];
} }
/* /*
- (void)storeAccessToken:(NSString *)_accessToken secret:(NSString *)secret userId:(NSString *)userId andScreenName:(NSString *)screenName - (void)storeAccessToken:(NSString *)_accessToken secret:(NSString *)secret userId:(NSString *)userId andScreenName:(NSString *)screenName
{ {
self.accessToken.accessToken = _accessToken; self.accessToken.accessToken = _accessToken;
self.accessToken.secret = secret; self.accessToken.secret = secret;
self.accessToken.userId = userId; self.accessToken.userId = userId;
self.accessToken.screenName = screenName; self.accessToken.screenName = screenName;
[timelineViewWindow makeKeyAndOrderFront:self]; [timelineViewWindow makeKeyAndOrderFront:self];
[[NSNotificationCenter defaultCenter] postNotificationName:@"authentificationSucceded" object:nil]; [[NSNotificationCenter defaultCenter] postNotificationName:@"authentificationSucceded" object:nil];
}*/ }*/
- (void)loggedIn - (void)loggedIn
{ {
[loginActivityIndicator stopAnimation:self]; [loginActivityIndicator stopAnimation:self];
[self initWebViews]; [self initWebViews];
[loginViewWindow performClose:self]; [loginViewWindow performClose:self];
[timelineViewWindow makeKeyAndOrderFront:self]; [timelineViewWindow makeKeyAndOrderFront:self];
} }
- (IBAction)login:(id)sender - (IBAction)login:(id)sender
{ {
if ([[loginEntityTextField stringValue] length] > 0) { if ([[loginEntityTextField stringValue] length] > 0) {
[[loginEntityTextField window] makeFirstResponder:nil]; [[loginEntityTextField window] makeFirstResponder:nil];
[loginActivityIndicator startAnimation:self]; [loginActivityIndicator startAnimation:self];
[oauthView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.authenticate();"]; [oauthView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.authenticate();"];
} }
} }
- (IBAction)logout:(id)sender - (IBAction)logout:(id)sender
{ {
[oauthView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.logout();"]; [oauthView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.logout();"];
[timelineViewWindow performClose:self]; [timelineViewWindow performClose:self];
[mentionsViewWindow performClose:self]; [mentionsViewWindow performClose:self];
[conversationViewWindow performClose:self]; [conversationViewWindow performClose:self];
[profileViewWindow performClose:self]; [profileViewWindow performClose:self];
[self.loginViewWindow makeKeyAndOrderFront:self]; [self.loginViewWindow makeKeyAndOrderFront:self];
[timelineView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.logout();"]; [timelineView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.logout();"];
[mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.logout();"]; [mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.logout();"];
} }
// Mentions window has been visible // Mentions window has been visible
- (void)windowDidBecomeKey:(NSNotification *)notification - (void)windowDidBecomeKey:(NSNotification *)notification
{ {
if ([notification object] == mentionsViewWindow) if ([notification object] == mentionsViewWindow)
{ {
//[self unreadMentions:0]; //[self unreadMentions:0];
[mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.setAllMentionsRead();"]; [mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.setAllMentionsRead();"];
} }
} }
- (void)getTweetUpdates:(id)sender - (void)getTweetUpdates:(id)sender
@ -485,39 +485,39 @@
- (IBAction)showConversationForPostId:(NSString *)postId andEntity:(NSString *)entity - (IBAction)showConversationForPostId:(NSString *)postId andEntity:(NSString *)entity
{ {
NSString *js = [NSString stringWithFormat:@"bungloo_instance.showStatus('%@', '%@');", postId, entity]; NSString *js = [NSString stringWithFormat:@"bungloo_instance.showStatus('%@', '%@');", postId, entity];
[conversationView stringByEvaluatingJavaScriptFromString:js]; [conversationView stringByEvaluatingJavaScriptFromString:js];
[conversationViewWindow makeKeyAndOrderFront:self]; [conversationViewWindow makeKeyAndOrderFront:self];
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
} }
- (IBAction)clearCache:(id)sender - (IBAction)clearCache:(id)sender
{ {
[timelineView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.cache.clear()"]; [timelineView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.cache.clear()"];
} }
- (IBAction)showProfileForEntity:(NSString *)entity - (IBAction)showProfileForEntity:(NSString *)entity
{ {
NSString *js = [NSString stringWithFormat:@"bungloo_instance.showProfileForEntity('%@');", entity]; NSString *js = [NSString stringWithFormat:@"bungloo_instance.showProfileForEntity('%@');", entity];
[profileView stringByEvaluatingJavaScriptFromString:js]; [profileView stringByEvaluatingJavaScriptFromString:js];
[profileViewWindow makeKeyAndOrderFront:self]; [profileViewWindow makeKeyAndOrderFront:self];
} }
- (void)growlNotificationWasClicked:(id)clickContext - (void)growlNotificationWasClicked:(id)clickContext
{ {
NSDictionary *userInfo = (NSDictionary *)clickContext; NSDictionary *userInfo = (NSDictionary *)clickContext;
NSString *postId = [userInfo objectForKey:@"postId"]; NSString *postId = [userInfo objectForKey:@"postId"];
NSString *entity = [userInfo objectForKey:@"entity"]; NSString *entity = [userInfo objectForKey:@"entity"];
[self showConversationForPostId:postId andEntity:entity]; [self showConversationForPostId:postId andEntity:entity];
NSString *js = [NSString stringWithFormat:@"bungloo_instance.mentionRead('%@', '%@');", postId, entity]; NSString *js = [NSString stringWithFormat:@"bungloo_instance.mentionRead('%@', '%@');", postId, entity];
[mentionsView stringByEvaluatingJavaScriptFromString:js]; [mentionsView stringByEvaluatingJavaScriptFromString:js];
} }
- (NSString *) applicationNameForGrowl - (NSString *) applicationNameForGrowl
{ {
return @"Bungloo"; return @"Bungloo";
} }
/* CARBON */ /* CARBON */

View file

@ -390,8 +390,8 @@
/*! @brief Tries to fill in missing keys in a notification dictionary. /*! @brief Tries to fill in missing keys in a notification dictionary.
* @param notifDict The dictionary to fill in. * @param notifDict The dictionary to fill in.
* @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict. * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict.
* @discussion This function examines the \a notifDict for missing keys, and * @discussion This function examines the \a notifDict for missing keys, and
* tries to get them from the last known registration dictionary. As of 1.1, * tries to get them from the last known registration dictionary. As of 1.1,
* the keys that it will look for are: * the keys that it will look for are:
* *
* \li <code>GROWL_APP_NAME</code> * \li <code>GROWL_APP_NAME</code>
@ -410,8 +410,8 @@
*@abstract Lets the app know whether growl:// is registered on the system, used for certain methods below this *@abstract Lets the app know whether growl:// is registered on the system, used for certain methods below this
*@return Returns whether growl:// is registered on the system *@return Returns whether growl:// is registered on the system
*@discussion Methods such as openGrowlPreferences rely on the growl:// URL scheme to function *@discussion Methods such as openGrowlPreferences rely on the growl:// URL scheme to function
* Further, this method can provide a check on whether Growl is installed, * Further, this method can provide a check on whether Growl is installed,
* however, the framework will not be relying on this method for choosing when/how to notify, * however, the framework will not be relying on this method for choosing when/how to notify,
* and it is not recommended that the app rely on it for other than whether to use growl:// methods * and it is not recommended that the app rely on it for other than whether to use growl:// methods
*@since Growl.framework 1.4 *@since Growl.framework 1.4
*/ */
@ -421,7 +421,7 @@
* @method openGrowlPreferences: * @method openGrowlPreferences:
* @abstract Open Growl preferences, optionally to this app's settings, growl:// method * @abstract Open Growl preferences, optionally to this app's settings, growl:// method
* @param showApp Whether to show the application's settings, otherwise just opens to the last position * @param showApp Whether to show the application's settings, otherwise just opens to the last position
* @return Return's whether opening the URL was succesfull or not. * @return Return's whether opening the URL was succesfull or not.
* @discussion Will launch if Growl is installed, but not running, and open the preferences window * @discussion Will launch if Growl is installed, but not running, and open the preferences window
* Uses growl:// URL scheme * Uses growl:// URL scheme
* @since Growl.framework 1.4 * @since Growl.framework 1.4

View file

@ -11,17 +11,17 @@
@implementation MimeType @implementation MimeType
+(NSString *)mimeTypeForFileAtPath:(NSString *)path error:(NSError **)err { +(NSString *)mimeTypeForFileAtPath:(NSString *)path error:(NSError **)err {
NSString *uti, *mimeType = nil; NSString *uti, *mimeType = nil;
if (!(uti = [[NSWorkspace sharedWorkspace] typeOfFile:path error:err])) if (!(uti = [[NSWorkspace sharedWorkspace] typeOfFile:path error:err]))
return nil; return nil;
if (err) if (err)
*err = nil; *err = nil;
if ((mimeType = (NSString *)UTTypeCopyPreferredTagWithClass((CFStringRef)uti, kUTTagClassMIMEType))) if ((mimeType = (NSString *)UTTypeCopyPreferredTagWithClass((CFStringRef)uti, kUTTagClassMIMEType)))
mimeType = NSMakeCollectable(mimeType); mimeType = NSMakeCollectable(mimeType);
return mimeType; return mimeType;
} }
@end @end

View file

@ -15,7 +15,7 @@
{ {
if ([base64Encoding length] % 4 != 0) if ([base64Encoding length] % 4 != 0)
return nil; return nil;
NSString *plist = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?><plist version=\"1.0\"><data>%@</data></plist>", base64Encoding]; NSString *plist = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?><plist version=\"1.0\"><data>%@</data></plist>", base64Encoding];
return [NSPropertyListSerialization propertyListWithData:[plist dataUsingEncoding:NSASCIIStringEncoding] options:0 format:NULL error:NULL]; return [NSPropertyListSerialization propertyListWithData:[plist dataUsingEncoding:NSASCIIStringEncoding] options:0 format:NULL error:NULL];
} }
@ -28,14 +28,14 @@
NSRange endRange = [plist rangeOfData:[@"</data>" dataUsingEncoding:NSASCIIStringEncoding] options:NSDataSearchBackwards range:fullRange]; NSRange endRange = [plist rangeOfData:[@"</data>" dataUsingEncoding:NSASCIIStringEncoding] options:NSDataSearchBackwards range:fullRange];
if (startRange.location == NSNotFound || endRange.location == NSNotFound) if (startRange.location == NSNotFound || endRange.location == NSNotFound)
return nil; return nil;
NSUInteger base64Location = startRange.location + startRange.length; NSUInteger base64Location = startRange.location + startRange.length;
NSUInteger base64length = endRange.location - base64Location; NSUInteger base64length = endRange.location - base64Location;
NSData *base64Data = [NSData dataWithBytesNoCopy:(void *)((uintptr_t)base64Location + (uintptr_t)[plist bytes]) length:base64length freeWhenDone:NO]; NSData *base64Data = [NSData dataWithBytesNoCopy:(void *)((uintptr_t)base64Location + (uintptr_t)[plist bytes]) length:base64length freeWhenDone:NO];
NSString *base64Encoding = [[NSString alloc] initWithData:base64Data encoding:NSASCIIStringEncoding]; NSString *base64Encoding = [[NSString alloc] initWithData:base64Data encoding:NSASCIIStringEncoding];
base64Encoding = [base64Encoding stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; base64Encoding = [base64Encoding stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
base64Encoding = [base64Encoding stringByReplacingOccurrencesOfString:@"\n" withString:@""]; base64Encoding = [base64Encoding stringByReplacingOccurrencesOfString:@"\n" withString:@""];
#if __has_feature(objc_arc) #if __has_feature(objc_arc)
return base64Encoding; return base64Encoding;
#else #else

View file

@ -15,15 +15,15 @@
{ {
IBOutlet NSTextField *textField; IBOutlet NSTextField *textField;
IBOutlet NSTextField *counter; IBOutlet NSTextField *counter;
NSMenu *addMenu; NSMenu *addMenu;
NSButton *addMenuButton; NSButton *addMenuButton;
NSString *inReplyTostatusId; NSString *inReplyTostatusId;
NSString *inReplyToEntity; NSString *inReplyToEntity;
NSMenuItem *addImage; NSMenuItem *addImage;
CLLocationManager *locationManager; CLLocationManager *locationManager;
CLLocation *currentLocation; CLLocation *currentLocation;
NSString *imageFilePath; NSString *imageFilePath;
NSButton *togglePrivateButton; NSButton *togglePrivateButton;
} }
@property (nonatomic, retain) IBOutlet NSTextField *textField; @property (nonatomic, retain) IBOutlet NSTextField *textField;

View file

@ -27,31 +27,31 @@
- (void)dealloc - (void)dealloc
{ {
[locationManager stopUpdatingLocation]; [locationManager stopUpdatingLocation];
[locationManager release]; [locationManager release];
[currentLocation release]; [currentLocation release];
[imageFilePath release]; [imageFilePath release];
[super dealloc]; [super dealloc];
} }
- (id)init - (id)init
{ {
self = [super init]; self = [super init];
if (self) if (self)
{ {
// Add your subclass-specific initialization here. // Add your subclass-specific initialization here.
// If an error occurs here, send a [self release] message and return nil. // If an error occurs here, send a [self release] message and return nil.
inReplyTostatusId = @""; inReplyTostatusId = @"";
inReplyToEntity = @""; inReplyToEntity = @"";
} }
return self; return self;
} }
- (NSString *)windowNibName - (NSString *)windowNibName
{ {
// Override returning the nib file name of the document // Override returning the nib file name of the document
// If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead. // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead.
return @"NewMessageWindow"; return @"NewMessageWindow";
} }
- (NSString *)displayName - (NSString *)displayName
@ -61,24 +61,24 @@
- (void)windowControllerDidLoadNib:(NSWindowController *) aController - (void)windowControllerDidLoadNib:(NSWindowController *) aController
{ {
[super windowControllerDidLoadNib:aController]; [super windowControllerDidLoadNib:aController];
// Add any code here that needs to be executed once the windowController has loaded the document's window. // Add any code here that needs to be executed once the windowController has loaded the document's window.
[textField becomeFirstResponder]; [textField becomeFirstResponder];
// Enable Continous Spelling // Enable Continous Spelling
NSTextView *textView = (NSTextView *)[[[self.windowControllers objectAtIndex:0] window] firstResponder];; NSTextView *textView = (NSTextView *)[[[self.windowControllers objectAtIndex:0] window] firstResponder];;
[textView setContinuousSpellCheckingEnabled:YES]; [textView setContinuousSpellCheckingEnabled:YES];
} }
- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError - (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
{ {
// Insert code here to write your document to data of the specified type. If the given outError != NULL, ensure that you set *outError when returning nil. // Insert code here to write your document to data of the specified type. If the given outError != NULL, ensure that you set *outError when returning nil.
// You can also choose to override -fileWrapperOfType:error:, -writeToURL:ofType:error:, or -writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead. // You can also choose to override -fileWrapperOfType:error:, -writeToURL:ofType:error:, or -writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead.
// For applications targeted for Panther or earlier systems, you should use the deprecated API -dataRepresentationOfType:. In this case you can also choose to override -fileWrapperRepresentationOfType: or -writeToFile:ofType: instead. // For applications targeted for Panther or earlier systems, you should use the deprecated API -dataRepresentationOfType:. In this case you can also choose to override -fileWrapperRepresentationOfType: or -writeToFile:ofType: instead.
if ( outError != NULL ) { if ( outError != NULL ) {
*outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL]; *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL];
} }
return nil; return nil;
@ -86,42 +86,42 @@
- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError - (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
{ {
// Insert code here to read your document from the given data of the specified type. If the given outError != NULL, ensure that you set *outError when returning NO. // Insert code here to read your document from the given data of the specified type. If the given outError != NULL, ensure that you set *outError when returning NO.
// You can also choose to override -readFromFileWrapper:ofType:error: or -readFromURL:ofType:error: instead. // You can also choose to override -readFromFileWrapper:ofType:error: or -readFromURL:ofType:error: instead.
// For applications targeted for Panther or earlier systems, you should use the deprecated API -loadDataRepresentation:ofType. In this case you can also choose to override -readFromFile:ofType: or -loadFileWrapperRepresentation:ofType: instead. // For applications targeted for Panther or earlier systems, you should use the deprecated API -loadDataRepresentation:ofType. In this case you can also choose to override -readFromFile:ofType: or -loadFileWrapperRepresentation:ofType: instead.
if ( outError != NULL ) if ( outError != NULL )
{ {
*outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL]; *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL];
} }
return YES; return YES;
} }
- (void)inReplyTo:(NSString *)entity statusId:(NSString *)statusId withString:(NSString *)string - (void)inReplyTo:(NSString *)entity statusId:(NSString *)statusId withString:(NSString *)string
{ {
[textField setStringValue:string]; [textField setStringValue:string];
NSInteger location = [string rangeOfString:@" "].location; NSInteger location = [string rangeOfString:@" "].location;
NSInteger length = 0; NSInteger length = 0;
if (location != NSNotFound) { if (location != NSNotFound) {
length = [[textField stringValue] length] - location - 1; length = [[textField stringValue] length] - location - 1;
} }
NSRange range = {location + 1, length}; NSRange range = {location + 1, length};
[[textField currentEditor] setSelectedRange:range]; [[textField currentEditor] setSelectedRange:range];
[inReplyTostatusId release]; [inReplyTostatusId release];
inReplyTostatusId = statusId; inReplyTostatusId = statusId;
[inReplyTostatusId retain]; [inReplyTostatusId retain];
[inReplyToEntity release]; [inReplyToEntity release];
inReplyToEntity = entity; inReplyToEntity = entity;
[inReplyToEntity retain]; [inReplyToEntity retain];
[self controlTextDidChange:nil]; [self controlTextDidChange:nil];
} }
- (void)withString:(NSString *)aString - (void)withString:(NSString *)aString
@ -129,59 +129,59 @@
[textField setStringValue:aString]; [textField setStringValue:aString];
NSRange range = {[[textField stringValue] length] , 0}; NSRange range = {[[textField stringValue] length] , 0};
[[textField currentEditor] setSelectedRange:range]; [[textField currentEditor] setSelectedRange:range];
NSLog(@"BB"); NSLog(@"BB");
[self controlTextDidChange:nil]; [self controlTextDidChange:nil];
} }
- (IBAction)addCurrentLocation:(id)sender - (IBAction)addCurrentLocation:(id)sender
{ {
NSMenuItem *menuItem = (NSMenuItem *)sender; NSMenuItem *menuItem = (NSMenuItem *)sender;
if (!self.locationManager) if (!self.locationManager)
{ {
[menuItem setTitle:@"Current location not available"]; [menuItem setTitle:@"Current location not available"];
[self initLocationManager]; [self initLocationManager];
} }
else else
{ {
[self.locationManager stopUpdatingLocation]; [self.locationManager stopUpdatingLocation];
self.currentLocation = nil; self.currentLocation = nil;
self.locationManager = nil; self.locationManager = nil;
[menuItem setTitle:@"Add current location"]; [menuItem setTitle:@"Add current location"];
} }
} }
- (IBAction)openAddMenu:(id)sender - (IBAction)openAddMenu:(id)sender
{ {
NSRect frame = [(NSButton *)sender frame]; NSRect frame = [(NSButton *)sender frame];
NSPoint menuOrigin = [[(NSButton *)sender superview] convertPoint:NSMakePoint(frame.origin.x, frame.origin.y+frame.size.height) toView:nil]; NSPoint menuOrigin = [[(NSButton *)sender superview] convertPoint:NSMakePoint(frame.origin.x, frame.origin.y+frame.size.height) toView:nil];
NSEvent *event = [NSEvent mouseEventWithType:NSLeftMouseDown NSEvent *event = [NSEvent mouseEventWithType:NSLeftMouseDown
location:menuOrigin location:menuOrigin
modifierFlags:NSLeftMouseDownMask // 0x100 modifierFlags:NSLeftMouseDownMask // 0x100
timestamp:NSTimeIntervalSince1970 timestamp:NSTimeIntervalSince1970
windowNumber:[[(NSButton *)sender window] windowNumber] windowNumber:[[(NSButton *)sender window] windowNumber]
context:[[(NSButton *)sender window] graphicsContext] context:[[(NSButton *)sender window] graphicsContext]
eventNumber:0 eventNumber:0
clickCount:1 clickCount:1
pressure:1]; pressure:1];
[NSMenu popUpContextMenu:self.addMenu withEvent:event forView:self.addMenuButton]; [NSMenu popUpContextMenu:self.addMenu withEvent:event forView:self.addMenuButton];
} }
- (IBAction)togglePrivate:(id)sender - (IBAction)togglePrivate:(id)sender
{ {
NSImage *image = [NSImage imageNamed:NSImageNameLockLockedTemplate]; NSImage *image = [NSImage imageNamed:NSImageNameLockLockedTemplate];
if (self.togglePrivateButton.image == [NSImage imageNamed:NSImageNameLockLockedTemplate]) if (self.togglePrivateButton.image == [NSImage imageNamed:NSImageNameLockLockedTemplate])
{ {
image = [NSImage imageNamed:NSImageNameLockUnlockedTemplate]; image = [NSImage imageNamed:NSImageNameLockUnlockedTemplate];
} }
[self.togglePrivateButton setImage:image]; [self.togglePrivateButton setImage:image];
} }
- (void)setIsPrivate:(BOOL)isPrivate { - (void)setIsPrivate:(BOOL)isPrivate {
NSImage *image = [NSImage imageNamed:(isPrivate ? NSImageNameLockLockedTemplate : NSImageNameLockUnlockedTemplate)]; NSImage *image = [NSImage imageNamed:(isPrivate ? NSImageNameLockLockedTemplate : NSImageNameLockUnlockedTemplate)];
[self.togglePrivateButton setImage:image]; [self.togglePrivateButton setImage:image];
} }
-(void)controlTextDidChange:(NSNotification *)aNotification { -(void)controlTextDidChange:(NSNotification *)aNotification {
@ -190,50 +190,50 @@
if(c < 0) { if(c < 0) {
[counter setTextColor:[NSColor redColor]]; [counter setTextColor:[NSColor redColor]];
} else { } else {
[counter setTextColor:[NSColor controlTextColor]]; [counter setTextColor:[NSColor controlTextColor]];
} }
} }
- (void)initLocationManager - (void)initLocationManager
{ {
self.locationManager = [[CLLocationManager alloc] init]; self.locationManager = [[CLLocationManager alloc] init];
[self.locationManager setDelegate:self]; [self.locationManager setDelegate:self];
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[self.locationManager setDistanceFilter:kCLDistanceFilterNone]; [self.locationManager setDistanceFilter:kCLDistanceFilterNone];
[self.locationManager startUpdatingLocation]; [self.locationManager startUpdatingLocation];
} }
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{ {
self.currentLocation = newLocation; self.currentLocation = newLocation;
NSMenuItem *menuItem = [self.addMenu itemAtIndex:0]; NSMenuItem *menuItem = [self.addMenu itemAtIndex:0];
[menuItem setTitle:@"Remove current location"]; [menuItem setTitle:@"Remove current location"];
} }
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{ - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
NSLog(@"CLLocationManager Error: %@", error); NSLog(@"CLLocationManager Error: %@", error);
NSMenuItem *menuItem = [self.addMenu itemAtIndex:0]; NSMenuItem *menuItem = [self.addMenu itemAtIndex:0];
[menuItem setTitle:@"Current location not available"]; [menuItem setTitle:@"Current location not available"];
} }
- (IBAction)sendPostButtonPressed:(id)sender - (IBAction)sendPostButtonPressed:(id)sender
{ {
[self sendPost:self.textField]; [self sendPost:self.textField];
} }
#pragma mark Keyboard delegate methods #pragma mark Keyboard delegate methods
- (IBAction)sendPost:(NSControl *)control { - (IBAction)sendPost:(NSControl *)control {
BOOL emptyIsOk = self.currentLocation || self.imageFilePath; BOOL emptyIsOk = self.currentLocation || self.imageFilePath;
if (emptyIsOk || ([[control stringValue] length] <= MESSAGE_MAX_LENGTH && [[control stringValue] length] > 0)) { if (emptyIsOk || ([[control stringValue] length] <= MESSAGE_MAX_LENGTH && [[control stringValue] length] > 0)) {
PostModel *post = [[[PostModel alloc] init] autorelease]; PostModel *post = [[[PostModel alloc] init] autorelease];
post.text = [control stringValue]; post.text = [control stringValue];
post.inReplyTostatusId = inReplyTostatusId; post.inReplyTostatusId = inReplyTostatusId;
post.inReplyToEntity = inReplyToEntity; post.inReplyToEntity = inReplyToEntity;
post.location = self.currentLocation; post.location = self.currentLocation;
post.imageFilePath = self.imageFilePath; post.imageFilePath = self.imageFilePath;
post.isPrivate = self.togglePrivateButton.image == [NSImage imageNamed:NSImageNameLockLockedTemplate]; post.isPrivate = self.togglePrivateButton.image == [NSImage imageNamed:NSImageNameLockLockedTemplate];
[[NSNotificationCenter defaultCenter] postNotificationName:@"sendTweet" object:post]; [[NSNotificationCenter defaultCenter] postNotificationName:@"sendTweet" object:post];
[self close]; [self close];
} else { } else {
@ -243,102 +243,102 @@
} }
- (BOOL)isCommandEnterEvent:(NSEvent *)e { - (BOOL)isCommandEnterEvent:(NSEvent *)e {
NSUInteger flags = (e.modifierFlags & NSDeviceIndependentModifierFlagsMask); NSUInteger flags = (e.modifierFlags & NSDeviceIndependentModifierFlagsMask);
BOOL isCommand = (flags & NSCommandKeyMask) == NSCommandKeyMask; BOOL isCommand = (flags & NSCommandKeyMask) == NSCommandKeyMask;
BOOL isEnter = (e.keyCode == 0x24); // VK_RETURN BOOL isEnter = (e.keyCode == 0x24); // VK_RETURN
return (isCommand && isEnter); return (isCommand && isEnter);
} }
- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector - (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector
{ {
BOOL retval = NO; BOOL retval = NO;
BOOL isEnter = [[NSApp currentEvent] keyCode] == 76;
if (commandSelector == @selector(insertNewline:) && !isEnter) {
NSText *text = [[textField window] fieldEditor:YES forObject:nil];
NSRange range = [text selectedRange];
NSString *stringBefore = [textField.stringValue substringToIndex:range.location];
NSString *stringAfter = [textField.stringValue substringFromIndex:range.location + range.length];
textField.stringValue = [NSString stringWithFormat:@"%@\n%@", stringBefore, stringAfter];
NSRange r = NSMakeRange(range.location + 1, 0); BOOL isEnter = [[NSApp currentEvent] keyCode] == 76;
[text scrollRangeToVisible:r];
[text setSelectedRange:r];
retval = YES; // causes Apple to NOT fire the default enter action if (commandSelector == @selector(insertNewline:) && !isEnter) {
}
else if (commandSelector == @selector(noop:) && isEnter) { NSText *text = [[textField window] fieldEditor:YES forObject:nil];
retval = YES;
[self sendPost:control]; NSRange range = [text selectedRange];
} NSString *stringBefore = [textField.stringValue substringToIndex:range.location];
NSString *stringAfter = [textField.stringValue substringFromIndex:range.location + range.length];
return retval;
textField.stringValue = [NSString stringWithFormat:@"%@\n%@", stringBefore, stringAfter];
NSRange r = NSMakeRange(range.location + 1, 0);
[text scrollRangeToVisible:r];
[text setSelectedRange:r];
retval = YES; // causes Apple to NOT fire the default enter action
}
else if (commandSelector == @selector(noop:) && isEnter) {
retval = YES;
[self sendPost:control];
}
return retval;
} }
#pragma mark Add images #pragma mark Add images
- (IBAction)addImage:(id)sender - (IBAction)addImage:(id)sender
{ {
NSMenuItem *menuItem = (NSMenuItem *)sender; NSMenuItem *menuItem = (NSMenuItem *)sender;
if (!self.imageFilePath) if (!self.imageFilePath)
{ {
[menuItem setTitle:@"Remove photo"]; [menuItem setTitle:@"Remove photo"];
NSOpenPanel* openDlg = [NSOpenPanel openPanel]; NSOpenPanel* openDlg = [NSOpenPanel openPanel];
[openDlg setPrompt:@"Select"]; [openDlg setPrompt:@"Select"];
[openDlg setDelegate:self]; [openDlg setDelegate:self];
// Enable the selection of files in the dialog. // Enable the selection of files in the dialog.
[openDlg setCanChooseFiles:YES]; [openDlg setCanChooseFiles:YES];
// Enable the selection of directories in the dialog. // Enable the selection of directories in the dialog.
[openDlg setCanChooseDirectories:NO]; [openDlg setCanChooseDirectories:NO];
// Display the dialog. If the OK button was pressed, // Display the dialog. If the OK button was pressed,
// process the files. // process the files.
if ( [openDlg runModalForDirectory:nil file:nil] == NSOKButton ) if ( [openDlg runModalForDirectory:nil file:nil] == NSOKButton )
{ {
// Get an array containing the full filenames of all // Get an array containing the full filenames of all
// files and directories selected. // files and directories selected.
NSArray* files = [openDlg filenames]; NSArray* files = [openDlg filenames];
// Loop through all the files and process them. // Loop through all the files and process them.
for( int i = 0; i < [files count]; i++ ) for( int i = 0; i < [files count]; i++ )
{ {
self.imageFilePath = [files objectAtIndex:i]; self.imageFilePath = [files objectAtIndex:i];
} }
} }
} }
else else
{ {
self.imageFilePath = nil; self.imageFilePath = nil;
[menuItem setTitle:@"Add photo"]; [menuItem setTitle:@"Add photo"];
} }
} }
-(BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename -(BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
{ {
NSString* ext = [filename pathExtension]; NSString* ext = [filename pathExtension];
if ([ext isEqualToString:@""] || [ext isEqualToString:@"/"] || ext == nil || ext == NULL || [ext length] < 1) { if ([ext isEqualToString:@""] || [ext isEqualToString:@"/"] || ext == nil || ext == NULL || [ext length] < 1) {
return YES; return YES;
} }
NSEnumerator* tagEnumerator = [[NSArray arrayWithObjects:@"png", @"jpg", @"gif", @"jpeg", nil] objectEnumerator]; NSEnumerator* tagEnumerator = [[NSArray arrayWithObjects:@"png", @"jpg", @"gif", @"jpeg", nil] objectEnumerator];
NSString* allowedExt; NSString* allowedExt;
while ((allowedExt = [tagEnumerator nextObject])) while ((allowedExt = [tagEnumerator nextObject]))
{ {
if ([ext caseInsensitiveCompare:allowedExt] == NSOrderedSame) if ([ext caseInsensitiveCompare:allowedExt] == NSOrderedSame)
{ {
return YES; return YES;
} }
} }
return NO; return NO;
} }
@end @end

View file

@ -12,10 +12,10 @@
@interface PostModel : NSObject { @interface PostModel : NSObject {
NSString *text; NSString *text;
NSString *inReplyTostatusId; NSString *inReplyTostatusId;
NSString *inReplyToEntity; NSString *inReplyToEntity;
CLLocation *location; CLLocation *location;
NSString *imageFilePath; NSString *imageFilePath;
BOOL isPrivate; BOOL isPrivate;
} }
@property (nonatomic, retain) NSString *text; @property (nonatomic, retain) NSString *text;

View file

@ -17,9 +17,9 @@
{ {
[text release]; [text release];
[inReplyTostatusId release]; [inReplyTostatusId release];
[inReplyToEntity release]; [inReplyToEntity release];
[location release]; [location release];
[imageFilePath release]; [imageFilePath release];
[super dealloc]; [super dealloc];
} }

View file

@ -13,16 +13,16 @@
NSString *title; NSString *title;
NSDate *date; NSDate *date;
NSString *itemDescription; NSString *itemDescription;
NSURL *releaseNotesURL; NSURL *releaseNotesURL;
NSString *DSASignature; NSString *DSASignature;
NSString *minimumSystemVersion; NSString *minimumSystemVersion;
NSURL *fileURL; NSURL *fileURL;
NSString *versionString; NSString *versionString;
NSString *displayVersionString; NSString *displayVersionString;
NSDictionary *propertiesDictionary; NSDictionary *propertiesDictionary;
} }

View file

@ -15,7 +15,7 @@
@interface SUUpdater : NSObject { @interface SUUpdater : NSObject {
NSTimer *checkTimer; NSTimer *checkTimer;
SUUpdateDriver *driver; SUUpdateDriver *driver;
SUHost *host; SUHost *host;
IBOutlet id delegate; IBOutlet id delegate;
} }

View file

@ -16,7 +16,7 @@
@protocol SUVersionComparison @protocol SUVersionComparison
/*! /*!
@method @method
@abstract An abstract method to compare two version strings. @abstract An abstract method to compare two version strings.
@discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent. @discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent.
*/ */

View file

@ -13,9 +13,9 @@
@interface ViewDelegate : NSObject { @interface ViewDelegate : NSObject {
WebView *timelineView; WebView *timelineView;
WebView *mentionsView; WebView *mentionsView;
WebView *conversationView; WebView *conversationView;
WebView *profileView; WebView *profileView;
WebView *oauthView; WebView *oauthView;
} }
@property (nonatomic, assign) WebView *timelineView; @property (nonatomic, assign) WebView *timelineView;

View file

@ -16,15 +16,15 @@
- (void)webView:(WebView *)sender addMessageToConsole:(NSDictionary *)message;{ - (void)webView:(WebView *)sender addMessageToConsole:(NSDictionary *)message;{
if (![message isKindOfClass:[NSDictionary class]]) return; if (![message isKindOfClass:[NSDictionary class]]) return;
NSString *viewName = @"TimelineView"; NSString *viewName = @"TimelineView";
if (sender == mentionsView) viewName = @"MentionsView"; if (sender == mentionsView) viewName = @"MentionsView";
if (sender == conversationView) viewName = @"ConversationView"; if (sender == conversationView) viewName = @"ConversationView";
if (sender == oauthView) viewName = @"OauthView"; if (sender == oauthView) viewName = @"OauthView";
if (sender == profileView) viewName = @"ProfileView"; if (sender == profileView) viewName = @"ProfileView";
NSLog(@"js<%@>: %@:%@: %@", NSLog(@"js<%@>: %@:%@: %@",
viewName, viewName,
[[message objectForKey:@"sourceURL"] lastPathComponent], [[message objectForKey:@"sourceURL"] lastPathComponent],
[message objectForKey:@"lineNumber"], [message objectForKey:@"lineNumber"],
[message objectForKey:@"message"] [message objectForKey:@"message"]
@ -32,103 +32,103 @@
} }
- (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame { - (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame {
NSString *viewName = @"TimelineView"; NSString *viewName = @"TimelineView";
if (sender == mentionsView) viewName = @"MentionsView"; if (sender == mentionsView) viewName = @"MentionsView";
if (sender == conversationView) viewName = @"ConversationView"; if (sender == conversationView) viewName = @"ConversationView";
if (sender == oauthView) viewName = @"OauthView"; if (sender == oauthView) viewName = @"OauthView";
NSLog(@"jsa<%@>: %@", viewName, message); NSLog(@"jsa<%@>: %@", viewName, message);
} }
- (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame { - (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame {
NSInteger result = NSRunCriticalAlertPanel(NSLocalizedString(@"Bungloo", @""), // title NSInteger result = NSRunCriticalAlertPanel(NSLocalizedString(@"Bungloo", @""), // title
message, // message message, // message
NSLocalizedString(@"OK", @""), // default button NSLocalizedString(@"OK", @""), // default button
NSLocalizedString(@"Cancel", @""), // alt button NSLocalizedString(@"Cancel", @""), // alt button
nil); nil);
return NSAlertDefaultReturn == result; return NSAlertDefaultReturn == result;
return NO; return NO;
} }
- (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id <WebPolicyDecisionListener>)listener { - (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id <WebPolicyDecisionListener>)listener {
[listener ignore]; [listener ignore];
[[NSWorkspace sharedWorkspace] openURL:[request URL]]; [[NSWorkspace sharedWorkspace] openURL:[request URL]];
} }
- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame { - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame {
NSFileManager *fileManager = [NSFileManager defaultManager]; NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *pathToJsPlugin = [@"~/Library/Application Support/bungloo/Plugin.js" stringByExpandingTildeInPath]; NSString *pathToJsPlugin = [@"~/Library/Application Support/bungloo/Plugin.js" stringByExpandingTildeInPath];
NSString *pathToCssPlugin = [@"~/Library/Application Support/bungloo/Plugin.css" stringByExpandingTildeInPath]; NSString *pathToCssPlugin = [@"~/Library/Application Support/bungloo/Plugin.css" stringByExpandingTildeInPath];
if([fileManager fileExistsAtPath:pathToCssPlugin])
{
[sender stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"setTimeout(function() { loadCssPlugin('file://localhost%@') }, 1000);", pathToCssPlugin]];
}
if([fileManager fileExistsAtPath:pathToJsPlugin])
{
[sender stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"setTimeout(function() { loadJsPlugin('file://localhost%@') }, 1000);", pathToJsPlugin]];
}
[sender stringByEvaluatingJavaScriptFromString:@"var OS_TYPE = 'mac';"];
if (sender == oauthView) { if([fileManager fileExistsAtPath:pathToCssPlugin])
{
[oauthView stringByEvaluatingJavaScriptFromString:@"function HostAppGo() { start('oauth') }"]; [sender stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"setTimeout(function() { loadCssPlugin('file://localhost%@') }, 1000);", pathToCssPlugin]];
}
} else if(sender == conversationView) { if([fileManager fileExistsAtPath:pathToJsPlugin])
{
[conversationView stringByEvaluatingJavaScriptFromString:@"function HostAppGo() { start('conversation') }"]; [sender stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"setTimeout(function() { loadJsPlugin('file://localhost%@') }, 1000);", pathToJsPlugin]];
}
} else if(sender == profileView) {
[sender stringByEvaluatingJavaScriptFromString:@"var OS_TYPE = 'mac';"];
[profileView stringByEvaluatingJavaScriptFromString:@"function HostAppGo() { start('profile') }"];
if (sender == oauthView) {
} else {
[oauthView stringByEvaluatingJavaScriptFromString:@"function HostAppGo() { start('oauth') }"];
NSString *action = @"timeline";
NSString *delay = @"1"; } else if(sender == conversationView) {
if (sender == mentionsView) { [conversationView stringByEvaluatingJavaScriptFromString:@"function HostAppGo() { start('conversation') }"];
action = @"mentions";
delay = @"1000"; } else if(sender == profileView) {
}
[profileView stringByEvaluatingJavaScriptFromString:@"function HostAppGo() { start('profile') }"];
[sender stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"function HostAppGo() { start('%@') }", action]];
} } else {
NSString *action = @"timeline";
NSString *delay = @"1";
if (sender == mentionsView) {
action = @"mentions";
delay = @"1000";
}
[sender stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"function HostAppGo() { start('%@') }", action]];
}
} }
- (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems
{ {
// FIXME // FIXME
/* /*
NSMutableArray *menuItems = [NSMutableArray arrayWithArray:defaultMenuItems]; NSMutableArray *menuItems = [NSMutableArray arrayWithArray:defaultMenuItems];
for (NSMenuItem*item in defaultMenuItems) { for (NSMenuItem*item in defaultMenuItems) {
if ([[item title] isEqualToString:@"Reload"]) { if ([[item title] isEqualToString:@"Reload"]) {
//[item setAction:@selector(reload:)]; //[item setAction:@selector(reload:)];
//[item setTarget:self]; //[item setTarget:self];
} else { } else {
[menuItems addObject:item]; [menuItems addObject:item];
} }
}*/ }*/
return defaultMenuItems; return defaultMenuItems;
} }
- (void)reload:(id)sender { - (void)reload:(id)sender {
[timelineView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.getNewData();"]; [timelineView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.getNewData();"];
[mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.getNewData();"]; [mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.getNewData();"];
} }
- (NSString *)pluginURL - (NSString *)pluginURL
{ {
NSFileManager *fileManager = [NSFileManager defaultManager]; NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *pathToPlugin = [@"~/Library/Application Support/Bungloo/Plugin.js" stringByExpandingTildeInPath]; NSString *pathToPlugin = [@"~/Library/Application Support/Bungloo/Plugin.js" stringByExpandingTildeInPath];
if([fileManager fileExistsAtPath:pathToPlugin]) if([fileManager fileExistsAtPath:pathToPlugin])
{ {
return [NSString stringWithFormat:@"%@", [NSURL fileURLWithPath:pathToPlugin]]; return [NSString stringWithFormat:@"%@", [NSURL fileURLWithPath:pathToPlugin]];
} }
return nil; return nil;

View file

@ -10,5 +10,5 @@
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
return NSApplicationMain(argc, (const char **) argv); return NSApplicationMain(argc, (const char **) argv);
} }

View file

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/"> <rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel> <channel>
<title>Bungloo's Changelog</title> <title>Bungloo's Changelog</title>
<link>http://jabs.nu/Bungloo/download/Appcast.xml</link> <link>http://jabs.nu/Bungloo/download/Appcast.xml</link>
<description>Most recent changes with links to updates.</description> <description>Most recent changes with links to updates.</description>
<language>en</language> <language>en</language>
<item> <item>
<title>Version 1.0.0</title> <title>Version 1.0.0</title>
<sparkle:minimumSystemVersion>10.5.0</sparkle:minimumSystemVersion> <sparkle:minimumSystemVersion>10.5.0</sparkle:minimumSystemVersion>
<sparkle:releaseNotesLink>http://jabs.nu/bungloo/download/ReleaseNotes.html</sparkle:releaseNotesLink> <sparkle:releaseNotesLink>http://jabs.nu/bungloo/download/ReleaseNotes.html</sparkle:releaseNotesLink>
<pubDate>Mon, 11 Feb 2013 00:29:41 +0100</pubDate> <pubDate>Mon, 11 Feb 2013 00:29:41 +0100</pubDate>
@ -15,6 +15,6 @@
length="1101694" length="1101694"
type="application/octet-stream" type="application/octet-stream"
sparkle:dsaSignature="MCwCFB1JIQINycvbZblob0PHy6Be1nVzAhQ2zkoVqoOjJsDjcnZYjI1qY7oX1Q==" /> sparkle:dsaSignature="MCwCFB1JIQINycvbZblob0PHy6Be1nVzAhQ2zkoVqoOjJsDjcnZYjI1qY7oX1Q==" />
</item> </item>
</channel> </channel>
</rss> </rss>

View file

@ -1,5 +1,4 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" <!DOCTYPE html>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html> <html>
<head> <head>
<title>Tentia Release Notes</title> <title>Tentia Release Notes</title>
@ -8,8 +7,8 @@
h1 { font-size: 1.2em; } h1 { font-size: 1.2em; }
h2 { font-size: 1em; margin-top: 2em; } h2 { font-size: 1em; margin-top: 2em; }
hr { margin: 2em 0; } hr { margin: 2em 0; }
p { margin: 0; padding: 0; } p { margin: 0; padding: 0; }
strong { color: red; } strong { color: red; }
</style> </style>
</head> </head>
<body> <body>
@ -175,7 +174,7 @@
<p>Moved reply icon to left so it is easier to use when the scrollbar is shown</p> <p>Moved reply icon to left so it is easier to use when the scrollbar is shown</p>
<p>Login with the [Login] button now works</p> <p>Login with the [Login] button now works</p>
<p>Fixed automatic updates so it will work next time again.</p> <p>Fixed automatic updates so it will work next time again.</p>
<hr /> <hr />
<h1>Tentia 0.2.0</h2> <h1>Tentia 0.2.0</h2>
@ -192,15 +191,15 @@
<p>Mentions now appear as realnames</p> <p>Mentions now appear as realnames</p>
<hr /> <hr />
<h1>Tentia 0.1.1</h1> <h1>Tentia 0.1.1</h1>
<p>Bugfixes</p> <p>Bugfixes</p>
<p>Changed to send on Cmd+Enter.</p> <p>Changed to send on Cmd+Enter.</p>
<hr /> <hr />
<h1>Tentia 0.1.0</h1> <h1>Tentia 0.1.0</h1>
<p>First attempt to rewrite the old Twitter client Twittia to a new and shiny Tent client Tentia.</p> <p>First attempt to rewrite the old Twitter client Twittia to a new and shiny Tent client Tentia.</p>
</body> </body>
</html> </html>

View file

@ -2,10 +2,10 @@
require 'time' require 'time'
def test var, message def test var, message
unless var unless var
puts message puts message
exit exit
end end
end end
path = File.dirname File.expand_path(__FILE__) path = File.dirname File.expand_path(__FILE__)
@ -28,13 +28,13 @@ end
xml = <<XML xml = <<XML
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/"> <rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel> <channel>
<title>Bungloo's Changelog</title> <title>Bungloo's Changelog</title>
<link>http://jabs.nu/Bungloo/download/Appcast.xml</link> <link>http://jabs.nu/Bungloo/download/Appcast.xml</link>
<description>Most recent changes with links to updates.</description> <description>Most recent changes with links to updates.</description>
<language>en</language> <language>en</language>
<item> <item>
<title>Version #{version}</title> <title>Version #{version}</title>
<sparkle:minimumSystemVersion>10.5.0</sparkle:minimumSystemVersion> <sparkle:minimumSystemVersion>10.5.0</sparkle:minimumSystemVersion>
<sparkle:releaseNotesLink>http://jabs.nu/bungloo/download/ReleaseNotes.html</sparkle:releaseNotesLink> <sparkle:releaseNotesLink>http://jabs.nu/bungloo/download/ReleaseNotes.html</sparkle:releaseNotesLink>
<pubDate>#{Time.now.rfc2822}</pubDate> <pubDate>#{Time.now.rfc2822}</pubDate>
@ -43,8 +43,8 @@ xml = <<XML
length="#{length}" length="#{length}"
type="application/octet-stream" type="application/octet-stream"
sparkle:dsaSignature="#{signature}" /> sparkle:dsaSignature="#{signature}" />
</item> </item>
</channel> </channel>
</rss> </rss>
XML XML

View file

@ -13,6 +13,7 @@ body {
a { a {
text-decoration: none; text-decoration: none;
color: #00317a; color: #00317a;
outline: 0;
} }
ol { ol {
@ -39,7 +40,7 @@ ol li, .error, header.profile {
} }
body > ol > li { body > ol > li {
} }
body > ol > li:first-child { body > ol > li:first-child {
@ -80,6 +81,7 @@ body > ol > li:after, header.profile:after {
header.profile img { header.profile img {
float: left; float: left;
margin: 0 10px 10px 0; margin: 0 10px 10px 0;
max-height: 100px;
max-width: 100px; max-width: 100px;
border-radius: 10px; border-radius: 10px;
} }
@ -282,7 +284,7 @@ li.mentioned {
.reposted_by li:hover { .reposted_by li:hover {
background: black; background: black;
} }
.reposted_by li a { .reposted_by li a {
color: white; color: white;

View file

@ -47,7 +47,7 @@ function(HostApp, Core, Paths, URI) {
var dom_element = _this.getStatusDOMElement(status); var dom_element = _this.getStatusDOMElement(status);
if (node) { if (node) {
node.parentNode.insertBefore(dom_element, node); node.parentNode.insertBefore(dom_element, node);
} else { } else {
@ -115,7 +115,7 @@ function(HostApp, Core, Paths, URI) {
var _this = this; var _this = this;
var callback = function(resp) { var callback = function(resp) {
var statuses = JSON.parse(resp.responseText); var statuses = JSON.parse(resp.responseText);
for (var i = 0; i < statuses.length; i++) { for (var i = 0; i < statuses.length; i++) {

View file

@ -33,13 +33,13 @@ function(HostApp, Timeline, URI, Paths) {
for (var i = 0; i < statuses.length; i++) { for (var i = 0; i < statuses.length; i++) {
var status = statuses[i]; var status = statuses[i];
var name; var name;
var profile = this.cache.profiles.getItem(status.entity); var profile = this.cache.profiles.getItem(status.entity);
if(profile) { if(profile) {
name = profile["https://tent.io/types/info/basic/v0.1.0"].name; name = profile["https://tent.io/types/info/basic/v0.1.0"].name;
} }
HostApp.notificateUserAboutMention(status.content.text, name || status.entity, status.id, status.entity); HostApp.notificateUserAboutMention(status.content.text, name || status.entity, status.id, status.entity);
}; };
} }
@ -52,7 +52,7 @@ function(HostApp, Timeline, URI, Paths) {
add_to_search = add_to_search || {}; add_to_search = add_to_search || {};
if (!add_to_search["mentioned_entity"]) { if (!add_to_search["mentioned_entity"]) {
add_to_search["mentioned_entity"] = HostApp.stringForKey("entity"); add_to_search["mentioned_entity"] = HostApp.stringForKey("entity");
} }
Timeline.prototype.getNewData.call(this, add_to_search); Timeline.prototype.getNewData.call(this, add_to_search);

View file

@ -92,7 +92,7 @@ function(HostApp, Paths, Hmac) {
// mac_key // mac_key
// mac_algorithm // mac_algorithm
this.register_data = register_data; this.register_data = register_data;
// Needed for later App Registration Modification // Needed for later App Registration Modification
HostApp.setStringForKey(register_data["mac_key"], "app_mac_key"); HostApp.setStringForKey(register_data["mac_key"], "app_mac_key");
HostApp.setStringForKey(register_data["mac_key_id"], "app_mac_key_id"); HostApp.setStringForKey(register_data["mac_key_id"], "app_mac_key_id");
@ -130,9 +130,9 @@ function(HostApp, Paths, Hmac) {
}; };
var auth_header = Hmac.makeAuthHeader( var auth_header = Hmac.makeAuthHeader(
url, url,
http_method, http_method,
HostApp.stringForKey("app_mac_key"), HostApp.stringForKey("app_mac_key"),
HostApp.stringForKey("app_mac_key_id") HostApp.stringForKey("app_mac_key_id")
); );
@ -147,13 +147,13 @@ function(HostApp, Paths, Hmac) {
Oauth.prototype.requestAccessTokenTicketFinished = function(responseBody) { Oauth.prototype.requestAccessTokenTicketFinished = function(responseBody) {
var access = JSON.parse(responseBody); var access = JSON.parse(responseBody);
HostApp.setStringForKey(access["access_token"], "user_access_token"); HostApp.setStringForKey(access["access_token"], "user_access_token");
HostApp.setSecret(access["mac_key"]); HostApp.setSecret(access["mac_key"]);
HostApp.setStringForKey(access["mac_algorithm"], "user_mac_algorithm"); HostApp.setStringForKey(access["mac_algorithm"], "user_mac_algorithm");
HostApp.setStringForKey(access["token_type"], "user_token_type"); HostApp.setStringForKey(access["token_type"], "user_token_type");
HostApp.loggedIn(); HostApp.loggedIn();
} }
@ -162,9 +162,9 @@ function(HostApp, Paths, Hmac) {
var url = Paths.mkApiRootPath("/apps/" + HostApp.stringForKey("app_id")); var url = Paths.mkApiRootPath("/apps/" + HostApp.stringForKey("app_id"));
var http_method = "DELETE"; var http_method = "DELETE";
var auth_header = Hmac.makeAuthHeader( var auth_header = Hmac.makeAuthHeader(
url, url,
http_method, http_method,
HostApp.stringForKey("app_mac_key"), HostApp.stringForKey("app_mac_key"),
HostApp.stringForKey("app_mac_key_id") HostApp.stringForKey("app_mac_key_id")
); );
@ -178,10 +178,10 @@ function(HostApp, Paths, Hmac) {
HostApp.setStringForKey(null, "user_mac_algorithm"); HostApp.setStringForKey(null, "user_mac_algorithm");
HostApp.setStringForKey(null, "user_token_type"); HostApp.setStringForKey(null, "user_token_type");
HostApp.setStringForKey(null, "api_root"); HostApp.setStringForKey(null, "api_root");
HostApp.setStringForKey(null, "entity"); HostApp.setStringForKey(null, "entity");
}, null, auth_header); }, null, auth_header);
} }
return Oauth; return Oauth;

View file

@ -253,7 +253,7 @@ function(HostApp, Core, Paths, URI) {
this.populate(this.profile_template.location, basic.location); this.populate(this.profile_template.location, basic.location);
this.populate(this.profile_template.gender, basic.gender); this.populate(this.profile_template.gender, basic.gender);
this.populate(this.profile_template.bio, basic.bio); this.populate(this.profile_template.bio, basic.bio);
if(basic.website_url) { if(basic.website_url) {
var url = basic.website_url; var url = basic.website_url;
@ -405,7 +405,7 @@ function(HostApp, Core, Paths, URI) {
var _this = this; var _this = this;
if (this.following_id) { if (this.following_id) {
this.setFollowingButton(false); this.setFollowingButton(false);
var url = Paths.mkApiRootPath("/followings/") + this.following_id; var url = Paths.mkApiRootPath("/followings/") + this.following_id;
Paths.getURL(url, "DELETE", function(resp) { Paths.getURL(url, "DELETE", function(resp) {
@ -566,7 +566,7 @@ function(HostApp, Core, Paths, URI) {
}, null, false); // do not send auth-headers }, null, false); // do not send auth-headers
} }
}); });
} }
return li; return li;

View file

@ -146,7 +146,7 @@ function(Core, Paths, HostApp, URI) {
if (!callback) { if (!callback) {
callback = function(data) { _this.getNewData(); } callback = function(data) { _this.getNewData(); }
} }
Core.prototype.repost.call(this, id, entity, callback); Core.prototype.repost.call(this, id, entity, callback);
} }
Timeline.prototype.logout = function() { Timeline.prototype.logout = function() {

View file

@ -56,7 +56,7 @@ function(URI, CacheStorage, require) {
Cache.prototype.stopGettingFollowings = function() { Cache.prototype.stopGettingFollowings = function() {
clearTimeout(this.intervall); clearTimeout(this.intervall);
} }
return Cache; return Cache;
}); });

View file

@ -17,9 +17,9 @@ function() {
CacheStorage.prototype.getItem = function(key) { CacheStorage.prototype.getItem = function(key) {
var item = null; var item = null;
try { // If localStorage doesn't work then just leave it empty try { // If localStorage doesn't work then just leave it empty
item = JSON.parse(localStorage.getItem(this.mkPath(key))); item = JSON.parse(localStorage.getItem(this.mkPath(key)));
} catch(e) {} } catch(e) {}
return item; return item;
@ -35,7 +35,7 @@ function() {
var length_path = this.mkInternalPath("_length"); var length_path = this.mkInternalPath("_length");
var length = parseInt(localStorage.getItem(length_path), 10) + 1; var length = parseInt(localStorage.getItem(length_path), 10) + 1;
localStorage.setItem(length_path, length); localStorage.setItem(length_path, length);
} }
} catch(e) {} } catch(e) {}
} }
@ -49,7 +49,7 @@ function() {
var length_path = this.mkInternalPath("_length"); var length_path = this.mkInternalPath("_length");
var length = parseInt(localStorage.getItem(length_path), 10) - 1; var length = parseInt(localStorage.getItem(length_path), 10) - 1;
localStorage.setItem(length_path, length); localStorage.setItem(length_path, length);
} }
} catch(e) {} } catch(e) {}
}; };
@ -62,7 +62,7 @@ function() {
} }
} }
localStorage.setItem(this.mkInternalPath("_length"), 0); localStorage.setItem(this.mkInternalPath("_length"), 0);
} catch(e) {} } catch(e) {}
} }

View file

@ -18,20 +18,20 @@ function(jQuery, Paths, URI, HostApp, Cache) {
if(this.template == "undefined") { if(this.template == "undefined") {
return jQuery.extend(true, {}, this.template); return jQuery.extend(true, {}, this.template);
} }
var a = document.createElement("a"); var a = document.createElement("a");
var item = document.createElement("li"); var item = document.createElement("li");
var aside = document.createElement("aside"); var aside = document.createElement("aside");
item.appendChild(aside); item.appendChild(aside);
var reply_to = a.cloneNode(); var reply_to = a.cloneNode();
reply_to.className = "reply_to" reply_to.className = "reply_to"
reply_to.innerText = " "; reply_to.innerText = " ";
reply_to.href = "#"; reply_to.href = "#";
aside.appendChild(reply_to); aside.appendChild(reply_to);
var repost = a.cloneNode(); var repost = a.cloneNode();
repost.className = "repost"; repost.className = "repost";
repost.innerText = " "; repost.innerText = " ";
@ -43,29 +43,29 @@ function(jQuery, Paths, URI, HostApp, Cache) {
remove.innerText = " "; remove.innerText = " ";
remove.href = "#"; remove.href = "#";
aside.appendChild(remove); aside.appendChild(remove);
var image = document.createElement("img"); var image = document.createElement("img");
image.className = "image"; image.className = "image";
image.src = "img/default-avatar.png"; image.src = "img/default-avatar.png";
image.onmousedown = function(e) { e.preventDefault(); }; image.onmousedown = function(e) { e.preventDefault(); };
item.appendChild(image); item.appendChild(image);
var image_username = a.cloneNode(); var image_username = a.cloneNode();
image.appendChild(image_username); image.appendChild(image_username);
var data = document.createElement("div"); var data = document.createElement("div");
data.className = "data"; data.className = "data";
item.appendChild(data); item.appendChild(data);
var head = document.createElement("h1"); var head = document.createElement("h1");
data.appendChild(head); data.appendChild(head);
var username = a.cloneNode(); var username = a.cloneNode();
head.appendChild(username); head.appendChild(username);
var space = document.createTextNode(" "); var space = document.createTextNode(" ");
head.appendChild(space); head.appendChild(space);
var geo = document.createElement("a"); var geo = document.createElement("a");
geo.style.display = "none"; geo.style.display = "none";
head.appendChild(geo); head.appendChild(geo);
@ -80,7 +80,7 @@ function(jQuery, Paths, URI, HostApp, Cache) {
head.appendChild(is_private); head.appendChild(is_private);
head.appendChild(space.cloneNode()); head.appendChild(space.cloneNode());
var pin = document.createElement("img"); var pin = document.createElement("img");
pin.src = "img/pin.png"; pin.src = "img/pin.png";
pin.alt = "Map link"; pin.alt = "Map link";
@ -102,29 +102,29 @@ function(jQuery, Paths, URI, HostApp, Cache) {
head.appendChild(reposted_by) head.appendChild(reposted_by)
var message = document.createElement("p"); var message = document.createElement("p");
message.className = "message"; message.className = "message";
data.appendChild(message); data.appendChild(message);
var images = document.createElement("p") var images = document.createElement("p")
images.className = "images"; images.className = "images";
data.appendChild(images); data.appendChild(images);
var date = message.cloneNode(); var date = message.cloneNode();
date.className = "date"; date.className = "date";
data.appendChild(date); data.appendChild(date);
var ago = a.cloneNode(); var ago = a.cloneNode();
date.appendChild(ago); date.appendChild(ago);
var from = document.createTextNode(" from "); var from = document.createTextNode(" from ");
date.appendChild(from) date.appendChild(from)
var source = document.createElement("a"); var source = document.createElement("a");
source.className = "source"; source.className = "source";
date.appendChild(source) date.appendChild(source)
this.template = { this.template = {
item: item, item: item,
reply_to: reply_to, reply_to: reply_to,
@ -238,15 +238,15 @@ function(jQuery, Paths, URI, HostApp, Cache) {
}, null, false); // do not send auth-headers }, null, false); // do not send auth-headers
} }
}); });
} }
if (status && status.permissions && !status.permissions.public) { if (status && status.permissions && !status.permissions.public) {
template.is_private.style.display = ''; template.is_private.style.display = '';
} }
var text = ""; var text = "";
if (status.type == "https://tent.io/types/post/photo/v0.1.0") { if (status.type == "https://tent.io/types/post/photo/v0.1.0") {
text = status.content.caption; text = status.content.caption;
} else { } else {
@ -271,7 +271,7 @@ function(jQuery, Paths, URI, HostApp, Cache) {
for (var i = 0; i < status.attachments.length; i++) { for (var i = 0; i < status.attachments.length; i++) {
// closure needed for the callback // closure needed for the callback
(function() { (function() {
var attachment = status.attachments[i]; var attachment = status.attachments[i];
var img = new Image(); var img = new Image();
@ -317,7 +317,7 @@ function(jQuery, Paths, URI, HostApp, Cache) {
HostApp.showConversation(status.id, status.entity); HostApp.showConversation(status.id, status.entity);
return false; return false;
} }
// {"type":"Point","coordinates":[57.10803113,12.25854746]} // {"type":"Point","coordinates":[57.10803113,12.25854746]}
if (status.content && status.content.location && (typeof status.content.location.type == "undefined" || status.content.location.type == "Point")) { if (status.content && status.content.location && (typeof status.content.location.type == "undefined" || status.content.location.type == "Point")) {
var href = "http://www.openstreetmap.org/?mlat=" + status.content.location.coordinates[0] + "&mlon=" + status.content.location.coordinates[1] + "&zoom=12" var href = "http://www.openstreetmap.org/?mlat=" + status.content.location.coordinates[0] + "&mlon=" + status.content.location.coordinates[1] + "&zoom=12"
@ -328,7 +328,7 @@ function(jQuery, Paths, URI, HostApp, Cache) {
if (typeof status.__repost != "undefined") { if (typeof status.__repost != "undefined") {
template.source.href = status.__repost.app.url; template.source.href = status.__repost.app.url;
template.source.innerHTML = status.__repost.app.name; template.source.innerHTML = status.__repost.app.name;
template.source.title = status.__repost.app.url; template.source.title = status.__repost.app.url;
} else { } else {
template.source.href = status.app.url; template.source.href = status.app.url;
template.source.innerHTML = status.app.name; template.source.innerHTML = status.app.name;
@ -372,7 +372,7 @@ function(jQuery, Paths, URI, HostApp, Cache) {
} }
var reposted_count = $(post).find(".reposted_by ul li").length + 1; var reposted_count = $(post).find(".reposted_by ul li").length + 1;
var people_person = reposted_count == 1 ? "person" : "people"; var people_person = reposted_count == 1 ? "person" : "people";
$(post).find(".reposted_by span").html("by " + reposted_count + " " + people_person); $(post).find(".reposted_by span").html("by " + reposted_count + " " + people_person);
@ -381,12 +381,12 @@ function(jQuery, Paths, URI, HostApp, Cache) {
var li = $("<li/>"); var li = $("<li/>");
li.attr("id", "post-" + repost.id) li.attr("id", "post-" + repost.id)
var a = $("<a/>"); var a = $("<a/>");
a.attr("href", repost.entity); a.attr("href", repost.entity);
a.attr("title", repost.entity); a.attr("title", repost.entity);
a.html(repost.entity); a.html(repost.entity);
li.append(a); li.append(a);
$(post).find(".reposted_by ul").append(li); $(post).find(".reposted_by ul").append(li);
a.click(function(e) { a.click(function(e) {
@ -600,10 +600,10 @@ function(jQuery, Paths, URI, HostApp, Cache) {
Core.prototype.logout = function() { Core.prototype.logout = function() {
this.body.innerHTML = ""; this.body.innerHTML = "";
} }
// Helper functions // Helper functions
@ -613,9 +613,9 @@ function(jQuery, Paths, URI, HostApp, Cache) {
if(url.startsWith("http://j.mp/")) { if(url.startsWith("http://j.mp/")) {
api = "http://api.j.mp"; api = "http://api.j.mp";
} }
var api_url = api + "/v3/expand?format=json&apiKey=R_4fc2a1aa461d076556016390fa6400f6&login=twittia&shortUrl=" + url; // FIXME: new api key var api_url = api + "/v3/expand?format=json&apiKey=R_4fc2a1aa461d076556016390fa6400f6&login=twittia&shortUrl=" + url; // FIXME: new api key
jQuery.ajax({ jQuery.ajax({
url: api_url, url: api_url,
success: function(data) { success: function(data) {
@ -636,7 +636,7 @@ function(jQuery, Paths, URI, HostApp, Cache) {
var text = node.innerHTML; var text = node.innerHTML;
var mentions_in_text = []; var mentions_in_text = [];
var res = text.match(/(\^[\w:/.]+(?:[\w]))/ig); var res = text.match(/(\^[\w:/.]+(?:[\w]))/ig);
if (res) { if (res) {
@ -665,7 +665,7 @@ function(jQuery, Paths, URI, HostApp, Cache) {
(function(mention) { // need this closure (function(mention) { // need this closure
var profile = function(profile) { var profile = function(profile) {
var basic = profile["https://tent.io/types/info/basic/v0.1.0"]; var basic = profile["https://tent.io/types/info/basic/v0.1.0"];
if (profile) { if (profile) {
@ -675,7 +675,7 @@ function(jQuery, Paths, URI, HostApp, Cache) {
} }
var new_text = node.innerHTML.replace( var new_text = node.innerHTML.replace(
mention.text, mention.text,
"<a href='" + mention.entity + "' class='name' title='" + mention.entity + "'>" "<a href='" + mention.entity + "' class='name' title='" + mention.entity + "'>"
+ name + name
+ "</a>" + "</a>"
@ -712,7 +712,7 @@ function(jQuery, Paths, URI, HostApp, Cache) {
if (resp.status >= 200 && resp.status < 400) { if (resp.status >= 200 && resp.status < 400) {
var p = JSON.parse(resp.responseText); var p = JSON.parse(resp.responseText);
_this.cache.profiles.setItem(mention.entity, p); _this.cache.profiles.setItem(mention.entity, p);
profile(p) profile(p)
} }
}, null, false); // do not send auth-headers }, null, false); // do not send auth-headers
} }
@ -726,16 +726,16 @@ function(jQuery, Paths, URI, HostApp, Cache) {
Core.prototype.parseMentions = function(text, post_id, entity) { Core.prototype.parseMentions = function(text, post_id, entity) {
var mentions = []; var mentions = [];
if (post_id && entity && post_id != "(null)" && entity != "(null)") { if (post_id && entity && post_id != "(null)" && entity != "(null)") {
mentions.push({ mentions.push({
post: post_id, post: post_id,
entity: entity entity: entity
}) })
} }
var res = text.match(/(\^[\w:/]+\.[\w:/.]+(?:[\w]))/ig); var res = text.match(/(\^[\w:/]+\.[\w:/.]+(?:[\w]))/ig);
if (res) { if (res) {
for (var i = 0; i < res.length; i++) { for (var i = 0; i < res.length; i++) {
var e = res[i].substring(1); var e = res[i].substring(1);
@ -791,7 +791,7 @@ function(jQuery, Paths, URI, HostApp, Cache) {
return text.replace(hash, "$1$2<a href='https://skate.io/search?q=%23$3'>$3</a>"); return text.replace(hash, "$1$2<a href='https://skate.io/search?q=%23$3'>$3</a>");
} }
Core.prototype.replyTo = function(entity, status_id, mentions, is_private) { Core.prototype.replyTo = function(entity, status_id, mentions, is_private) {
var string = "^" + entity.replace("https://", "") + " "; var string = "^" + entity.replace("https://", "") + " ";
for (var i = 0; i < mentions.length; i++) { for (var i = 0; i < mentions.length; i++) {
@ -815,7 +815,7 @@ function(jQuery, Paths, URI, HostApp, Cache) {
} else { } else {
var reposted_by = ul.parent(".reposted_by"); var reposted_by = ul.parent(".reposted_by");
var reposted_count = reposted_by.find("ul li").length; var reposted_count = reposted_by.find("ul li").length;
var people_person = reposted_count == 1 ? "person" : "people"; var people_person = reposted_count == 1 ? "person" : "people";
reposted_by.find("span").html("by " + reposted_count + " " + people_person); reposted_by.find("span").html("by " + reposted_count + " " + people_person);

View file

@ -18,7 +18,7 @@ function(URI, CryptoJS) {
port = url.protocol() == "https" ? "443" : "80"; port = url.protocol() == "https" ? "443" : "80";
} }
var normalizedRequestString = "" var normalizedRequestString = ""
+ time_stamp + '\n' + time_stamp + '\n'
+ nonce + '\n' + nonce + '\n'
+ http_method + '\n' + http_method + '\n'

View file

@ -1,5 +1,5 @@
define(function() { define(function() {
var HostApp = {}; var HostApp = {};
HostApp.setStringForKey = function(string, key) { HostApp.setStringForKey = function(string, key) {
@ -10,16 +10,16 @@ define(function() {
controller.setStringForKey(string, key); controller.setStringForKey(string, key);
} }
} }
HostApp.setSecret = function(string) { HostApp.setSecret = function(string) {
if (OS_TYPE == "mac") { if (OS_TYPE == "mac") {
controller.setSecret_(string); controller.setSecret_(string);
} else { } else {
controller.setStringForKey(string, "user_mac_key"); controller.setStringForKey(string, "user_mac_key");
} }
} }
HostApp.secret = function() { HostApp.secret = function() {
if (OS_TYPE == "mac") { if (OS_TYPE == "mac") {
return controller.secret(); return controller.secret();
@ -140,6 +140,6 @@ define(function() {
} }
} }
return HostApp; return HostApp;
}); });

View file

@ -46,13 +46,13 @@ function(jQuery, HostApp, Hmac, Cache) {
if (auth_header !== false && typeof user_access_token != "undefined") { if (auth_header !== false && typeof user_access_token != "undefined") {
auth_header = Hmac.makeAuthHeader( auth_header = Hmac.makeAuthHeader(
url, url,
http_method, http_method,
HostApp.secret(), HostApp.secret(),
user_access_token user_access_token
); );
xhr.setRequestHeader("Authorization", auth_header); xhr.setRequestHeader("Authorization", auth_header);
} }
} }
}, },
url: url, url: url,
@ -85,14 +85,14 @@ function(jQuery, HostApp, Hmac, Cache) {
if (user_access_token) { if (user_access_token) {
auth_header = Hmac.makeAuthHeader( auth_header = Hmac.makeAuthHeader(
url, url,
"POST", "POST",
HostApp.secret(), HostApp.secret(),
user_access_token user_access_token
); );
xhr.setRequestHeader("Authorization", auth_header); xhr.setRequestHeader("Authorization", auth_header);
} }
}, },
url: url, url: url,
contentType: "multipart/form-data;boundary=" + boundary, contentType: "multipart/form-data;boundary=" + boundary,

View file

@ -9,7 +9,7 @@ function start(view) {
if (view == "oauth") { if (view == "oauth") {
require(["controller/Oauth"], function(Oauth) { require(["controller/Oauth"], function(Oauth) {
bungloo_instance = new Oauth(); bungloo_instance = new Oauth();
}); });
@ -17,9 +17,9 @@ function start(view) {
} else if (view == "timeline") { } else if (view == "timeline") {
require(["controller/Timeline"], function(Timeline) { require(["controller/Timeline"], function(Timeline) {
bungloo_instance = new Timeline(); bungloo_instance = new Timeline();
}); });
} else if (view == "mentions") { } else if (view == "mentions") {
@ -131,7 +131,7 @@ function loadCssPlugin(css_url) {
} }
function debug(string) { function debug(string) {
if (typeof string != "string") { if (typeof string != "string") {
string = JSON.stringify(string); string = JSON.stringify(string);
} }
@ -141,18 +141,18 @@ function debug(string) {
function go() { // wait untill everything is loaded function go() { // wait untill everything is loaded
setTimeout(function() { setTimeout(function() {
if (typeof HostAppGo != typeof __not_defined__) { if (typeof HostAppGo != typeof __not_defined__) {
HostAppGo(); HostAppGo();
} else { } else {
go(); go();
} }
}, 500); }, 500);
} }
go(); go();