Exemplo n.º 1
0
        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();
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
                }
            }
        }