From ae46c85fd8ba31452296c3eb7c1dc5d60f5049f6 Mon Sep 17 00:00:00 2001 From: short <> Date: Wed, 13 Nov 2002 12:56:42 +0000 Subject: [PATCH] First release --- src/pbmtopicturemsg.pl | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100755 src/pbmtopicturemsg.pl diff --git a/src/pbmtopicturemsg.pl b/src/pbmtopicturemsg.pl new file mode 100755 index 0000000..e800ec8 --- /dev/null +++ b/src/pbmtopicturemsg.pl @@ -0,0 +1,78 @@ +#! /usr/bin/perl +# +# $Id$ + +use strict; +use warnings; + +undef $/; +my $data=<>; +$data=~s/^\s*#.*\n//m; +my($format,$width,$height)=($data=~/^(P[14])\n(\d+) (\d+)\n/); +$data=$'; +die "Invalid format" if !$format || !$width || !$height; +die "Picture too big; width=$width < 0xFF && height=$height < 0xFF" if $width>0xFF || $height>0xFF; +if ($format eq "P1") { + $data=~tr/01//cd; + } +else { + $data=unpack("b*",$data); + my $width8=int(($width+7)/8)*8; + for my $y (0..$height-1) { + # cut end-of-line gap + substr($data,$width*$y+$width,$width8-$width)=""; + } + } +die "Bad data length ".length($data) if length($data)!=$width*$height; + +my @pictureudh=( + 0x05, # IEI + 0x04, # IEDL + 0x15,0x8A, # dest port (ring tones) + 0x15,0x8A); # src port (unused) + +my $multihdr_uniq=int(rand(0x100)); +sub multihdr +{ +my($num,$total)=@_; + + return ( + 0x00, # IEI + 0x03, # IEDL + $multihdr_uniq, # unique serial ID + $total, # total messages + $num+1); # message number (# from 1) +} + +sub udh +{ +my(@bytes)=@_; + + return pack "C*",scalar(@bytes),@bytes; +} + + +my $picturebyteslen=int(($width*$height+7)/8)+4; # +4 is for some part of the header +my $picturedata=unpack("b*",pack("C*", + 0x30, # version string '0' + 0x02, # item=OTA bitmap + ($picturebyteslen>>8)&0xFF, # picture size in bytes incl. header; HIGH + ($picturebyteslen>>0)&0xFF, # picture size in bytes incl. header; LOW + 0x00, # animation pictures - 0=static picture + $width,$height, # picture size in pixels + 0x01, # picture depth - B/W + )) + .$data; + +my @out=udh(@pictureudh).pack("b*",$picturedata); +if (length($out[0])>140) { + my $datalen=int((length($picturedata)+7)/8); + my $hdrlen=length(udh(@pictureudh,multihdr(8,8))); + my $dataspace=(140-$hdrlen); + my $total=int(($datalen+$dataspace-1)/$dataspace); + die "Too big: total=$total <=0xFF !" if $total>0xFF; + @out=map({ + udh(@pictureudh,multihdr($_,$total)).pack("b*",substr($picturedata,$dataspace*8*$_,$dataspace*8)); + } (0..$total-1)); + } +print map({ uc(unpack("H*",$_))."\n"; } @out); -- 1.8.3.1