Example #1
0
        public async Task <IHttpActionResult> Novo()
        {
            //Verifica se há um usuário válido logado.
            ApplicationUser user = await UserManager.FindByIdAsync(User.Identity.GetUserId());

            if (user == null)
            {
                return(Unauthorized());
            }

            // Checar se o request é multipart/form-data.
            if (!Request.Content.IsMimeMultipartContent("form-data"))
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            //Processo de leitura do arquivo//
            string root     = HttpContext.Current.Server.MapPath("~/App_Data");
            var    provider = new MultipartFormDataStreamProvider(root);
            await Request.Content.ReadAsMultipartAsync(provider);

            string CategoryID = provider.FormData["categoryId"];
            string CSVTags    = provider.FormData["tags"];
            string Filename   = provider.FormData["filename"];

            //Análise e estruturação do arquivo
            TextParser parser = new TextParser();

            byte[] binaryData = File.ReadAllBytes(provider.FileData[0].LocalFileName);

            Node fbxFile;

            try
            {
                fbxFile = parser.ParseFromStream(new MemoryStream(binaryData));
            }
            catch (Exception ex)
            {
                return(BadRequest("Arquivo FBX inválido. - " + ex.Message));
            }


            //Carregamento da lista de objetos existentes no arquivo
            var objects = new List <FBXObject>();

            foreach (Property prop in (fbxFile.Properties.First(d => d.Name == "Objects").Value as Node).Properties)
            {
                var obj = FBXObject.GetFBXObjectFromObjectNode(prop.Value as Node);
                objects.Add(obj);
            }

            //Pega todas as conexões existentes e seus objetos.
            FBXObject rootNode = new FBXObject()
            {
                UID = "0", Name = "Root"
            };
            var connections = FBXConnection.GetConnectionsFromConnectionNode(fbxFile.Properties.
                                                                             First(D => D.Name == "Connections").Value as Node, objects, rootNode).ToList();

            //Objeto final a ser armazenado contendo estrutura, objetos e conexões
            Final        final  = new Final(connections, objects, fbxFile);
            MemoryStream memory = new MemoryStream();

            (new BinaryFormatter()).Serialize(memory, final);


            //Dado a ser guardado no banco
            var file = new Files()
            {
                Id               = Guid.NewGuid().ToString(),
                BinaryFile       = binaryData,
                ApplicationUser  = db.Users.First(d => d.Id == user.Id),
                Name             = Filename,
                FinalInformation = memory.GetBuffer(),
                Category         = db.Categories.First(d => d.Id == CategoryID),
                UpdateDateTime   = DateTime.Now
            };


            db.Files.Add(file);
            db.SaveChanges();
            SaveTagsForFile(CSVTags, file);
            SaveContentsForFile(final, file);
            db.SaveChanges();
            return(Ok(file.Id));
        }
    // $ANTLR end "list"


    // $ANTLR start "objectDeclaration"
    // E:\\DEVELOP\\Visual Studio Projects\\Vsual Studio 2010\\GameEngineSlimDX\\GEngine\\ResourcesManagers\\FBXParser\\fbx.g:93:1: objectDeclaration[string id] returns [FBXDeclarationNode dec] : ( (name= STRING ( COMMA type= STRING )? | index= NUMBER ) )? LCURLY (node= declaration )* RCURLY ;
    public FBXDeclarationNode objectDeclaration(string id) // throws RecognitionException [1]
    {
        FBXDeclarationNode dec = null;

        IToken             name  = null;
        IToken             type  = null;
        IToken             index = null;
        FBXDeclarationNode node  = null;


        try
        {
            // E:\\DEVELOP\\Visual Studio Projects\\Vsual Studio 2010\\GameEngineSlimDX\\GEngine\\ResourcesManagers\\FBXParser\\fbx.g:94:2: ( ( (name= STRING ( COMMA type= STRING )? | index= NUMBER ) )? LCURLY (node= declaration )* RCURLY )
            // E:\\DEVELOP\\Visual Studio Projects\\Vsual Studio 2010\\GameEngineSlimDX\\GEngine\\ResourcesManagers\\FBXParser\\fbx.g:94:4: ( (name= STRING ( COMMA type= STRING )? | index= NUMBER ) )? LCURLY (node= declaration )* RCURLY
            {
                // E:\\DEVELOP\\Visual Studio Projects\\Vsual Studio 2010\\GameEngineSlimDX\\GEngine\\ResourcesManagers\\FBXParser\\fbx.g:94:4: ( (name= STRING ( COMMA type= STRING )? | index= NUMBER ) )?
                int alt8  = 2;
                int LA8_0 = input.LA(1);

                if ((LA8_0 == NUMBER || LA8_0 == STRING))
                {
                    alt8 = 1;
                }
                switch (alt8)
                {
                case 1:
                    // E:\\DEVELOP\\Visual Studio Projects\\Vsual Studio 2010\\GameEngineSlimDX\\GEngine\\ResourcesManagers\\FBXParser\\fbx.g:94:6: (name= STRING ( COMMA type= STRING )? | index= NUMBER )
                {
                    // E:\\DEVELOP\\Visual Studio Projects\\Vsual Studio 2010\\GameEngineSlimDX\\GEngine\\ResourcesManagers\\FBXParser\\fbx.g:94:6: (name= STRING ( COMMA type= STRING )? | index= NUMBER )
                    int alt7  = 2;
                    int LA7_0 = input.LA(1);

                    if ((LA7_0 == STRING))
                    {
                        alt7 = 1;
                    }
                    else if ((LA7_0 == NUMBER))
                    {
                        alt7 = 2;
                    }
                    else
                    {
                        NoViableAltException nvae_d7s0 =
                            new NoViableAltException("", 7, 0, input);

                        throw nvae_d7s0;
                    }
                    switch (alt7)
                    {
                    case 1:
                        // E:\\DEVELOP\\Visual Studio Projects\\Vsual Studio 2010\\GameEngineSlimDX\\GEngine\\ResourcesManagers\\FBXParser\\fbx.g:94:8: name= STRING ( COMMA type= STRING )?
                    {
                        name = (IToken)Match(input, STRING, FOLLOW_STRING_in_objectDeclaration542);
                        // E:\\DEVELOP\\Visual Studio Projects\\Vsual Studio 2010\\GameEngineSlimDX\\GEngine\\ResourcesManagers\\FBXParser\\fbx.g:94:20: ( COMMA type= STRING )?
                        int alt6  = 2;
                        int LA6_0 = input.LA(1);

                        if ((LA6_0 == COMMA))
                        {
                            alt6 = 1;
                        }
                        switch (alt6)
                        {
                        case 1:
                            // E:\\DEVELOP\\Visual Studio Projects\\Vsual Studio 2010\\GameEngineSlimDX\\GEngine\\ResourcesManagers\\FBXParser\\fbx.g:94:21: COMMA type= STRING
                        {
                            Match(input, COMMA, FOLLOW_COMMA_in_objectDeclaration545);
                            type = (IToken)Match(input, STRING, FOLLOW_STRING_in_objectDeclaration549);
                        }
                        break;
                        }
                    }
                    break;

                    case 2:
                        // E:\\DEVELOP\\Visual Studio Projects\\Vsual Studio 2010\\GameEngineSlimDX\\GEngine\\ResourcesManagers\\FBXParser\\fbx.g:94:43: index= NUMBER
                    {
                        index = (IToken)Match(input, NUMBER, FOLLOW_NUMBER_in_objectDeclaration559);
                    }
                    break;
                    }


                    if (name != null)
                    {
                        dec = new FBXObject(name.Text, type != null? type.Text : null);
                    }
                    else
                    {
                        dec = new FBXObject();
                    }
                    dec.Type = id;
                    if (index != null)
                    {
                        ((FBXObject)dec).Index = int.Parse(index.Text);
                    }
                }
                break;
                }

                Match(input, LCURLY, FOLLOW_LCURLY_in_objectDeclaration570);
                // E:\\DEVELOP\\Visual Studio Projects\\Vsual Studio 2010\\GameEngineSlimDX\\GEngine\\ResourcesManagers\\FBXParser\\fbx.g:105:4: (node= declaration )*
                do
                {
                    int alt9  = 2;
                    int LA9_0 = input.LA(1);

                    if ((LA9_0 == ID))
                    {
                        alt9 = 1;
                    }


                    switch (alt9)
                    {
                    case 1:
                        // E:\\DEVELOP\\Visual Studio Projects\\Vsual Studio 2010\\GameEngineSlimDX\\GEngine\\ResourcesManagers\\FBXParser\\fbx.g:105:10: node= declaration
                    {
                        PushFollow(FOLLOW_declaration_in_objectDeclaration583);
                        node = declaration();
                        state.followingStackPointer--;


                        if (dec == null)
                        {
                            dec      = new FBXObject();
                            dec.Type = id;
                        }
                        ((FBXObject)dec).Add(node);
                    }
                    break;

                    default:
                        goto loop9;
                    }
                } while (true);

loop9:
                ;               // Stops C# compiler whining that label 'loop9' has no statements

                Match(input, RCURLY, FOLLOW_RCURLY_in_objectDeclaration599);

                if (dec == null)
                {
                    dec      = new FBXObject();
                    dec.Type = id;
                }
            }
        }
        catch (RecognitionException re)
        {
            ReportError(re);
            Recover(input, re);
        }
        finally
        {
        }
        return(dec);
    }