summaryrefslogtreecommitdiff
path: root/UError.pas
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@redhat.com>2024-10-11 23:38:44 +0200
committerTomas Bzatek <tbzatek@redhat.com>2024-10-23 18:13:05 +0200
commit7d757b8452daed2575e3a9cc300459d7e8674345 (patch)
tree1b4c0107964cc871dc6e2d732c615af710592c4c /UError.pas
parent81c8cd22e61701c1145dc267b0925add6cc0e78a (diff)
downloadtuxcmd-0.6.81.tar.xz
Full port to GErrorv0.6.81
Started 15 years ago, picking up on that work. Introduced the new TUXCMD_ERROR domain to distinguish between operations or their steps. Plugins may continue reporting the G_IO_ERROR domain.
Diffstat (limited to 'UError.pas')
-rw-r--r--UError.pas236
1 files changed, 194 insertions, 42 deletions
diff --git a/UError.pas b/UError.pas
index 6734367..d557189 100644
--- a/UError.pas
+++ b/UError.pas
@@ -23,54 +23,107 @@ interface
uses glib2, gtk2, Classes, SysUtils, ULibc, GTKForms;
+type TuxcmdErrorEnum = (
+ TUXCMD_ERROR_CANCELLED,
+ TUXCMD_ERROR_EXCEPTION,
+ TUXCMD_ERROR_NOT_SUPPORTED,
+ // Basic IO
+ TUXCMD_ERROR_CHDIR,
+ TUXCMD_ERROR_OPENDIR,
+ TUXCMD_ERROR_STAT,
+ TUXCMD_ERROR_MKDIR,
+ TUXCMD_ERROR_REMOVE,
+ TUXCMD_ERROR_SYMLINK,
+ TUXCMD_ERROR_CHMOD,
+ TUXCMD_ERROR_CHOWN,
+ TUXCMD_ERROR_RENAME,
+ TUXCMD_ERROR_TIMESTAMPS,
+ // File IO
+ TUXCMD_ERROR_OPEN_FILE,
+ TUXCMD_ERROR_READ_FILE,
+ TUXCMD_ERROR_WRITE_FILE,
+ TUXCMD_ERROR_CLOSE_FILE,
+ TUXCMD_ERROR_SEEK,
+ // File copy
+ TUXCMD_ERROR_ALLOC_FAILED,
+ TUXCMD_ERROR_SOURCE_OPEN,
+ TUXCMD_ERROR_TARGET_OPEN,
+ TUXCMD_ERROR_SOURCE_READ,
+ TUXCMD_ERROR_TARGET_WRITE,
+ TUXCMD_ERROR_SOURCE_CLOSE,
+ TUXCMD_ERROR_TARGET_CLOSE
+);
-// Ported from gioerror.h
-
-type GIOErrorEnum = (G_IO_ERROR_FAILED,
- G_IO_ERROR_NOT_FOUND,
- G_IO_ERROR_EXISTS,
- G_IO_ERROR_IS_DIRECTORY,
- G_IO_ERROR_NOT_DIRECTORY,
- G_IO_ERROR_NOT_EMPTY,
- G_IO_ERROR_NOT_REGULAR_FILE,
- G_IO_ERROR_NOT_SYMBOLIC_LINK,
- G_IO_ERROR_NOT_MOUNTABLE_FILE,
- G_IO_ERROR_FILENAME_TOO_LONG,
- G_IO_ERROR_INVALID_FILENAME,
- G_IO_ERROR_TOO_MANY_LINKS,
- G_IO_ERROR_NO_SPACE,
- G_IO_ERROR_INVALID_ARGUMENT,
- G_IO_ERROR_PERMISSION_DENIED,
- G_IO_ERROR_NOT_SUPPORTED,
- G_IO_ERROR_NOT_MOUNTED,
- G_IO_ERROR_ALREADY_MOUNTED,
- G_IO_ERROR_CLOSED,
- G_IO_ERROR_CANCELLED,
- G_IO_ERROR_PENDING,
- G_IO_ERROR_READ_ONLY,
- G_IO_ERROR_CANT_CREATE_BACKUP,
- G_IO_ERROR_WRONG_ETAG,
- G_IO_ERROR_TIMED_OUT,
- G_IO_ERROR_WOULD_RECURSE,
- G_IO_ERROR_BUSY,
- G_IO_ERROR_WOULD_BLOCK,
- G_IO_ERROR_HOST_NOT_FOUND,
- G_IO_ERROR_WOULD_MERGE,
- G_IO_ERROR_FAILED_HANDLED,
- G_IO_ERROR_TOO_MANY_OPEN_FILES,
- G_IO_ERROR_NOT_INITIALIZED,
- G_IO_ERROR_ADDRESS_IN_USE,
- G_IO_ERROR_PARTIAL_INPUT,
- G_IO_ERROR_INVALID_DATA);
+// Ported from gioerror.h, glib-2.83.0
+type GIOErrorEnum = (
+ G_IO_ERROR_FAILED,
+ G_IO_ERROR_NOT_FOUND,
+ G_IO_ERROR_EXISTS,
+ G_IO_ERROR_IS_DIRECTORY,
+ G_IO_ERROR_NOT_DIRECTORY,
+ G_IO_ERROR_NOT_EMPTY,
+ G_IO_ERROR_NOT_REGULAR_FILE,
+ G_IO_ERROR_NOT_SYMBOLIC_LINK,
+ G_IO_ERROR_NOT_MOUNTABLE_FILE,
+ G_IO_ERROR_FILENAME_TOO_LONG,
+ G_IO_ERROR_INVALID_FILENAME,
+ G_IO_ERROR_TOO_MANY_LINKS,
+ G_IO_ERROR_NO_SPACE,
+ G_IO_ERROR_INVALID_ARGUMENT,
+ G_IO_ERROR_PERMISSION_DENIED,
+ G_IO_ERROR_NOT_SUPPORTED,
+ G_IO_ERROR_NOT_MOUNTED,
+ G_IO_ERROR_ALREADY_MOUNTED,
+ G_IO_ERROR_CLOSED,
+ G_IO_ERROR_CANCELLED,
+ G_IO_ERROR_PENDING,
+ G_IO_ERROR_READ_ONLY,
+ G_IO_ERROR_CANT_CREATE_BACKUP,
+ G_IO_ERROR_WRONG_ETAG,
+ G_IO_ERROR_TIMED_OUT,
+ G_IO_ERROR_WOULD_RECURSE,
+ G_IO_ERROR_BUSY,
+ G_IO_ERROR_WOULD_BLOCK,
+ G_IO_ERROR_HOST_NOT_FOUND,
+ G_IO_ERROR_WOULD_MERGE,
+ G_IO_ERROR_FAILED_HANDLED,
+ G_IO_ERROR_TOO_MANY_OPEN_FILES,
+ G_IO_ERROR_NOT_INITIALIZED,
+ G_IO_ERROR_ADDRESS_IN_USE,
+ G_IO_ERROR_PARTIAL_INPUT,
+ G_IO_ERROR_INVALID_DATA,
+ G_IO_ERROR_DBUS_ERROR,
+ G_IO_ERROR_HOST_UNREACHABLE,
+ G_IO_ERROR_NETWORK_UNREACHABLE,
+ G_IO_ERROR_CONNECTION_REFUSED,
+ G_IO_ERROR_PROXY_FAILED,
+ G_IO_ERROR_PROXY_AUTH_FAILED,
+ G_IO_ERROR_PROXY_NEED_AUTH,
+ G_IO_ERROR_PROXY_NOT_ALLOWED,
+ G_IO_ERROR_BROKEN_PIPE,
+// G_IO_ERROR_CONNECTION_CLOSED = G_IO_ERROR_BROKEN_PIPE,
+ G_IO_ERROR_NOT_CONNECTED,
+ G_IO_ERROR_MESSAGE_TOO_LARGE,
+ G_IO_ERROR_NO_SUCH_DEVICE,
+ G_IO_ERROR_DESTINATION_UNSET
+);
+
+const G_IO_ERROR_CONNECTION_CLOSED = G_IO_ERROR_BROKEN_PIPE;
+
+
+function tuxcmd_error_quark: TGQuark;
+function TUXCMD_ERROR: TGQuark;
function g_io_error_quark: TGQuark;
function G_IO_ERROR: TGQuark;
function g_io_error_from_errno(err_no: gint): GIOErrorEnum;
-procedure g_set_error_from_exception(Error: PPGError; E: Exception);
+procedure tuxcmd_set_error_from_exception(Error: PPGError; E: Exception);
procedure ShowError(Parent: TCustomGTKForm; const Text: string; Error: PGError);
+procedure PrefixTuxcmdError(Error: PPGError; const FileName: string);
+procedure VFSToTuxcmdError(Error: PPGError; Operation: TuxcmdErrorEnum);
implementation
@@ -78,6 +131,16 @@ uses UCoreUtils, UGnome;
(********************************************************************************************************************************)
+function tuxcmd_error_quark: TGQuark;
+begin
+ Result := g_quark_from_static_string('tuxcmd-error-quark');
+end;
+
+function TUXCMD_ERROR: TGQuark;
+begin
+ Result := tuxcmd_error_quark;
+end;
+
function g_io_error_quark: TGQuark;
begin
Result := g_quark_from_static_string('g-io-error-quark');
@@ -90,6 +153,11 @@ end;
function g_io_error_from_errno(err_no: gint): GIOErrorEnum;
begin
+ // Prefer native library call
+ if @__g_io_error_from_errno <> nil then begin
+ Result := __g_io_error_from_errno(err_no);
+ Exit;
+ end;
case err_no of
EEXIST: Result := G_IO_ERROR_EXISTS;
EISDIR: Result := G_IO_ERROR_IS_DIRECTORY;
@@ -103,23 +171,40 @@ begin
ENOMEM: Result := G_IO_ERROR_NO_SPACE;
EINVAL: Result := G_IO_ERROR_INVALID_ARGUMENT;
EPERM: Result := G_IO_ERROR_PERMISSION_DENIED;
+ EMLINK: Result := G_IO_ERROR_TOO_MANY_LINKS;
+ ENOMSG: Result := G_IO_ERROR_INVALID_DATA;
+ ENODATA: Result := G_IO_ERROR_INVALID_DATA;
+ EBADMSG: Result := G_IO_ERROR_INVALID_DATA;
ECANCELED: Result := G_IO_ERROR_CANCELLED;
ENOTEMPTY: Result := G_IO_ERROR_NOT_EMPTY;
ENOTSUP: Result := G_IO_ERROR_NOT_SUPPORTED;
+ EPROTONOSUPPORT: Result := G_IO_ERROR_NOT_SUPPORTED;
+ ESOCKTNOSUPPORT: Result := G_IO_ERROR_NOT_SUPPORTED;
+ EPFNOSUPPORT: Result := G_IO_ERROR_NOT_SUPPORTED;
+ EAFNOSUPPORT: Result := G_IO_ERROR_NOT_SUPPORTED;
ETIMEDOUT: Result := G_IO_ERROR_TIMED_OUT;
EBUSY: Result := G_IO_ERROR_BUSY;
EAGAIN: Result := G_IO_ERROR_WOULD_BLOCK;
EMFILE: Result := G_IO_ERROR_TOO_MANY_OPEN_FILES;
EADDRINUSE: Result := G_IO_ERROR_ADDRESS_IN_USE;
+ EHOSTUNREACH: Result := G_IO_ERROR_HOST_UNREACHABLE;
+ ENETUNREACH: Result := G_IO_ERROR_NETWORK_UNREACHABLE;
+ ENETDOWN: Result := G_IO_ERROR_NETWORK_UNREACHABLE;
+ ECONNREFUSED: Result := G_IO_ERROR_CONNECTION_REFUSED;
+ EADDRNOTAVAIL: Result := G_IO_ERROR_CONNECTION_REFUSED;
+ ECONNRESET: Result := G_IO_ERROR_CONNECTION_CLOSED;
+ ENOTCONN: Result := G_IO_ERROR_NOT_CONNECTED;
+ EDESTADDRREQ: Result := G_IO_ERROR_DESTINATION_UNSET;
+ EMSGSIZE: Result := G_IO_ERROR_MESSAGE_TOO_LARGE;
+ ENOTSOCK: Result := G_IO_ERROR_INVALID_ARGUMENT;
else Result := G_IO_ERROR_FAILED;
end;
end;
-
(********************************************************************************************************************************)
-procedure g_set_error_from_exception(Error: PPGError; E: Exception);
+procedure tuxcmd_set_error_from_exception(Error: PPGError; E: Exception);
begin
- g_set_error(Error, G_IO_ERROR, integer(G_IO_ERROR_FAILED), 'Exception raised: %s', PChar(E.Message));
+ g_set_error(Error, TUXCMD_ERROR, integer(TUXCMD_ERROR_EXCEPTION), 'Exception raised: %s', PChar(E.Message));
end;
(********************************************************************************************************************************)
@@ -142,5 +227,72 @@ begin
gtk_widget_destroy (PGtkWidget(Dialog));
end;
+procedure PrefixTuxcmdError(Error: PPGError; const FileName: string);
+begin
+ if (Error = nil) or (Error^ = nil) then Exit;
+ if (Error^.domain <> TUXCMD_ERROR) then Exit;
+ case TuxcmdErrorEnum(Error^.code) of
+ TUXCMD_ERROR_CHDIR: g_prefix_error(Error, 'Error changing directory to ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_OPENDIR: g_prefix_error(Error, 'Error opening directory ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_STAT: g_prefix_error(Error, 'Error getting file info for ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_MKDIR: g_prefix_error(Error, 'Error creating directory ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_REMOVE: g_prefix_error(Error, 'Error deleting ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_SYMLINK: g_prefix_error(Error, 'Error creating symlink ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_CHMOD: g_prefix_error(Error, 'Error changing permissions of ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_CHOWN: g_prefix_error(Error, 'Error changing owner/group of ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_RENAME: g_prefix_error(Error, 'Error renaming file ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_TIMESTAMPS: g_prefix_error(Error, 'Error changing timestamps of ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_OPEN_FILE: g_prefix_error(Error, 'Error opening file ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_READ_FILE: g_prefix_error(Error, 'Error reading file ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_WRITE_FILE: g_prefix_error(Error, 'Error writing file ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_CLOSE_FILE: g_prefix_error(Error, 'Error closing file ''%s'': ', StrToUTF8(PChar(FileName)));
+ TUXCMD_ERROR_SEEK: g_prefix_error(Error, 'Error seeking in file ''%s'': ', StrToUTF8(PChar(FileName)));
+ end;
+end;
+
+procedure VFSToTuxcmdError(Error: PPGError; Operation: TuxcmdErrorEnum);
+var OldError: PGError;
+begin
+ if (Error = nil) or (Error^ = nil) or (Error^.domain <> G_IO_ERROR) then Exit;
+ case GIOErrorEnum(Error^.code) of
+ G_IO_ERROR_FAILED,
+ G_IO_ERROR_NOT_FOUND,
+ G_IO_ERROR_EXISTS,
+ G_IO_ERROR_IS_DIRECTORY,
+ G_IO_ERROR_NOT_DIRECTORY,
+ G_IO_ERROR_NOT_EMPTY,
+ G_IO_ERROR_NOT_REGULAR_FILE,
+ G_IO_ERROR_NOT_SYMBOLIC_LINK,
+ G_IO_ERROR_FILENAME_TOO_LONG,
+ G_IO_ERROR_INVALID_FILENAME,
+ G_IO_ERROR_TOO_MANY_LINKS,
+ G_IO_ERROR_NO_SPACE,
+ G_IO_ERROR_INVALID_ARGUMENT,
+ G_IO_ERROR_PERMISSION_DENIED,
+ G_IO_ERROR_NOT_SUPPORTED,
+// G_IO_ERROR_CLOSED,
+// G_IO_ERROR_CANCELLED,
+// G_IO_ERROR_PENDING,
+ G_IO_ERROR_READ_ONLY,
+ G_IO_ERROR_CANT_CREATE_BACKUP,
+ G_IO_ERROR_WOULD_RECURSE,
+ G_IO_ERROR_BUSY,
+ G_IO_ERROR_WOULD_BLOCK,
+ G_IO_ERROR_WOULD_MERGE,
+// G_IO_ERROR_FAILED_HANDLED,
+ G_IO_ERROR_TOO_MANY_OPEN_FILES,
+ G_IO_ERROR_NOT_INITIALIZED,
+ G_IO_ERROR_PARTIAL_INPUT,
+ G_IO_ERROR_INVALID_DATA,
+ G_IO_ERROR_BROKEN_PIPE,
+ G_IO_ERROR_NO_SUCH_DEVICE: begin
+ OldError := Error^;
+ Error^ := nil;
+ g_set_error(Error, TUXCMD_ERROR, gint(Operation), '%s', OldError^.message);
+ g_free (OldError);
+ end;
+ end;
+end;
+
end.