#!/usr/bin/python -tt
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# Copyright 2004 Duke University

"""
Exceptions and Errors thrown by yum.
"""

from i18n import to_unicode, to_utf8

class YumBaseError(Exception):
    """
    Base Yum Error. All other Errors thrown by yum should inherit from
    this.
    """
    def __init__(self, value=None):
        Exception.__init__(self)
        self.value = value
    def __str__(self):
        return "%s" % to_utf8(self.value)

    def __unicode__(self):
        return '%s' % to_unicode(self.value)

class YumGPGCheckError(YumBaseError):
    pass

class YumDownloadError(YumBaseError):
    pass

class YumTestTransactionError(YumBaseError):
    pass

class YumRPMCheckError(YumBaseError):
    pass
        
class YumRPMTransError(YumBaseError):
    """ This class means rpm's .ts.run() returned known errors. We are compat.
        with YumBaseError in that we print nicely, and compat. with traditional
        usage of this error from runTransaction(). """
    def __init__(self, msg, errors):
        self.msg    = msg
        self.errors = errors
        # old YumBaseError raises from runTransaction used to raise just this
        self.value  = self.errors

    def __str__(self):
        return "%s" %(self.msg,)

    def __unicode__(self):
        return '%s' % to_unicode(self.msg)


class LockError(YumBaseError):
    def __init__(self, errno, msg, pid=0):
        YumBaseError.__init__(self, msg)
        self.errno = errno
        self.msg = msg
        self.pid = pid
        
class DepError(YumBaseError):
    pass
    
class RepoError(YumBaseError):
    pass

class DuplicateRepoError(RepoError):
    pass

# Have our own custom .value with all the mirror errors.
class NoMoreMirrorsRepoError(RepoError):
    def __init__(self, value=None, errors=None):
        Exception.__init__(self)
        self._value = value
        self.errors = errors

    @property
    def value(self):
        ret = self._value
        for url, msg in self.errors or []:
            ret += '\n%s: %s' % (url, msg)
        return ret

class ConfigError(YumBaseError):
    pass
    
class MiscError(YumBaseError):
    pass

class FIPSNonCompliantError(MiscError):
    def __init__(self, sumtype):
        MiscError.__init__(
            self, '%s algorithm is not FIPS compliant' % sumtype)

class GroupsError(YumBaseError):
    pass

class InstallError(YumBaseError):
    pass

class GroupInstallError(InstallError):
    pass

class UpdateError(YumBaseError):
    pass

class UpdateMissingNameError(UpdateError):
    pass
    
class RemoveError(YumBaseError):
    pass

class ReinstallError(YumBaseError):
    pass

class ReinstallRemoveError(ReinstallError):
    pass

class ReinstallInstallError(ReinstallError):
    def __init__(self, value=None, failed_pkgs=[]):
        ReinstallError.__init__(self, value)
        self.failed_pkgs = failed_pkgs

class DowngradeError(YumBaseError):
    pass

class RepoMDError(YumBaseError):
    pass

class PackageSackError(YumBaseError):
    pass

class RpmDBError(YumBaseError):
    pass

class CompsException(YumBaseError):
    pass

class MediaError(YumBaseError):
    pass
    
class PkgTagsError(YumBaseError):
    pass
    
class YumDeprecationWarning(DeprecationWarning):
    """
    Used to mark a method as deprecated.
    """
    def __init__(self, value=None):
        DeprecationWarning.__init__(self, value)

class YumFutureDeprecationWarning(YumDeprecationWarning):
    """
    Used to mark a method as deprecated. Unlike YumDeprecationWarning,
    YumFutureDeprecationWarnings will not be shown on the console.
    """
    def __init__(self, value=None):
        YumDeprecationWarning.__init__(self, value)
