public static MetaWeblogResult AddSecurityFault(this MetaWeblogResult result)
        {
            var faultStruct = new FaultStruct();

            faultStruct.faultCode   = "11"; // invalid access
            faultStruct.faultString = "Authentication Failed";
            result.Fault            = faultStruct;

            return(result);
        }
        public static MetaWeblogResult AddValidatonFault(this MetaWeblogResult result)
        {
            var faultStruct = new FaultStruct();

            faultStruct.faultCode   = "802"; // invalid access
            faultStruct.faultString = "invalid request";
            result.Fault            = faultStruct;

            return(result);
        }
        public async Task <MetaWeblogResult> ProcessRequest(
            MetaWeblogRequest input,
            MetaWeblogSecurityResult permission,
            CancellationToken cancellationToken)
        {
            MetaWeblogResult output = new MetaWeblogResult();

            output.Method = input.MethodName;

            switch (input.MethodName)
            {
            case "metaWeblog.newPost":
                if (permission.CanEditPosts)
                {
                    output.PostId = await service.NewPost(
                        input.BlogId,
                        input.UserName,
                        input.Password,
                        input.Post,
                        input.Publish,
                        permission.DisplayName
                        );
                }
                else
                {
                    output.AddSecurityFault();
                }

                break;

            case "metaWeblog.editPost":
                if (permission.CanEditPosts)
                {
                    output.Completed = await service.EditPost(
                        input.BlogId,
                        input.PostId,
                        input.UserName,
                        input.Password,
                        input.Post,
                        input.Publish);
                }
                else
                {
                    output.AddSecurityFault();
                }


                break;

            case "metaWeblog.getPost":
                if (permission.CanEditPosts)
                {
                    var postStruct = await service.GetPost(
                        input.BlogId,
                        input.PostId,
                        input.UserName,
                        input.Password,
                        cancellationToken
                        );

                    output.Post = postStruct;
                    if (string.IsNullOrEmpty(output.Post.postId))
                    {
                        output.Fault = new FaultStruct {
                            faultCode = "404", faultString = "post not found"
                        };
                    }
                }
                else
                {
                    output.AddSecurityFault();
                }

                break;

            case "metaWeblog.newMediaObject":
            case "wp.uploadFile":
                if (permission.CanEditPosts || permission.CanEditPages)
                {
                    output.MediaInfo = await service.NewMediaObject(
                        input.BlogId,
                        input.UserName,
                        input.Password,
                        input.MediaObject);
                }
                else
                {
                    output.AddSecurityFault();
                }

                break;

            case "metaWeblog.getCategories":
                if (permission.CanEditPosts || permission.CanEditPages)
                {
                    output.Categories = await service.GetCategories(
                        input.BlogId,
                        input.UserName,
                        input.Password,
                        cancellationToken);
                }
                else
                {
                    output.AddSecurityFault();
                }

                break;

            case "wp.newCategory":
                if (permission.CanEditPosts || permission.CanEditPages)
                {
                    output.CategoryId = await service.NewCategory(
                        input.BlogId,
                        input.Category,
                        input.UserName,
                        input.Password
                        );
                }
                else
                {
                    output.AddSecurityFault();
                }

                break;

            case "metaWeblog.getRecentPosts":
                if (permission.CanEditPosts)
                {
                    var posts = await service.GetRecentPosts(
                        input.BlogId,
                        input.UserName,
                        input.Password,
                        input.NumberOfPosts,
                        cancellationToken);

                    output.Posts = posts;
                }
                else
                {
                    output.AddSecurityFault();
                }
                break;

            case "blogger.getUsersBlogs":
            case "metaWeblog.getUsersBlogs":
            case "wp.getUsersBlogs":
                output.Blogs = await service.GetUserBlogs(
                    input.AppKey,
                    input.UserName,
                    input.Password,
                    cancellationToken);

                break;

            case "blogger.deletePost":
                if (permission.CanEditPosts)
                {
                    output.Completed = await service.DeletePost(
                        input.BlogId,
                        input.PostId,
                        input.UserName,
                        input.Password
                        );
                }
                else
                {
                    output.AddSecurityFault();
                }

                break;

            case "blogger.getUserInfo":
                // Not implemented.  Not planned.
                throw new MetaWeblogException("10", "The method GetUserInfo is not implemented.");

            case "wp.newPage":
                if (permission.CanEditPages)
                {
                    output.PageId = await service.NewPage(
                        input.BlogId,
                        input.UserName,
                        input.Password,
                        input.Page,
                        input.Publish);
                }
                else
                {
                    output.AddSecurityFault();
                }

                break;

            case "wp.getPageList":
                if (permission.CanEditPages)
                {
                    output.Pages = await service.GetPageList(
                        input.BlogId,
                        input.UserName,
                        input.Password,
                        cancellationToken);
                }
                else
                {
                    output.AddSecurityFault();
                }

                break;

            case "wp.getPages":
                if (permission.CanEditPages)
                {
                    output.Pages = await service.GetPages(
                        input.BlogId,
                        input.UserName,
                        input.Password,
                        cancellationToken);
                }
                else
                {
                    output.AddSecurityFault();
                }

                break;

            case "wp.getPage":
                if (permission.CanEditPages)
                {
                    output.Page = await service.GetPage(
                        input.BlogId,
                        input.PageId,
                        input.UserName,
                        input.Password,
                        cancellationToken);
                }
                else
                {
                    output.AddSecurityFault();
                }

                break;

            case "wp.editPage":
                if (permission.CanEditPages)
                {
                    output.Completed = await service.EditPage(
                        input.BlogId,
                        input.PageId,
                        input.UserName,
                        input.Password,
                        input.Page,
                        input.Publish);
                }
                else
                {
                    output.AddSecurityFault();
                }

                break;

            case "wp.deletePage":
                if (permission.CanEditPages)
                {
                    output.Completed = await service.DeletePage(
                        input.BlogId,
                        input.PageId,
                        input.UserName,
                        input.Password
                        );
                }
                else
                {
                    output.AddSecurityFault();
                }

                break;

            case "wp.getAuthors":
                // Not implemented.
                throw new MetaWeblogException("10", "The method getAuthors is not implemented.");

            //output.Authors = this.GetAuthors(input.BlogID, input.UserName, input.Password);
            //break;
            case "wp.getTags":
                // Not implemented.
                throw new MetaWeblogException("10", "The method getTags is not implemented.");
                //output.Keywords = this.GetKeywords(input.BlogID, input.UserName, input.Password);
                //break;
            }


            return(output);
        }