Changeset 3076
- Timestamp:
- 12/24/05 02:58:03 (3 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/cocoa-networking/Chat Core/AsyncSocket.h
r3075 r3076 1 //2 1 // AsyncSocket.h 3 2 // … … 7 6 // 8 7 // E-Mail: d-j-v@earthlink.net 9 //10 8 11 9 /* … … 22 20 extern NSString *const AsyncSocketErrorDomain; 23 21 24 enum AsyncSocketError 25 { 22 enum AsyncSocketError { 26 23 AsyncSocketCFSocketError = kCFSocketError, // From CFSocketError enum. 27 24 AsyncSocketNoError = 0, // Never used. … … 30 27 AsyncSocketWriteTimeoutError 31 28 }; 29 32 30 typedef enum AsyncSocketError AsyncSocketError; 33 31 34 @interface NSObject ( AsyncSocketDelegate ) 35 32 @interface NSObject (AsyncSocketDelegate) 36 33 /* In the event of an error, the socket is closed. You may call "readDataWithTimeout:tag:" during this call-back to get the last bit of data off the socket. When connecting, this delegate method may be called before "socket:didAcceptNewSocket:" or "socket:didConnectToHost:". */ 37 - (void) socket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;34 - (void) socket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err; 38 35 39 36 /* Called when a socket disconnects with or without error. If you want to release a socket after it disconnects, do so here. It is not safe to do that during "socket:willDisconnectWithError:". */ 40 - (void) socketDidDisconnect:(AsyncSocket *)sock;37 - (void) socketDidDisconnect:(AsyncSocket *)sock; 41 38 42 39 /* Called when a socket accepts a connection. Another socket is spawned to handle it. The new socket will have the same delegate and will call "socket:didConnectToHost:port:". */ 43 - (void) socket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket;40 - (void) socket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket; 44 41 45 42 /* Called when a new socket is spawned to handle a connection. This method should return the run-loop of the thread on which the new socket and its delegate should operate. If omitted, [NSRunLoop currentRunLoop] is used. */ 46 - (NSRunLoop *) socket:(AsyncSocket *)sock wantsRunLoopForNewSocket:(AsyncSocket *)newSocket;43 - (NSRunLoop *) socket:(AsyncSocket *)sock wantsRunLoopForNewSocket:(AsyncSocket *)newSocket; 47 44 48 45 /* Called when a socket is about to connect. This method should return YES to continue, or NO to abort. If aborted, will result in AsyncSocketCanceledError. */ 49 - (BOOL) socketWillConnect:(AsyncSocket *)sock;46 - (BOOL) socketWillConnect:(AsyncSocket *)sock; 50 47 51 48 /* Called when a socket connects and is ready for reading and writing. "host" will be an IP address, not a DNS name. */ 52 - (void) socket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port;49 - (void) socket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port; 53 50 54 51 /* Called when a socket has completed reading the requested data. Not called if there is an error. */ 55 - (void) socket:(AsyncSocket *)sock didReadData:(NSData*)data withTag:(long)tag;52 - (void) socket:(AsyncSocket *)sock didReadData:(NSData*)data withTag:(long)tag; 56 53 57 54 /* Called when a socket has completed writing the requested data. Not called if there is an error. */ 58 -(void) socket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag; 59 55 - (void) socket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag; 60 56 @end 61 57 62 @interface AsyncSocket : NSObject 63 { 58 @interface AsyncSocket : NSObject { 64 59 CFSocketRef theSocket; // IPv4/IPv6 accept or connect socket. 65 60 CFSocketRef theSocket6; // IPv6 accept socket. … … 76 71 NSTimer *theReadTimer; 77 72 NSData *partialReadBuffer; 78 73 79 74 NSMutableArray *theWriteQueue; 80 75 AsyncWritePacket *theCurrentWrite; … … 84 79 id theDelegate; 85 80 Byte theFlags; 86 81 87 82 long theUserData; 88 83 } 89 90 84 - (id) init; 91 85 - (id) initWithDelegate:(id)delegate; … … 154 148 + (NSData *) LFData; // 0x0A 155 149 + (NSData *) ZeroData; // 0x00 156 157 150 @end branches/cocoa-networking/Chat Core/MVIRCChatConnection.h
r3075 r3076 1 1 #import "MVChatConnection.h" 2 3 @class AsyncSocket; 2 4 3 5 @interface MVIRCChatConnection : MVChatConnection { 4 6 @private 7 AsyncSocket *_chatConnection; 5 8 NSMutableDictionary *_knownUsers; 9 NSString *_server; 10 NSString *_currentNickname; 11 NSString *_nickname; 12 NSString *_username; 13 NSString *_password; 14 NSString *_realName; 15 NSString *_proxyServer; 6 16 NSString *_proxyUsername; 7 17 NSString *_proxyPassword; 18 unsigned short _serverPort; 19 unsigned short _proxyServerPort; 20 BOOL _secure; 8 21 } 9 22 + (NSArray *) defaultServerPorts; … … 13 26 14 27 @interface MVChatConnection (MVIRCChatConnectionPrivate) 28 - (void) _readNextMessageFromServer; 29 15 30 + (const char *) _flattenedIRCStringForMessage:(NSAttributedString *) message withEncoding:(NSStringEncoding) enc andChatFormat:(MVChatMessageFormat) format; 16 31 - (void) _forceDisconnect; branches/cocoa-networking/Chat Core/MVIRCChatConnection.m
r3075 r3076 4 4 #import "MVIRCFileTransfer.h" 5 5 6 #import "AsyncSocket.h" 6 7 #import "MVChatPluginManager.h" 7 8 #import "NSAttributedStringAdditions.h" … … 1090 1091 tooLate = YES; 1091 1092 } 1092 } 1093 } */ 1093 1094 1094 1095 + (NSArray *) defaultServerPorts { … … 1102 1103 _proxyUsername = nil; 1103 1104 _proxyPassword = nil; 1104 _chatConnection = NULL; 1105 _chatConnectionSettings = NULL; 1105 _chatConnection = [[AsyncSocket allocWithZone:nil] initWithDelegate:self]; 1106 1106 1107 1107 _knownUsers = [[NSMutableDictionary allocWithZone:nil] initWithCapacity:200]; 1108 1108 1109 extern unsigned int connectionCount;1110 connectionCount++;1111 1112 while( ! irssiThreadReady ) usleep( 50 );1113 1114 IrssiLock();1109 // extern unsigned int connectionCount; 1110 // connectionCount++; 1111 1112 // while( ! irssiThreadReady ) usleep( 50 ); 1113 1114 /* IrssiLock(); 1115 1115 1116 1116 CHAT_PROTOCOL_REC *proto = chat_protocol_find_id( IRC_PROTOCOL ); … … 1130 1130 [self _setIrssiConnectSettings:settings]; 1131 1131 1132 IrssiUnlock(); 1132 IrssiUnlock(); */ 1133 1133 } 1134 1134 … … 1148 1148 _proxyPassword = nil; 1149 1149 1150 [self _setIrssiConnection:NULL];1151 [self _setIrssiConnectSettings:NULL];1152 1153 extern unsigned int connectionCount;1154 connectionCount--;1150 // [self _setIrssiConnection:NULL]; 1151 // [self _setIrssiConnectSettings:NULL]; 1152 1153 // extern unsigned int connectionCount; 1154 // connectionCount--; 1155 1155 1156 1156 [super dealloc]; … … 1192 1192 [self _willConnect]; // call early so other code has a chance to change our info 1193 1193 1194 IrssiLock(); 1194 if( ! [_chatConnection connectToHost:[self server] onPort:[self serverPort] error:NULL] ) { 1195 NSLog( @"failed to connect" ); 1196 } 1197 1198 /* IrssiLock(); 1195 1199 1196 1200 if( ! _chatConnectionSettings ) { … … 1236 1240 _chatConnection -> rawlog = NULL; 1237 1241 1238 IrssiUnlock(); 1242 IrssiUnlock(); */ 1239 1243 } 1240 1244 … … 1242 1246 [self cancelPendingReconnectAttempts]; 1243 1247 1244 if( ! _chatConnection ) return; 1245 if( [self status] == MVChatConnectionConnectingStatus ) { 1246 [self _forceDisconnect]; 1247 return; 1248 } 1249 1250 if( [[reason string] length] ) { 1251 const char *msg = [[self class] _flattenedIRCStringForMessage:reason withEncoding:[self encoding] andChatFormat:[self outgoingChatFormat]]; 1252 [self sendRawMessage:[NSString stringWithFormat:@"QUIT :%s", msg] immediately:YES]; 1253 } else [self sendRawMessage:@"QUIT" immediately:YES]; 1254 1255 IrssiLock(); 1256 1257 if( _chatConnection ) { 1258 _chatConnection -> connection_lost = NO; 1259 _chatConnection -> no_reconnect = YES; 1260 server_disconnect( _chatConnection ); 1261 } 1262 1263 IrssiUnlock(); 1248 if( [self status] == MVChatConnectionConnectedStatus ) { 1249 if( [[reason string] length] ) { 1250 const char *msg = [[self class] _flattenedIRCStringForMessage:reason withEncoding:[self encoding] andChatFormat:[self outgoingChatFormat]]; 1251 [self sendRawMessage:[NSString stringWithFormat:@"QUIT :%s", msg] immediately:YES]; 1252 } else [self sendRawMessage:@"QUIT" immediately:YES]; 1253 } 1254 1255 [_chatConnection disconnectAfterWriting]; 1264 1256 } 1265 1257 … … 1269 1261 NSParameterAssert( name != nil ); 1270 1262 1271 IrssiLock(); 1272 1273 if( _chatConnectionSettings ) { 1274 g_free_not_null( _chatConnectionSettings -> realname ); 1275 _chatConnectionSettings -> realname = g_strdup( [self encodedBytesWithString:name] ); 1276 } 1277 1278 IrssiUnlock(); 1263 id old = _realName; 1264 _realName = [name copyWithZone:nil]; 1265 [old release]; 1279 1266 } 1280 1267 1281 1268 - (NSString *) realName { 1282 if( ! _chatConnectionSettings ) return nil; 1283 return [self stringWithEncodedBytes:_chatConnectionSettings -> realname]; 1269 return [[_realName retain] autorelease]; 1284 1270 } 1285 1271 … … 1290 1276 NSParameterAssert( [nickname length] > 0 ); 1291 1277 1292 IrssiLock(); 1293 1294 if( _chatConnectionSettings ) { 1295 g_free_not_null( _chatConnectionSettings -> nick ); 1296 _chatConnectionSettings -> nick = g_strdup( [self encodedBytesWithString:nickname] ); 1297 } 1298 1299 IrssiUnlock(); 1278 id old = _nickname; 1279 _nickname = [nickname copyWithZone:nil]; 1280 [old release]; 1281 1282 if( ! _currentNickname ) 1283 _currentNickname = [_nickname retain]; 1300 1284 1301 1285 if( [self isConnected] && ! [nickname isEqualToString:[self nickname]] ) … … 1304 1288 1305 1289 - (NSString *) nickname { 1306 if( _status == MVChatConnectionConnectedStatus ) { // don't call [self isConnected], need speed here 1307 IrssiLock(); 1308 NSString *nick = nil; 1309 if( _chatConnection && _chatConnection -> nick ) 1310 nick = [self stringWithEncodedBytes:_chatConnection -> nick]; 1311 IrssiUnlock(); 1312 if( nick ) return nick; 1313 } 1314 1315 if( ! _chatConnectionSettings ) return nil; 1316 return [self stringWithEncodedBytes:_chatConnectionSettings -> nick]; 1290 return [[_currentNickname retain] autorelease]; 1317 1291 } 1318 1292 1319 1293 - (NSString *) preferredNickname { 1320 if( ! _chatConnectionSettings ) return nil; 1321 return [self stringWithEncodedBytes:_chatConnectionSettings -> nick]; 1294 return [[_nickname retain] autorelease]; 1322 1295 } 1323 1296 … … 1333 1306 1334 1307 - (void) setPassword:(NSString *) password { 1335 IrssiLock(); 1336 1337 if( _chatConnectionSettings ) { 1338 g_free_not_null( _chatConnectionSettings -> password ); 1339 if( [password length] ) _chatConnectionSettings -> password = g_strdup( [self encodedBytesWithString:password] ); 1340 else _chatConnectionSettings -> password = NULL; 1341 } 1342 1343 IrssiUnlock(); 1308 id old = _password; 1309 _password = [password copyWithZone:nil]; 1310 [old release]; 1344 1311 } 1345 1312 1346 1313 - (NSString *) password { 1347 if( ! _chatConnectionSettings ) return nil; 1348 char *pass = _chatConnectionSettings -> password; 1349 if( pass ) return [self stringWithEncodedBytes:pass]; 1350 return nil; 1314 return [[_password retain] autorelease]; 1351 1315 } 1352 1316 … … 1357 1321 NSParameterAssert( [username length] > 0 ); 1358 1322 1359 IrssiLock(); 1360 1361 if( _chatConnectionSettings ) { 1362 g_free_not_null( _chatConnectionSettings -> username ); 1363 _chatConnectionSettings -> username = g_strdup( [self encodedBytesWithString:username] ); 1364 } 1365 1366 IrssiUnlock(); 1323 id old = _username; 1324 _username = [username copyWithZone:nil]; 1325 [old release]; 1367 1326 } 1368 1327 1369 1328 - (NSString *) username { 1370 if( ! _chatConnectionSettings ) return nil; 1371 return [self stringWithEncodedBytes:_chatConnectionSettings -> username]; 1329 return [[_username retain] autorelease]; 1372 1330 } 1373 1331 … … 1378 1336 NSParameterAssert( [server length] > 0 ); 1379 1337 1380 IrssiLock(); 1381 1382 if( _chatConnectionSettings ) { 1383 g_free_not_null( _chatConnectionSettings -> address ); 1384 _chatConnectionSettings -> address = g_strdup( [self encodedBytesWithString:server] ); 1385 } 1386 1387 IrssiUnlock(); 1338 id old = _server; 1339 _server = [server copyWithZone:nil]; 1340 [old release]; 1388 1341 } 1389 1342 1390 1343 - (NSString *) server { 1391 if( ! _chatConnectionSettings ) return nil; 1392 return [self stringWithEncodedBytes:_chatConnectionSettings -> address]; 1344 return [[_server retain] autorelease]; 1393 1345 } 1394 1346 … … 1396 1348 1397 1349 - (void) setServerPort:(unsigned short) port { 1398 IrssiLock(); 1399 if( _chatConnectionSettings ) 1400 _chatConnectionSettings -> port = ( port ? port : 6667 ); 1401 IrssiUnlock(); 1350 _serverPort = ( port ? port : 6667 ); 1402 1351 } 1403 1352 1404 1353 - (unsigned short) serverPort { 1405 if( ! _chatConnectionSettings ) return 0; 1406 return _chatConnectionSettings -> port; 1354 return _serverPort; 1407 1355 } 1408 1356 … … 1410 1358 1411 1359 - (void) setSecure:(BOOL) ssl { 1412 IrssiLock(); 1413 1414 if( _chatConnectionSettings ) { 1415 _chatConnectionSettings -> use_ssl = ssl; 1416 _chatConnectionSettings -> ssl_verify = NO; 1417 } 1418 1419 IrssiUnlock(); 1360 _secure = ssl; 1420 1361 } 1421 1362 1422 1363 - (BOOL) isSecure { 1423 if( ! _chatConnectionSettings ) return NO; 1424 return _chatConnectionSettings -> use_ssl; 1364 return _secure; 1425 1365 } 1426 1366 … … 1428 1368 1429 1369 - (void) setProxyServer:(NSString *) address { 1430 IrssiLock(); 1431 1432 if( _chatConnectionSettings ) { 1433 g_free_not_null( _chatConnectionSettings -> proxy ); 1434 _chatConnectionSettings -> proxy = g_strdup( [self encodedBytesWithString:address] ); 1435 } 1436 1437 IrssiUnlock(); 1370 id old = _proxyServer; 1371 _proxyServer = [address copyWithZone:nil]; 1372 [old release]; 1438 1373 } 1439 1374 1440 1375 - (NSString *) proxyServer { 1441 if( ! _chatConnectionSettings ) return nil; 1442 return [self stringWithEncodedBytes:_chatConnectionSettings -> proxy]; 1376 return [[_proxyServer retain] autorelease]; 1443 1377 } 1444 1378 … … 1446 1380 1447 1381 - (void) setProxyServerPort:(unsigned short) port { 1448 IrssiLock(); 1449 if( _chatConnectionSettings ) 1450 _chatConnectionSettings -> proxy_port = port; 1451 IrssiUnlock(); 1382 _proxyServerPort = port; 1452 1383 } 1453 1384 1454 1385 - (unsigned short) proxyServerPort { 1455 if( ! _chatConnectionSettings ) return 0; 1456 return _chatConnectionSettings -> proxy_port; 1386 return _proxyServerPort; 1457 1387 } 1458 1388 … … 1486 1416 NSParameterAssert( raw != nil ); 1487 1417 1488 IrssiLock(); 1489 if( _chatConnection ) 1490 irc_send_cmd_full( (IRC_SERVER_REC *) _chatConnection, [self encodedBytesWithString:raw], now, now, FALSE); 1491 IrssiUnlock(); 1418 const char *rawString = [self encodedBytesWithString:raw]; 1419 if( ! rawString ) return; 1420 1421 NSMutableData *data = [[NSMutableData allocWithZone:nil] initWithBytes:(void *)rawString length:strlen( rawString )]; 1422 [data appendBytes:"\x0D\x0A" length:2]; 1423 1424 [_chatConnection writeData:data withTimeout:-1. tag:0]; 1425 [data release]; 1492 1426 } 1493 1427 … … 1571 1505 NSParameterAssert( [[user nickname] length] > 0 ); 1572 1506 1573 IrssiLock();1507 /* IrssiLock(); 1574 1508 const char *mask = [self encodedBytesWithString:[NSString stringWithFormat:@"%@!*@*", [user nickname]]]; 1575 1509 if( ! notifylist_find( mask, NULL ) ) notifylist_add( mask, NULL, TRUE, 600 ); 1576 IrssiUnlock(); 1510 IrssiUnlock(); */ 1577 1511 } 1578 1512 … … 1581 1515 NSParameterAssert( [[user nickname] length] > 0 ); 1582 1516 1583 IrssiLock();1517 /* IrssiLock(); 1584 1518 notifylist_remove( [self encodedBytesWithString:[NSString stringWithFormat:@"%@!*@*", [user nickname]]] ); 1585 IrssiUnlock(); 1519 IrssiUnlock(); */ 1586 1520 } 1587 1521 … … 1611 1545 1612 1546 _awayMessage = [message copyWithZone:nil]; 1613 const char *msg = [[self class] _flattenedIRCStringForMessage:message withEncoding:[self encoding] andChatFormat:[self outgoingChatFormat]];1547 /* const char *msg = [[self class] _flattenedIRCStringForMessage:message withEncoding:[self encoding] andChatFormat:[self outgoingChatFormat]]; 1614 1548 1615 1549 IrssiLock(); 1616 1550 if( _chatConnection ) 1617 1551 irc_send_cmdv( (IRC_SERVER_REC *) _chatConnection, "AWAY :%s", msg ); 1618 IrssiUnlock(); 1552 IrssiUnlock(); */ 1619 1553 } else { 1620 1554 [[self localUser] _setStatus:MVChatUserAvailableStatus]; … … 1628 1562 unsigned int lag = 0; 1629 1563 1630 IrssiLock();1564 /* IrssiLock(); 1631 1565 if( _chatConnection ) 1632 1566 lag = _chatConnection -> lag; 1633 IrssiUnlock(); 1567 IrssiUnlock(); */ 1634 1568 1635 1569 return lag; 1636 } */1570 } 1637 1571 @end 1638 1572 … … 1640 1574 1641 1575 @implementation MVIRCChatConnection (MVIRCChatConnectionPrivate) 1576 - (void) socket:(AsyncSocket *) sock willDisconnectWithError:(NSError *) error { 1577 NSLog(@"willDisconnectWithError: %@", error ); 1578 _status = MVChatConnectionServerDisconnectedStatus; 1579 if( ABS( [_lastConnectAttempt timeIntervalSinceNow] ) > 300. ) 1580 [self performSelector:@selector( connect ) withObject:nil afterDelay:5.]; 1581 [self scheduleReconnectAttemptEvery:30.]; 1582 } 1583 1584 - (void) socketDidDisconnect:(AsyncSocket *) sock { 1585 if( _status != MVChatConnectionServerDisconnectedStatus ) 1586 _status = MVChatConnectionDisconnectedStatus; 1587 [self _didDisconnect]; 1588 } 1589 1590 - (void) socket:(AsyncSocket *) sock didConnectToHost:(NSString *) host port:(UInt16) port { 1591 [self _didConnect]; 1592 [self _readNextMessageFromServer]; 1593 } 1594 1595 - (void) _readNextMessageFromServer { 1596 static NSData *delimeter = nil; 1597 if( ! delimeter ) delimeter = [[NSData allocWithZone:nil] initWithBytes:"\x0D\x0A" length:2]; 1598 [_chatConnection readDataToData:delimeter withTimeout:-1. tag:0]; 1599 } 1600 1601 - (void) socket:(AsyncSocket *) sock didReadData:(NSData *) data withTag:(long) tag { 1602 NSString *rawString = [[NSString allocWithZone:nil] initWithData:data encoding:[self encoding]]; 1603 char *line = (char *)[(NSMutableData *)data mutableBytes]; 1604 unsigned int len = [data length]; 1605 1606 char *sender = NULL; 1607 char *user = NULL; 1608 char *host = NULL; 1609 char *command = NULL; 1610 char *currentParameter = NULL; 1611 NSMutableArray *parameters = [[NSMutableArray allocWithZone:nil] initWithCapacity:10]; 1612 1613 if( len <= 2 || len > 512 ) 1614 goto end; // bad message 1615 1616 BOOL done = NO; 1617 if( *line != '\r' && ! done ) { 1618 if( *line == ':' ) { 1619 // prefix: ':' <sender> [ '!' <user> ] [ '@' <host> ] ' ' { ' ' } 1620 sender = ++line; 1621 while( *line != '\r' && *line != ' ' && *line != '!' && *line != '@' ) line++; 1622 if( *line == '\r' ) done = YES; 1623 1624 if( *line == '!' ) { 1625 *line++ = '\0'; 1626 user = line; 1627 while( *line != '\r' && *line != ' ' && *line != '@' && ! done ) line++; 1628 if( *line == '\r' ) done = YES; 1629 if( *line != '@' ) *line = '\0'; 1630 } 1631 1632 if( *line == '@' ) { 1633 *line++ = '\0'; 1634 host = line; 1635 while( *line != '\r' && *line != ' ' && ! done ) line++; 1636 if( *line == '\r' ) done = YES; 1637 *line = '\0'; 1638 } 1639 1640 if( *line == ' ' ) { 1641 *line++ = '\0'; 1642 while( *line == ' ' && ! done ) line++; 1643 } 1644 } 1645 1646 if( *line != '\r' && ! done ) { 1647 // command: <letter> { <letter> } | <number> <number> <number> 1648 // letter: 'a' ... 'z' | 'A' ... 'Z' 1649 // number: '0' ... '9' 1650 command = line; 1651 while( *line != '\r' && *line != ' ' && ! done ) line++; 1652 if( *line == ' ' ) { 1653 *line++ = '\0'; 1654 while( *line == ' ' && ! done ) line++; 1655 } 1656 } 1657 1658 NSString *param = nil; 1659 while( *line != '\r' && ! done ) { 1660 // params: [ ':' <trailing data> | <letter> { <letter> } ] [ ' ' { ' ' } ] [ <params> ] 1661 currentParameter = NULL; 1662 param = nil; 1663 if( *line == ':' ) { 1664 currentParameter = ++line; 1665 while( *line != '\r' && ! done ) line++; 1666 *line = '\0'; 1667 done = YES; 1668 } else { 1669 currentParameter = line; 1670 while( *line != '\r' && *line != ' ' && ! done ) line++; 1671 if( *line == '\r' ) done = YES; 1672 *line++ = '\0'; 1673 } 1674 1675 if( currentParameter ) 1676 param = [NSString stringWithBytes:currentParameter encoding:NSASCIIStringEncoding]; 1677 if( param ) [parameters addObject:param]; 1678 1679 while( *line == ' ' && ! done ) line++; 1680 } 1681 } 1682 1683 end: 1684 NSLog(@"%s %s %s %s %@", sender, user, host, command, [parameters description] ); 1685 1686 NSNotification *note = [NSNotification notificationWithName:MVChatConnectionGotRawMessageNotification object:self userInfo:[NSDictionary dictionaryWithObjectsAndKeys:rawString, @"message", [NSNumber numberWithBool:NO], @"outbound", nil]]; 1687 [[NSNotificationCenter defaultCenter] postNotification:note]; 1688 [rawString release]; 1689 1690 [parameters release]; 1691 [self _readNextMessageFromServer]; 1692 } 1693 1642 1694 /* + (MVIRCChatConnection *) _connectionForServer:(SERVER_REC *) server { 1643 1695 if( ! server ) return nil;
