Subversion Repositories userdetect2

Rev

Rev 81 | Rev 83 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit UD2_PluginStatus;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, SysUtils;
  7.  
  8. type
  9.   UD2_STATUSCAT       = WORD;
  10.   UD2_STATUSAUTH      = TGUID;
  11.   UD2_STATUSMSG       = DWORD;
  12.   UD2_STATUSEXTRAINFO = DWORD;
  13.  
  14.   UD2_STATUS = packed record
  15.     cbSize: BYTE;
  16.     bReserved: BYTE;
  17.     wCategory: UD2_STATUSCAT;
  18.     grAuthority: UD2_STATUSAUTH;
  19.     dwMessage: UD2_STATUSMSG;
  20.     dwExtraInfo: UD2_STATUSEXTRAINFO;
  21.   end;
  22.  
  23. const
  24.   // Note: we need to declare non-typed constants first, because we cannot use
  25.   // typed constants in constant records.
  26.   // http://stackoverflow.com/questions/2714365/delphi-all-constants-are-constant-but-some-are-more-constant-than-others
  27.   UD2_STATUSAUTH_GENERIC_ = '{90F53368-1EFB-4350-A6BC-725C69938B9C}';
  28.   UD2_STATUSAUTH_GENERIC : UD2_STATUSAUTH = UD2_STATUSAUTH_GENERIC_;
  29.  
  30.   UD2_STATUSCAT_SUCCESS   = 0;
  31.   UD2_STATUSCAT_NOT_AVAIL = 1;
  32.   UD2_STATUSCAT_FAILED    = 2;
  33.  
  34.   (* Success codes *)
  35.  
  36.   UD2_STATUS_OK_UNSPECIFIED: UD2_STATUS = (
  37.     cbSize: SizeOf(UD2_STATUS);
  38.     bReserved: 0;
  39.     wCategory: UD2_STATUSCAT_SUCCESS;
  40.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  41.     dwMessage: 0;
  42.     dwExtraInfo: 0
  43.   );
  44.   UD2_STATUS_OK_SINGLELINE: UD2_STATUS = (
  45.     cbSize: SizeOf(UD2_STATUS);
  46.     bReserved: 0;
  47.     wCategory: UD2_STATUSCAT_SUCCESS;
  48.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  49.     dwMessage: 1;
  50.     dwExtraInfo: 0
  51.   );
  52.   UD2_STATUS_OK_MULTILINE: UD2_STATUS = (
  53.     cbSize: SizeOf(UD2_STATUS);
  54.     bReserved: 0;
  55.     wCategory: UD2_STATUSCAT_SUCCESS;
  56.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  57.     dwMessage: 2;
  58.     dwExtraInfo: 0
  59.   );
  60.   UD2_STATUS_OK_LICENSED: UD2_STATUS = (
  61.     cbSize: SizeOf(UD2_STATUS);
  62.     bReserved: 0;
  63.     wCategory: UD2_STATUSCAT_SUCCESS;
  64.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  65.     dwMessage: 3;
  66.     dwExtraInfo: 0
  67.   );
  68.  
  69.   (* "Not available" codes *)
  70.  
  71.   UD2_STATUS_NOTAVAIL_UNSPECIFIED: UD2_STATUS = (
  72.     cbSize: SizeOf(UD2_STATUS);
  73.     bReserved: 0;
  74.     wCategory: UD2_STATUSCAT_NOT_AVAIL;
  75.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  76.     dwMessage: 0;
  77.     dwExtraInfo: 0
  78.   );
  79.   UD2_STATUS_NOTAVAIL_OS_NOT_SUPPORTED: UD2_STATUS = (
  80.     cbSize: SizeOf(UD2_STATUS);
  81.     bReserved: 0;
  82.     wCategory: UD2_STATUSCAT_NOT_AVAIL;
  83.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  84.     dwMessage: 1;
  85.     dwExtraInfo: 0
  86.   );
  87.   UD2_STATUS_NOTAVAIL_HW_NOT_SUPPORTED: UD2_STATUS = (
  88.     cbSize: SizeOf(UD2_STATUS);
  89.     bReserved: 0;
  90.     wCategory: UD2_STATUSCAT_NOT_AVAIL;
  91.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  92.     dwMessage: 2;
  93.     dwExtraInfo: 0
  94.   );
  95.   UD2_STATUS_NOTAVAIL_NO_ENTITIES: UD2_STATUS = (
  96.     cbSize: SizeOf(UD2_STATUS);
  97.     bReserved: 0;
  98.     wCategory: UD2_STATUSCAT_NOT_AVAIL;
  99.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  100.     dwMessage: 3;
  101.     dwExtraInfo: 0
  102.   );
  103.   UD2_STATUS_NOTAVAIL_WINAPI_CALL_FAILURE: UD2_STATUS = (
  104.     cbSize: SizeOf(UD2_STATUS);
  105.     bReserved: 0;
  106.     wCategory: UD2_STATUSCAT_NOT_AVAIL;
  107.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  108.     dwMessage: 4;
  109.     dwExtraInfo: 0
  110.   );
  111.  
  112.   (* Failure codes *)
  113.  
  114.   UD2_STATUS_FAILURE_UNSPECIFIED: UD2_STATUS = (
  115.     cbSize: SizeOf(UD2_STATUS);
  116.     bReserved: 0;
  117.     wCategory: UD2_STATUSCAT_FAILED;
  118.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  119.     dwMessage: 0;
  120.     dwExtraInfo: 0
  121.   );
  122.   UD2_STATUS_FAILURE_BUFFER_TOO_SMALL: UD2_STATUS = (
  123.     cbSize: SizeOf(UD2_STATUS);
  124.     bReserved: 0;
  125.     wCategory: UD2_STATUSCAT_FAILED;
  126.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  127.     dwMessage: 1;
  128.     dwExtraInfo: 0
  129.   );
  130.   UD2_STATUS_FAILURE_INVALID_ARGS: UD2_STATUS = (
  131.     cbSize: SizeOf(UD2_STATUS);
  132.     bReserved: 0;
  133.     wCategory: UD2_STATUSCAT_FAILED;
  134.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  135.     dwMessage: 2;
  136.     dwExtraInfo: 0
  137.   );
  138.   UD2_STATUS_FAILURE_PLUGIN_NOT_LICENSED: UD2_STATUS = (
  139.     cbSize: SizeOf(UD2_STATUS);
  140.     bReserved: 0;
  141.     wCategory: UD2_STATUSCAT_FAILED;
  142.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  143.     dwMessage: 3;
  144.     dwExtraInfo: 0
  145.   );
  146.   UD2_STATUS_FAILURE_NO_RETURNED_VALUE: UD2_STATUS = (
  147.     cbSize: SizeOf(UD2_STATUS);
  148.     bReserved: 0;
  149.     wCategory: UD2_STATUSCAT_FAILED;
  150.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  151.     dwMessage: 4;
  152.     dwExtraInfo: 0
  153.   );
  154.   UD2_STATUS_FAILURE_CATCHED_EXCEPTION: UD2_STATUS = (
  155.     cbSize: SizeOf(UD2_STATUS);
  156.     bReserved: 0;
  157.     wCategory: UD2_STATUSCAT_FAILED;
  158.     grAuthority: UD2_STATUSAUTH_GENERIC_;
  159.     dwMessage: 5;
  160.     dwExtraInfo: 0
  161.   );
  162.  
  163. function UD2_STATUS_FormatStatusCode(grStatus: UD2_STATUS): string;
  164. function UD2_STATUS_Equal(grStatus1, grStatus2: UD2_STATUS; compareExtraInfo: boolean): boolean;
  165. function UD2_STATUS_OSError(OSError: DWORD): UD2_STATUS;
  166. function UD2_STATUS_HandleException(E: Exception): UD2_STATUS;
  167.  
  168. implementation
  169.  
  170. function UD2_STATUS_FormatStatusCode(grStatus: UD2_STATUS): string;
  171. begin
  172.   // 00 0000 {44332211-1234-ABCD-EFEF-001122334455} 00000000 00000000
  173.   result := Format('%.2x %.4x %s %.8x %.8x', [
  174.     grStatus.bReserved,
  175.                 grStatus.wCategory,
  176.                 GUIDTostring(grStatus.grAuthority),
  177.                 grStatus.dwMessage,
  178.                 grStatus.dwExtraInfo]);
  179. end;
  180.  
  181. function UD2_STATUS_Equal(grStatus1, grStatus2: UD2_STATUS; compareExtraInfo: boolean): boolean;
  182. begin
  183.   result := (grStatus1.bReserved = grStatus2.bReserved) and
  184.             (grStatus1.wCategory = grStatus2.wCategory) and
  185.             IsEqualGUID(grStatus1.grAuthority, grStatus2.grAuthority) and
  186.             (grStatus1.dwMessage = grStatus2.dwMessage);
  187.   if compareExtraInfo and (grStatus1.dwExtraInfo <> grStatus2.dwExtraInfo) then result := false;
  188. end;
  189.  
  190. function UD2_STATUS_OSError(OSError: DWORD): UD2_STATUS;
  191. begin
  192.   result := UD2_STATUS_NOTAVAIL_WINAPI_CALL_FAILURE;
  193.   result.dwExtraInfo := OSError;
  194. end;
  195.  
  196. function UD2_STATUS_HandleException(E: Exception): UD2_STATUS;
  197. begin
  198.   if E is EOSError then
  199.   begin
  200.     result := UD2_STATUS_OSError(EOSError(E).ErrorCode);
  201.   end
  202.   else
  203.   begin
  204.     result := UD2_STATUS_FAILURE_CATCHED_EXCEPTION;
  205.   end;
  206. end;
  207.  
  208. end.
  209.