Launchee.pm
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:3k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. ##
  2. # MODULE DESCRIPTION: Startup notification: launchee
  3. #
  4. # This class implements you to notify the launcher about
  5. # your application's startup progress. See
  6. # @CLASS(StartupNotification::Launcher) for details.
  7. #
  8. # <h3>Launchee example</h3>
  9. # <pre class="example">
  10. # use Utils::StartupNotification::Launchee;
  11. #
  12. # my $sn = new StartupNotification::Launchee();
  13. #
  14. # $sn->setProgress(40);
  15. # $sn->setStatus("Starting database");
  16. # sleep 1;
  17. #
  18. # $sn->setProgress(80);
  19. # $sn->setStatus("Starting user interface");
  20. # sleep 1;
  21. #
  22. # $sn->setProgress(100);
  23. # $sn->setStatus("Done");
  24. # sleep 5;
  25. # </pre>
  26. package StartupNotification::Launchee;
  27. use strict;
  28. use IO::Socket::INET;
  29. use IPC::Messages;
  30. ### CATEGORY: Class StartupNotification::Launchee
  31. ##
  32. # StartupNotification::Launchee->new()
  33. #
  34. # Create a new StartupNotification::Launchee object.
  35. # This constructor checks whether the first argument passed to the
  36. # current application is a startup notification parameter. (see
  37. # $StartupNotificationLauncher->getArg() for details)
  38. # If it is, that argument is removed from the argument stack,
  39. # so your application won't have to worry about that.
  40. sub new {
  41. my ($class) = @_;
  42. my %self;
  43. if ($ARGV[0] =~ /^--startup-notify-port=(d+)$/) {
  44. my $port = $1;
  45. shift @ARGV;
  46. $self{socket} = new IO::Socket::INET(
  47. PeerHost => '127.0.0.1',
  48. PeerPort => $port,
  49. Proto => 'tcp'
  50. );
  51. }
  52. return bless %self, $class;
  53. }
  54. ##
  55. # void $StartupNotificationLaunchee->setProgress(float progress)
  56. # progress: The current startup progress, in percentage.
  57. # Requires: 0 <= $progress <= 100
  58. #
  59. # Notify the launcher about the launchee's startup progress.
  60. #
  61. # If you pass 100 to this method, then you have indicated that
  62. # initialization is complete. You must then not call
  63. # any of the methods in this class anymore.
  64. sub setProgress {
  65. my ($self, $progress) = @_;
  66. if ($self->{socket}) {
  67. my %args = (i => $progress);
  68. my $data = IPC::Messages::encode("progress", %args);
  69. $self->{socket}->send($data, 0);
  70. $self->{socket}->flush();
  71. }
  72. }
  73. ##
  74. # void $StartupNotificationLaunchee->setStatus(String status)
  75. # status: A status message. For example, "starting database".
  76. # Requires: defined($status)
  77. #
  78. # Notify the launcher about the launchee's startup status.
  79. # status.
  80. sub setStatus {
  81. my ($self, $status) = @_;
  82. if ($self->{socket}) {
  83. my %args = (msg => $status);
  84. my $data = IPC::Messages::encode("status", %args);
  85. $self->{socket}->send($data, 0);
  86. $self->{socket}->flush();
  87. }
  88. }
  89. ##
  90. # void $StartupNotificationLaunchee->setError(String message, int errorCode = 0)
  91. # message: The error message.
  92. # errorCode: The associated error code.
  93. # Requires: defined($message)
  94. #
  95. # Notify the launcher that the launcher failed to initialize.
  96. # After calling this method, you must not call any of the
  97. # methods in this class anymore.
  98. sub setError {
  99. my ($self, $message, $errorCode) = @_;
  100. if ($self->{socket}) {
  101. my %args = (
  102. msg => $message,
  103. code => defined($errorCode) ? $errorCode : 0
  104. );
  105. my $data = IPC::Messages::encode("error", %args);
  106. $self->{socket}->send($data, 0);
  107. $self->{socket}->flush();
  108. }
  109. }
  110. 1;