TraceFileEvent.pm
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # Perl package for representing events in NS trace files
  2. # ***XXX*** Need to work out comments.  Probably make it so that comments
  3. #           result in single data item called comment
  4. package NS::TraceFileEvent;
  5. use 5.005;
  6. use strict;
  7. use warnings;
  8. use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
  9. BEGIN {
  10. use Text::Balanced qw(extract_bracketed);
  11. use Exporter ();
  12. $VERSION = 1.00;
  13. @ISA = qw(Exporter);
  14. @EXPORT = qw();
  15. %EXPORT_TAGS = ();
  16. @EXPORT_OK = qw(&string_to_hashref &hashref_to_string &quote_if_needed);
  17. }
  18. # the constructor:
  19. sub new {
  20. my $self  = shift;
  21. my $class = ref($self) || $self;
  22. my $obj = { type => undef,
  23.     timestamp => undef,
  24.     data => {}
  25.   };
  26. bless $obj, $class;  # make the hash into an object
  27. # if there are still more arguments to process, then use them
  28. # to initialize the object.  Otherwise, object will be uninitialized.
  29. if (scalar(@_) == 1) {
  30. # init with string
  31. $obj = $obj->set_string_representation(shift);
  32. } elsif (@_) {
  33. # init with data
  34. $obj->set_type(shift);
  35. $obj->set_timestamp(shift);
  36. if (ref $_[0] eq 'HASH') {
  37. $obj->set_data(shift);
  38. } else {
  39. $obj->set_data({@_});
  40. }
  41. }
  42. return $obj;
  43. }
  44. # get the type of event
  45. sub get_type {
  46. my $self = shift;
  47. return $self->{'type'};
  48. }
  49. # set the type of the event
  50. sub set_type {
  51. my ($self, $type) = @_;
  52. $self->{'type'} = $type;
  53. # invalidate string representation
  54. delete $self->{'string_representation'};
  55. }
  56. # get the timestamp for the event
  57. sub get_timestamp {
  58. my $self = shift;
  59. return $self->{'timestamp'};
  60. }
  61. # set the timestamp of the event
  62. sub set_timestamp {
  63. my ($self, $time) = @_;
  64. $self->{'timestamp'} = $time;
  65. # invalidate string representation
  66. delete $self->{'string_representation'};
  67. }
  68. # get a value from the event
  69. sub get {
  70. my ($self, $key) = @_;
  71. return $self->{'data'}{$key}
  72. }
  73. # set a value in the event
  74. sub set {
  75. my ($self, $key, $value) = @_;
  76. $self->{'data'}{$key} = $value;
  77. # invalidate string representation
  78. delete $self->{'string_representation'};
  79. }
  80. # remove a value from the event
  81. sub remove {
  82. my ($self, $key) = @_;
  83. delete $self->{'data'}{$key};
  84. # invalidate string representation
  85. delete $self->{'string_representation'};
  86. }
  87. # get all data
  88. sub get_data {
  89. my $self = shift;
  90. return $self->{'data'};
  91. }
  92. # set all data
  93. sub set_data {
  94. my $self = shift;
  95. my $new_data = shift;
  96. if (defined $new_data and ref $new_data ne 'HASH') {
  97. die "NS::TraceFileEvent::set_data wants a hash reference";
  98. }
  99. $self->{'data'} = $new_data;
  100. # invalidate string representation
  101. delete $self->{'string_representation'};
  102. }
  103. # return the string representation of the event, suitable for writing
  104. # to an ns trace file
  105. sub get_string_representation {
  106. my $self = shift;
  107. unless (defined $self->{'string_representation'}) {
  108. # construct a string representation if none is cached
  109. unless (defined $self->{'type'} and
  110. defined $self->{'timestamp'}) {
  111. return undef; # abort if object is not initialized
  112. }
  113. if ($self->{'type'} =~ m/^#/ and
  114.     defined $self->{'data'}{'#'} and
  115.     (keys %{$self->{'data'}} == 1)) {
  116.   # freeform comment line
  117. $self->{'string_representation'} =
  118.      $self->{'type'} . ' ' . $self->{'data'}{'#'};
  119. } else {
  120. # normal event
  121. $self->{'string_representation'} =
  122. $self->{'type'} . ' ' .
  123. $self->{'timestamp'} . ' ' .
  124. hashref_to_string($self->{'data'});
  125. }
  126. }
  127. return $self->{string_representation};
  128. }
  129. # set all data via string representation
  130. # returns undef if operation fails (string was malformed) and returns
  131. # the object itself if the operation succeeds.
  132. sub set_string_representation {
  133. my ($self, $string) = @_;
  134. chomp $string; # remove any trailing newline
  135. $self->{'string_representation'} = $string; # save a copy
  136. my ($type, $time, $data) = split ' ', $string, 3;
  137. $self->{'type'} = $type;
  138. if ($type =~ m/^#/) {
  139. # we don't try to parse the comment
  140. $self->{'timestamp'} = '*';
  141. $self->{'data'} = {'#' => "$time $data"};
  142. } else {
  143. unless (defined $type and defined $time) {
  144. # event is malformed if type or time is malformed
  145. $self->{'type'} = undef;
  146. $self->{'timestamp'} = undef;
  147. $self->{'data'} = {};
  148. delete $self->{'string_representation'};
  149. return undef;
  150. }
  151. $self->{'timestamp'} = $time;
  152. $self->{'data'} = string_to_hashref($data);
  153. }
  154. return $self;
  155. }
  156. # exportable functions
  157. sub quote_if_needed {
  158. my $value = shift;
  159. # if delimited in brackets or quotes already, then don't change
  160. if ($value =~ m/^(".*"|{.*})$/) {
  161. return $value;
  162. }
  163. #otherwise, see if it needs quoting
  164. if ($value =~ m/ / or
  165.     $value eq '') {
  166. $value = "{$value}";
  167. }
  168. return $value;
  169. }
  170. sub string_to_hashref {
  171. my $string = shift;
  172. my ($tag, $value, %hash);
  173. while (defined $string and
  174.        ($tag, $string) = split(' ', $string, 2)) {
  175. $tag =~ s/-(.*)/$1/;
  176. if ($string =~ m/^({|[|")/) {
  177. # if the value appears to be quoted, then
  178. # find the end of the quote
  179. ($hash{$tag}, $string) = extract_bracketed($string,
  180.    '{["');
  181. } else {
  182. # value doesn't appear to be quoted, so whitespace
  183. # will mark the end of the value
  184. ($hash{$tag}, $string) = split(' ', $string, 2);
  185. }
  186. }
  187. return %hash;
  188. }
  189. sub hashref_to_string {
  190.     my $ref = shift;
  191.     my %data = %$ref;
  192.     return join (' ', map { "-$_ ". quote_if_needed($data{$_}) }
  193.                   keys %data);
  194. }
  195. # a Perl module must return a true value
  196. 1;