aboutsummaryrefslogtreecommitdiff
path: root/VKPC/Global.m
diff options
context:
space:
mode:
Diffstat (limited to 'VKPC/Global.m')
-rw-r--r--VKPC/Global.m234
1 files changed, 234 insertions, 0 deletions
diff --git a/VKPC/Global.m b/VKPC/Global.m
new file mode 100644
index 0000000..4f5f145
--- /dev/null
+++ b/VKPC/Global.m
@@ -0,0 +1,234 @@
+//
+// global.m
+// VKPC
+//
+// Created by Eugene on 11/28/13.
+// Copyright (c) 2013-2014 Eugene Z. All rights reserved.
+//
+
+#import "Global.h"
+#import <CoreServices/CoreServices.h>
+#import "NSTimer+Blocks.h"
+#import "NSUserNotificationCenter+Private.h"
+
+#include <stdlib.h>
+#include <math.h>
+
+int const VKPCWSServerPort = 56130;
+char * const VKPCWSServerHost = "127.0.0.1";
+char * const VKPCWSClientHost = "vkpc-local.ch1p.com";
+//char * const VKPCHostsFile = "/private/etc/hosts";
+
+NSString * const VKPCAppHomeURL = @"https://ch1p.com/vkpc/?v={version}";
+NSString * const CH1PEmail = @"ch1p@ch1p.com";
+
+#ifdef DEBUG
+BOOL const VKPCIsDebug = YES;
+#else
+BOOL const VKPCIsDebug = NO;
+#endif
+
+BOOL const VKPCIsServerLogsEnabled = NO;
+BOOL VKPCIsYosemite = NO;
+
+NSString * const VKPCEZCopyright = @"Eugene Z";
+NSString * const VKPCEZCopyrightYears = @" © 2013-2015";
+NSString * const VKPCEZURL = @"https://vk.com/ez";
+
+NSString * const VKPCPreferencesShowNotifications = @"VKPCShowNotifications";
+NSString * const VKPCPreferencesInvertPlaylistIcons = @"VKPCInvertPlaylistIcons";
+NSString * const VKPCPreferencesCatchMediaButtons = @"VKPCCatchMediaButtons";
+NSString * const VKPCPreferencesBrowser = @"VKPCBrowser";
+NSString * const VKPCPreferencesStatisticReportedTimestamp = @"VKPCStatisticReportedTimestamp";
+NSString * const VKPCPreferencesUUID = @"VKPCUUID";
+NSString * const VKPCPreferencesUseExtensionMode = @"VKPCUseExtensionMode";
+
+NSString * const kAppleInterfaceStyle = @"AppleInterfaceStyle";
+NSString * const kAppleInterfaceThemeChangedNotification = @"AppleInterfaceThemeChangedNotification";
+NSString * const kAppleInterfaceStyleDark = @"Dark";
+NSString * const kCFBundleDisplayName = @"CFBundleDisplayName";
+NSString * const kCFBundleShortVersionString = @"CFBundleShortVersionString";
+NSString * const kCFBundleVersion = @"CFBundleVersion";
+
+int VKPCSessionID;
+pid_t VKPCPID;
+
+void VKPCInitGlobals() {
+ SInt32 major, minor;
+ Gestalt(gestaltSystemVersionMajor, &major);
+ Gestalt(gestaltSystemVersionMinor, &minor);
+
+ VKPCIsYosemite = major >= 10 && minor >= 10;
+ VKPCSessionID = arc4random() % 65536;
+ VKPCPID = [[NSProcessInfo processInfo] processIdentifier];
+}
+
+void VKPCInitUUID() {
+ NSString *currentUUID = [[NSUserDefaults standardUserDefaults] stringForKey:VKPCPreferencesUUID];
+ if ([currentUUID isEqualToString:@""]) {
+ CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
+ NSString *uuidString = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);
+ CFRelease(uuid);
+
+ [[NSUserDefaults standardUserDefaults] setObject:uuidString forKey:VKPCPreferencesUUID];
+ }
+}
+
+static NSUserNotification *lastNotification;
+static BOOL isLowerThan10_9() {
+ SInt32 major, minor;
+ Gestalt(gestaltSystemVersionMajor, &major);
+ Gestalt(gestaltSystemVersionMinor, &minor);
+
+ return major == 10 && minor < 9;
+}
+static void removeNotification(NSUserNotification *notification) {
+// if (isLowerThan10_9()) {
+ [[NSUserNotificationCenter defaultUserNotificationCenter] _removeDisplayedNotification:notification];
+// } else {
+// [[NSUserNotificationCenter defaultUserNotificationCenter] removeDeliveredNotification:notification];
+// }
+}
+void ShowNotification(NSString *title, NSString *text) {
+ NSUserNotification *notification = [[NSUserNotification alloc] init];
+ [notification setTitle:title];
+ [notification setInformativeText:text];
+ [notification setHasActionButton:NO];
+
+ if (lastNotification != nil) {
+ removeNotification(lastNotification);
+ }
+
+ [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification];
+ [NSTimer scheduledTimerWithTimeInterval:4.0 block:^{
+ removeNotification(notification);
+ } repeats:NO];
+
+ lastNotification = notification;
+}
+
+NSString * GetFileFromResourceAsString(NSString *fileName, NSError * __autoreleasing * error) {
+ NSString *path = [[fileName lastPathComponent] stringByDeletingPathExtension];
+ NSString *type = [fileName pathExtension];
+ NSError *localError = nil;
+
+ NSString *resPath = [[NSBundle mainBundle] pathForResource:path ofType:type];
+ NSURL *url = [NSURL fileURLWithPath:resPath];
+ NSString *content = nil;
+ content = [[NSString alloc]
+ initWithContentsOfURL:url
+ encoding:NSUTF8StringEncoding
+ error:&localError];
+
+ if (localError || content == nil) {
+ *error = localError;
+ NSLog(@"Error reading file %@\n%@", url, [localError localizedFailureReason]);
+ }
+
+ return content;
+}
+
+NSString * GetSystemFontName() {
+ return VKPCIsYosemite ? @"Helvetica Neue" : @"Lucida Grande";
+}
+
+InterfaceStyle GetInterfaceStyle() {
+ if (VKPCIsYosemite) {
+ NSString *theme = [[NSUserDefaults standardUserDefaults] stringForKey:kAppleInterfaceStyle];
+ if (theme != nil && [theme isKindOfClass:[NSString class]] && [theme isEqualToString:kAppleInterfaceStyleDark]) {
+ return InterfaceStyleYosemiteDark;
+ }
+ return InterfaceStyleYosemite;
+ }
+ return InterfaceStyleLegacy;
+}
+
+long GetTimestamp() {
+ return (long)floor([[NSDate date] timeIntervalSince1970]);
+}
+
+BOOL IsAnotherProcessRunning() {
+ NSArray *list = [[NSWorkspace sharedWorkspace] runningApplications];
+ for (int i = 0; i < list.count; i++) {
+ NSRunningApplication *app = list[i];
+ if ([[app bundleIdentifier] isEqualToString:[[NSBundle mainBundle] bundleIdentifier]]
+ && [app processIdentifier] != VKPCPID) {
+ return YES;
+ }
+ }
+ return NO;
+}
+
+void DebugLog(const char *str) {
+// printf("><> %s\n", str);
+}
+
+//////////////////////////////////// Images ////////////////////////////////////
+
+NSString * const VKPCImageEmpty = @"empty";
+NSString * const VKPCImageCellBg = @"pl_cell_bg";
+NSString * const VKPCImageCellPressedBg = @"pl_cell_pressed_bg";
+NSString * const VKPCImagePause = @"pl_pause";
+NSString * const VKPCImagePlay = @"pl_play";
+NSString * const VKPCImageTitleSeparator = @"pl_title_separator";
+NSString * const VKPCImageSettings = @"settings";
+NSString * const VKPCImageSettingsPressed = @"settings_pressed";
+NSString * const VKPCImageStatus = @"status";
+NSString * const VKPCImageStatusPressed = @"status_pressed";
+
+static NSString * const kImagesBundleLegacy = @"ImagesLegacy";
+static NSString * const kImagesBundleYosemite = @"ImagesYosemite";
+static NSString * const kImagesBundleYosemiteDark = @"ImagesYosemiteDark";
+
+static BOOL imagesInited = NO;
+static NSArray *imageNames;
+static NSMutableDictionary *imageBundles; // @{<bundleName>: NSBundle}
+static NSMutableDictionary *allImages; // @{<bundleName>: @{<imageName>: NSImage, ...}}
+
+NSDictionary * VKPCGetImagesDictionary() {
+ if (!imagesInited) {
+ allImages = [[NSMutableDictionary alloc] init];
+ imageBundles = [[NSMutableDictionary alloc] init];
+
+ imageNames = @[VKPCImageEmpty, VKPCImageCellBg, VKPCImageCellPressedBg,
+ VKPCImagePause, VKPCImagePlay, VKPCImageTitleSeparator, VKPCImageSettings,
+ VKPCImageSettingsPressed, VKPCImageStatus, VKPCImageStatusPressed];
+
+ // Loading bundles
+ NSArray *bundlePaths = [[NSBundle mainBundle] pathsForResourcesOfType:@"bundle" inDirectory:@""];
+ for (NSString *bundlePath in bundlePaths) {
+ NSString *bundleKey = [[bundlePath lastPathComponent] stringByDeletingPathExtension];
+ if ([bundleKey hasPrefix:@"Images"]) {
+ imageBundles[bundleKey] = [NSBundle bundleWithPath:bundlePath];
+ }
+ }
+
+ imagesInited = YES;
+ }
+
+ NSString *bundleKey;
+ switch (GetInterfaceStyle()) {
+ case InterfaceStyleYosemite:
+ bundleKey = kImagesBundleYosemite;
+ break;
+ case InterfaceStyleLegacy:
+ bundleKey = kImagesBundleLegacy;
+ break;
+ case InterfaceStyleYosemiteDark:
+ bundleKey = kImagesBundleYosemiteDark;
+ break;
+ }
+
+ if (allImages[bundleKey] != nil) {
+// NSLog(@"[VKPCGetImagesDictionary] returning from cache, bundleKey = %@", bundleKey);
+ return (NSDictionary *)allImages[bundleKey];
+ }
+
+ allImages[bundleKey] = [[NSMutableDictionary alloc] init];
+ for (NSString *named in imageNames) {
+ NSImage *img = [(NSBundle *)imageBundles[bundleKey] imageForResource:named];
+ allImages[bundleKey][named] = img;
+ }
+
+ return (NSDictionary *)allImages[bundleKey];
+} \ No newline at end of file