# Convert Nokia SMS from .vmg to plain text
#
# Takes a directory with .vmg files, reads the unicode messages and puts
# all messages in plaintext to stdout chronologically.
# use new clock from Tcl 8.5 in Tcl 8.4
package require newclock
package require textutil
# edit this one for displaying user names instead of numbers
set known_numbers {+49172123456789 Joe}
set directory [lindex $argv 0]
if {$directory == ""} {
puts "usage: $argv0 path-to-vmg-files"
exit -1
}
set count 0
foreach file [glob [file join $directory *.vmg]] {
# read file
set in [open $file]
fconfigure $in -encoding unicode
set message [read $in]
close $in
# get sender's phone number
regexp -line -nocase {^TEL:(.*)$} $message _ sender
foreach {number name} $known_numbers {
if {$number == $sender} {
set sender "$name ($number)"
}
}
# extract message body
regexp {BEGIN:VBODY\n(.*)END:VBODY} $message _ body
# get date
regexp -line -nocase {^Date:(.*)$} $message _ date
set date [clock scan $date -format {%d.%m.%Y %H:%M:%S}]
set date [clock format $date -format {%Y-%m-%d %H:%M:%S}]
set key "$date -- $sender"
# remove date from message body
regsub -line -nocase {^Date:(.*)$} $body "" body
if {[array get messages $key] != ""} {
puts stderr "Warning: double entries at $key!"
}
set messages($key) $body
incr count
}
set keys [array names messages]
foreach key [lsort $keys] {
puts [string repeat - 72]
puts "* $key\n"
puts [::textutil::indent [::textutil::adjust $messages($key) -length 70] " "]
}
puts stderr "\nConverted $count messages."