public void Run() { try { ByteBuilder builder = new ByteBuilder(2048); // // Get first line // String line = socketLineReader.ReadLine(); if (line == null) { return; } if (line.StartsWith("GET ")) { uint start = BuildHttpResponseFromFirstLine(builder, line); if (builder.contentLength > 0) { socket.Send(builder.bytes, (int)start, (int)(builder.contentLength - start), SocketFlags.None); } socket.ShutdownAndDispose(); } else { // // Tcp Mode // do { if (!HandleLine(builder, line)) { socket.ShutdownAndDispose(); break; } if (builder.contentLength > 0) { socket.Send(builder.bytes, (int)builder.contentLength, SocketFlags.None); builder.Clear(); } line = socketLineReader.ReadLine(); } while (line != null); socket.ShutdownAndDispose(); } } catch (Exception e) { callback.UnhandledException(clientString, e); socket.ShutdownAndDispose(); } }
public static List <RemoteNpcObject> GetServerInterface(SocketLineReader socketLineReader, out Dictionary <String, RemoteNpcInterface> serverInterfaces) { socketLineReader.socket.Send(Encoding.ASCII.GetBytes(":interface\n")); serverInterfaces = new Dictionary <String, RemoteNpcInterface>(); List <SosMethodDefinition> methodDefinitionList = new List <SosMethodDefinition>(); while (true) { String interfaceName = socketLineReader.ReadLine(); if (interfaceName == null) { throw UnexpectedClose(socketLineReader); } if (interfaceName.Length <= 0) { break; } // Get parent interfaces String[] parentInterfaceNames = null; Int32 spaceIndex = interfaceName.IndexOf(' '); if (spaceIndex >= 0) { parentInterfaceNames = interfaceName.Substring(spaceIndex + 1).Split(' '); interfaceName = interfaceName.Remove(spaceIndex); } while (true) { String methodDefinitionLine = socketLineReader.ReadLine(); if (methodDefinitionLine == null) { throw UnexpectedClose(socketLineReader); } if (methodDefinitionLine.Length <= 0) { break; } SosMethodDefinition methodDefinition = SosTypes.ParseMethodDefinition(methodDefinitionLine, 0); methodDefinitionList.Add(methodDefinition); } serverInterfaces.Add(interfaceName, new RemoteNpcInterface(interfaceName, parentInterfaceNames, methodDefinitionList.ToArray())); methodDefinitionList.Clear(); } List <RemoteNpcObject> serverObjects = new List <RemoteNpcObject>(); while (true) { String objectLine = socketLineReader.ReadLine(); if (objectLine == null) { throw UnexpectedClose(socketLineReader); } if (objectLine.Length <= 0) { break; } String objectName = objectLine.Peel(out objectLine); String[] interfaceNames = objectLine.Split(RemoteNpcObject.SplitChars, StringSplitOptions.RemoveEmptyEntries); RemoteNpcInterface[] interfaces = new RemoteNpcInterface[interfaceNames.Length]; for (int i = 0; i < interfaceNames.Length; i++) { String interfaceName = interfaceNames[i]; RemoteNpcInterface npcInterface; if (!serverInterfaces.TryGetValue(interfaceName, out npcInterface)) { throw new FormatException(String.Format("The NPC server returned interface '{0}' in the :objects command but not in the :interfaces command", interfaceName)); } interfaces[i] = npcInterface; } serverObjects.Add(new RemoteNpcObject(objectName, interfaces)); } return(serverObjects); }
public void UpdateAndVerifyEnumAndObjectTypes(NpcVerifyCriteria criteria) { if (threadSafe) { Monitor.Enter(serverEndPoint); } try { // // The reason for the retry logic is because if the underlying socket is disconnected, it may not // fail until after a send and a receive...so the socket should be reconnected and the request should // be repeated only once. // for (UInt32 attempt = 0; ; attempt++) { try { Connect(); socketLineReader.socket.Send(Encoding.UTF8.GetBytes(":type\n")); enumAndObjectTypes.Clear(); while (true) { String typeDefinitionLine = socketLineReader.ReadLine(); if (typeDefinitionLine == null) { if (attempt == 0) { Dispose(); continue; // Retry } throw UnexpectedClose(); } if (typeDefinitionLine.Length == 0) { break; // empty line } Int32 spaceIndex = typeDefinitionLine.IndexOf(' '); String sosTypeName = typeDefinitionLine.Remove(spaceIndex); String typeDefinition = typeDefinitionLine.Substring(spaceIndex + 1); Type type = GetTypeFromSosTypeName(sosTypeName); if (typeDefinition.StartsWith("Enum")) { SosEnumDefinition enumDefinition = SosTypes.ParseSosEnumTypeDefinition(typeDefinition, 4); enumDefinition.VerifyType(type, (SosVerifyCriteria)criteria); } else { SosObjectDefinition objectDefinition = SosTypes.ParseSosObjectTypeDefinition(typeDefinition, 0); objectDefinition.VerifyType(type); } enumAndObjectTypes.Add(type); } return; } catch (SocketException) { if (socketLineReader != null) { socketLineReader.Dispose(); socketLineReader = null; } if (attempt == 0) { continue; // Retry } throw; } } } finally { if (threadSafe) { Monitor.Exit(serverEndPoint); } } }