iut 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/.gitignore +9 -0
  2. data/Gemfile +4 -0
  3. data/Rakefile +1 -0
  4. data/bin/iut +2 -0
  5. data/iut.gemspec +24 -0
  6. data/lib/iut.rb +17 -0
  7. data/lib/iut/generator.rb +28 -0
  8. data/lib/iut/version.rb +4 -0
  9. data/template/project/iUnitTest/iUnitTest.xcodeproj/project.pbxproj +480 -0
  10. data/template/project/iUnitTest/iUnitTest/Classes/.do_not_remove_this_directory +0 -0
  11. data/template/project/iUnitTest/iUnitTest/Tests/.do_not_remove_this_directory +0 -0
  12. data/template/project/iUnitTest/iUnitTest/en.lproj/InfoPlist.strings +2 -0
  13. data/template/project/iUnitTest/iUnitTest/iUnitTest-Info.plist +44 -0
  14. data/template/project/iUnitTest/iUnitTest/iUnitTest-Prefix.pch +14 -0
  15. data/template/project/iUnitTest/iUnitTest/iunittest/Default.png +0 -0
  16. data/template/project/iUnitTest/iUnitTest/iunittest/IUTAppDelegate.h +20 -0
  17. data/template/project/iUnitTest/iUnitTest/iunittest/IUTAppDelegate.m +38 -0
  18. data/template/project/iUnitTest/iUnitTest/iunittest/IUTDetailView.xib +184 -0
  19. data/template/project/iUnitTest/iUnitTest/iunittest/IUTMainWindow.xib +732 -0
  20. data/template/project/iUnitTest/iUnitTest/iunittest/IUTTestView.xib +432 -0
  21. data/template/project/iUnitTest/iUnitTest/iunittest/Settings.bundle/Japanese.lproj/Root.strings +0 -0
  22. data/template/project/iUnitTest/iUnitTest/iunittest/Settings.bundle/Root.plist +39 -0
  23. data/template/project/iUnitTest/iUnitTest/iunittest/Settings.bundle/en.lproj/Root.strings +0 -0
  24. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/AppAgent.h +33 -0
  25. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/AppAgent.m +135 -0
  26. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/AppAgentHelper.h +63 -0
  27. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UINavigationBarBasedTest.h +25 -0
  28. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UINavigationBarBasedTest.m +49 -0
  29. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UITabBarAndNavigationBarBasedTest.h +23 -0
  30. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UITabBarAndNavigationBarBasedTest.m +42 -0
  31. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UITabBarBasedTest.h +25 -0
  32. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UITabBarBasedTest.m +50 -0
  33. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UITableViewBasedTest.h +23 -0
  34. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UITableViewBasedTest.m +57 -0
  35. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UITableViewControllerTest.h +22 -0
  36. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UITableViewControllerTest.m +44 -0
  37. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UIViewBasedTest.h +21 -0
  38. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UIViewBasedTest.m +52 -0
  39. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UIViewControllerTest.h +63 -0
  40. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/ControllerTest/UIViewControllerTest.m +162 -0
  41. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/GTMSenTestCase.h +17 -0
  42. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/GTMSenTestCase.m +15 -0
  43. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTAssertion.h +135 -0
  44. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTAssertion.m +216 -0
  45. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTAssertionInfo.h +60 -0
  46. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTAssertionInfo.m +104 -0
  47. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTDetailViewController.h +24 -0
  48. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTDetailViewController.m +81 -0
  49. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTLog.h +14 -0
  50. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTPreference.h +34 -0
  51. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTPreference.m +125 -0
  52. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTResultTableViewCell.h +27 -0
  53. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTResultTableViewCell.m +83 -0
  54. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTResultTableViewController.h +26 -0
  55. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTResultTableViewController.m +193 -0
  56. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTTest.h +74 -0
  57. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTTest.m +127 -0
  58. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTTestRunner.h +66 -0
  59. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTTestRunner.m +449 -0
  60. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTTestRunnerViewController.h +59 -0
  61. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/IUTTestRunnerViewController.m +163 -0
  62. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/NSExceptionExtension.h +21 -0
  63. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/NSExceptionExtension.m +52 -0
  64. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/SenTestAssertion.h +82 -0
  65. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/SourceCodeOpener.h +65 -0
  66. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/SourceCodeOpener.m +176 -0
  67. data/template/project/iUnitTest/iUnitTest/iunittest/UnitTest/UITableViewControllerTestHelper.h +35 -0
  68. data/template/project/iUnitTest/iUnitTest/iunittest/isd_logo_60x40.png +0 -0
  69. data/template/project/iUnitTest/iUnitTest/iunittest/isd_logo_60x40_w.png +0 -0
  70. data/template/project/iUnitTest/iUnitTest/iunittest/iunittest_icon.png +0 -0
  71. data/template/project/iUnitTest/iUnitTest/main.m +18 -0
  72. data/template/project/iUnitTest/script/sync_source.rb +27 -0
  73. metadata +119 -0
@@ -0,0 +1,163 @@
1
+ //
2
+ // IUTTestRunnerViewController.m
3
+ // iUnitTest
4
+ //
5
+ // Created by Katsuyoshi Ito on 09/01/16.
6
+ // Copyright 2009 ITO SOFT DESIGN Inc. All rights reserved.
7
+ //
8
+
9
+ #import "IUTTestRunnerViewController.h"
10
+ #import "IUTTestRunner.h"
11
+ #import "IUTPreference.h"
12
+
13
+
14
+ @interface IUTTestRunnerViewController(_private)
15
+ - (void)updateControls;
16
+ @end
17
+
18
+ @implementation IUTTestRunnerViewController
19
+
20
+ @synthesize progressView, startStopButton, indicatorView, resultLabel, resultTestViewController, allButton;
21
+ @synthesize running, runner;
22
+
23
+
24
+ /*
25
+ // The designated initializer. Override to perform setup that is required before the view is loaded.
26
+ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
27
+ if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
28
+ // Custom initialization
29
+ }
30
+ return self;
31
+ }
32
+ */
33
+
34
+ /*
35
+ // Implement loadView to create a view hierarchy programmatically, without using a nib.
36
+ - (void)loadView {
37
+ }
38
+ */
39
+
40
+ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
41
+ - (void)viewDidLoad {
42
+ [super viewDidLoad];
43
+
44
+ runner = [IUTTestRunner new];
45
+
46
+ indicatorView.hidesWhenStopped = YES;
47
+ [self updateControls];
48
+ [progressView setProgress:0.0];
49
+
50
+ resultTestViewController = [[IUTResultTableViewController alloc] initWithStyle:UITableViewStylePlain];
51
+ resultTestViewController.view.frame = CGRectMake(0, 50, 320, 410 - 42);
52
+ resultTestViewController.view.backgroundColor = [UIColor clearColor];
53
+ resultTestViewController.navigationController = self.navigationController;
54
+ resultTestViewController.runner = self.runner;
55
+ [self.view addSubview:resultTestViewController.view];
56
+ [[UIApplication sharedApplication].keyWindow bringSubviewToFront:resultTestViewController.view];
57
+ [resultTestViewController.tableView reloadData];
58
+
59
+ if ([[IUTPreference sharedPreference]isAutoRun]) {
60
+ [self startAction:self];
61
+ }
62
+ }
63
+
64
+ /*
65
+ // Override to allow orientations other than the default portrait orientation.
66
+ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
67
+ // Return YES for supported orientations
68
+ return (interfaceOrientation == UIInterfaceOrientationPortrait);
69
+ }
70
+ */
71
+
72
+ - (void)didReceiveMemoryWarning {
73
+ [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
74
+ // Release anything that's not essential, such as cached data
75
+ }
76
+
77
+
78
+ - (void)dealloc {
79
+ [resultTestViewController release];
80
+ [progressView release];
81
+ [startStopButton release];
82
+ [indicatorView release];
83
+ [resultLabel release];
84
+ [allButton release];
85
+ [runner release];
86
+ [super dealloc];
87
+ }
88
+
89
+
90
+ - (void)updateControls
91
+ {
92
+ if (self.isRunning) {
93
+ [self setButtonTitle:@"Stop"];
94
+ [progressView setProgress:0.0];
95
+ [indicatorView startAnimating];
96
+ [resultLabel setText:@""];
97
+ } else {
98
+ [self setButtonTitle:@"Start"];
99
+ [indicatorView stopAnimating];
100
+ [resultLabel setText:runner.result];
101
+ }
102
+ [resultTestViewController.tableView reloadData];
103
+ self.view.backgroundColor = runner.backgroundColor;
104
+
105
+ allButton.enabled = !self.isRunning && [[IUTPreference sharedPreference] canClear];
106
+ }
107
+
108
+ - (IBAction)startStopAction:(id)sender
109
+ {
110
+ if (self.isRunning) {
111
+ [self stopAction:(id)sender];
112
+ } else {
113
+ [self startAction:(id)sender];
114
+ }
115
+ }
116
+
117
+
118
+ - (IBAction)startAction:(id)sender
119
+ {
120
+ self.running = YES;
121
+ [NSThread detachNewThreadSelector:@selector(run:) toTarget:self.runner withObject:self];
122
+ }
123
+
124
+ - (IBAction)stopAction:(id)sender
125
+ {
126
+ self.running = NO;
127
+ [self.runner stop:self];
128
+ }
129
+
130
+ - (IBAction)clearPassedTestsAction:(id)sender
131
+ {
132
+ [[IUTPreference sharedPreference] clearPassedTests];
133
+ [self updateControls];
134
+ }
135
+
136
+
137
+ - (void)setButtonTitle:(NSString *)title
138
+ {
139
+ [startStopButton setTitle:title forState:UIControlStateNormal];
140
+ [startStopButton setTitle:title forState:UIControlStateHighlighted];
141
+ [startStopButton setTitle:title forState:UIControlStateDisabled];
142
+ }
143
+
144
+ - (void)setProgress:(NSNumber *)value
145
+ {
146
+ [progressView setProgress:[value floatValue]];
147
+ }
148
+
149
+ - (void)willTest:(id)sender
150
+ {
151
+ [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
152
+ [self updateControls];
153
+ }
154
+
155
+ - (void)didTest:(id)sender
156
+ {
157
+ [self stopAction:self];
158
+ [self updateControls];
159
+ [UIApplication sharedApplication].applicationIconBadgeNumber = self.runner.badgeNumber;
160
+ }
161
+
162
+
163
+ @end
@@ -0,0 +1,21 @@
1
+ //
2
+ // NSExceptionExtension.h
3
+ // iUnitTest
4
+ //
5
+ // Created by Katsuyoshi Ito on 09/05/14.
6
+ // Copyright 2009 ITO SOFT DESIGN Inc. All rights reserved.
7
+ //
8
+
9
+ #import <UIKit/UIKit.h>
10
+ #import "IUTAssertionInfo.h"
11
+
12
+
13
+ @interface NSException(IUTAssertionInfo)
14
+ @property (assign, readonly) IUTAssertionInfo *assertionInfo;
15
+ @property (readonly) BOOL isFailure;
16
+ @property (readonly) BOOL isError;
17
+ @end
18
+
19
+ @interface NSException(IUTResultTableViewCell)
20
+ - (UIColor *)color;
21
+ @end
@@ -0,0 +1,52 @@
1
+ //
2
+ // NSExceptionExtension.m
3
+ // iUnitTest
4
+ //
5
+ // Created by Katsuyoshi Ito on 09/05/14.
6
+ // Copyright 2009 ITO SOFT DESIGN Inc. All rights reserved.
7
+ //
8
+
9
+ #import "NSExceptionExtension.h"
10
+ #import "IUTAssertion.h"
11
+ #import "IUTTestRunner.h"
12
+
13
+
14
+ @implementation NSException(IUTAssertionInfo)
15
+
16
+ - (IUTAssertionInfo *)assertionInfo
17
+ {
18
+ if ([self isFailure] || [self isError]) {
19
+ return [[self userInfo] objectForKey:IUTAssertionInfoKey];
20
+ }
21
+ return nil;
22
+ }
23
+
24
+ - (BOOL)isFailure
25
+ {
26
+ return [[self name] isEqualToString:IUTAssertionExceptionName];
27
+ }
28
+
29
+ - (BOOL)isError
30
+ {
31
+ return [[self name] isEqualToString:IUTAssertionErrorExceptionName];
32
+ }
33
+
34
+ @end
35
+
36
+ @implementation NSException(IUTResultTableViewCell)
37
+
38
+ - (UIColor *)color
39
+ {
40
+ IUTAssertionInfo *info = self.assertionInfo;
41
+
42
+ if ([self isFailure]) {
43
+ return [info.methodName isEqualToString:@"testThisClassAlways"] ? [IUTTestRunner failureColor2] : [IUTTestRunner failureColor];
44
+ } else
45
+ if ([self isError]) {
46
+ return [IUTTestRunner errorColor];
47
+ }
48
+ return nil;
49
+ }
50
+
51
+ @end
52
+
@@ -0,0 +1,82 @@
1
+ /*
2
+ * SenTestAssertion.h
3
+ * iUnitTest
4
+ *
5
+ * Created by Katsuyoshi Ito on 09/02/03.
6
+ * Copyright 2009 ITO SOFT DESIGN Inc. All rights reserved.
7
+ *
8
+ */
9
+
10
+ #define STAssertNil(a1, description, ...) \
11
+ ASSERT_NIL(a1)
12
+
13
+ #define STAssertNotNil(a1, description, ...) \
14
+ ASSERT_NOT_NIL(a1)
15
+
16
+ #define STAssertTrue(expression, description, ...) \
17
+ ASSERT(expression)
18
+
19
+ #define STAssertFalse(expression, description, ...) \
20
+ ASSERT(!expression)
21
+
22
+ #define STAssertEqualObjects(a1, a2, description, ...) \
23
+ ASSERT_EQUAL(a1, a2)
24
+
25
+ #define STAssertEquals(a1, a2, description, ...) \
26
+ { \
27
+ char *e = @encode(__typeof(a1)); \
28
+ if (*e == 'i') { \
29
+ ASSERT_EQUAL_INT((a1), (int)(a2)); \
30
+ } \
31
+ else \
32
+ if (*e == 'f') { \
33
+ ASSERT_EQUAL_FLOAT((a1), (float)(a2)); \
34
+ } \
35
+ else \
36
+ if (*e == 'd') { \
37
+ ASSERT_EQUAL_DOUBLE((a1), (double)(a2)); \
38
+ } else { \
39
+ ASSERT_FAIL(@"not supported in this case."); \
40
+ } \
41
+ }
42
+
43
+
44
+ #define STAssertEqualsWithAccuracy(left, right, accuracy, description, ...) \
45
+ { \
46
+ char *e = @encode(__typeof(left)); \
47
+ if (*e == 'f') { \
48
+ ASSERT_EQUAL_FLOAT_DELTA((left), (float)(right), (float)(accuracy)); \
49
+ } \
50
+ else \
51
+ if (*e == 'd') { \
52
+ ASSERT_EQUAL_DOUBLE_DELTA((left), (double)(right), (double)(accuracy)); \
53
+ } else { \
54
+ ASSERT_FAIL(@"not supported in this case."); \
55
+ } \
56
+ }
57
+
58
+
59
+ #define STAssertThrows(expression, description, ...) \
60
+ ASSERT_RAISE(expression)
61
+
62
+ /* FIXME: not suuported
63
+ #define STAssertThrowsSpecific(expression, specificException, description, ...) \
64
+ #define STAssertThrowsSpecificNamed(expr, specificException, aName, description, ...) \
65
+ */
66
+
67
+ #define STAssertNoThrow(expression, description, ...) \
68
+ ASSERT_NOTHING_RAISED(expression)
69
+
70
+ /* FIXME: not suuported
71
+ #define STAssertNoThrowSpecific(expression, specificException, description, ...) \
72
+ #define STAssertNoThrowSpecificNamed(expr, specificException, aName, description, ...) \
73
+ */
74
+
75
+ #define STFail(description, ...) \
76
+ ASSERT_FAIL(([NSString stringWithFormat:description, ##__VA_ARGS__]))
77
+
78
+
79
+ /* FIXME: not suuported
80
+ #define STAssertTrueNoThrow(expression, description, ...) \
81
+ #define STAssertFalseNoThrow(expression, description, ...) \
82
+ */
@@ -0,0 +1,65 @@
1
+ //
2
+ // SourceCodeOpener.h
3
+ // iUnitTestTest
4
+ //
5
+ // Created by Katsuyoshi Ito on 09/04/26.
6
+ // Copyright 2009 ITO SOFT DESIGN Inc. All rights reserved.
7
+ //
8
+
9
+ #import <Foundation/Foundation.h>
10
+
11
+
12
+ #if TARGET_IPHONE_SIMULATOR
13
+
14
+ #define SOURCE_CODE_OPENER_START() [SourceCodeOpener sourceCodeOpener]
15
+ #define SOURCE_CODE_OPENER_OPEN_HERE() [[SourceCodeOpener sourceCodeOpener] open:[NSString stringWithFormat:@"%s", __FILE__] line:__LINE__]
16
+
17
+ #else
18
+
19
+ #define SOURCE_CODE_OPENER_START()
20
+ #define SOURCE_CODE_OPENER_OPEN_HERE()
21
+
22
+ #endif
23
+
24
+
25
+
26
+ #if TARGET_IPHONE_SIMULATOR
27
+
28
+ @interface SourceCodeOpener : NSObject <NSNetServiceDelegate, NSNetServiceBrowserDelegate> {
29
+
30
+ NSNetServiceBrowser *browser;
31
+ NSMutableSet *services;
32
+ NSNetService *targetService;
33
+ NSMutableSet *resolvingServices;
34
+ NSFileHandle *fileHandle;
35
+ }
36
+
37
+
38
+ @property (retain) NSNetService *targetService;
39
+ @property (retain) NSFileHandle *fileHandle;
40
+
41
+
42
+ + (id)sourceCodeOpener;
43
+
44
+
45
+ #pragma mark -
46
+ #pragma mark NSNetServiceBrowser's delegate
47
+
48
+ - (void)netServiceBrowser:(NSNetServiceBrowser *)netServiceBrowser didFindService:(NSNetService *)netService moreComing:(BOOL)moreServicesComing;
49
+
50
+ - (void)netServiceBrowser:(NSNetServiceBrowser *)netServiceBrowser didRemoveService:(NSNetService *)netService moreComing:(BOOL)moreServicesComing;
51
+
52
+
53
+ #pragma mark -
54
+ #pragma mark NSNetService's delegate
55
+
56
+ - (void)netServiceDidResolveAddress:(NSNetService *)sender;
57
+
58
+
59
+
60
+ - (void)open:(NSString *)filePath line:(NSInteger)line;
61
+
62
+
63
+ @end
64
+
65
+ #endif
@@ -0,0 +1,176 @@
1
+ //
2
+ // SourceCodeOpener.m
3
+ // iUnitTestTest
4
+ //
5
+ // Created by Katsuyoshi Ito on 09/04/26.
6
+ // Copyright 2009 ITO SOFT DESIGN Inc. All rights reserved.
7
+ //
8
+
9
+
10
+ #if TARGET_IPHONE_SIMULATOR
11
+
12
+
13
+ #import "SourceCodeOpener.h"
14
+ #import <sys/types.h>
15
+ #import <sys/socket.h>
16
+ #import <netinet/in.h>
17
+ #import <arpa/inet.h>
18
+ #import <unistd.h>
19
+
20
+
21
+ @interface SourceCodeOpener(_private)
22
+ - (BOOL)openWithSocketAddress:(struct sockaddr *)socketAddress;
23
+ - (void)close;
24
+ - (BOOL)isOpend;
25
+ @end
26
+
27
+
28
+ @implementation SourceCodeOpener
29
+
30
+ @synthesize targetService, fileHandle;
31
+
32
+ + (id)sourceCodeOpener
33
+ {
34
+ static id opener = nil;
35
+ if (opener == nil) {
36
+ opener = [self new];
37
+ }
38
+ return opener;
39
+ }
40
+
41
+
42
+
43
+ - (id)init
44
+ {
45
+ self = [super init];
46
+ if (self) {
47
+ browser = [NSNetServiceBrowser new];
48
+ services = [NSMutableSet new];
49
+ resolvingServices = [NSMutableSet new];
50
+ [browser setDelegate:self];
51
+ [browser searchForServicesOfType:@"_iunittest_opencode._tcp." inDomain:@""];
52
+ }
53
+ return self;
54
+ }
55
+
56
+ - (void)dealloc
57
+ {
58
+ [self close];
59
+ for (NSNetService *service in [resolvingServices allObjects]) {
60
+ [service stop];
61
+ }
62
+ [resolvingServices release];
63
+ [services release];
64
+ [super dealloc];
65
+ }
66
+
67
+ #pragma mark -
68
+ #pragma mark open/close
69
+
70
+ - (BOOL)openWithSocketAddress:(struct sockaddr *)socketAddress
71
+ {
72
+ int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
73
+ if (socket_fd != -1) {
74
+ self.fileHandle = [[NSFileHandle alloc] initWithFileDescriptor:socket_fd closeOnDealloc:YES];
75
+ int len = sizeof(*socketAddress);
76
+ int result = connect(socket_fd, socketAddress, len);
77
+ if (result != -1) {
78
+ return YES;
79
+ } else {
80
+ [self close];
81
+ }
82
+ } else {
83
+ [self close];
84
+ }
85
+ return NO;
86
+ }
87
+
88
+ - (void)close
89
+ {
90
+ if (self.fileHandle) {
91
+ self.fileHandle = nil;
92
+ self.targetService = nil;
93
+ }
94
+ }
95
+
96
+ - (BOOL)isOpend
97
+ {
98
+ return self.fileHandle ? YES : NO;
99
+ }
100
+
101
+
102
+ #pragma mark -
103
+ #pragma mark NSNetServiceBrowser's delegate
104
+
105
+ - (void)netServiceBrowser:(NSNetServiceBrowser *)netServiceBrowser didFindService:(NSNetService *)netService moreComing:(BOOL)moreServicesComing
106
+ {
107
+ [services addObject:netService];
108
+ [resolvingServices addObject:netService];
109
+ [netService setDelegate:self];
110
+ [netService resolveWithTimeout:1.0];
111
+ }
112
+
113
+ - (void)netServiceBrowser:(NSNetServiceBrowser *)netServiceBrowser didRemoveService:(NSNetService *)netService moreComing:(BOOL)moreServicesComing
114
+ {
115
+ if ([resolvingServices containsObject:netService]) {
116
+ [netService stop];
117
+ [resolvingServices removeObject:netService];
118
+ }
119
+ [services removeObject:netService];
120
+ }
121
+
122
+ #pragma mark -
123
+ #pragma mark NSNetService's delegate
124
+
125
+
126
+
127
+ - (void)netServiceDidResolveAddress:(NSNetService *)sender
128
+ {
129
+ [resolvingServices removeObject:sender];
130
+
131
+ if (![self isOpend]) {
132
+ // to make local domain
133
+ NSString *hostName = [[NSProcessInfo processInfo] hostName];
134
+ hostName = [[[hostName componentsSeparatedByString:@"."] objectAtIndex:0] stringByAppendingString:@".local."];
135
+ if ([[sender hostName] caseInsensitiveCompare:hostName] == NSOrderedSame) {
136
+
137
+ if ([[sender addresses] count] > 0) {
138
+ NSData * address;
139
+ struct sockaddr *socketAddress;
140
+ int i;
141
+ BOOL gotAddress = NO;
142
+
143
+ for (i = 0; i < [[sender addresses] count]; i++) {
144
+ address = [[sender addresses] objectAtIndex:i];
145
+ socketAddress = (struct sockaddr *)[address bytes];
146
+
147
+ if (socketAddress->sa_family == AF_INET) {
148
+ gotAddress = YES;
149
+ break;
150
+ }
151
+ }
152
+ if (gotAddress) {
153
+ if ([self openWithSocketAddress:socketAddress]) {
154
+ self.targetService = sender;
155
+ }
156
+ }
157
+ }
158
+ }
159
+ }
160
+ }
161
+
162
+
163
+
164
+ - (void)open:(NSString *)filePath line:(NSInteger)line
165
+ {
166
+ if ([self isOpend]) {
167
+ if (line) {
168
+ NSString *cmd = [NSString stringWithFormat:@"%@:%d\n", filePath, line];
169
+ [self.fileHandle writeData:[cmd dataUsingEncoding:NSUTF8StringEncoding]];
170
+ }
171
+ }
172
+ }
173
+
174
+ @end
175
+
176
+ #endif