<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -73,6 +73,7 @@
 		787817C80D860ED30049CF95 /* unicodeutil.rb in Resources */ = {isa = PBXBuildFile; fileRef = 787817C70D860ED30049CF95 /* unicodeutil.rb */; };
 		787898250CF38C510045585B /* filelogger.rb in Resources */ = {isa = PBXBuildFile; fileRef = 787898240CF38C510045585B /* filelogger.rb */; };
 		787A36A20C6A392600DDB70D /* fieldeditortextview.rb in Resources */ = {isa = PBXBuildFile; fileRef = 787A36A10C6A392600DDB70D /* fieldeditortextview.rb */; };
+		78835406109FEA7F00CD2FFF /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78835405109FEA7F00CD2FFF /* SystemConfiguration.framework */; };
 		7884E54E0CDA91F500AF3678 /* SACrashReporter in Resources */ = {isa = PBXBuildFile; fileRef = 7884E5450CDA91F500AF3678 /* SACrashReporter */; };
 		7889CAB90D646E2C003D808E /* WelcomeDialog.nib in Resources */ = {isa = PBXBuildFile; fileRef = 7889CAB70D646E2C003D808E /* WelcomeDialog.nib */; };
 		7889CABF0D647494003D808E /* welcomedialog.rb in Resources */ = {isa = PBXBuildFile; fileRef = 7889CABE0D647494003D808E /* welcomedialog.rb */; };
@@ -228,6 +229,7 @@
 		787898240CF38C510045585B /* filelogger.rb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.ruby; path = filelogger.rb; sourceTree = &quot;&lt;group&gt;&quot;; };
 		787A36A10C6A392600DDB70D /* fieldeditortextview.rb */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = text.script.ruby; path = fieldeditortextview.rb; sourceTree = &quot;&lt;group&gt;&quot;; };
 		787FD46C0BFE960100F2F22D /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = &quot;&lt;absolute&gt;&quot;; };
+		78835405109FEA7F00CD2FFF /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = /System/Library/Frameworks/SystemConfiguration.framework; sourceTree = &quot;&lt;absolute&gt;&quot;; };
 		7884E5450CDA91F500AF3678 /* SACrashReporter */ = {isa = PBXFileReference; lastKnownFileType = folder; name = SACrashReporter; path = vendor/SACrashReporter; sourceTree = &quot;&lt;group&gt;&quot;; };
 		7889CAB80D646E2C003D808E /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/WelcomeDialog.nib; sourceTree = &quot;&lt;group&gt;&quot;; };
 		7889CABE0D647494003D808E /* welcomedialog.rb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.ruby; path = welcomedialog.rb; sourceTree = &quot;&lt;group&gt;&quot;; };
@@ -281,6 +283,7 @@
 				78E5723D0C1C30BA00BDF7EC /* CoreServices.framework in Frameworks */,
 				789AF78A10859FEE006848B3 /* RubyCocoa.framework in Frameworks */,
 				78FA9F651085AA1400001F13 /* Sparkle.framework in Frameworks */,
+				78835406109FEA7F00CD2FFF /* SystemConfiguration.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -357,6 +360,7 @@
 				787FD46C0BFE960100F2F22D /* Carbon.framework */,
 				780253C20C09525900C170D4 /* CoreServices.framework */,
 				788D56F00BB6872B00DDBF69 /* WebKit.framework */,
+				78835405109FEA7F00CD2FFF /* SystemConfiguration.framework */,
 				789AF78910859FEE006848B3 /* RubyCocoa.framework */,
 				78FA9F641085AA1400001F13 /* Sparkle.framework */,
 			);</diff>
      <filename>LimeChat.xcodeproj/project.pbxproj</filename>
    </modified>
    <modified>
      <diff>@@ -133,6 +133,10 @@ typedef enum AsyncSocketError AsyncSocketError;
 /* SSL support */
 - (void) useSSL;
 
+/* Proxy support */
+- (void) useSystemSocksProxy;
+- (void) useSocksProxyVersion:(int)version host:(NSString*)host port:(int)port user:(NSString*)user password:(NSString*)password;
+
 /* The following methods won't block. To not time out, use a negative time interval. If they time out, &quot;onSocket:disconnectWithError:&quot; is called. The tag is for your convenience. You can use it as an array index, step number, state id, pointer, etc., just like the socket's user data. */
 
 /* This will read a certain number of bytes, and call the delegate method when those bytes have been read. If there is an error, partially read data is lost. If the length is 0, this method does nothing and the delegate is not called. */</diff>
      <filename>objc/AsyncSocket.h</filename>
    </modified>
    <modified>
      <diff>@@ -13,6 +13,7 @@
 #import &lt;netinet/in.h&gt;
 #import &lt;arpa/inet.h&gt;
 #import &lt;netdb.h&gt;
+#import &lt;SystemConfiguration/SystemConfiguration.h&gt;
 
 #pragma mark Declarations
 
@@ -1569,16 +1570,45 @@ static void MyCFWriteStreamCallback (CFWriteStreamRef stream, CFStreamEventType
 
 - (void)useSSL
 {
-	NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:
-								   (NSString *)kCFStreamSocketSecurityLevelNegotiatedSSL, kCFStreamSSLLevel,
-								   kCFBooleanTrue, kCFStreamSSLAllowsAnyRoot,
-								   kCFBooleanFalse, kCFStreamSSLValidatesCertificateChain,
-								   kCFNull, kCFStreamSSLPeerName,
-								   kCFBooleanFalse, kCFStreamSSLIsServer,
-								   nil];
-	
-	CFReadStreamSetProperty(theReadStream, kCFStreamPropertySSLSettings, settings);
-	CFWriteStreamSetProperty(theWriteStream, kCFStreamPropertySSLSettings, settings);
+  NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:
+                                          (NSString*)kCFStreamSocketSecurityLevelNegotiatedSSL, kCFStreamSSLLevel,
+                                          kCFBooleanTrue, kCFStreamSSLAllowsAnyRoot,
+                                          kCFBooleanFalse, kCFStreamSSLValidatesCertificateChain,
+                                          kCFNull, kCFStreamSSLPeerName,
+                                          kCFBooleanFalse, kCFStreamSSLIsServer,
+                                          nil];
+
+  CFReadStreamSetProperty(theReadStream, kCFStreamPropertySSLSettings, settings);
+  CFWriteStreamSetProperty(theWriteStream, kCFStreamPropertySSLSettings, settings);
+}
+
+- (void)useSystemSocksProxy
+{
+  CFDictionaryRef settings = SCDynamicStoreCopyProxies(NULL);
+  CFReadStreamSetProperty(theReadStream, kCFStreamPropertySOCKSProxy, settings);
+  CFWriteStreamSetProperty(theWriteStream, kCFStreamPropertySOCKSProxy, settings);
+  CFRelease(settings);
+}
+
+- (void)useSocksProxyVersion:(int)version host:(NSString*)host port:(int)port user:(NSString*)user password:(NSString*)password
+{
+  NSMutableDictionary* settings = [NSMutableDictionary dictionary];
+  
+  if (version == 4) {
+    [settings setObject:(NSString*)kCFStreamSocketSOCKSVersion4 forKey:(NSString*)kCFStreamPropertySOCKSVersion];
+  }
+  else {
+    [settings setObject:(NSString*)kCFStreamSocketSOCKSVersion5 forKey:(NSString*)kCFStreamPropertySOCKSVersion];
+  }
+  
+  [settings setObject:host forKey:(NSString*)kCFStreamPropertySOCKSProxyHost];
+  [settings setObject:[NSNumber numberWithInt:port] forKey:(NSString*)kCFStreamPropertySOCKSProxyPort];
+
+  if ([user length]) [settings setObject:user forKey:(NSString*)kCFStreamPropertySOCKSUser];
+  if ([password length]) [settings setObject:password forKey:(NSString*)kCFStreamPropertySOCKSPassword];
+
+  CFReadStreamSetProperty(theReadStream, kCFStreamPropertySOCKSProxy, settings);
+  CFWriteStreamSetProperty(theWriteStream, kCFStreamPropertySOCKSProxy, settings);
 }
 
 + (NSString*)posixErrorStringFromErrno:(int)code</diff>
      <filename>objc/AsyncSocket.m</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>18e3f740ebbdc3ee658a4404f210b6a77bac98e9</id>
    </parent>
  </parents>
  <author>
    <name>Satoshi Nakagawa</name>
    <email>psychs@limechat.net</email>
  </author>
  <url>http://github.com/psychs/limechat/commit/1987147848c345e5e77e9fcb87c21667c6b3cbdb</url>
  <id>1987147848c345e5e77e9fcb87c21667c6b3cbdb</id>
  <committed-date>2009-11-02T21:17:56-08:00</committed-date>
  <authored-date>2009-11-02T21:17:56-08:00</authored-date>
  <message>SOCKS proxy support in AsyncSocket</message>
  <tree>09fbba1ad3c2807eda8e1ccca61662bdb6bc36cb</tree>
  <committer>
    <name>Satoshi Nakagawa</name>
    <email>psychs@limechat.net</email>
  </committer>
</commit>
