connectionchecker / AppController.m

/* -*- Mode: Objective-C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-  */
    Copyright 2008-2009 Håkan Waara (
    This file is part of ConnectionChecker.

    ConnectionChecker is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    ConnectionChecker is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with ConnectionChecker.  If not, see <>.

#import "AppController.h"
#import "ConnectionView.h"

@interface AppController(Private)
- (void)check:(NSTimer *)timer;
- (void)setupTimerAndHost;

@implementation AppController

- (void)awakeFromNib
  if ([[NSScreen screens] count]) { 
    // figure out an area covering all screens
    NSRect allScreensFrame;
    NSScreen *screen;
    NSEnumerator *screenEnumerator = [[NSScreen screens] objectEnumerator];
    while ((screen = [screenEnumerator nextObject])) {
      allScreensFrame = NSUnionRect([screen frame], allScreensFrame);
    // create the connection view
    connectionView = [[ConnectionView alloc] initWithFrame:allScreensFrame];
    [connectionView setDelegate:self];
    // create & show the window
    desktopWindow = [[NSWindow alloc] initWithContentRect:allScreensFrame styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO];
    [desktopWindow setContentView:connectionView];
    [desktopWindow setLevel:(kCGDesktopWindowLevel)];
    [desktopWindow setFrame:allScreensFrame display:YES];
    [desktopWindow orderFront:nil];

	[self setupTimerAndHost];

- (void)setupTimerAndHost
	[checkingTimer invalidate];
	[checkingTimer autorelease];
	checkingTimer = [[NSTimer scheduledTimerWithTimeInterval:4
													 repeats:YES] retain];

- (void)check:(NSTimer *)timer
  // do the actual check on a thread to not hog the UI every other second
  [NSThread detachNewThreadSelector:@selector(checkOnThread) toTarget:self withObject:nil];

- (void)checkOnThread
  NSAutoreleasePool *pool = [NSAutoreleasePool new];
  // -o = wait for one packet reply, then exit
	// -t 2 = timeout of 2 secs
	NSArray *args = [NSArray arrayWithObjects:@"-o", @"-t", @"2", @"", nil];
	NSTask *ping = [NSTask new];
  [ping setStandardError:[NSFileHandle fileHandleWithNullDevice]];
  [ping setLaunchPath:@"/sbin/ping"];
  [ping setArguments:args];
  [ping launch];
	// block until ping is finished.
	[ping waitUntilExit];
  // update UI
	lastCheckSuccessful = ([ping terminationStatus] == 0);
  [connectionView performSelectorOnMainThread:@selector(update:) withObject:self waitUntilDone:NO];
  // update dock icon
  if (lastCheckSuccessful)
    [NSApp setApplicationIconImage:[NSImage imageNamed:@"active"]];
    [NSApp setApplicationIconImage:[NSImage imageNamed:@"inactive"]];
  [pool release];

- (BOOL)lastCheckSuccessful
	return lastCheckSuccessful;

Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.