public IList <Dominio.Foto> Pesquisar(Dominio.Foto objeto, int qtde = 0)
        {
            ICriteria criteria = NHibernate.HttpModule.RecuperarSessao.CreateCriteria(typeof(Dominio.Foto));

            criteria.AddOrder(Order.Desc("Codigo"));

            if (qtde > 0)
            {
                criteria.SetMaxResults(qtde);
            }

            if (objeto == null)
            {
                return(criteria.List <Dominio.Foto>());
            }

            if (objeto.Codigo > 0)
            {
                criteria = criteria.Add(Expression.Eq("Codigo", objeto.Codigo));
            }
            if (!string.IsNullOrEmpty(objeto.Legenda))
            {
                criteria = criteria.Add(Expression.InsensitiveLike("Legenda", string.Format("%{0}%", objeto.Legenda)));
            }
            if (!string.IsNullOrEmpty(objeto.Fonte))
            {
                criteria = criteria.Add(Expression.Eq("Fonte", objeto.Fonte));
            }

            criteria = criteria.Add(Expression.Eq("Galeria", objeto.Galeria));

            IList <Dominio.Foto> fotos = criteria.List <Dominio.Foto>();

            return(fotos);
        }
        /// <summary>
        /// Exclui uma foto do sistema.
        /// </summary>
        /// <param name="codigo">código da foto</param>
        /// <returns>caso a foto tenha sido excluida</returns>
        public bool ExcluirFoto(int codigo)
        {
            try
            {
                IFactoryDAO fabrica = FactoryFactoryDAO.GetFabrica();
                IFotoDAO    fotoDAO = fabrica.GetFotoDAO();

                Dominio.Foto foto = fotoDAO.Pesquisar(codigo);

                if (fotoDAO.Excluir(foto.Codigo))
                {
                    this.ExcluirImagemGaleria(foto.Caminho);
                }
                else
                {
                    return(false);
                }

                return(true);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        /// <summary>
        /// Consulta de fotos cadastradas.
        /// </summary>
        /// <param name="foto">objeto fotos com os parametros de consulta</param>
        /// <returns>lista das fotos referentes a pesquisa.</returns>
        public IList <Dominio.Foto> PesquisarFoto(Dominio.Foto foto, int qtde = 0, int pagina = 0)
        {
            try
            {
                IFactoryDAO fabrica = FactoryFactoryDAO.GetFabrica();
                IFotoDAO    fotoDAO = fabrica.GetFotoDAO();

                return(fotoDAO.Pesquisar(foto, qtde, pagina));
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        public Dominio.Foto Cadastrar(Dominio.Foto objeto)
        {
            try
            {
                NHibernate.HttpModule.RecuperarSessao.Transaction.Begin();
                objeto.Codigo = (int)NHibernate.HttpModule.RecuperarSessao.Save(objeto);
                NHibernate.HttpModule.RecuperarSessao.Transaction.Commit();
            }
            catch (Exception e)
            {
                NHibernate.HttpModule.RecuperarSessao.Transaction.Rollback();
            }

            return(objeto);
        }
        public bool Excluir(int codigo)
        {
            Dominio.Foto foto = this.Pesquisar(codigo);

            using (ISession session = NHibernate.HttpModule.RecuperarSessao)
                using (ITransaction transaction = session.BeginTransaction())
                {
                    try
                    {
                        NHibernate.HttpModule.RecuperarSessao.Delete(foto);
                        transaction.Commit();
                    }
                    catch (HibernateException e)
                    {
                        transaction.Rollback();
                        throw new ApplicationException("Existem outros registros vinculados, foto não pode ser excluída", e.InnerException);
                    }
                }

            return(true);
        }
        /// <summary>
        /// Cadastra uma nova foto em banco
        /// </summary>
        /// <param name="foto">objetos com os dados da foto</param>
        /// <param name="arquivo">arquivo da foto</param>
        /// <returns>Foto cadastrada com o código gerado</returns>
        public Dominio.Foto SalvarFoto(Dominio.Foto foto, HttpPostedFileBase file)
        {
            try
            {
                if (foto == null)
                {
                    throw new ArgumentNullException("foto");
                }

                IFactoryDAO fabrica = FactoryFactoryDAO.GetFabrica();
                IFotoDAO    fotoDAO = fabrica.GetFotoDAO();
                string      path    = "~/AppData/Foto/";

                foto.Caminho = string.Format("Usuario/{0}.jpg", foto.Legenda);

                this.SalvarImagem
                (
                    this.RedimensionarImagem(file.InputStream, 90, 90), HttpContext.Current.Server.MapPath(path + foto.Caminho)
                );

                foto.Galeria = false;

                if (foto.Codigo == 0)
                {
                    return(fotoDAO.Cadastrar(foto));
                }

                fotoDAO.Alterar(foto);

                return(foto);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        /// <summary>
        /// Cadastra uma nova foto em banco,
        /// Salvando todos os tamanhos necessários para galeria.
        /// </summary>
        /// <param name="foto">objetos com os dados da foto</param>
        /// <param name="arquivo">arquivo da foto</param>
        /// <returns>Foto cadastrada com o código gerado</returns>
        public Dominio.Foto SalvarFotoGaleria(Dominio.Foto foto, HttpPostedFileBase file)
        {
            try
            {
                // TODO: verificar transação
                // using (TransactionScope transacao = new TransactionScope())
                //{
                if (foto == null)
                {
                    throw new ArgumentNullException("foto");
                }

                IFactoryDAO fabrica = FactoryFactoryDAO.GetFabrica();
                IFotoDAO    fotoDAO = fabrica.GetFotoDAO();
                string      caminho = string.Empty;

                foto.Galeria = true;

                if (file != null)
                {
                    Image imagem = Image.FromStream(file.InputStream);

                    foto.Caminho = this.GerarCaminhoImagem(file);
                    double proporcao = 0;

                    if (imagem.Size.Width > imagem.Size.Height)
                    {
                        // imagem horizontal
                        proporcao = (double)imagem.Size.Height / (double)imagem.Size.Width;
                    }
                    else
                    {
                        // imagem vertical
                        proporcao = (double)imagem.Size.Width / (double)imagem.Size.Height;
                    }


                    foreach (dynamic tamanho in tamanhos)
                    {
                        caminho = string.Format("{0}\\{1}\\{2}", HttpContext.Current.Server.MapPath("~/AppData/Foto"), tamanho.caminho, foto.Caminho.Replace("/", @"\"));

                        // Se a imagem for mais larga que 1024px, reduz para esse tamanho e salva
                        if (imagem.Size.Width > 1024 && tamanho.largura == 1024)
                        {
                            if (imagem.Size.Width > imagem.Size.Height)
                            {
                                this.SalvarImagem
                                (
                                    this.RedimensionarImagem(file.InputStream, (int)(((double)tamanho.largura) * proporcao), tamanho.largura),
                                    caminho
                                );
                            }
                            else
                            {
                                this.SalvarImagem
                                (
                                    this.RedimensionarImagem(file.InputStream, tamanho.largura, (int)(((double)tamanho.largura) * proporcao)),
                                    caminho
                                );
                            }
                        }
                        // Se a imagem tiver 1024px ou menos e estiver na hora de salvar a full, mantem o tamanho dela
                        else if (tamanho.largura == 1024)
                        {
                            this.SalvarImagem
                            (
                                this.RedimensionarImagem(file.InputStream, imagem.Size.Height, imagem.Size.Width),
                                caminho
                            );
                        }
                        else// if (tamanho.largura == 300)
                        {
                            if (imagem.Size.Width > imagem.Size.Height)
                            {
                                this.SalvarImagem
                                (
                                    this.RedimensionarImagem(file.InputStream, (int)(((double)tamanho.largura) * proporcao), tamanho.largura),
                                    caminho
                                );
                            }
                            else
                            {
                                this.SalvarImagem
                                (
                                    this.RedimensionarImagem(file.InputStream, tamanho.largura, (int)(((double)tamanho.largura) * proporcao)),
                                    caminho
                                );
                            }
                        }

                        /*else
                         * {
                         *  this.SalvarImagem
                         *  (
                         *      this.RedimensionarImagem(file.InputStream, tamanho.largura, tamanho.altura),
                         *      caminho
                         *  );
                         * }*/
                    }
                }

                if (foto.Codigo == 0)
                {
                    foto = fotoDAO.Cadastrar(foto);
                    //ConteudoMySQL conteudo = new ConteudoMySQL();

                    //foto.Codigo = conteudo.InserirFoto(foto);
                }
                else
                {
                    fotoDAO.Alterar(foto);
                }

                //transacao.Complete();

                return(foto);
                //}
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        public void Alterar(Dominio.Foto objeto)
        {
            NHibernate.HttpModule.RecuperarSessao.Update(objeto);

            NHibernate.HttpModule.RecuperarSessao.Flush();
        }