Exemple #1
0
    public void testNotifyOfServerChanges()
    {
        System.Xml.XmlDocument doc        = new System.Xml.XmlDocument();
        System.Xml.XmlElement  serverNode = doc.CreateElement("server");
        System.Xml.XmlElement  child1     = doc.CreateElement("child1");
        System.Xml.XmlElement  child2     = doc.CreateElement("child2");

        serverNode.AppendChild(child1);
        serverNode.AppendChild(child2);
        doc.AppendChild(serverNode);

        bool called = false;

        Action <object> callback = o => { called = true; Console.WriteLine(o.ToString()); };

        RoarManager.roarServerAllEvent += callback;

        RoarManager.NotifyOfServerChanges(serverNode);

        Assert.IsTrue(called);

        this.mockery.VerifyAllExpectationsHaveBeenMet();
    }
Exemple #2
0
    protected void OnServerResponse(string raw, string apicall, IRequestCallback cb)
    {
        var uc         = apicall.Split("/"[0]);
        var controller = uc[0];
        var action     = uc[1];

        if (Debug.isDebugBuild)
        {
            Debug.Log(raw);
        }

        // Fire call complete event
        RoarManager.OnRoarNetworkEnd("no id");

        // -- Parse the Roar response
        // Unexpected server response
        if (raw == null || raw.Length == 0 || raw[0] != '<')
        {
            // Error: fire the error callback
            System.Xml.XmlDocument doc   = new System.Xml.XmlDocument();
            System.Xml.XmlElement  error = doc.CreateElement("error");
            doc.AppendChild(error);
            error.AppendChild(doc.CreateTextNode(raw));
            if (cb != null)
            {
                cb.OnRequest(
                    new Roar.RequestResult(
                        RoarExtensions.CreateXmlElement("error", raw),
                        IWebAPI.INVALID_XML_ERROR,
                        "Invalid server response"
                        ));
            }
            return;
        }

        System.Xml.XmlElement root = null;
        try
        {
            root = RoarExtensions.CreateXmlElement(raw);
            if (root == null)
            {
                throw new System.Xml.XmlException("CreateXmlElement returned null");
            }
        }
        catch (System.Xml.XmlException e)
        {
            if (cb != null)
            {
                cb.OnRequest(
                    new Roar.RequestResult(
                        RoarExtensions.CreateXmlElement("error", raw),
                        IWebAPI.INVALID_XML_ERROR,
                        e.ToString()
                        ));
            }
            return;
        }

        System.Xml.XmlElement io = root.SelectSingleNode("/roar/io") as System.Xml.XmlElement;
        if (io != null)
        {
            if (cb != null)
            {
                cb.OnRequest(
                    new Roar.RequestResult(
                        root,
                        IWebAPI.IO_ERROR,
                        io.InnerText
                        ));
            }
            return;
        }

        int    callback_code;
        string callback_msg = "";

        System.Xml.XmlElement actionElement = root.SelectSingleNode("/roar/" + controller + "/" + action) as System.Xml.XmlElement;

        if (actionElement == null)
        {
            if (cb != null)
            {
                cb.OnRequest(
                    new Roar.RequestResult(
                        RoarExtensions.CreateXmlElement("error", raw),
                        IWebAPI.INVALID_XML_ERROR,
                        "Incorrect XML response"
                        ));
            }
            return;
        }

        // Pre-process <server> block if any and attach any processed data
        System.Xml.XmlElement serverElement = root.SelectSingleNode("/roar/server") as System.Xml.XmlElement;
        RoarManager.NotifyOfServerChanges(serverElement);

        // Status on Server returned an error. Action did not succeed.
        string status = actionElement.GetAttribute("status");

        if (status == "error")
        {
            callback_code = IWebAPI.UNKNOWN_ERR;
            callback_msg  = actionElement.SelectSingleNode("error").InnerText;
            string server_error = (actionElement.SelectSingleNode("error") as System.Xml.XmlElement).GetAttribute("type");
            if (server_error == "0")
            {
                if (callback_msg == "Must be logged in")
                {
                    callback_code = IWebAPI.UNAUTHORIZED;
                }
                if (callback_msg == "Invalid auth_token")
                {
                    callback_code = IWebAPI.UNAUTHORIZED;
                }
                if (callback_msg == "Must specify auth_token")
                {
                    callback_code = IWebAPI.BAD_INPUTS;
                }
                if (callback_msg == "Must specify name and hash")
                {
                    callback_code = IWebAPI.BAD_INPUTS;
                }
                if (callback_msg == "Invalid name or password")
                {
                    callback_code = IWebAPI.DISALLOWED;
                }
                if (callback_msg == "Player already exists")
                {
                    callback_code = IWebAPI.DISALLOWED;
                }

                logger.DebugLog(string.Format("[roar] -- response error: {0} (api call = {1})", callback_msg, apicall));
            }

            // Error: fire the callback
            // NOTE: The Unity version ASSUMES callback = errorCallback
            if (cb != null)
            {
                cb.OnRequest(new Roar.RequestResult(root, callback_code, callback_msg));
            }
        }

        // No error - pre-process the result
        else
        {
            System.Xml.XmlElement auth_token = actionElement.SelectSingleNode(".//auth_token") as System.Xml.XmlElement;
            if (auth_token != null && !string.IsNullOrEmpty(auth_token.InnerText))
            {
                RoarAuthToken = auth_token.InnerText;
            }

            callback_code = IWebAPI.OK;
            if (cb != null)
            {
                cb.OnRequest(new Roar.RequestResult(root, callback_code, callback_msg));
            }
        }

        RoarManager.OnCallComplete(new RoarManager.CallInfo(root, callback_code, callback_msg, "no id"));
    }