obextool-0.35/0000755000076400007640000000000011127522267013467 5ustar gerhardrgerhardrobextool-0.35/contrib/0000755000076400007640000000000011127517240015122 5ustar gerhardrgerhardrobextool-0.35/contrib/images/0000755000076400007640000000000011127517240016367 5ustar gerhardrgerhardrobextool-0.35/contrib/images/xpm2gif.sh0000755000076400007640000000172311127517240020305 0ustar gerhardrgerhardr#!/bin/sh # XPMPAT="X pixmap image text" conv_xpm() { FILNAM="$1" ### ### Check if file parmater is present ### if [ -z "$FILNAM" ] ; then echo "Error: no file parameter" echo "Usage: `basename $0` XPM-file" exit 1 fi ### ### Check if extension is specified ### if [ -z `echo $FILNAM|grep ".xpm$"` ] then INPNAM="$FILNAM.xpm" else INPNAM="$FILNAM" FILNAM="`echo $FILNAM|sed 's/.xpm$//'`" fi ### ### Check if file is present ### if [ ! -f "$INPNAM" ] ; then echo "Error: file $INPNAM does not exist" exit 2 fi ### ### Check if file is a correct XPM file ### RES=`file $INPNAM|grep "$XPMPAT"` if [ -z "$RES" ] ; then echo "Error: file $INPNAM is no valid XPM-file" exit 3 fi ### ### Create output name ### if [ ! -z "$2" ] then FILOUT="$2.gif" else FILOUT="$FILNAM.gif" fi ### ### Do conversion... ### xpmtoppm "$INPNAM" | ppmtogif > "$FILOUT" } for F in $* do echo "Converting $F..." conv_xpm $F done obextool-0.35/contrib/images/giftrans.sh0000755000076400007640000000075711127517240020554 0ustar gerhardrgerhardr#!/bin/sh if [ $# -lt 2 ] then echo "Usage: `basename $0` gifname color" echo " gifname - name of GIF file" echo " color - color ID to make transparent" echo " E.g. `basename $0` input.gif rgbi:0.5/0.5/0.5" echo " or `basename $0` input.gif rgb:ff/00/00" exit 1 fi # giftoppm $1 | ppmtogif -interlace -transparent $2 > /tmp/$$.gif giftopnm $1 | ppmtogif -interlace -transparent $2 > /tmp/$$.gif if [ $? -eq 0 ] then mv /tmp/$$.gif $1 else rm /tmp/$$.gif fi obextool-0.35/contrib/images/png2gif.sh0000755000076400007640000000216711127517240020270 0ustar gerhardrgerhardr#!/bin/sh # FILPAT="PNG image data" FILEXT=png conv_img() { FILNAM="$1" ### ### Check if file parmater is present ### if [ -z "$FILNAM" ] ; then echo "Error: no file parameter" echo "Usage: `basename $0` $FILEXT-file" exit 1 fi ### ### Check if extension is specified ### EXTPAT=".${FILEXT}$" if [ -z `echo $FILNAM|grep "$EXTPAT"` ] then INPNAM="$FILNAM.$FILEXT" else INPNAM="$FILNAM" FILNAM="`echo $FILNAM|sed \"s/$EXTPAT//\"`" fi ### ### Check if file is present ### if [ ! -f "$INPNAM" ] ; then echo "Error: file $INPNAM does not exist" exit 2 fi ### ### Check if file is a correct $FILEXT file ### RES=`file $INPNAM|grep "$FILPAT"` if [ -z "$RES" ] ; then echo "Error: file $INPNAM is no valid $FILEXT-file" exit 3 fi ### ### Create output name ### if [ ! -z "$2" ] then FILOUT="$2.gif" else FILOUT="$FILNAM.gif" fi ### ### Do conversion... ### ${FILEXT}topnm "$INPNAM" | ppmquant 256 | ppmtogif > "$FILOUT" if [ -f $FILOUT ] then rm $INPNAM else echo "Error: no output file created." fi } for F in $* do echo "Converting $F..." conv_img $F done obextool-0.35/contrib/lang/0000755000076400007640000000000011127517240016043 5ustar gerhardrgerhardrobextool-0.35/contrib/lang/AllFromGerman.pl0000754000076400007640000000721411127517240021074 0ustar gerhardrgerhardr#!/usr/bin/perl # !/bin/sh #echo RENAMED.2 #exit # Script for converting ObexTool language files from German to template files # Copyright Jrgen Elgaard Larsen (jel@elgaard.net), 2005 # Feel fre to use under the *GNU GPL Licence version 2 or above # # version 0.1 ############################################################## # # USAGE: # # The script reads all files ending with ".de" in the # present working directory and makes copies of them in # the same directory. # # It takes one argument, which is the language code # of the files to be generated, e.g. # # ./AllFromGerman.pl en # # There is one option, "-copyEnglish" which makes the script # copy the English description to the new language, e.g. # ./AllFromGerman.pl -copyEnglish da # The default is to clear all strings. # # Thus, giving the command # ./AllFromGerman.pl -copyEnglish en # will automagically create complete English language files # for ObexTool. No further action needed! # ############################################################## ############################################################## # init my $from_dir = '.'; # Directory to read files from my $to_dir = '.'; # Directory to write files to my $copy = 0; my $lang = ''; ############################################################## # Program # Read parameters while ($lang = shift @ARGV){ # Is this an option? if ( $lang =~ m/\-/){ if ($lang = '-copyEnglish'){ $copy = 1; } else { print STDERR "Unknown option: $lang\n"; print STDERR "See script file for usage\n\n"; exit 3; } } else { # Not an option, must be language last; } } # Check, that language is set unless ($lang){ print STDERR "No language code given\n"; print STDERR "See script file for usage\n\n"; exit 4; } # Check that no further arguments are given: if ((scalar @ARGV) > 0){ print STDERR "Too many arguments\n"; print STDERR "See script file for usage\n\n"; exit 5; } my $Lang = uc($lang); # Open directory for reading unless (opendir DIR, $from_dir){ print STDERR "Could not open directory for reading: $!\n"; print STDERR "See script file for usage\n\n"; exit 7; } my @files = readdir DIR; closedir DIR; # Run through all files ending with .de foreach $file (@files){ next unless ($file =~ m/\.de$/o); # Read file content unless (open FILE, "<${from_dir}/$file"){ print STDERR "Could not open file $file: $!\n"; next; } my @context = ; close FILE; # Make new filename my $newfile = $file; $newfile =~ s/\.de$/.$lang/; # Open new file for writing unless (open FILE, ">${to_dir}/$newfile"){ print STDERR "Could not write file $newfile: $!\n - skipping.\n\n"; next; } # Run through lines foreach $line (@context){ # Replace language name $line =~ s/German\s+language\s+file/$Lang language file/i; # Change translation if ($copy){ $line =~ s/\"([^"]*)\"\s+\"([^"]*)\"/\"$1\" \"$1\"/; # It seems there can up to 3 pais on one line, so we need this dirty hack: $line =~ s/(\"[^"]*\"\s+\"[^"]*\")\s+\"([^"]*)\"\s+\"([^"]*)\"/$1 \"$2\" \"$2\"/; $line =~ s/(\"[^"]*\"\s+\"[^"]*\"\s+\"[^"]*\"\s+\"[^"]*\")\s+\"([^"]*)\"\s+\"([^"]*)\"/$1 \"$2\" \"$2\"/; } else { $line =~ s/\"([^"]*)\"\s+\"([^"]*)\"/\"$1\" \"\"/; # It seems there can up to 3 pais on one line, so we need this dirty hack: $line =~ s/(\"[^"]*\"\s+\"[^"]*\")\s+\"([^"]*)\"\s+\"([^"]*)\"/$1 \"$2\" \"\"/; $line =~ s/(\"[^"]*\"\s+\"[^"]*\"\s+\"[^"]*\"\s+\"[^"]*\")\s+\"([^"]*)\"\s+\"([^"]*)\"/$1 \"$2\" \"\"/; } print FILE $line; } close FILE; } exit; obextool-0.35/contrib/lang/da.rc0000644000076400007640000000263511127517240016763 0ustar gerhardrgerhardr! ------------------------------------------------------------------------------ ! da.rc ! This file is part of Unifix BWidget Toolkit ! Definition of Danish resources ! ------------------------------------------------------------------------------ ! --- symbolic names of buttons ------------------------------------------------ *abortName: &Annullr *retryName: P&rv igen *ignoreName: &Ignorer *okName: &OK *cancelName: &Cancel *yesName: &Ja *noName: &Nej ! --- symbolic names of label of SelectFont dialog ---------------------------- *boldName: Fed *italicName: Kursiv *underlineName: Understreg *overstrikeName: Overstreg *fontName: &Font *sizeName: &Strrelse *styleName: St&il ! --- symbolic names of label of PasswdDlg dialog ----------------------------- *loginName: &Brugernavn *passwordName: &Password ! --- resource for SelectFont dialog ------------------------------------------ *SelectFont.title: Font-valg *SelectFont.sampletext: Eksempeltekst ! --- resource for MessageDlg dialog ------------------------------------------ *MessageDlg.noneTitle: Besked *MessageDlg.infoTitle: Information *MessageDlg.questionTitle: Sprgsml *MessageDlg.warningTitle: Advarsel *MessageDlg.errorTitle: Fejl ! --- resource for PasswdDlg dialog ------------------------------------------- *PasswdDlg.title: Indtast brugernavn og password obextool-0.35/contrib/lang/check_trans.sh0000755000076400007640000000046611127517240020674 0ustar gerhardrgerhardr#!/bin/sh # # OBEX_LANG=de contrib/check_trans.tcl lang/obextool.$OBEX_LANG obextool.tk lib/* etc/* contrib/check_trans.tcl lang/adr_plug.$OBEX_LANG plugins/adr_plugin.tcl contrib/check_trans.tcl lang/vcs_plug.$OBEX_LANG plugins/vcs_plugin.tcl contrib/check_trans.tcl lang/sms_siem.$OBEX_LANG plugins/sm* obextool-0.35/contrib/lang/check_trans.tcl0000755000076400007640000000746611127517240021053 0ustar gerhardrgerhardr#!/usr/bin/tclsh # # Translation checker # (c) Gerhard Reithofer, Techn. EDV Reithofer 2004 # if {$argc < 2} { puts "Usage: [file tail $argv0] languagefile sourcefile ..." exit 1 } set langname [lindex $argv 0] set language [string range [file extension $langname] 1 end] set module [file rootname [file tail $langname]] set resultf [file tail [lindex $argv 1]].$language set untranslated "*NoTranslation*" set unused "*NotUsed*" set ntranslated 0 set ntrans_used 0 set linecounter 0 set files_done "" set OBEXDIR [pwd] proc quote {ns} { regsub -all "\\\n" $ns "\\\\n" ns ; return $ns } source lib/obextool.ini source $langname proc get_text { msg args } { global untranslated ntranslated language if [llength $args] { set dict [lindex $args 0] } else { set dict obextool } global ${dict}_Text #puts "Dict_Variable: ${dict}_Text" #puts "[llength [array names ${dict}_Text]] entries found." #puts "Message to translate: $msg" if { $language == "en" } { error "can't translate to english" 1000 } if { ! [array exists ${dict}_Text] } { "error not dictionary '$dict' exists" 1001 } if { ! [info exists ${dict}_Text($msg)] } { incr ntranslated return $untranslated } else { return [set ${dict}_Text($msg)] } } proc load_Messages { dict language } { debug_out "load_Messages $dict $language" 3 global OBEXDIR [string tolower $dict]_Text set version_var [string tolower $dict]_Text_version puts "Dict variable: [string tolower $dict]_Text" set lang_file [file join $OBEXDIR lang $dict.$language] puts "Loading file: $lang_file" if ![file exist $lang_file] { puts "Unable to open laguage file '$lang_file'!" exit 2 } source $lang_file puts "[llength [array names [string tolower $dict]_Text]] entries read." catch {set version_val [eval set $version_var]} debug_var $version_var 2 debug_var version_val 3 if [info exists version_val] { puts "Found message file $lang_file version $version_val ..." } else { puts "No version information found in '$lang_file'!" } return [llength [array names [string tolower $dict]_Text]] } set rec_counter [load_Messages $module $language] set of [open $resultf w+] puts $of "#\n# Language translation file for ObexTool\n#" puts $of "\narray set ${module}_Text \[list\\" for {set i 1} {$i<$argc} {incr i} { set filename [lindex $argv $i] puts "Checkin file $filename..." append files_done " $filename" set fd [open $filename r] while {![eof $fd]} { set line [gets $fd] if {[string index [string trimleft $line] 0] == "#"} continue if {![regexp "\\\[.*get_text" $line]} continue regsub "^.*\\\[.*get_text" $line "" tres set ltrimmed [string trim $tres] set rtrimmed [string range $ltrimmed 0 [string first "\"" $ltrimmed 1]] set trimmed [string trim $rtrimmed "\""] if [info exists ChkValue("$trimmed")] continue set trans [get_text "$trimmed" $module] set ChkValue("$trimmed") 1 if [string equal $trans $untranslated] { puts "$filename: <$trimmed>" puts $of " \"$trimmed\" \"$untranslated\" \\" } else { if $ChkValue("$trimmed") continue puts $of " \"$trimmed\" \"$DlgValue($trimmed)\" \\" } incr linecounter } ; ### end while {![eof $fd]} close $fd } ; ### for {set i 1} {$i<$argc} {incr i} ## foreach name [array names DlgValue] { ## if !$ChkValue($name) { ## puts "ChkValue: $ChkValue($name)" ## puts $of "\"[quote $name]\" \"$unused\" \\" ## incr ntrans_used ## } ## } puts $of "\]\n" puts $of "set ${module}_Text_version \"$OBEXTOOLVERSION\"" close $of puts "Translation file: $langname" puts "Output file: $resultf" puts "Input files: $files_done" puts "Translation language: $language" puts "Records in translation table: $rec_counter" puts "Lines to translate: $linecounter" puts "Untranslated lines: $ntranslated" puts "Unused translation entries: $ntrans_used" obextool-0.35/contrib/lang/danish.txt0000644000076400007640000000152011127517240020050 0ustar gerhardrgerhardrContributions to ObexTool Jrgen Elgaard Larsen > I just tried your ObexTool. Very nice app, even though it is still > alpha. It helped me quit a bit. > > However, one of my collegues does not read German very well, so I wrote > a little perl script that translates language files for ObexTool from > German to English (actually just copying the English keys). I thought > you might want it, since it will enable you to remake English language > files instantly after you updates the German files. > > I have attached the script as AllFromGerman.pl. Instructions is in the file. > > While I was at it, I also made Danish language files for the present > version of ObexTool. They are attached as lang_da.tgz - please note that > in order to use them, you have to copy the attached da.rc file to the > bwidget lang directory. obextool-0.35/contrib/startup/0000755000076400007640000000000011127517240016624 5ustar gerhardrgerhardrobextool-0.35/contrib/startup/obextool0000755000076400007640000000301411127517240020403 0ustar gerhardrgerhardr#!/bin/sh # ObexTool startup script for Debain Sarge, written by Hendrik Sattler # See also: http://www.stud.uni-karlsruhe.de/~ubq7/debian/ # # I has been tested and works great with: # obexftp (0.10.7-3) # tablelist (4.0-1) # obextool (>= 0.32-2 installed in /usr/share/obextool) # and obextool cofiguration dir /etc/obextool # It autodetects IRDA, Bluetooth and serial (/dev/ttyS0) interfaces XDIALOG=$(which Xdialog) if [ -z "${OBEXCMD}" ]; then echo "Define OBEXCMD environment variable to disable this scan!" if [ ${XDIALOG} ]; then ${XDIALOG} --infobox "Scanning for IrDA devices" 0 0 1000 & fi echo "Scanning for Irda devices" if ( obexftp -i -l >/dev/null 2>&1 ); then if [ ${XDIALOG} ]; then ${XDIALOG} --infobox "Found IrDA device" 0 0 3000 & fi echo "Found IrDA device" OBEXCMD_OPTIONS="-i" else if [ ${XDIALOG} ]; then ${XDIALOG} --infobox "Scanning for bluetooth devices" 0 0 5000 & fi echo "Scanning for bluetooth devices" BTADDR=$(obexftp -b 2>&1| grep Browsing | cut -f 2 -d " ") if [ "${BTADDR}" ]; then if [ ${XDIALOG} ]; then ${XDIALOG} --infobox "Found bluetooth device ${BTADDR}" 0 0 3000 & fi echo "Found bluetooth device ${BTADDR}" OBEXCMD_OPTIONS="-b ${BTADDR}" fi fi fi OBEXCMD_OPTIONS=${OBEXCMD_OPTIONS:=-t /dev/ttyS0} OBEXCMD=${OBEXCMD:=/usr/bin/obexftp ${OBEXCMD_OPTIONS}} export OBEXCMD echo "Using obexftp command: ${OBEXCMD}" OBEXTOOL_CFG=${OBEXTOOL_CFG:=/etc/obextool} export OBEXTOOL_CFG exec /usr/share/obextool/obextool.tk "$@" obextool-0.35/contrib/icons/0000755000076400007640000000000011127517240016235 5ustar gerhardrgerhardrobextool-0.35/contrib/icons/16x16/0000755000076400007640000000000011127517240017022 5ustar gerhardrgerhardrobextool-0.35/contrib/icons/16x16/folder_new.gif0000644000076400007640000000037611127517240021643 0ustar gerhardrgerhardrGIF89axxxhhh```PPPHHH000((( !,@{ d)RT BMH$eSIzMA`H$ `0p@X(qP!`LJn' Oص&J#(76a )ij 3 EIHp"!;obextool-0.35/contrib/icons/16x16/data.gif0000644000076400007640000000027411127517240020425 0ustar gerhardrgerhardrGIF89aX]]]ܠXXXܨ4!,@iP)3BR 5E(kPU e3I`k/X! Q'zab׌me0J,(PBq@_B[&giGnYY;obextool-0.35/contrib/icons/16x16/smi_icon.gif0000644000076400007640000000025211127517240021310 0ustar gerhardrgerhardrGIF89a000!,@W0yC XPD0PlHiV  WUر3CtQP(*:O)~B keCDV 0 +dE332%%###F2$'')2r2 "",!R5cN{D#JJ/|1 +'C30ýPD% -.FDA;obextool-0.35/contrib/icons/16x16/folder_orange_open.gif0000644000076400007640000000025011127517240023335 0ustar gerhardrgerhardrGIF87aXܠXXXX000ܨ,]I꼘cUeKB"lFnqG{ ,s$ u%$š%z{ ;obextool-0.35/contrib/icons/16x16/text.gif0000644000076400007640000000030111127517240020467 0ustar gerhardrgerhardrGIF89aX@XXXX000ܨ! ,@nP7 lM$ Q.V p,% AR@BPF4hӒ4HL` ^Vg>Ҳ1ax24w_h6w{Wa ex2W &;obextool-0.35/contrib/icons/16x16/configure.gif0000644000076400007640000000021111127517240021464 0ustar gerhardrgerhardrGIF89aܠXXX000!,@NX B** @^ZSQf)#Pe($8cB ѩ0PXP[Đ, g9;obextool-0.35/contrib/icons/16x16/bmx_icon.gif0000644000076400007640000000052311127517240021307 0ustar gerhardrgerhardrGIF87aܰ88иH(PhpX PhX080H`@(ȸ@hȰ@(PH8`8ȸH080,x@ @ "rTLR*$h[h`~ÀF$2?  si se   `  !"ZZ# i$%y&ZA;obextool-0.35/contrib/icons/16x16/filefind.gif0000644000076400007640000000052511127517240021273 0ustar gerhardrgerhardrGIF89a8P0H0xxp dHh0pp`h`@@`(PPp@80ppppXXXXT@@@hh G!,@rpB91`X!+TzhB8Ji" *'*D& k^+f,)GmWX (  # ^( !~F}GC'$A;obextool-0.35/contrib/icons/16x16/jad_icon.gif0000644000076400007640000000030111127517240021251 0ustar gerhardrgerhardrGIF87a@@XXX000ܨ,vcjU ɍ0G qd :y) KԵ 00@n00 bE%@5 7g5E:YaPPp"pp%Zex-~O(y3x-z;obextool-0.35/contrib/icons/16x16/reload.gif0000644000076400007640000000054211127517240020760 0ustar gerhardrgerhardrGIF89a@0 (x@(  @8(x8ذаШ X(xxxP XXXPPPHHH@@@h`(X(888 X P 000 H PH(((PH@ 880(  G!,@0dp9L=!d0XRfC -/0K3¸W-V 0_h  mK"iXj%&(]L$ u*VY+QB'#Ux##WBx.*A;obextool-0.35/contrib/icons/16x16/bmp_icon.gif0000644000076400007640000000032111127517240021273 0ustar gerhardrgerhardrGIF87a X踘,( hhh(((XXXPPPHHHppp888,V B%¦+ t];6܄q!X0@áx &S "D$AWb&O/4a4!;obextool-0.35/contrib/icons/16x16/db_icon.gif0000644000076400007640000000017311127517240021107 0ustar gerhardrgerhardrGIF89a!,@@*agSiaӁ5z E,PV}3֮t,ڥe $S6wo;obextool-0.35/contrib/icons/16x16/up2.gif0000644000076400007640000000041711127517240020221 0ustar gerhardrgerhardrGIF87aHHHppp```xxxPPPhhhXXX@@@, dihAb !rơ5"P,\W3X,nKp0p(aѶ Q "VHp xy, R_ln EaJ TmvUxz-0"!;obextool-0.35/contrib/icons/16x16/folder_orange.gif0000644000076400007640000000025211127517240022316 0ustar gerhardrgerhardrGIF87aXܠXXXX000ܨ,_IҼPmqUWRX0ʺ _ߣGFHDr)D ib WMx0$ `1aΞ szs_tv 2;obextool-0.35/contrib/icons/16x16/smo_icon.gif0000644000076400007640000000017711127517240021324 0ustar gerhardrgerhardrGIF87a,L BF%Aḧ́IFsd(ZrUA^ P0GxNC-`/0UE P$'*rGZuum#p]FA;obextool-0.35/contrib/icons/16x16/unknown.gif0000644000076400007640000000026311127517240021211 0ustar gerhardrgerhardrGIF89aܠXXX000@ܨ!,@`H3 EIQd$J%CxcMja6,} h>![G Zai X )Y%>Ahk S [q$L{TtB=@T1;obextool-0.35/contrib/icons/16x16/edittrash.gif0000644000076400007640000000057011127517240021502 0ustar gerhardrgerhardrGIF89axp8pP`pph蘠8HHЀȸpxxXh`P`X@XHxxxppphhh```XhXXXXPPPHHH@@@888!,@0`D0Rؙ4P%Ք:,"LfS~4jjP9T)5'/o5KO#-n4qKB'+B+* "K7  1$ 7~C')+moKRVP#+’C%onWJA;obextool-0.35/contrib/icons/16x16/news.gif0000644000076400007640000000025411127517240020466 0ustar gerhardrgerhardrGIF89a@@XXX0004!,@YI ZT8@1dҷQw +WnWTh#]B @9AAIL5`ĀPqxtӅuz +;obextool-0.35/contrib/icons/16x16/editcopy.gif0000644000076400007640000000032111127517240021325 0ustar gerhardrgerhardrGIF89aXX00 `d`!,@N d Aēƈ4 t-6LbxLL@WД /(H ZZ$D^;obextool-0.35/contrib/icons/16x16/kpaint.gif0000644000076400007640000000036711127517240021005 0ustar gerhardrgerhardrGIF89aX! ,t'#I#Ed}4Wi%#3*@(LJ%墂x," 5  / |_(OiYRb &HZ& ;44)!;obextool-0.35/contrib/icons/16x16/filenew2.gif0000644000076400007640000000061411127517240021225 0ustar gerhardrgerhardrGIF89aȨȸȨȠȠиȸȰ蘘иȰPPPȰ888xx(((ȨؠG!,@@pH,rT# `D"2H$Sh1,tlζ)  2a+ijkcJ'+-1+a W&3Km2o!aV&Y!^ jbL 1hc+gFc#.,%5.ŜW ˝ŝZ\"`GU%[)/aYA;obextool-0.35/contrib/icons/16x16/info.gif0000644000076400007640000000054711127517240020452 0ustar gerhardrgerhardrGIF89a $PP(,@@@000 G!,@@B,$r8 "Q))lYLB!"-w.4 e  {W|L rs}mOpqxz N$Q& ! |%_A;obextool-0.35/contrib/icons/16x16/editpaste.gif0000644000076400007640000000056011127517240021474 0ustar gerhardrgerhardrGIF89axИhH0pph`XpPH@(pPH@H`hhh````H`pXXXPPP8P`Px888`Px G!,@@pH, ?$R(gf)6+Q,&!%|:ҡKQX)KB C%%3O#z) ) D!B*++-!uv '$'0(4!/e `CgiB"OPb &1FBA;obextool-0.35/contrib/icons/16x16/view_icon.gif0000644000076400007640000000013511127517240021472 0ustar gerhardrgerhardrGIF89a000ܨ!,@.<2>$49lhmAIz X0zî]wD];obextool-0.35/contrib/icons/16x16/view_multicolumn.gif0000644000076400007640000000013511127517240023112 0ustar gerhardrgerhardrGIF89a000ܨ!,@.A9sʴ ȔVɶ80!~XtqDC;obextool-0.35/contrib/icons/16x16/kmidi.gif0000644000076400007640000000014111127517240020602 0ustar gerhardrgerhardrGIF89a! ,2˺GkEk{LbTuVb*D1j\P ƄHxrH ;obextool-0.35/contrib/icons/16x16/kmix.gif0000644000076400007640000000175311127517240020467 0ustar gerhardrgerhardrGIF89a'..!-!62A''' 2<***5b7\7d+,,9h;W;^sttuuuKwwwxxx`yyy{{{x|~m}}}M2N5\Xc,υSspmhjIgeUӐTUۜXxUꡡe㦦r嬬ذù”Ġإ! , ('") & 7>"G@*HH<+0BAd3DQ@$~aP"Ea1Є.` D &[N /d٣'XJ3kڤᒥ@4XG'VA@9͛!"񥌚8u&h :xJ`A9((;obextool-0.35/contrib/icons/16x16/bell.gif0000644000076400007640000000105011127517240020423 0ustar gerhardrgerhardrGIF89aޮj$zz__&Zz,AF-)@ !$%*7**."Ĥ*FF3F-';1?(6 E:/9 5=8A=3 ;obextool-0.35/contrib/icons/16x16/gnome-mime-image-svg.gif0000644000076400007640000000056411127517240023425 0ustar gerhardrgerhardrGIF89a k@@@KKI>Ui*YTTTD[q]]]3i=qvvveetuoႯÙލ罽Զϰ! ?,@,!oܵF2Gt({xHU>^,'s e3[a. &q;_^5%765544)P[;52 "4C;2!=10(źC$ !=BDA;obextool-0.35/contrib/icons/48x48/0000755000076400007640000000000011127517241017035 5ustar gerhardrgerhardrobextool-0.35/contrib/icons/48x48/text_large.gif0000644000076400007640000000313511127517240021663 0ustar gerhardrgerhardrGIF89a00yhӼmwћz²|qbzť}o~ոVSM}ĺsi\ziuuuЯӝkkkǠqi]xYTLҲaaaxtdJIG973yq1/+ӭ睖PLFͩzpb˲xn`{{z;;;쵙tx̣555\WNywqwgue̕лvչtϻж}m~krf`Wά蝒\YWپtk^ջpgZpnᦖ{󡝗ng[ĞκiaV}rcɻn˦pʷvvvje]tΜ`[SZUMSRPbbbldXTTTibXNNNROHεȦc\Rwm_׻|jŜ񺭚xrm:::c^Ukv߂vfʵɣ|ԵtTPIf_TzpaŹ}kؠſ@??깹)'%~@W`H8 @`H8@`D D@`8( b`!,00@H*4A܏#Jha*AYÉ 'ޚ W5F !DC=ԭЖM`R )?fּsgO+޼N- ZHB7À l =F 9sh9B1&,@aZsO%o$O=qBejA饔q7YcA )K4G6H9{!~b0nP@;obextool-0.35/contrib/icons/48x48/date.gif0000644000076400007640000000312311127517240020437 0ustar gerhardrgerhardrGIF89a00> yzzޚw/ Տj" Ǟ~ܖN $$-ҝӇb |k) ' ´odd KK\ zyzyyy **popӵ^O &ӌg{5 9OOOnф8 zzy{hC _íR 1Ջ""8~]]ږcā.fчC A ` 5^WoJ xӥZ yyztvS ~ F e\..}e {F -Ҋ< X03 ''p"|||azzzyzyܩ`y) pppՏ֍lI ͂ݬ/Ф: (uqP -  ̵W .ٖٔ$L F TTz.¡? ܪ_ꞰU Q % w΃ρ; ݛM } iD ˁ7 1ۓrM:{z.5w3 ؑ`8x(db`!,00@ H*\h4T=d@E"ũV 9ɓDB@G- M?&`@0]ւِM x䥓*Uƈ`Bׯ`,D9DÞa M+Å8ܙgK!,S*@VA{WaZ _,'B>;YoXJi&M M5vͣ6N 1 ԨSuYm%js孉3acj06NzHf[ZICCڍ)OkN>ɟ?+'}5jyZVB"DMЦ_h$ [%MZiuiTl`ЁT!H+pZt;=T pS;[0#V!&`B&r!VB  {O5R^D*Ӟ{tixC;~f`6Ԝ7B8O0$X:FDx2@4K޸r(͒u@dG*YMGPm vAВ-Mf>k%[ cN; gߔۮ)r ԱZM4nP@,4C0GȆH17%S .>{cW.M!´?9\QI,eA :FڒDhM9Y($TR|cw#3GՅܬDDlFTY CS #;hfGhJS,` 0y,v7xG%2B3(1 kDR%N V`5b"Qryy@;obextool-0.35/contrib/icons/48x48/kcmmidi.gif0000644000076400007640000000200111127517240021131 0ustar gerhardrgerhardrGIF89a00؈hpp蠠HHPxxxppphhh```XXXPPPPHPHPHHHH@@@000(((pphphh PHH G!,00@pH,Ȥ#jBPp6e(F˴zn#bpD&fé~> 3(a!' ---'F!!H|NMP!$`GRTVXZ\ik mJehjlnprtv+ MEL( 0"00 # $b8PpD 98@ ,:0q"cD]Ny5UU' \Ir)j0c#l2 Vd*a$kg-Q22<[D,.*,oNxpB<:/([L̕/9`"bH@Z"BXRױo(P0Ë'G~ܸPOfi8A>x0<}T&<|*:AbKC<7TY ~A] ``VE`1̗U: W^dR=6Y}h _XlM)ne- Ta\RuU$$I (4䓋_/@`[RicR2V6`g&@ `f/ԓr:0sPl(D.l zhg(&jlFE*)6ɦ~Zj(&+pk j물@A^ĐYt2FKPrrkJK!rAY]+Q+_;obextool-0.35/contrib/icons/48x48/file_large.gif0000644000076400007640000000443111127517240021616 0ustar gerhardrgerhardrGIF89a00LFDdTҬ|lbVdT|lʤTD´4.,\LTDĶTDn4dZQ\L4!lf\L}(T y(R"4=PYpU˂T)Sh&S h=XSl_WNpR^*.=٩ƒ֢‚syң[ ZΑmpG2|GP.ly8`$:C1#‚,FI">!8gH 5L'@nR21B]CL_xT*!.|H,b1"9LCRhI?VCA tq3h#pB4@y*8T ؂Ђf=+ H6,pa^ 34@Ruf[p>1D7 XXf}J o\[1D ,$agW5Aƃ!)MG S}u)`,Ȱ%p ]VY T4\,!@k6l,6Њ/㔩܁_hvG4HfZq 4.B,@jƅRbDH<Z'` elc~Ҹ Uj%7}$>s(^CY &KH?`<9pp0e gH-48bD"Aa bdb(8әGDG>҉L8&!g\ m[$IxSjTσ1#X1jl7[ ,H aR@, @d#+ 8$2ԓ"$Jd'KJl V։BhQ҂JmmHZ;obextool-0.35/contrib/icons/48x48/source_java.gif0000644000076400007640000000436711127517240022036 0ustar gerhardrgerhardrGIF89a00dB4|jR\F,\B,D><\<,|Ҭ\6,μp\2,\B<64ʤƴdfe4.,|rlľĺ̺ntndv<::dbTtZPd\TDFEtl>4dF,Ԕ|lR7|vaTBT>$&%|zx̾|rdʷdCʴLJKĴlČ~lƬzvd̾η|n\|f\|b\쌅|ĶzjlV8LNTq|ּdľT>4le\ִδάT: \^Vʬ|~|ƬƼ¼wwvd¤trtr\o„j\ljlf\Ҭdjdtvw|bTTRQdbdlNA|^TtfLt^LylfDtRLlVDlRDdN<|LNLd><̴DBD\>4\:4@„HX1#ň$ Ҋ&E2`@Hˣ^cszdڅ@G51 f4U"K% 1q[rl\Ca++$PJҹF礩Q yBaZȂcܹ(N)6&H(gt!Dg@FE쑋7b,dSBG!@* t0B_ꐀL` K01P'Dz? mcFF ¨P $`.@ x(!5 I4ARAu8f!b A-jqV$F21Mh@! 7! 0/^B  c@Xт;d#0AH'&aF7p l{쉐TMAz$'9oP2sOH9 [ߠ7W|C:KNm H =d0@̔A1W߶P1&X`ц6@:G8aed';;obextool-0.35/contrib/icons/48x48/vcard.gif0000644000076400007640000000235511127517240020627 0ustar gerhardrgerhardrGIF89a00@@8x̸0(((( `\PpȰxp|hxp`ؠhxИxиȰxhp`蠠̰xxxpppXXXؘHLHȨ000Ġмhd`x:%zhjs+ bs`$4Y9. `=0eSQ-5`ZHD/!,00@$#5-.8<11))1-: 3/66+>:  1++*!, Μ/. ;';ԭ Z$ 8ƍ! A X{k׳h\p'LAxkxԺHD/#HuC& ڣ [Hz$ e#<@qAtIͻ4dhf$v2း %Mgל@  XM)iu,\rUc< @BX}TZ0C,O1t``U vd (l0‰(b N (_/8Ɉ45#YF>RC Q <&Y?C 3x@ TՕfJ\Y(0:IbI1&\k >C `(Tg*(:v n11å*C-THz$QKtIB 4lrEc/uā6mA @Ъ,sB1SyC׬ДS5S+wy M5(5.>p_9ܰ!IMStSC~z5G!Ԡ[oRQuՂME8**,@B \0!7 (A! #~.(r$t%;obextool-0.35/contrib/icons/48x48/karm.gif0000644000076400007640000000402311127517240020454 0ustar gerhardrgerhardrGIF89a00JLffdB,fbdB,^^\쒒:$:$:$VVT22.v,6b4̶&R$664檬jrtF<JF&&$ccc: 2kk2 * * zz|R: ƾrrtF4F4jjlF4bbd>,>,rfLZZ\6$JJLBFDBBD::< r *.,**,>""$jfdbb\6>$ & "66 ... J6 ,(*fbȹY^@.\ItstcÄbV\ jw}BH3yrC4 .< 302_R"#LF0AP 6K3d&Ux:nȲ,B`ie8:.@hP+_RGS}U} HhNuю0iݓ&%UXc-Q3ad$E`Qg^ǓI L@1hV $GJ͞ <U0s("l`qAUP PI8Ԓ-x % *3G'qXB<8𔁸9s#ɨ>D"$ˋl&Ej(I^ʒP͡L X2@0 =`K/nX7ȶ>i`$)R1P ӌ !R+ Gf,W 2wܱ"a\6\2$*1q l8B|1iD mܦnHDp8ał}1/ L9kJ$ AHUWRN2dos(k_t 7}DŽmX*lx-=.T%`4Ѷ$00l".EΕF*T8@G"(TbA 8NɎ*P4 |XrFBhItBW|ò儡*}gVdDPQҔ&TCTwFRu 0 @'?VS\#6?B@') @,Edzq E=@60%F %ZBDp@=8/:vOB*bR BsŐp @p@H pC/Vla@&UJZ%S@D0 o4b^ ʀ1/dTv0 G`Е3`bI$O_@,c)3V0-#3^P'PAWxtYЊ5x- L&fT w h@jZ/  '8g STk\ :׉ΝS!;obextool-0.35/contrib/icons/48x48/korn.gif0000644000076400007640000000343511127517240020501 0ustar gerhardrgerhardrGIF89a00PP AAKK <<{{{yyyqqqkkkSS cccaaa___DDYYYWWWwQQQOOO[[GGGNNtpp곳555虙cc ܈֝yzzΩ ơğ::88 {ff YYJJ|||zzztttrrrpppnnnTTjjjhhhfffdddbbb++,```EE^^^\\\iiXXXVVV TTTLLLJJJHHHDDD>>}щ000bb***&&&UU"""Ϙ>)D̶F`׈{b`x8|@W`|8 @`8@`D `8x(Dlb`!,00@ H&$IIM+[:]B,h(F)UF` x7Pe1KP+&!YJ+H]\@Je!O1NduQSB )d -G6@\g SЂ]D-\UTmrQyG3 < 1T#pu %Ue`ŰV/82CՖdh]0(<51XEDG211O<'4I',җ2jE,hR#l!ǫ!F+"2bKĐ^i f*jѳZD9XDBqhI(/."@(Gcdدk+YЁL](c[(H\YmD(ф\| /1Y#{lQtGnSI$ 6Q)B- T45TrFPoSUeDƑٓ e` Zl0R+`b{nVap@G@ U EM)1-ad0<㕆=Q 1 iɂK*zfY#]h9G_ 1'c l`PUم 4- 0Y hEDA {h@x x zq )'@"qQbW |"J|AOrQc48VOgWum~x{w5{,C  f;Q9 n%}F}4/O~_bpG]8DYS˽H3/ ?  ם1  C8/  (읲4b6b4= @ *m  5\+;obextool-0.35/contrib/icons/48x48/folder_orange_open.gif0000644000076400007640000000237111127517240023355 0ustar gerhardrgerhardrGIF89a00HD@P`@X8 Ȁİ0Ęиp@pThL| p Ȭxظhظ̰xxx༈hhh xpppذhhP@(((|(x Шp:%zhjs+ bs`$Y9. `=0eSQ-5ԇ`ZD/!,00@5 + 88  1""-30;;::., >-- 5& &&4x8GPHЀL)"A Z"oNIɓ XP"Ŋ+vۂ>Pgb PCQ2XJdۧlg Ѣ96a{hMӰ- Hݻx~Js5FI|7Aԉ(x5GJś^qţȒ(IZR>Ry#ĭ=uA KhFӪ]FT'C:s:AH 0Aӡڵ i1@ >Q4餄w,г~*l@,X=9@4!$p$ q@  t($QADe_AaU"tMQ 'XH( %(A%Z!e4PI%g+2J)&n"|uO}ET`sFVH(_Efe)XXZg| 01 YPieO[pƊ$06#8^$4f$h^$&ABcIT5^U)vYDN@哗3 Y@Ţe鲓+ &Pf&q#_vm|@{f. I;obextool-0.35/contrib/icons/48x48/package_graphics.gif0000644000076400007640000000275311127517240023005 0ustar gerhardrgerhardrGIF89a""Ȫ;7^\p3dEE"#!P:Ƕ,(0.d4C%HޣdWˆk97э^D_۩z{1 bgz]_DgP&+kuc2:E{7Aׄ(%ݿUFHE׋10mXrOirAB@.mӖ22]"w~/0.P_vԀԓ[.wh%؟^|Hv,.~{~s; $q$V2a^dlM}lǧ+-%'6)()`xH؏tc~~ލPNHIjljیXց2チޠ3ųcj咐aFxdVa껹g y{xP4҈ћ3~cPioqn)*p-؏kmj]JctuJ bڛЈ{~p`QSP[k!xfN8WԅiwaʂlTF^Mw<=;z[F} 褢l&%M&Hd  Xt!,""@ H.ssÒY0q@AcaJ r䘕1IJijWA Ϟ1z܋Ⱥ`2ƪ1irNskz,8 ¾<’ vT$:,d|^^^¶{hƔڌ22t&ll\$w|Z~5;EȄ]&H.)_O?q!N悟TRm V6`$h"he<05!SLא,ę b 1XH8Tr@Ե@ -eIΘ@Kp!TI(߬ цfQ"pL'.=Hrd,vcF.Ek9P,TBh& )vEGI" T5S(38s.K2hhrj뭸*$Y7J ľecZ E`&G miHgN-~4Iz.- ! O? ("8.nK. .䤣T8* FBQ MG7S0@*\`to<Ėt޴T$|Bl>𴲴̒,VTRTtrt$T4L6f9\^\r\^ԒXԲ,., L>~J LJLljl^l񼺼b\Z\|z|dԬrvt464̂Dt\>̞ڤT,fdlb|J\T2 ܮ|424<:<  L& ԬV ܼܖ N̔^nܞ<̖ ̤bdl\DFD􄆄dfd|FTVTtvt$̼b쬮 LNLlnlb\^\|~|,00 H*\ȰÇHqDj&V8P"iHQ"45^f$I36-_CZmRhڔͥΈެ[56Qx ŽSm圃 Q$0'G"mVÍ3ھH ldZ\XkI/zw2POXl(=w0dg!4BJXztjLa9_v57+n@멳iw]/GQ O0(@TǓ/EQs<g@ GUp8_G !z 9o&ps!t0]סlÅ90=yEC-;%wb8 <5wE@&l \IEr cC[jTb| Ǐ?u.ITD;]ƙ v?]ЦFţ/PĢxJ( \p^QGsJ֨n)U "x"(@D4ٜ&ID*$! " AU`1$5 x/P y̲M$ va <@zN׈ ? 1q, C3$l˱!Pt >jX4E 4@JlG';ϱA/ :s#7sSm ;?Z1?WCeh?>e9ȑ|s8!:c@sP\^/;#. 3LC \@~u9f̺54Ѐo@>fpt.F Ј$!I` QqDȀ?<譏zX VЉ8t0LhF u/.VCXHEǦ15^]=!9~A9EL!T( :B|Y?d8"^#:Ё@Dm&0rD"0h Uu̐<:cJ.叀dH@;obextool-0.35/contrib/icons/48x48/tux_config.gif0000644000076400007640000000340011127517240021665 0ustar gerhardrgerhardrGIF89a00ۂ3wԱ XGƷC4p''&b*$1:4{}X3ƿ3o˜ 6l33bfiwww mmLC/A;)eܬ83&!"|zu kqp<-3am33ޢtX%3/{3AAA4w??? lʽ߈݆ɵ333ywqtG5  ۨ]O;'!!!Yb3{3"#ü3} "3۰ #33͛|B@D4xw iK%ؿV3͠>3zf34s~;ڍ78<:ՠĘ!3d33~353 uuG@A3y3;8P] #Kf{)ZyVVVTTTec^LLL83} 3v>>>3ڻú0003x2xǓ3LGH3݁ щ3z3nW1 j3߷"  38 @`X8@`D TP`8(b`!,00@q H*<ȰC"mD>YaCM̘iR&tZƃ^)h0&  F (]Zh )b)ə3(BxJׯ`tOx6Q4Cp"@WU\CvR+8h11t WۂxY20'cMȑ*XqcPANkȴ>CG6{BL/ z?ܱ `,QI۳ ѣd JOq!D|∖o)б޽ީXųWBRuHaz.\ d0b\XX  d&aaQphF4B7e M8?M>f OU DciIhLe$@Y i D*[I'E6G%b%6wf4[h\Th,B1\*G F[0(sF '* ԪA;obextool-0.35/contrib/icons/48x48/multimedia.gif0000644000076400007640000000347211127517240021663 0ustar gerhardrgerhardrGIF89a00zY~h<ϧ q Oa`坝rVo Ww'ѓ8EO|yyy4?~w*ǞqqqmmmPe`.79`{ 6Wxcccݚ]]]Ljqm QnYYY]8Y{GeWmr }ud(^wY7zO;uS}\oy?":@F&2111~+++)))MqԱWݘ+AE=J`6hwֶd>`kSҲb碢w>lI`%6̖fkՆF_Mrxxxvvv/@lllybbbp -6XXX"%ծNNNwFHFmeyB}tӊtDv%NCR?] ]o09ÿ>uN׵>)D̶F`׈4\{b`p8$@W`8 @`8@`D `8p(b`!,00@H*}(T y(R"4=PYpU˂T)Sh&S h=XSl_WNpR^*.=٩ƒ֢‚syң[ ZΑmpG2|GP.ly8`$:C1#‚,FI">!8gH 5L'@nR21B]CL_xT*!.|H,b1"9LCRhI?VCA tq3h#pB4@y*8T ؂Ђf=+ H6,pa^ 34@Ruf[p>1D7 XXf}J o\[1D ,$agW5Aƃ!)MG S}u)`,Ȱ%p ]VY T4\,!@k6l,6Њ/㔩܁_hvG4HfZq 4.B,@jƅRbDH<Z'` elc~Ҹ Uj%7}$>s(^CY &KH?`<9pp0e gH-48bD"Aa bdb(8әGDG>҉L8&!g\ m[$IxSjTσ1#X1jl7[ ,H aR@, @d#+ 8$2ԓ"$Jd'KJl V։BhQ҂JmmHZ;obextool-0.35/contrib/icons/48x48/info.gif0000644000076400007640000000470011127517240020457 0ustar gerhardrgerhardrGIF89a00D><|viҬe\žk~t Cu .T42,4.,Lz$L̳#B,nļ T jTblķdZT̼ =g茖TND cdМT[>J\LF<\|D~Ԥ|BW<99 Jz~dnt4nr,j\fl0̾< ^tLČl~l8~DBCUmz$z!B(dĬL1F{sfm(<0/k'|4߼^3dr)PD|AmxFDgapStCIh~- &0FBLZe>@{E@ w0,q]h@E;1U)$xI@7A 2YA**hf0 >4bjU|`5ݸ`1  .tj c x"g 9NYNyC61%.C/ 0P08lTB)@XHP$` $G(p, 80"4B"g@\) 6A'>Vlrw'0^y$(aqKҰ cX@SQWd&@ā֘Ex3 ىXE`)B%2@l xx_њ X2Wn:<5&. F+9lÿ2@t7Eg>4n# a/E0?~zXegAdz4fwP*B|HuwN3~SO%LKWBE.I*  rIbE"!zwT|..c}MX$ !òקyb߳ +|()ٗ`{YĄ S_%=Vh5,`0a X\qʆUhЀAF+Ă .,Xp"" ZT縧PJJիX@;obextool-0.35/contrib/icons/48x48/kpaint.gif0000644000076400007640000000445711127517240021023 0ustar gerhardrgerhardrGIF89a00  T|, f""$&&$&\2***4:4..,6.,22466422\>:$22t::<FBVT>>"̞|ҊLnlΚ rt4ž<Β|֦ ƚҦDdj\ftjάʔܲﶶ4ƾLd¾¾ܾʼtά̚ΔڬT! ,00 H*\ȰÇP(%*41"%J\H*]Tu$*EK$YPnʕ;Ƒ^bI&9r 5J IӦoIu3^v0„hQζaMU[(Z¨(k۵mJLXW= ( ކ 1+ I`G8<^(QO1lҘA[Rr`'u-bx%׵kʅ[<7aD c@ᇄ@,XbxQUܖ/kڴaD#VyPC 1DB2ѰH]4UC3(31L8" y CB]`A v (T R-q {b )ct`@aBh1-UM.@J*H J<.W5аq,A` F lyRJ\@"tӍ'og2YI~ 1  "d͡&0@D TN3oDJ0\#4~RL.QçT ҍ0͙0('46 &P@Pf+sd`Zҍ: +igMTMTh""87`(c)/Rh`%Ð2 P@X î8˻B4 GJ l9{GM7""  1Tڂroc7ƢahPAX7%+ZDI1P#7"G#J&tH'T8x'FC i ۚS(9u0E(\)@H$i $TH`i8\BF,hR._82L4j@q$L`tK70"nboj@!Ӏ'8 XX-@A 8o zZk~- pbf B҃L}@|)4ARn8!)`QB(c1AXXfPABt#QA! EXHE>O*1iN'@]|[p '@@Zqd\8ƑX؃ ] VP"I_LLAъV*?!PxF5zJ;X$d0 m@TUC0, d>8B A%.-a &o@ p$H)*Q;t! S(< p 0jB\JBCPE*LaD VP3#nXC!]X0)BQv \Lcp6 Ot"ZBD%QB ZxANP6`5"pF3T PZf6Ѐ%LzD D JBϤ D0J› H$ `"J$Eɭnwې;obextool-0.35/contrib/icons/48x48/vcalendar.gif0000644000076400007640000000431311127517240021463 0ustar gerhardrgerhardrGIF87a00l¬lt464lbT̂DĴR lRTRTIJƬL6Ҭ|z|Ttnd|\Fʼl|jdvμ\B|ztʴD"Ԟl$&$LFD>\Nr$" ʴ,.,LNLܺT.¼n ><>4lfdtR\Z\ܮҬ|ndʶ̄n~lT*,&$LJL|fdfd̺FD.^dz<ĎdԎLdԼZ ̞ljlD*zj|vd<64T:Č|̴rDd:||ܴt$dbdd>\.rҿlּvĴ|zdN^d|vttlf\Ķִ\JԴlεLJDܤlNԜ|䬦vʤtV|rfμ,*&<:A pN#A5Q$p~s7rQ8\lK6ŝ.2=;31dPG|!\DbS-! :xPJ4s`"7~#@S,XK$CeUƁ (n03:z3 `07߀B 0F2 1[, 4 :LHl3,8Cl1q L<-OCN(3H6H  tH3O/A,kпM(V\3" Q r,P{)^D2ĹĈTzJ/()Dʣ(eQ Q -,-׻elj y 08՜L1LnA./N= 2ei`[P+ 7.KûApmr1 P }BQ $bn v:5n|U 2X qSap?$'$r#a B aJ\&OLq pJlvqK$q&}ct"PF&\f3<@h߮)bЁbIkl$_h)=5ԃ$'O n- Ex``d @b 2FJ(E8 1La b4l oL]Ӟ.eC# G5*RjTMm9PCXVrd+VJVaj.VOp}\{lwGN;obextool-0.35/contrib/icons/48x48/xedit.gif0000644000076400007640000000401311127517240020636 0ustar gerhardrgerhardrGIF87a00dŒ̂4̼¤DFD䜖tTҜJVL&ҤĶ|޼$*,|,drt~TԤdZ<ҜvTԊlҼ\V<Ĭtʴ ڜVĜ|rܔtʬδdb|ĺڼ ¤윖\ĺ<2$ LTVTzlƜ̬TJ4֜bDt2ĺ|||zt|ҴnTԚ䤞ڬ^,R<,64$tVD<LNL\^\ܖt~\lnlĬvt~~d lLf ޴bDZČּδά Ƥ\<6$ִ¬|Ķ\VD̔ĺܜƤ֤즄G0<8Iڜ"@@LA \O.@@,XGHLG,00 H*\ȰÇ H"B2fHE2QB"0@!E0A&@xll9R 'cb3!;vrudQƤb%A%HW5ek5KRU;C!T\ (]ڨăeVH㠘58 #n@UqXـGkyZxk#MbU$G%~l֍&DznV|JpfXϫYMaz륩d-'$YX^ˎ9^\zBЈ}pB%*$B z@w{'2) @aAf 1ML- fN ]J̱C41G6gnT2-i IH%Gx A)z%zds:؀_aJ+,UW1m:A68vq){,K,Ǭ7 hݙ H榧S졁fn!RAvwz|ȘTԭ"U8ì&d§MA'2壘gVPI*4,t@(`y'i jrK>9~@i^+!S16b2ZJrtL N0P)-D,Mh#j+T K$%?d%m\ɐCL7B wҌxsjۉ2>B|POGM`RK-ۘXEゔnF6C@W8Ȇ8rN8ET(w\  H&&lHd !C`C,vI9 B |  +I%d_Hb"渐 Q" $Q!vPNA dLcX EH|,:7*yIHBP)b@i }- ; \ \b.+ȇB `C$,Ib,l5\6* USv";obextool-0.35/contrib/icons/48x48/package_multimedia.gif0000644000076400007640000000161011127517240023326 0ustar gerhardrgerhardrGIF89a00XT(@Ȩ8ظH@x8phh`и`pd0ȸXȰXh`(PPиH@H(Ԩp`ĸ踸xxxp0PPPPP(@@@888ĸ000((( x0!,00@@pH,Ȥr)pN(I-VDxl/t+ZVB*̡Dxh^556r8 !t55*9;!31 P:<==>G2`bc#e.h,59$(:(/]/07O99+%%ق  00 '*} &:ZŰÇ#R1#~!@#GDxҨQa tmy@66i BP&0!¢2TKB1J( X 7 r䘷 a03р psa†U&و CY h{ yj'1p WUHӨS^ &P(#i2<,i 0֖/x8iFXbi0K0b06OCcMMhe+~K YmS :pQ6> Xe2ʜWT564Eb`RէHx e Yo9M8)`4N9^NF  +gO`0C|M="ؓp'6d*V%  pId%HF,@SX:P,Xd 5>X*NMB ڦvL;obextool-0.35/contrib/icons/48x48/winprops.gif0000644000076400007640000000166711127517240021416 0ustar gerhardrgerhardrGIF89a00ؠؘؐxxxXXXPPPHHH``X G!,00@pH,dl:ШTJ\Hv=x`PDHf\+7<.dOV( kmoq$^xz|eLnpCV`~ & U ++ "#(() bإB$ r\Z`l{ jl_г uAȕ[8E6ĄGQ]Iɓ(S6q˗0Y^u؆ÊKhӪͼigH&nݺvP9sK†8enTA  Yp>nH %lLYOmm؂d@w ^{_rڽI½VBBKы ڈPgMNLthfJ N% +_S1dʘ9&,ZsVʽQS+N?~}Rjz)$"UVNTqaTT6 ,Dń#uGh5VX{$GG2Dȇ\ x$ qHhQgL|@4X$;x<&t'RH[.riWC|UD8 < #&|ݓ '*IOb< ['9Aǖ]e=D۟)c}S[;h+j v~jnzU ݮk^1+,K\;obextool-0.35/contrib/icons/48x48/kmix.gif0000644000076400007640000000343211127517241020476 0ustar gerhardrgerhardrGIF89a00!-&2!" 1<,40G0<6F(*'9I^01/DY046@g342DjHXF\GmJ_8:7FWKvPdNtLs2@E LySy RlR?A?NjDECYSiVqYWxGIF]l[e~JKIZeeMOL^yg{DV`qJUVQSQk nwWYVBao#m|]^\t} |Bkbdaf td (ϑ`de3$1L8VڳOCH"tRL J6D2# /2h$'>p̝b Iv$ X 'I),5s*B Jd'GH# HSj<&M̲ v!t䑇$LC0 L֒'BkͺPj"E`L0 -2zB) Wya ĀP("!Ԃ/)xR/ h?T޸2'[K-:2CG38 B8∏?I'LW/2J #4/\|Fm@ .* 0y]P<yAHA%6q-xk#Dv5$~ !ik#M4A pKp50|K Ty t .+8tsFCT)sl4Ï UG$Bt32|K8jl\4' Yq @M:z@`DY +!p+2d'8EH@Ѐ,@0AB8̡+;obextool-0.35/contrib/icons/48x48/bell.gif0000644000076400007640000000307211127517241020444 0ustar gerhardrgerhardrGIF89a00      "" "*.*":&N6JFJJj>n> v: bBRN$^J$vBzBvFZR$vFVV$^R$F~JbV,^Z$J^^$JNNRNRNbb,Rfb,~V,Rff,V RZ,VVRZjj4ZVzf4V^$Znn4rn4^$rn<^^rr4^b,rr<^^^$b$j,`"<`(!**CϪ 4M,]M9v~yAuB GdLJvE ,+.P&(q!cr#C b6h  R'RRG(Psjѓ*Ð@mAh e/L\t!;cdb!=iȸE?JX2_8A{h0APA z2#SLq!|‚%L32K(\آ$q!!/Ŝ 1B (2&a)( ,2 )Vz)$Ỷ+)26Ġ$H/9XL/\yCa s^Tg+U)aZ/*c /}"䟦0_(+9A闦 z"3槭 HTСY /iᄰyg K~*(PmCL r)X%z2 'ux 'b 20.b!rH"3|ubK04j/h!+$#^!ua-bL0‰&d 'B%d`dž:D"b2*jb)$)fE '$u0@'L.‰'kI0"N0('Gs̱umޗ 3-<NX%5x@;obextool-0.35/contrib/icons/48x48/gimp.gif0000644000076400007640000000456211127517241020467 0ustar gerhardrgerhardrGIF89a00)3%L$a. 9t}= D ?'F+ S'%J/EQ2*V5a+,O9=!!a: d=^Cgfem,m$DAqvG5ru\r*t1ywnPSy/bMl^nZI'._xu;F{[_77" ޽xBv=^U)=Z "AL=Fz >Qk)t̟<:2GϠ7OZHR_[0{wo_Ug Q0X+#Tnݺ+FZy|BSwPa#q޹ӫױǎ524\kX}?N>ـ@ p:8sDI(B4J!vhG6H 0C  8 rS 6d!4F*LN=,K+,+` p68RFWTcN=2x؁9?>G4L#84RƟޑl &va9sN=gpЌ?gpx:Dfqǟ|87i^"`?O>A~l 1(AK%tIJL6\H,z%N?ڄM=D-# !181 x9<|)7c?`# 021`A 80":LM_tN>pb # ZT 1N;KV\:`c7+hS1 T"RB&XbIMDV 7pMTFx%dppAK@=Q"0 7:{9#- Ѓz q (98sNσ_ 3@p Uxr6L _^6H8k^\4 uWȋxs ) 7T:4=Rsd~C$0`¥+WMR.N69t$Fdӻx>; ,l^$E)cTACx2^AW*CaE8‘8(HeX9``8J)H1B Rs>Ђ# `unӳpH$B(xv4 Âΰ MBwd v0U >A\҂Ei N AQ7`@e[X q ch8qzD?Ì.[4ClD1pR $$:IG1nTQ}9x4 i[-UHrGhbJ{@*ްx6)H 4@zk (q;d A3$Mz;obextool-0.35/contrib/icons/48x48/gnome-mime-image-svg.gif0000644000076400007640000000525211127517241023437 0ustar gerhardrgerhardrGIF89a04 %  ; $3$"&"$"+I+:-a,.+046342686M>@=EHEAC@DFDFHESRM&OLNK(&OQNY*V/].0b'^41/d f,`mC`.em994e^`]Hg,l?kFhPgCD_VPp-x6u-zMr9uDvlnk2~Zu5~>}?|=7XV[~IGFxzw^aJRhMPXYăJvXU_P~@p`XnstUԍwyx[xbUh͋}ɁZ晛gԜ_敠nޠoܔdmꤦn耳اr쭪Э}ڟ沴Έܧ۷迷нಯ¾Ü㾾ȩİջ! ,04H*8ÇHŋ-Fć&H$E{+@F2͛8+ݦCڜiH' %:H>'WsSX1YGsMP&;D (̪Y1[J0a™&=Mn:%LeKR6m7an1+r#N>T=3=H&TBkOZ5B$6߰G$EJ>at9;)4\a$6[>@-3x7l=O=sT<;jSJZ"m&7r =H>ԳI3(=S>ۙr7ĺNJZ;kjC!yJL<ۼs =hN7\s7!`lһ 7L2|L*r (:頃8nHJwl 0.@@@@9#&˦ bĜsN7X{SM34!}#;MܔN1C9`I؅M(첧(L⺣N1dNN7h0cr* Hx >9yJ%kMNTC#/S }7$*J}jb֘z 5|+E-Ƽ61xI؆p7|l: C:ҋa3 f8:&}?qxMrh ! i0 T$tb7z$ri0+a@hژ^ d 0܆5% E-a0\1$*40 kl#iNO6aqdp!!pArCݠ7!РOPMYdsD-3( E8|"X @,Xp=GdcңGq|#H= b,0Y8 Dc8Dc,\9qK|a%)(A d{PN_:z3պ)R皏` xDZw84! H01 \@CZ=̑rAbg@cˈƂІcMm6؆'G,mLΠ2ާ6uNvRq0R,7qi@ЀX d`hNf*Ȇf)^3Ƽ 8πP9h#{۸ F fLfNȃjRqRoBDQ]jUW"՗De]jV԰&$bNf;;obextool-0.35/doc/0000755000076400007640000000000011127522661014232 5ustar gerhardrgerhardrobextool-0.35/doc/TODO0000644000076400007640000000100711127517241014716 0ustar gerhardrgerhardrTODO list --------- Implementation of object multi selection (normal, extended and window), and Drag&Drop. Inline editing (e.g. file/folder renaming in canvas directly). Online confguration dialogue and options (eg. lang, device string...). Configuration storage as personal configuration profile on local computer and/or mobile. More command line parameters for initial configuration values (e.g. --list_initmode=icons --file_datefmt="Y/M/D H:M"). Installation programs (with config) and packages (RPM, MDK...). obextool-0.35/doc/INSTALL0000644000076400007640000001053211127517635015271 0ustar gerhardrgerhardrInstallation ============ Preface: If you are a lucky Debian Sarge user and you have Internet online acess, you may ignore this file, just put the lines: deb http://www.stud.uni-karlsruhe.de/~ubq7/debian testing main deb-src http://www.stud.uni-karlsruhe.de/~ubq7/debian testing main into your: /etc/apt/sources.list file and call: apt-get update apt-get install obextool The Debian repository for ObexTool, maintaned by Hendrik Sattler (programmer of the great software for Siemens mobiles SCMxx) - see also http://www.hendrik-sattler.de/scmxx/ will do the rest for you. After this use: obextool In any other case you need: 1 TCL/Tk version 8.x Tool Command Language (Tcl) is an interpreted language and very portable interpreter for that language. Tcl is embeddable and extensible, and has been widely used since its creation in 1988 by John Ousterhout. Tk is a GUI toolkit for Tcl. You may download it from http://tcl.sourceforge.net/ or install it form your favourite freeware server or Linux distribution. I've used 8.4 and 8.5, but older versions should work too. 2 The BWidget Toolkit The BWidget library was originally developed by UNIFIX Online, and released under both the GNU Public License and the Tcl license. You may download it from http://sourceforge.net/projects/tcllib or install it from your favourite freeware server or Linux distribution. If using the danish language files, you should copy the contrib file da.rc file to the bwidget lang directory. 3 TableList, a multi-column listbox package written by Csaba Nemethi It is also part of the tklib package from http://sourceforge.net/projects/tcllib. ALternatively you may download it from http://www.nemethi.de I've used Tablelist 4.2, but older and newer version should work also. 5 The ObexFTP program by Christian W. Zuckschwerdt ObexFTP implements the Object Exchange (OBEX) protocols file transfer feature. You may download it from http://triq.net/obexftp, from OpenOBEX too http://openobex.sourceforge.net/projects/openobex/ or install it from your favourite freeware server or Linux distribution. Tested with ObexFTP 0.19. Be sure to configure your wrapper script etc/obexwrap.sh or use the correct commandline syntax for the --obexcmd command line option or set the environent variable OBEXCMD to the corresponding value. 6 The ObexTool Frontend, written by Gerhard Reithofer You may download it from http://www.tech-edv.co.at/programmierung/gplsw.html This is version 0.35 Unpack the tarball, e.g. /usr/local/ tar -xzvf /root/obextool-0.35.tar.gz the software will create a new subdirectory obextool-0.35. Change the configuration to your suits, the files are located in the etc-directory of the ObexTool (example /usr/local/obextool-0.35), or try using the commandline options (obextool.tk --help). Start the ObexTool: /usr/local/obextool-0.35/obextool.tk or try using a commandline like this: obextool.tk --obexcmd "obexftp -t /dev/modem" You may also create a symlink in the binary directory: ln -s /usr/local/obextool/obextool.tk /usr/bin/obextool obextool Note: You must set the environment value OBEXTOOL to the installation dir if using a file link to obextool.tk. You may also create a shell in /usr/bin/obextool for using a specific configuration in /etc/obextool - example: #!/bin/sh # ObexTool startup shell # OBEXDIR=/usr/share/obextool OBEXTOOL_CFG=/etc/obextool OBEXTCMD="$OBEXDIR/contrib/obexftp/obexftp.static -t /dev/modem" export OBEXDIR OBEXTOOL_CFG OBEXTCMD # # Let's start the ObexTool without memory status # feature (if no Siemens), using Tk version 8.4 and # a specific configuration directory /etc/obextool # and the contributed static compiled obexftp version. wish8.4 $OBEXDIR/obextool.tk --memstat 0 You also may have a look at Hendrik Sattlers obextool startup script for Debian in the contrib/startup directory. If ObexTool does not find its libraries, a message will be displayed. Use the environment variable OBEXTOOL to point to the ObexTool installation directory (esp. when using symlinks to obextool.tk). export OBEXTOOL=/usr/local/obextool03 obextool Enjoy. obextool-0.35/doc/ChangeLog0000644000076400007640000001115211127522661016004 0ustar gerhardrgerhardr2008-01-02 Gerhard Reithofer * Version is: 0.35 * new parameter preserve,filedate (feature requ. by Falko - fakko) * repairing several bugs (e.g. inforrect date_format param.) 2008-12-06 Gerhard Reithofer * Version is: 0.34 * selectable download directory ObexConfig(download_dir,select) * default download directory ObexConfig(download_dir,define) * new parameter config,root_slash (thanks to David Khling) * pipe error if space in pathname (thanks to Stephen Huntley) * icon symlinks removed (windows), orig. icons moved to contrib * outdated static obexftp removed from contrib * polish language files (provided by Kamil Nowak) * new config commandline parameter (--setconf param value) 2005-08-20 Gerhard Reithofer * Version is: 0.33 * Bug in read_obextool_config repaired (thanks to Dalibor Straka) * New config parameter dir_slash for Nokia 6670 (thanks to Daniel Burr) * ObexTool directory changed to full lowercase (obextool-0.33) * Debian repository (maintained by Hendrik Sattler since 0.32) http://www.stud.uni-karlsruhe.de/~ubq7/debian/ 2005-07-11 Gerhard Reithofer * Version is: 0.32 * Version postfix 'alfa' removed from naming scheme (was never alfa ;-) * Keywords LC_ALL, LC_MESSAGES and LANG for language decision (2 chars) * Keyword LOCALE - checks the previous 3 environment values in order * Handling of encoding, quoting and trailing slashes moved to config * Environment variable OBEXCMD treated as --obexcmd default * Enhanced filename handling (for Nokia 6670 - thanks to Daniel Burr) * Command line parameter --version added 2004-08-22 Gerhard Reithofer * Version is: 0.31-alpha * Patch for Ericsson T630/K700i (thanks to Andreas Bhler) * Optional utf-8 encoding implemented * Optional HTML quoting implemented (T630/K700i) * Multiselection disabled (multisel is just on ToDo) * Danish language files (thanks to Jrgen Elgaard Larsen) * Contrib tool for translations (also by Jrgen Elgaard Larsen) 2004-08-31 Gerhard Reithofer * Version is: 0.3-alpha * New and more good looking About dialogue ;-) * Command line parameter --obexcmd, --obexdir, --obexcfg * Command line parameter --memstat, --debug, --help * New environment variable OBEXTOOL_CFG for etc dir. * Viewers and Editors may be defined together (context menu) * Most used context menu entries moved to menu beginning * XML parser corrections for Ericsson T610 and Nokia 6230 * Many, many enhancements in VCal scheduler plugin * Code reorganisation using TCL packaging * Lib enhancements to improve plugin developement * Several new file type icons * New Siemens addressbook plugin - read only, very early devel. 2003-11-07 Gerhard Reithofer * Version is: 0.22.2-alfa * Config parameter file,obexexe and file,obexdev removed * Shell wrapper script (etc/obexwrap.sh) - should work with bluetooth * Some wait-cursor usage - for the impatient one ;-) * Refresh of detail-list scrollbar on 1st call * Memory status can be deactivated - which works only with Siemens :-( * New configuration parameter config,memstatus for deactivation * Documentation updates 2003-07-15 Gerhard Reithofer * Version is: 0.21-alfa * Show properties extended for displaying folder summary * Fild file restricted to find from current folder onwards * Version checking for language files implemented (load_Messages) * A little bug cleanup 2003-07-02 Gerhard Reithofer * Version is: 0.2-alfa + main directory has been renamed from obextool to ObexTool (CVS) * VCS Plugin added, including german message file * fixed some bugs in obexfile.tcl (temporary renaming) * export overwrite simplyfied (only yes/no possible) * language parameter in load_Messages (taken from config if ommitted) 2003-06-19 Gerhard Reithofer * Version is: 0.11-alfa * Internationalization and implemented, language files in subdir lang * german language file added * Siemens SMS plugin added - thanks to Hendrik Sattler * ObexConfig(file,viewable) parameter moved from obextool.cfg to obextool.ext * Using of option --chdir of ObexFTP for upload * New function write_file_tmp in obexfile.tcl * Many, many minor changes... 2003-05-23 Gerhard Reithofer * Publication of the 1st package: 0.1-alfa obextool-0.35/doc/COPYING0000644000076400007640000004314611127517241015273 0ustar gerhardrgerhardr GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. obextool-0.35/etc/0000755000076400007640000000000011127517241014236 5ustar gerhardrgerhardrobextool-0.35/etc/obexwrap.sh0000755000076400007640000000207011127517241016423 0ustar gerhardrgerhardr#!/bin/sh # # Shell wrapper for obexftp 0.10.2+ # # Christian has changed output (of --list) to stderr, so we must # "redirect" it back to stdout # # Wrapper commands for: ### Version obexftp 0.10.2 - which I'm still using now... # obexftp.static -d /dev/modem "$@" # obexftp -d /dev/modem "$@" ### Version obexftp 0.10.3 # obexftp -t /dev/modem "$@" 2>&1 ### Version obexftp 0.10.4 (should also work with bluetooth) #### obexftp -b -B "$@" 2>&1 ### Bluetooth example (replace bt address and channel # obexftp -b 00:11:22:33:EE:FF -B 9 "$@" ### Typical serial interface call # obexftp -t /dev/modem "$@" 2>&1 ### In my $HOME stored development version # $HOME/sw/cprog/obexftp-0.10.4/apps/obexftp -t /dev/modem "$@" 2>/dev/null # obexftp -t /dev/modem "$@" ### obexftp -b 00:16:20:1A:12:8F "$@" # $HOME/tmp/obexftp-0.20-cad1/obexftp-0.20 -b 00:16:20:1A:12:8F "$@" # $HOME/tmp/obexftp-0.20-$HOSTNAME/apps/obexftp -b 00:16:20:1A:12:8F "$@" # obexftp -b 00:13:FD:05:8C:78 "$@" # obexftp -b 00:16:20:1A:12:8F -B 7 "$@" obexftp -b 00:1A:75:59:62:62 -B 7 "$@" obextool-0.35/etc/obextool.cfg0000644000076400007640000001075311127517241016560 0ustar gerhardrgerhardr### ### Obex tool configuration file ### set ObexConfig(cfg_file,version) "0.35" ### ### Language setting - 2 characters or environment ### keywords LOCALE, LC_MESSAGES, LC_ALL and LANG ### LOCALE honours $LC_ALL, $LC_MESSAGES and ### $LANG in order ### # set ObexConfig(config,language) en # set ObexConfig(config,language) de # set ObexConfig(config,language) da set ObexConfig(config,language) LOCALE # set ObexConfig(config,language) LC_MESSAGES # set ObexConfig(config,language) LC_ALL # set ObexConfig(config,language) LANG ### ### Date format in the file listings ### Format descriptors: ### Y - 4 digit year ### Z - 2 digit year ### N - 2 digit month ### D - 2 digit day ### H - 2 digit hour ### M - 2 digit minute ### S - 2 digit seconds ### Note: detailed list view becomes sorted alphabetically! ### # set ObexConfig(file,datefmt) "D.M.Y H:N" set ObexConfig(file,datefmt) "Y-M-D H:N" ### ### Temporary file path and prefix ### set ObexConfig(temp,prefix) "/tmp/otmp" # set ObexConfig(temp,prefix) "~/otmp" ### if encoding is wanted... set ObexConfig(config,encoding) "utf-8" ### ... else activate next line ... # set ObexConfig(cfg,encoding) "" ### if html like quoting is wanted... set ObexConfig(config,quote_map) {""" "'" "'" "'"} ### ... else activate next line ... # set ObexConfig(config,quote_map) "" ### Don't use chdir command in obexftp ls option (SE K700i,810i...) # set ObexConfig(config,dont_chdir) 1 set ObexConfig(config,dont_chdir) 0 ### Nokia 6670 requires the trailing slash on all directory names set ObexConfig(config,dir_slash) 1 # set ObexConfig(config,dir_slash) 0 ### Siemens S65V requires the trailing slash on obexftp ls # set ObexConfig(config,add_lslash) "/" ### ... deactivate "feature" if not working for you set ObexConfig(config,add_lslash) "" ### Some old Alcatel don't like "/" as root dir # ObexConfig(config,root_slash) 0 set ObexConfig(config,root_slash) 1 ### ### Preserve date on downloded file ### set ObexConfig(preserve,filedate) 1 ### ### Enable memory status display - only works with Siemens :-( ### # set ObexConfig(config,memstatus) 1 set ObexConfig(config,memstatus) 0 ### ### Enable file move command - only works with Siemens :-( ### set ObexConfig(config,filemove) 1 # set ObexConfig(config,filemove) 0 ### ### Busy cursor ### set ObexConfig(gui,cursor) watch ### ### Baloon help options ### set ObexConfig(gui,help_options) {-bg #ffffc0 -font {Helvetica 10}} ### ### Memory status bar colors (red, green) ### set ObexConfig(gui,status_bg) #C00000 set ObexConfig(gui,status_fg) #00C000 ### ### Initial main window size on startup ### set ObexConfig(gui,initsize) "800x600" ### ### Global dialog fonts ### set ObexConfig(font,labels) {Helvetica 12 bold} set ObexConfig(font,entries) {Helvetica 12} set ObexConfig(font,buttons) {Helvetica 12} set ObexConfig(font,frames) {Helvetica 12 bold} ### ### File list line height and font (tree_mode) ### set ObexConfig(tree,font) {Helvetica 12} set ObexConfig(tree,height) 21 ### ### File list line height and font (list_mode) ### set ObexConfig(list,font) {Helvetica 12} set ObexConfig(list,lineheight) 22 ### ### Icon view text parameters (icon_mode) ### set ObexConfig(icon,font) {Helvetica 12} set ObexConfig(icon,txt_maxlen) 12 set ObexConfig(icon,lineheight) 18 ### ### Icon view position parameters ### set ObexConfig(icon,xstart) 50 set ObexConfig(icon,ystart) 40 set ObexConfig(icon,x_offs) 80 set ObexConfig(icon,y_offs) 100 ### ### Text window parameters (file viewer, file/memory info...) ### set ObexConfig(textwin,font) {fixed 12 bold} set ObexConfig(textwin,width) 60 set ObexConfig(textwin,height) 20 ### ### System command for obexftp wrapper ### Will be ignored if OBEXCMD is specified ### set ObexConfig(obexftp,command) "$OBEXCFG/obexwrap.sh" ### ### Initial mode of list window ### # set ObexConfig(list,initmode) detail set ObexConfig(list,initmode) listb # set ObexConfig(list,initmode) icons ### ### Predefine download directory, if none is specified, ### the startup directory is chosen. ### # set ObexConfig(download_dir,define) $env(HOME)/mobile set ObexConfig(download_dir,define) "" ### ### Allow selection of the download directory ### # set ObexConfig(download_dir,select) 0 set ObexConfig(download_dir,select) 1 ### ### Select mouse button numbers for selection and context menu ### set ObexConfig(mouse_button,left) 1 # set ObexConfig(mouse_button,right) 2 set ObexConfig(mouse_button,right) 3 # # puts "Found configuration file [info script] version $ObexConfig(cfg_file,version) ..." obextool-0.35/etc/obextool.ext0000644000076400007640000000162711127517241016621 0ustar gerhardrgerhardr### ### ObexTool extension defintions ### set ObexConfig(ext_file,version) "0.35" ### ### Text - viewable file extensions ### set ObexConfig(file,viewable) [list log txt jad vcs] ### ### external graphic viewer programs ### set ObexConfig(view,bmp) "xzgv" set ObexConfig(view,bmx) "xzgw" set ObexConfig(view,png) "kview" set ObexConfig(view,jpg) "kview" set ObexConfig(edit,png) "kview" set ObexConfig(edit,jpg) "kview" ### ### X Multi Media System player for MP audio set ObexConfig(view,mp3) "xmms" ### ### MPEG moview player set ObexConfig(view,3gp) "mplayer" ### ### MIDI file player set ObexConfig(view,mid) "timidity" set ObexConfig(view,midi) "timidity" ### ### external editors ### set ObexConfig(edit,bmx) "gimp" set ObexConfig(edit,bmp) "gimp" ### ### external editors ### ### set ObexConfig(edit,txt) "kate" puts "Found configuration file [info script] version $ObexConfig(ext_file,version) ..." obextool-0.35/etc/obextool.typ0000644000076400007640000000264411127517241016635 0ustar gerhardrgerhardr### ### ObexTool file type descriptions ### set ObexConfig(typ_file,version) "0.35" ### ### Currently known file type extensions ### set ObexConfig(cfg,file_types) [list \ folder [get_text "Folder"] \ 3gp [get_text "3GP Video file"] \ adr [get_text "Address book file"] \ bmx [get_text "Animation file"] \ bmp [get_text "Bitmap picture file"] \ cfg [get_text "Configuration file"] \ dat [get_text "Data file"] \ db [get_text "Data base file"] \ gif [get_text "GIF picture file"] \ jad [get_text "Java definition file"] \ imy [get_text "iMelody ringtone file"] \ jar [get_text "Executable Java file"] \ jpg [get_text "JPEG picture file"] \ jpeg [get_text "JPEG picture file"] \ log [get_text "Log file"] \ mid [get_text "Midi ring tone file"] \ midi [get_text "Midi ring tone file"] \ mp3 [get_text "MP3 audio file"] \ png [get_text "PNG picture file"] \ smi [get_text "SMS incoming file"] \ smo [get_text "SMS outgoing file"] \ svg [get_text "Scalable vector graphics"] \ txt [get_text "Text file"] \ vcf [get_text "Bussiness card file"] \ vcs [get_text "Organizer entry file"] \ ] puts "Found configuration file [info script] version $ObexConfig(typ_file,version) ..." obextool-0.35/images/0000755000076400007640000000000011127517241014730 5ustar gerhardrgerhardrobextool-0.35/images/3gp_icon.gif0000644000076400007640000000052311127517241017120 0ustar gerhardrgerhardrGIF87aܰ88иH(PhpX PhX080H`@(ȸ@hȰ@(PH8`8ȸH080,x@ @ "rTLR*$h[h`~ÀF$2?  si se   `  !"ZZ# i$%y&ZA;obextool-0.35/images/3gp_large.gif0000644000076400007640000000161011127517241017260 0ustar gerhardrgerhardrGIF89a00XT(@Ȩ8ظH@x8phh`и`pd0ȸXȰXh`(PPиH@H(Ԩp`ĸ踸xxxp0PPPPP(@@@888ĸ000((( x0!,00@@pH,Ȥr)pN(I-VDxl/t+ZVB*̡Dxh^556r8 !t55*9;!31 P:<==>G2`bc#e.h,59$(:(/]/07O99+%%ق  00 '*} &:ZŰÇ#R1#~!@#GDxҨQa tmy@66i BP&0!¢2TKB1J( X 7 r䘷 a03р psa†U&و CY h{ yj'1p WUHӨS^ &P(#i2<,i 0֖/x8iFXbi0K0b06OCcMMhe+~K YmS :pQ6> Xe2ʜWT564Eb`RէHx e Yo9M8)`4N9^NF  +gO`0C|M="ؓp'6d*V%  pId%HF,@SX:P,Xd 5>X*NMB ڦvL;obextool-0.35/images/ObexTool.gif0000644000076400007640000006111011127517241017151 0ustar gerhardrgerhardrGIF89avRvjě׻,7BN)WbqvxqVVWUdjp|nbbb㩾5BJ]bjn4?pBBBʴIpzW?JQ*8?vp~?W_\x߈ɖwRr~eptr:jt$('>JJJJt]T^c|mnoTnv?dmy̧ӝv222FPUvvvFX_v~dx킊:::^vz|~7R["+0~jrv܁ƢUjqLYze~NNN.>Fefg7NXsRZ_]be]^_g~***K^eU2ftfKck...nrtJRW!CNŔ"""b~~~ijk5bn\~6662>D&&&FFF ۜۼ>^gg֢S|>>,DOpzLX_+MXIjtՐrrrRRRhZrz]fj憩z3Yczzz,vcH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ L È+WX$b7z[ene2k.Ͳ#sgp>ZdR^mhAys/slKc6Yr[޽3c!*Uܰhu*շB~ڲs3q{^h⭖B'qYV\p#oJPR 9ߑ!JE1H0`uHq(EIF80CU42c󐳌-^M8XI>"\h!xC5HC2LDB zp%X hleG- @ T0b>xL  Cd,5CN;D 2( -Xc H"Dx7@p#&,Uhpp>2a~0j@ \ALa +61豌w(61Aq VX`y1/R/\a8`&XF8`c3Q&#+$a q^!6&*b =`2 n 6d0"\'8HFHAM_<  0Cp&wsNbئ/PX9Kp;dApt0KA[t(IoA9|F7@2bn@`/',LN ~ԛ!'HJժW-)VUR500F51Nt(#ŁD5|z8X8  @BM{󤰀:v (1|R+O؀ Ց@Ґ&yvcFu'%nw6n{#>9' X$2a[^ A"|ܖh ` 2JV(ipr/|Wrġ ','@Lx]b7Qab؀"a%O=Y! .e/^ؾ&vo{Ol8D7S/1G%Z q$ HAűJ*'a6Aۖ- Q y#(@2G@1cxȬA V;m0U,bS. _Ye01p >bB\N{@s;=OzQJ=)Inrj7gJ7  M1(qPVX`[L 3a3(

i Astk` wp ,0|Т|7s շ ~@ 0%ix)k} h! ) [B)`p~ P F i(# P%`7` p @ :p/P7RO m` )®0 }ipmt7`'` C_:z!@8 ( kᐺ:I `{0c0 p aPY0 < p ] %S8 3 ՠp @D)x@ PY`  A`f Fd vmI-a(XgddƔKA)yiuڈSIGYjg `B٥\A e<~#cGiBb<JYrz3& T@E  f0(fN%G9I& ''`6$@Ud!agXId碰 )gKPCNnًs;5W5Q iOd%*Ki%7a8G3dpqb0gM $ 5U%fr*qAD7ib EtP:^q&;6q 2c*~2 ::'HA vxάbCB#x`Mbp׀ahF/ Jo#v,3\S9HAA,PX69 sf/W66@L-F?QG49,%HPԂaG-aXA38V0=WT<5nbx&.0ٵvɦ,kTAcI=P4Jش $'/ܡ W'(CC 88J20cNze_z@hB8ч?`'@BB``$@P°ڢgO{ DP )`HЂVņ9jU3Xg/ Ak#H# 4nq!WaH Vupu?SC! "A*D Ǟf0`A j6Y2q xaJf0B0)LN Լ[`.BK(@F&x`@v.gye >+Y5q8 <P=^q/l,*0!Bl@u}3aiX-@H@e[Aˈ)0?TOCyXb>qZr| N鉷 d|` v՞%Ԑ<ъsՔ# 1 X>!-} 4吇t & 0ՋeG$&Pvר;U] &q?@ R8HI8VsW<)Zϊ<@ IPx .9HaBŏx9@,бIw򛗨G'6Ɋ9Y2<^d, 8!M>oas؄  0 Hxh=I1p:4]P{`o8?xExl8j&,>cD1|ة9h`Dp:Hw.XlPE*) =Ѓɫ!iQ`1%3m'jg`cPUq&HxO& # 0p xlXړ000Y`\`pD;RRvL HJQ9a'ʼn=j@Xe{A`H'FHr k_Ȅp#xex4A$wUhX9@\xҐiLB6@7yPoD oFq`r4Ǽq ile3m6"uhM[a8V  |'vBR@a `p8m@ș3,]1sȆW*XcP861Sd~ 6P =\P(c8*|`9P&@@X^h& HG(C !|xKi0T2Z@,$rZA 4PdAڅ .h#:`hfV04$qK 2P)KKx jp `'BԐW̅uȅex*<ӆU9*  @K;@x$%?mYS>ANVĈuh9 I+ɛU(R0>3鐇8\rlhgNTIV0lXg+1|v {hVЁZ0N0 Hc/X@<}(@h"DOY8. (`hxIJ(V6V-;EB^/شbP9+p51KWPvT}x+Z#pcg8MHrj d.&:ZVGXxy&lXhj( S 60+r$Lb؃W#h (]d;3ghP1(ܴ \<5Nn /驀m 1QtWX96*Z0#"*90a[{@ W`Y@`p@N=l *ehfYeWȆ6x:HJ Xxl0)SuU<0ۂw =+ uP `iI@V# Z|Ⅳm ųM0oضN G(Pp]k(V0ȇ(@bTd` 8Ju؁<GHS8ކq9S;ʅ?Od/R'2=k8T 8'hT"1j1:? 0]PcA݅{*&؍/^ zph "$E^d#@m02(Y0~@ GZ;~4HU= F0(6"0>#hkhp(=J8Xl)6gP:P\h70{vٹ1)I,1PȅFK$Syh؂ @B/ș*!x@ NoJ!ڭuM$0 8zgaЅ;A~Nhg1{HK FDMVt*mH1@ "֫]`:ZX15㙋Sz؆F؆ Ȅ^} #p]SL@Ȃi:(heXn_d1H^6M gxΛ6PZvL-Pf@6? +ѳ`W\XȦRNW¡aef1d<(>mtqEi?t(9b1pR` :HN hnxEz0W@9l76<&]^Y+~،i`y2W31<;C2=4lcx-@8V^ix?P<8@C'Tx?VЃzH-m=Q5Pa@0P&YzMb@ !Dkǃw+C(Nˆ h!;I'f@.# R8~;(z?5w`fgPze3h\ Cp<=/DUe P{0U*;PvY`jXG -vjH#x%^y(POy'pYypj]8jSx7/b$_*0^h,VX!nd:h t(Q!xY[-8H2]'@q]iUUjJ'|_RhiC4( \A*=hwwa9; %Jr*wts?v"`"[v}مXG\ypGl4; \ *daħg}fcvISm@*NPV:]uj,eʡdtP:ZI4BG?vi?~FRK؉wI$kex@͊b,)B=|PԂ(S@OqxNazË?/TDyl %YB> 2%D a8B S8&_/qDhGxЀ+jp P *™DxR, ՜O~ Nc1gY3b@8 #Eq+%I A=8A,S&,f˞B0l<1NP_Rnl]diy5섁58D(q6t,VBSM$0;M0 hG{K% B'r @Rрu0 v[>%0:B4P5T!抡;d ed_3=B)A4+" tZuG #"0\pAz=m7r,:b|U5as(ijM,'e. }P@5Cd/AdΒ 0⁚4T ]5~!$18Ģ_n3lN`@>0$.$|,|2,́2@.,́\9+x "!d]8(@x!^ԏ`CmZQ= ?d, xlެǨA!l=B/L$ٽU3(B2d ؂2H=h! $^eA!X[&)B8A8VxH?o,)@,ؘEmulL ((0d` 5B=d04(A5hXM0<2.C- $^f*#U.m?$F$fB@óI?$4L4 PCQXe@$A\$"Cd'`@)HњS<>æ%@LxTWeEkT`&xQ1 3A.mV T,ރ=A a|CB4 4CbЃ{t4RA0 $x?HT,S%ā9$1N]4pA<6h("@+C^aeRG@DC!xݐB9TFB(ȣp9dT6tH@>x;EiCC@-l$LUA-C:|4?h)4,94,۶f C@-³ٝPECSn=,=C^|9 @:-0A C/(+/\d=tB'lC# B ].dte7@CXCUE'; ,e%tA~9%xA 6$@ 7< WB'̂%,Iz\!xt#7XCiÎ(&AlQf.+lC$N_!$LUA3AC$]B|Ѐ&l> @5 ik`A !%D'lC!ԃ<,,B@7ƚt{g6V|<&(%OR`!|Ӿd]X+):@3h -, " 4C<l@AN #|C9AX58-2̡CL7)6`:&&`j^f>\A7(47:xzK$H.%Lk:l~?%Qu*ѬC-@ۢ|C @$ȭ,0Aͨ09A BFM OA&44:'B́z_b}kjƒ&BdL1L_Y".Ȣ8Ѐ 78L@) 1ad5dR- ;p?TC TC5aBؾl2 TEA# @:$ -C:C|d`6/-,ȶC !X9BB|+Xz-AR$82EB:\*DBI&uT 4 C '--4x.dM+?:`+_@qHPC X%0A:/\L;^ PŦ)%$L CSyo`GU-8@‚^:I-C6HA!P @6 +\@j]*B`C@('%B)@qY {2N7^O+SC @퇄J$$&:lEVF=tMl7Atѭ!\,@/-p9*+0$9:C70MB٬oR *,A5` u>߃]CCpCiVQA>#s1dj{Tv>`B:?3(Ě0 A-a|7L=rwztW$Ză/PU1R(8؂@@+ᵎe`:x*)!]5Tw&9Ԏh?BlÊ& @F]\82pix74!H2fPɍ (@<@id&,n :%& M9P ,Ѐ-@L 9r@.|Վa$; ҂9pA.] 6+=T6h|؟Q?28K0i`j_#HA 3:䚠 9:l P=)#4BeYp6 $ C؃ XA+Oeo,) -B-7* C3xBCZP0ȁ/0;(׊V@ƃl 4A07$0eaV7#0$$7:}6̕ 0 P9el`_ŝuc\ʃ,h$w%w:A*w b 0-O` /4:YO)} #I7hkWa nT)4Zhgw`)/]8t²( J"@Dx 1h%NjbcЍ. ޞ-EHXSda6_̈c(hU(zAS<]tY-w± qfFJ*#^AfCbMH& iń ($Į]Îc!r~y9ER`l N"g&ڰ#gL1DˌaNoşY)؁.AK D)$Y&*x$"BUUV+e/| Q$Ph2j 4V]ܹJn[W0cPx]U>Q*tj-p&b`j6*a_!F;(-Oy(fwr A2TpG /$& sү@a j^! YCVvF6 #QbeP!X;bpPAVڕU@r"r`lD;Ɋ,1qdha@z6,2F C9" ] @N`E-p%<@5HfAyL_эDl GЇ2ޱ0戔;0uю䦑$8 HPh #/;Lc2|rB,Vcx<8VKy^@FQBP0pF"`,h@t c\d{ha  ]D'b `FԦfb%H qHeY3xi 7r (0y9|@.6|@ TX|p0Z a9PX268lЅ(VDJ8Ģ$W(jUe(]aLJ_#N4b G$1`5f!:tK^\nXbXv[E ap i# 31 G{ٜ.u/>Iq-h%h Z+QKNOey@ڨOo;8G99i?  D ؁ƈKEbHBH1{R( 1-4js; eJTPc F66 `m(G {GQ *dJa '8}#7  Qr<ɭb$(*|)',`?Ap0(07Q-;׎eTвOƜb*j费kA ],? 6tg QV JUBQ%p! 9*l8?h?uͦ;xp^d ʀs>vPt;$nGK_P p jф'LcPˍk0`hƣYKF h;V(FՆ ZCfsLk< 'QPL$ U`9DYT8: *Y@҅rn/OE[Vݖխ>AHw> \ԢpHsi} pEq'z m #8 瀁H Jc$aF`j6f1 NXCo$cWr&6ax %ZG(ZaF}!Da JXa&AnNJ|dF\&څAZ-TnHdv-CF!v( Үi A7 2 d {fA Zhvm|憐Z6Br aΡi_vCJ@[ v-Te*."aʊA! `XN  f @ ]PH&dD! a( vJ`VeMHfa  ` G졵~l!\! r,d0ކ!ށ@aH\ a>AL{fPkL`2A* |,`K\q p!+bFxTrK.l nE"! <>@Vp &ʭN @mh  Z9 !``>3Á` `R 0QA/ @jHQdX(nZ @A; `=D f D&As\a@HDȂ#`@&a;R]p@"J#a~$ $ ʭQl6`5h*A먋SZ@^) @:F b:YnZoA;,t Նg-Gyb @a@QR=B$#(QU)3 ` -  U A@Cmed  Je O.F ba(,:ASQ AO *wUC t&FA!@S "q^2`&BA,r 2 $hm?H  `ܱfA,bP#7nvaN/O) [t, @F (* A/4b`pobN22`F!! Dmؼtă%PMl ·T,"Q!\A4 l!<P( cQ+N" b^f86lO= <( HU%N@r$U;l>A3l]9)xaXUT@"aw#!v+&|`Fga @ :4%( Ҁ `tJQs9A6XBE @  &`N >>b5rc H]WVi]+kt=3u! ~/82o b J;؎" !LL6j81bF*֖z` WoGD1!HXw&t Ng3Damݠ,`3v)Vo) U\5:#%#vסb7"+km*zH%gBh`{ &@S _ϗJ/\9B! QuM >N` 37i﵊ՠ.܀L L@azaQتLu &<ؕPՊsUr/ja2.h# J%a ҚB9I#H}XA:,u\? Z*@aN!"g,nL["A?>ͬ+ĂtQً/vCFemzM﫺 '/B9?;HG۩Y+q%-1Iƻvx-AL/XņU6}UZ8E],9rIMÝ7]0a|=Ax% /}-|[ˎ^xO;c3I`] 64XÕSGj"HTBbA菔BI}gܑV>ARSx,HO~H0M1%8d7}^UvHքl0b\^˕t/TLYTpp^'BzҐ!x X\P9BUWEs#8ífሏr%fUGB*q'TZ5##r1z~]6RIA,5NLO5alɦ 2xu!Muxe6 "ix3ZecW85V"Y4HUf5ne"nȥ\zTI? XdIz7lLj |9bKv֘8-i*Y;=8kMzUfqe؍=+ nEƤʦqVZk-VkZF1R>DF]$yd ӗ=tiv`QF =kiYq7k(?NJ 4>mbn~eU~ZGq*gTȟe]U*S̈hۿq*GVs՚VFQՔZw8ankZX)Z%(_䳱R8MDgj>5#.}(gT2܌IA4.`v^Σ-Cs_69UK^#XPHR;ho@G:dgle,X1/23`lyTz%d<̇]vKIb LpBr5BmG,pw{cuÌ!LHd$.M6ꏇ=U+M~aQVbFB'SX41xamD'"Qc \*o)m˘ 0(g1΂%.N.N#_n'0 Z2k(2`_ 帼DIsO YB2NrW8 b1Zc4!RTֈF 8`06HR~ iU&ƼXъVJm1^G/Ϝebԙiގ2U7~Le*nGLYW^K،SqUoDPכN6}ʫ.4ʼn6ӓ[ъ {9H*Ϫx(9t=ՙ=Tئ3qģ{(f.]JJOdy IZz e.> AԞ7 fY;RtM)P"rl-n&HސER=^j6%$^sZk [A"n~L G(T%\9hrtG&O&ΞVX՘9,ߜNZJW)K%'\z1洓t%q(n~pmK~m dKMMɵ,yN̞W>J_M& ]Q+^Jl'C_.] X0qV~zf|,gYy`K^/jP]leZ잓WyBFċ LtVYfb Xre"YPW.Ƴ5ЌZlay4^J%gm{#6GdjT#ːg2NWt%$m_ MV_״}/]f|``9' fP.'XN:|=`$Wb.lP {a o䌺FunSݺZ۲쵃p5ĸ]F-a ~SPo6Ȧ尉=+/|Ef~\-i钏9Ì3Қcvu#;OŵC{-U^k|´e ҫb?pyW`umהl)p;_ +p^{ew]wOqX6+z*#yz,x'8f}@5 yRX]mo O>]m5gs^cwuQm|z~LG}sW~ c}p0,%08Gng~\~W"Es[dkr (bC&c|wvX|&zwOw#5oB:  1++*!, Μ/. ;';ԭ Z$ 8ƍ! A X{k׳h\p'LAxkxԺHD/#HuC& ڣ [Hz$ e#<@qAtIͻ4dhf$v2း %Mgל@  XM)iu,\rUc< @BX}TZ0C,O1t``U vd (l0‰(b N (_/8Ɉ45#YF>RC Q <&Y?C 3x@ TՕfJ\Y(0:IbI1&\k >C `(Tg*(:v n11å*C-THz$QKtIB 4lrEc/uā6mA @Ъ,sB1SyC׬ДS5S+wy M5(5.>p_9ܰ!IMStSC~z5G!Ԡ[oRQuՂME8**,@B \0!7 (A! #~.(r$t%;obextool-0.35/images/bmp_icon.gif0000644000076400007640000000032111127517241017201 0ustar gerhardrgerhardrGIF87a X踘,( hhh(((XXXPPPHHHppp888,V B%¦+ t];6܄q!X0@áx &S "D$AWb&O/4a4!;obextool-0.35/images/bmp_large.gif0000644000076400007640000000445711127517241017361 0ustar gerhardrgerhardrGIF89a00  T|, f""$&&$&\2***4:4..,6.,22466422\>:$22t::<FBVT>>"̞|ҊLnlΚ rt4ž<Β|֦ ƚҦDdj\ftjάʔܲﶶ4ƾLd¾¾ܾʼtά̚ΔڬT! ,00 H*\ȰÇP(%*41"%J\H*]Tu$*EK$YPnʕ;Ƒ^bI&9r 5J IӦoIu3^v0„hQζaMU[(Z¨(k۵mJLXW= ( ކ 1+ I`G8<^(QO1lҘA[Rr`'u-bx%׵kʅ[<7aD c@ᇄ@,XbxQUܖ/kڴaD#VyPC 1DB2ѰH]4UC3(31L8" y CB]`A v (T R-q {b )ct`@aBh1-UM.@J*H J<.W5аq,A` F lyRJ\@"tӍ'og2YI~ 1  "d͡&0@D TN3oDJ0\#4~RL.QçT ҍ0͙0('46 &P@Pf+sd`Zҍ: +igMTMTh""87`(c)/Rh`%Ð2 P@X î8˻B4 GJ l9{GM7""  1Tڂroc7ƢahPAX7%+ZDI1P#7"G#J&tH'T8x'FC i ۚS(9u0E(\)@H$i $TH`i8\BF,hR._82L4j@q$L`tK70"nboj@!Ӏ'8 XX-@A 8o zZk~- pbf B҃L}@|)4ARn8!)`QB(c1AXXfPABt#QA! EXHE>O*1iN'@]|[p '@@Zqd\8ƑX؃ ] VP"I_LLAъV*?!PxF5zJ;X$d0 m@TUC0, d>8B A%.-a &o@ p$H)*Q;t! S(< p 0jB\JBCPE*LaD VP3#nXC!]X0)BQv \Lcp6 Ot"ZBD%QB ZxANP6`5"pF3T PZf6Ѐ%LzD D JBϤ D0J› H$ `"J$Eɭnwې;obextool-0.35/images/bmx_icon.gif0000644000076400007640000000052311127517241017215 0ustar gerhardrgerhardrGIF87aܰ88иH(PhpX PhX080H`@(ȸ@hȰ@(PH8`8ȸH080,x@ @ "rTLR*$h[h`~ÀF$2?  si se   `  !"ZZ# i$%y&ZA;obextool-0.35/images/bmx_large.gif0000644000076400007640000000161011127517241017355 0ustar gerhardrgerhardrGIF89a00XT(@Ȩ8ظH@x8phh`и`pd0ȸXȰXh`(PPиH@H(Ԩp`ĸ踸xxxp0PPPPP(@@@888ĸ000((( x0!,00@@pH,Ȥr)pN(I-VDxl/t+ZVB*̡Dxh^556r8 !t55*9;!31 P:<==>G2`bc#e.h,59$(:(/]/07O99+%%ق  00 '*} &:ZŰÇ#R1#~!@#GDxҨQa tmy@66i BP&0!¢2TKB1J( X 7 r䘷 a03р psa†U&و CY h{ yj'1p WUHӨS^ &P(#i2<,i 0֖/x8iFXbi0K0b06OCcMMhe+~K YmS :pQ6> Xe2ʜWT564Eb`RէHx e Yo9M8)`4N9^NF  +gO`0C|M="ؓp'6d*V%  pId%HF,@SX:P,Xd 5>X*NMB ڦvL;obextool-0.35/images/cfg_icon.gif0000644000076400007640000000021111127517241017160 0ustar gerhardrgerhardrGIF89aܠXXX000!,@NX B** @^ZSQf)#Pe($8cB ѩ0PXP[Đ, g9;obextool-0.35/images/cfg_large.gif0000644000076400007640000000340011127517241017325 0ustar gerhardrgerhardrGIF89a00ۂ3wԱ XGƷC4p''&b*$1:4{}X3ƿ3o˜ 6l33bfiwww mmLC/A;)eܬ83&!"|zu kqp<-3am33ޢtX%3/{3AAA4w??? lʽ߈݆ɵ333ywqtG5  ۨ]O;'!!!Yb3{3"#ü3} "3۰ #33͛|B@D4xw iK%ؿV3͠>3zf34s~;ڍ78<:ՠĘ!3d33~353 uuG@A3y3;8P] #Kf{)ZyVVVTTTec^LLL83} 3v>>>3ڻú0003x2xǓ3LGH3݁ щ3z3nW1 j3߷"  38 @`X8@`D TP`8(b`!,00@q H*<ȰC"mD>YaCM̘iR&tZƃ^)h0&  F (]Zh )b)ə3(BxJׯ`tOx6Q4Cp"@WU\CvR+8h11t WۂxY20'cMȑ*XqcPANkȴ>CG6{BL/ z?ܱ `,QI۳ ѣd JOq!D|∖onH %lLYOmm؂d@w ^{_rڽI½VBBKы ڈPgMNLthfJ N% +_S1dʘ9&,ZsVʽQS+N?~}Rjz)$"UVNTqaTT6 ,Dń#uGh5VX{$GG2Dȇ\ x$ qHhQgL|@4X$;x<&t'RH[.riWC|UD8 < #&|ݓ '*IOb< ['9Aǖ]e=D۟)c}S[;h+j v~jnzU ݮk^1+,K\;obextool-0.35/images/db_icon.gif0000644000076400007640000000017311127517241017015 0ustar gerhardrgerhardrGIF89a!,@@*agSiaӁ5z E,PV}3֮t,ڥe $S6wo;obextool-0.35/images/db_large.gif0000644000076400007640000000156411127517241017164 0ustar gerhardrgerhardrGIF89a00X((Pxphx``` h xxx8ppp0hhh```XXXPPP@@@Px((888Hp @h` G!,00@@pH,ȤɒD"0Nrkai4 f|9Y᜶bIC /NfVg'uu#pJ,'_'##&\D,#)&Kr# Y]Rggo, {~aۅWg(SuE,$xxzveu""''4Bn%Ct-4FK *cfiEB%V@#6R 2*XYcnXbqmbt;LQ+%VfBQj~eh8+* /CVH$<ֆUԖ~ȝK_\(h֩T\"+cMP X"j"CZrrmErˮҨY,Eլ-Edl&Oh KKP [# e%A:@ij 8@/w](V^$`@ͧ? ">&n"|uO}ET`sFVH(_Efe)XXZg| 01 YPieO[pƊ$06#8^$4f$h^$&ABcIT5^U)vYDN@哗3 Y@Ţe鲓+ &Pf&q#_vm|@{f. I;obextool-0.35/images/download.gif0000644000076400007640000000046511127517241017233 0ustar gerhardrgerhardrGIF89a8|P8lPP`408`Hxpx0`@hp(D8 80 40PX,(ȠPX̘H|PĐ8p@8d@8`@hh @(ؠ 0(PPА̐̀xh`̀8\X G!,@R@pH,DtqJ=,0amaBm Ue'Ta$ڸz)7ᴆ )"TJ!%  pq YsUA;obextool-0.35/images/edit_cut.gif0000644000076400007640000000056011127517241017220 0ustar gerhardrgerhardrGIF89aph`hX`x`Hаhhh0H؀(xpxhhh`H`pXPXXXPPP8P`888xxpp`XG!,@@pH, RQ*3⌦X,DM6bူ82R\K>CDV 0 +dE332%%###F2$'')2r2 "",!R5cN{D#JJ/|1 +'C30ýPD% -.FDA;obextool-0.35/images/editcopy.gif0000644000076400007640000000032111127517241017233 0ustar gerhardrgerhardrGIF89aXX00 `d`!,@N d Aēƈ4 t-6LbxLL@WД /(H ZZ$D^;obextool-0.35/images/editdele.gif0000644000076400007640000000057011127517241017200 0ustar gerhardrgerhardrGIF89axp8pP`pph蘠8HHЀȸpxxXh`P`X@XHxxxppphhh```XhXXXXPPPHHH@@@888!,@0`D0Rؙ4P%Ք:,"LfS~4jjP9T)5'/o5KO#-n4qKB'+B+* "K7  1$ 7~C')+moKRVP#+’C%onWJA;obextool-0.35/images/editpast.gif0000644000076400007640000000056011127517241017235 0ustar gerhardrgerhardrGIF89axИhH0pph`XpPH@(pPH@H`hhh````H`pXXXPPP8P`Px888`Px G!,@@pH, ?$R(gf)6+Q,&!%|:ҡKQX)KB C%%3O#z) ) D!B*++-!uv '$'0(4!/e `CgiB"OPb &1FBA;obextool-0.35/images/file_icon.gif0000644000076400007640000000026311127517241017347 0ustar gerhardrgerhardrGIF89aܠXXX000@ܨ!,@`H3 EIQd$J%CxcMja6,} h>![G Zai X )Y%>Ahk S [q$L{TtB=@T1;obextool-0.35/images/file_large.gif0000644000076400007640000000443111127517241017512 0ustar gerhardrgerhardrGIF89a00LFDdTҬ|lbVdT|lʤTD´4.,\LTDĶTDn4dZQ\L4!lf\L}(T y(R"4=PYpU˂T)Sh&S h=XSl_WNpR^*.=٩ƒ֢‚syң[ ZΑmpG2|GP.ly8`$:C1#‚,FI">!8gH 5L'@nR21B]CL_xT*!.|H,b1"9LCRhI?VCA tq3h#pB4@y*8T ؂Ђf=+ H6,pa^ 34@Ruf[p>1D7 XXf}J o\[1D ,$agW5Aƃ!)MG S}u)`,Ȱ%p ]VY T4\,!@k6l,6Њ/㔩܁_hvG4HfZq 4.B,@jƅRbDH<Z'` elc~Ҹ Uj%7}$>s(^CY &KH?`<9pp0e gH-48bD"Aa bdb(8әGDG>҉L8&!g\ m[$IxSjTσ1#X1jl7[ ,H aR@, @d#+ 8$2ԓ"$Jd'KJl V։BhQ҂JmmHZ;obextool-0.35/images/filefind.gif0000644000076400007640000000052511127517241017201 0ustar gerhardrgerhardrGIF89a8P0H0xxp dHh0pp`h`@@`(PPp@80ppppXXXXT@@@hh G!,@rpB91`X!+TzhB8Ji" *'*D& k^+f,)GmWX (  # ^( !~F}GC'$A;obextool-0.35/images/fileinfo.gif0000644000076400007640000000054711127517241017220 0ustar gerhardrgerhardrGIF89a $PP(,@@@000 G!,@@B,$r8 "Q))lYLB!"-w.4 e  {W|L rs}mOpqxz N$Q& ! |%_A;obextool-0.35/images/folder_icon.gif0000644000076400007640000000025211127517241017701 0ustar gerhardrgerhardrGIF87aXܠXXXX000ܨ,_IҼPmqUWRX0ʺ _ߣGFHDr)D ib WMx0$ `1aΞ szs_tv 2;obextool-0.35/images/folder_large.gif0000644000076400007640000000165211127517241020050 0ustar gerhardrgerhardrGIF89a008А X<pР@`@Ȉp(ȰШ`Р`ԸȸHhH| xtd`DpHhxxxظtt```pȬphМP@@@а̨P8ppЈhG!,00@@pH,ȤRù.VL$B0rˤ [*FbH@LAh\Fa_ &99077++fh % $%F%!(#%2#[`I1/q/ )43:M..xX Kd 6hjlnp.'I*D=jWC cEW:`(BcȜI3!0d!Ť.ذiEʀ*&']ʹjhԡbC 8%,a7/ Q q `k"66!q@@BG$5|Utx$As!d!%^4!``Q U O,ޕi )WAFN YJo/ նF¢ 2RN.;ąRjE'3uD+[)R2A[eͽ.r,[8:wcT>)б޽ީXųWBRuHaz.\ d0b\XX  d&aaQphF4B7e M8?M>f OU DciIhLe$@Y i D*[I'E6G%b%6wf4[h\Th,B1\*G F[0(sF '* ԪA;obextool-0.35/images/foldernew.gif0000644000076400007640000000037611127517241017412 0ustar gerhardrgerhardrGIF89axxxhhh```PPPHHH000((( !,@{ d)RT BMH$eSIzMA`H$ `0p@X(qP!`LJn' Oص&J#(76a )ij 3 EIHp"!;obextool-0.35/images/gif_icon.gif0000644000076400007640000000036711127517241017202 0ustar gerhardrgerhardrGIF89aX! ,t'#I#Ed}4Wi%#3*@(LJ%墂x," 5  / |_(OiYRb &HZ& ;44)!;obextool-0.35/images/gif_large.gif0000644000076400007640000000445711127517241017350 0ustar gerhardrgerhardrGIF89a00  T|, f""$&&$&\2***4:4..,6.,22466422\>:$22t::<FBVT>>"̞|ҊLnlΚ rt4ž<Β|֦ ƚҦDdj\ftjάʔܲﶶ4ƾLd¾¾ܾʼtά̚ΔڬT! ,00 H*\ȰÇP(%*41"%J\H*]Tu$*EK$YPnʕ;Ƒ^bI&9r 5J IӦoIu3^v0„hQζaMU[(Z¨(k۵mJLXW= ( ކ 1+ I`G8<^(QO1lҘA[Rr`'u-bx%׵kʅ[<7aD c@ᇄ@,XbxQUܖ/kڴaD#VyPC 1DB2ѰH]4UC3(31L8" y CB]`A v (T R-q {b )ct`@aBh1-UM.@J*H J<.W5аq,A` F lyRJ\@"tӍ'og2YI~ 1  "d͡&0@D TN3oDJ0\#4~RL.QçT ҍ0͙0('46 &P@Pf+sd`Zҍ: +igMTMTh""87`(c)/Rh`%Ð2 P@X î8˻B4 GJ l9{GM7""  1Tڂroc7ƢahPAX7%+ZDI1P#7"G#J&tH'T8x'FC i ۚS(9u0E(\)@H$i $TH`i8\BF,hR._82L4j@q$L`tK70"nboj@!Ӏ'8 XX-@A 8o zZk~- pbf B҃L}@|)4ARn8!)`QB(c1AXXfPABt#QA! EXHE>O*1iN'@]|[p '@@Zqd\8ƑX؃ ] VP"I_LLAъV*?!PxF5zJ;X$d0 m@TUC0, d>8B A%.-a &o@ p$H)*Q;t! S(< p 0jB\JBCPE*LaD VP3#nXC!]X0)BQv \Lcp6 Ot"ZBD%QB ZxANP6`5"pF3T PZf6Ѐ%LzD D JBϤ D0J› H$ `"J$Eɭnwې;obextool-0.35/images/icondetl.gif0000644000076400007640000000012311127517241017214 0ustar gerhardrgerhardrGIF89a000ܨ!,@$ Jˎ1{GJ8fUjz.tk;obextool-0.35/images/iconlarg.gif0000644000076400007640000000013511127517241017214 0ustar gerhardrgerhardrGIF89a000ܨ!,@.<2>$49lhmAIz X0zî]wD];obextool-0.35/images/iconlist.gif0000644000076400007640000000013511127517241017242 0ustar gerhardrgerhardrGIF89a000ܨ!,@.A9sʴ ȔVɶ80!~XtqDC;obextool-0.35/images/imy_icon.gif0000644000076400007640000000105011127517241017221 0ustar gerhardrgerhardrGIF89aޮj$zz__&Zz,AF-)@ !$%*7**."Ĥ*FF3F-';1?(6 E:/9 5=8A=3 ;obextool-0.35/images/imy_large.gif0000644000076400007640000000307211127517241017371 0ustar gerhardrgerhardrGIF89a00      "" "*.*":&N6JFJJj>n> v: bBRN$^J$vBzBvFZR$vFVV$^R$F~JbV,^Z$J^^$JNNRNRNbb,Rfb,~V,Rff,V RZ,VVRZjj4ZVzf4V^$Znn4rn4^$rn<^^rr4^b,rr<^^^$b$j,`"<`(!**CϪ 4M,]M9v~yAuB GdLJvE ,+.P&(q!cr#C b6h  R'RRG(Psjѓ*Ð@mAh e/L\t!;cdb!=iȸE?JX2_8A{h0APA z2#SLq!|‚%L32K(\آ$q!!/Ŝ 1B (2&a)( ,2 )Vz)$Ỷ+)26Ġ$H/9XL/\yCa s^Tg+U)aZ/*c /}"䟦0_(+9A闦 z"3槭 HTСY /iᄰyg K~*(PmCL r)X%z2 'ux 'b 20.b!rH"3|ubK04j/h!+$#^!ua-bL0‰&d 'B%d`dž:D"b2*jb)$)fE '$u0@'L.‰'kI0"N0('Gs̱umޗ 3-<NX%5x@;obextool-0.35/images/jad_icon.gif0000644000076400007640000000030111127517241017157 0ustar gerhardrgerhardrGIF87a@@XXX000ܨ,vcjU ɍ0G qd :y) KԵ 00@n00 bE%@5 7g5E:YaPPp"pp%Zex-~O(y3x-z;obextool-0.35/images/jad_large.gif0000644000076400007640000000470011127517241017330 0ustar gerhardrgerhardrGIF89a00D><|viҬe\žk~t Cu .T42,4.,Lz$L̳#B,nļ T jTblķdZT̼ =g茖TND cdМT[>J\LF<\|D~Ԥ|BW<99 Jz~dnt4nr,j\fl0̾< ^tLČl~l8~DBCUmz$z!B(dĬL1F{sfm(<0/k'|4߼^3dr)PD|AmxFDgapStCIh~- &0FBLZe>@{E@ w0,q]h@E;1U)$xI@7A 2YA**hf0 >4bjU|`5ݸ`1  .tj c x"g 9NYNyC61%.C/ 0P08lTB)@XHP$` $G(p, 80"4B"g@\) 6A'>Vlrw'0^y$(aqKҰ cX@SQWd&@ā֘Ex3 ىXE`)B%2@l xx_њ X2Wn:<5&. F+9lÿ2@t7Eg>4n# a/E0?~zXegA<\<,|Ҭ\6,μp\2,\B<64ʤƴdfe4.,|rlľĺ̺ntndv<::dbTtZPd\TDFEtl>4dF,Ԕ|lR7|vaTBT>$&%|zx̾|rdʷdCʴLJKĴlČ~lƬzvd̾η|n\|f\|b\쌅|ĶzjlV8LNTq|ּdľT>4le\ִδάT: \^Vʬ|~|ƬƼ¼wwvd¤trtr\o„j\ljlf\Ҭdjdtvw|bTTRQdbdlNA|^TtfLt^LylfDtRLlVDlRDdN<|LNLd><̴DBD\>4\:4@„HX1#ň$ Ҋ&E2`@Hˣ^cszdڅ@G51 f4U"K% 1q[rl\Ca++$PJҹF礩Q yBaZȂcܹ(N)6&H(gt!Dg@FE쑋7b,dSBG!@* t0B_ꐀL` K01P'Dz? mcFF ¨P $`.@ x(!5 I4ARAu8f!b A-jqV$F21Mh@! 7! 0/^B  c@Xт;d#0AH'&aF7p l{쉐TMAz$'9oP2sOH9 [ߠ7W|C:KNm H =d0@̔A1W߶P1&X`ц6@:G8aed';;obextool-0.35/images/jpeg_icon.gif0000644000076400007640000000032111127517241017350 0ustar gerhardrgerhardrGIF87a X踘,( hhh(((XXXPPPHHHppp888,V B%¦+ t];6܄q!X0@áx &S "D$AWb&O/4a4!;obextool-0.35/images/jpeg_large.gif0000644000076400007640000000275311127517241017525 0ustar gerhardrgerhardrGIF89a""Ȫ;7^\p3dEE"#!P:Ƕ,(0.d4C%HޣdWˆk97э^D_۩z{1 bgz]_DgP&+kuc2:E{7Aׄ(%ݿUFHE׋10mXrOirAB@.mӖ22]"w~/0.P_vԀԓ[.wh%؟^|Hv,.~{~s; $q$V2a^dlM}lǧ+-%'6)()`xH؏tc~~ލPNHIjljیXց2チޠ3ųcj咐aFxdVa껹g y{xP4҈ћ3~cPioqn)*p-؏kmj]JctuJ bڛЈ{~p`QSP[k!xfN8WԅiwaʂlTF^Mw<=;z[F} 褢l&%M&Hd  Xt!,""@ H.ssÒY0q@AcaJ r䘕1IJijWA Ϟ1z܋Ⱥ`2ƪ1irNskzAׄ(%ݿUFHE׋10mXrOirAB@.mӖ22]"w~/0.P_vԀԓ[.wh%؟^|Hv,.~{~s; $q$V2a^dlM}lǧ+-%'6)()`xH؏tc~~ލPNHIjljیXց2チޠ3ųcj咐aFxdVa껹g y{xP4҈ћ3~cPioqn)*p-؏kmj]JctuJ bڛЈ{~p`QSP[k!xfN8WԅiwaʂlTF^Mw<=;z[F} 褢l&%M&Hd  Xt!,""@ H.ssÒY0q@AcaJ r䘕1IJijWA Ϟ1z܋Ⱥ`2ƪ1irNskzҲ1ax24w_h6w{Wa ex2W &;obextool-0.35/images/log_large.gif0000644000076400007640000000401311127517241017350 0ustar gerhardrgerhardrGIF87a00dŒ̂4̼¤DFD䜖tTҜJVL&ҤĶ|޼$*,|,drt~TԤdZ<ҜvTԊlҼ\V<Ĭtʴ ڜVĜ|rܔtʬδdb|ĺڼ ¤윖\ĺ<2$ LTVTzlƜ̬TJ4֜bDt2ĺ|||zt|ҴnTԚ䤞ڬ^,R<,64$tVD<LNL\^\ܖt~\lnlĬvt~~d lLf ޴bDZČּδά Ƥ\<6$ִ¬|Ķ\VD̔ĺܜƤ֤즄G0<8Iڜ"@@LA \O.@@,XGHLG,00 H*\ȰÇ H"B2fHE2QB"0@!E0A&@xll9R 'cb3!;vrudQƤb%A%HW5ek5KRU;C!T\ (]ڨăeVH㠘58 #n@UqXـGkyZxk#MbU$G%~l֍&DznV|JpfXϫYMaz륩d-'$YX^ˎ9^\zBЈ}pB%*$B z@w{'2) @aAf 1ML- fN ]J̱C41G6gnT2-i IH%Gx A)z%zds:؀_aJ+,UW1m:A68vq){,K,Ǭ7 hݙ H榧S졁fn!RAvwz|ȘTԭ"U8ì&d§MA'2壘gVPI*4,t@(`y'i jrK>9~@i^+!S16b2ZJrtL N0P)-D,Mh#j+T K$%?d%m\ɐCL7B wҌxsjۉ2>B|POGM`RK-ۘXEゔnF6C@W8Ȇ8rN8ET(w\  H&&lHd !C`C,vI9 B |  +I%d_Hb"渐 Q" $Q!vPNA dLcX EH|,:7*yIHBP)b@i }- ; \ \b.+ȇB `C$,Ib,l5\6* USv";obextool-0.35/images/mid_icon.gif0000644000076400007640000000014111127517241017174 0ustar gerhardrgerhardrGIF89a! ,2˺GkEk{LbTuVb*D1j\P ƄHxrH ;obextool-0.35/images/mid_large.gif0000644000076400007640000000100411127517241017335 0ustar gerhardrgerhardrGIF89a00؜؈؄|t|l 808؜(,(؄($(|Ѐ |  l  G!,00@pH,Ȥ h:,')U>dz4fwP*B|HuwN3~SO%LKWBE.I*  rIbE"!zwT|..c}MX$ !òקyb߳ +|()ٗ`{YĄ S_%=Vh5,`0a X\qʆUhЀAF+Ă .,Xp"" ZT縧PJJիX@;obextool-0.35/images/midi_icon.gif0000644000076400007640000000014111127517241017345 0ustar gerhardrgerhardrGIF89a! ,2˺GkEk{LbTuVb*D1j\P ƄHxrH ;obextool-0.35/images/midi_large.gif0000644000076400007640000000100411127517241017506 0ustar gerhardrgerhardrGIF89a00؜؈؄|t|l 808؜(,(؄($(|Ѐ |  l  G!,00@pH,Ȥ h:,')U>dz4fwP*B|HuwN3~SO%LKWBE.I*  rIbE"!zwT|..c}MX$ !òקyb߳ +|()ٗ`{YĄ S_%=Vh5,`0a X\qʆUhЀAF+Ă .,Xp"" ZT縧PJJիX@;obextool-0.35/images/mp3_icon.gif0000644000076400007640000000175311127517241017134 0ustar gerhardrgerhardrGIF89a'..!-!62A''' 2<***5b7\7d+,,9h;W;^sttuuuKwwwxxx`yyy{{{x|~m}}}M2N5\Xc,υSspmhjIgeUӐTUۜXxUꡡe㦦r嬬ذù”Ġإ! , ('") & 7>"G@*HH<+0BAd3DQ@$~aP"Ea1Є.` D &[N /d٣'XJ3kڤᒥ@4XG'VA@9͛!"񥌚8u&h :xJ`A9((;obextool-0.35/images/mp3_large.gif0000644000076400007640000000343211127517241017272 0ustar gerhardrgerhardrGIF89a00!-&2!" 1<,40G0<6F(*'9I^01/DY046@g342DjHXF\GmJ_8:7FWKvPdNtLs2@E LySy RlR?A?NjDECYSiVqYWxGIF]l[e~JKIZeeMOL^yg{DV`qJUVQSQk nwWYVBao#m|]^\t} |Bkbdaf td (ϑ`de3$1L8VڳOCH"tRL J6D2# /2h$'>p̝b Iv$ X 'I),5s*B Jd'GH# HSj<&M̲ v!t䑇$LC0 L֒'BkͺPj"E`L0 -2zB) Wya ĀP("!Ԃ/)xR/ h?T޸2'[K-:2CG38 B8∏?I'LW/2J #4/\|Fm@ .* 0y]P<yAHA%6q-xk#Dv5$~ !ik#M4A pKp50|K Ty t .+8tsFCT)sl4Ï UG$Bt32|K8jl\4' Yq @M:z@`DY +!p+2d'8EH@Ѐ,@0AB8̡+;obextool-0.35/images/openfold_icon.gif0000644000076400007640000000025011127517241020232 0ustar gerhardrgerhardrGIF87aXܠXXXX000ܨ,]I꼘cUeKB"lFnqG{ ,s$ u%$š%z{ ;obextool-0.35/images/openfold_large.gif0000644000076400007640000000237111127517241020402 0ustar gerhardrgerhardrGIF89a00HD@P`@X8 Ȁİ0Ęиp@pThL| p Ȭxظhظ̰xxx༈hhh xpppذhhP@(((|(x Шp:%zhjs+ bs`$Y9. `=0eSQ-5ԇ`ZD/!,00@5 + 88  1""-30;;::., >-- 5& &&4x8GPHЀL)"A Z"oNIɓ XP"Ŋ+vۂ>Pgb PCQ2XJdۧlg Ѣ96a{hMӰ- Hݻx~Js5FI|7Aԉ(x5GJś^qţȒ(IZR>Ry#ĭ=uA KhFӪ]FT'C:s:AH 0Aӡڵ i1@ >Q4餄w,г~*l@,X=9@4!$p$ q@  t($QADe_AaU"tMQ 'XH( %(A%Z!e4PI%g+2J):$22t::<FBVT>>"̞|ҊLnlΚ rt4ž<Β|֦ ƚҦDdj\ftjάʔܲﶶ4ƾLd¾¾ܾʼtά̚ΔڬT! ,00 H*\ȰÇP(%*41"%J\H*]Tu$*EK$YPnʕ;Ƒ^bI&9r 5J IӦoIu3^v0„hQζaMU[(Z¨(k۵mJLXW= ( ކ 1+ I`G8<^(QO1lҘA[Rr`'u-bx%׵kʅ[<7aD c@ᇄ@,XbxQUܖ/kڴaD#VyPC 1DB2ѰH]4UC3(31L8" y CB]`A v (T R-q {b )ct`@aBh1-UM.@J*H J<.W5аq,A` F lyRJ\@"tӍ'og2YI~ 1  "d͡&0@D TN3oDJ0\#4~RL.QçT ҍ0͙0('46 &P@Pf+sd`Zҍ: +igMTMTh""87`(c)/Rh`%Ð2 P@X î8˻B4 GJ l9{GM7""  1Tڂroc7ƢahPAX7%+ZDI1P#7"G#J&tH'T8x'FC i ۚS(9u0E(\)@H$i $TH`i8\BF,hR._82L4j@q$L`tK70"nboj@!Ӏ'8 XX-@A 8o zZk~- pbf B҃L}@|)4ARn8!)`QB(c1AXXfPABt#QA! EXHE>O*1iN'@]|[p '@@Zqd\8ƑX؃ ] VP"I_LLAъV*?!PxF5zJ;X$d0 m@TUC0, d>8B A%.-a &o@ p$H)*Q;t! S(< p 0jB\JBCPE*LaD VP3#nXC!]X0)BQv \Lcp6 Ot"ZBD%QB ZxANP6`5"pF3T PZf6Ѐ%LzD D JBϤ D0J› H$ `"J$Eɭnwې;obextool-0.35/images/reload.gif0000644000076400007640000000054211127517241016666 0ustar gerhardrgerhardrGIF89a@0 (x@(  @8(x8ذаШ X(xxxP XXXPPPHHH@@@h`(X(888 X P 000 H PH(((PH@ 880(  G!,@0dp9L=!d0XRfC -/0K3¸W-V 0_h  mK"iXj%&(]L$ u*VY+QB'#Ux##WBx.*A;obextool-0.35/images/smi_icon.gif0000644000076400007640000000025211127517241017216 0ustar gerhardrgerhardrGIF89a000!,@W0yC XPD0PlHiV  WUر3CtQP(*:O)~B ke>}щ000bb***&&&UU"""Ϙ>)D̶F`׈{b`x8|@W`|8 @`8@`D `8x(Dlb`!,00@ H&$IIM+[:]B,h(F)UF` x7Pe1KP+&!YJ+H]\@Je!O1NduQSB )d -G6@\g SЂ]D-\UTmrQyG3 < 1T#pu %Ue`ŰV/82CՖdh]0(<51XEDG211O<'4I',җ2jE,hR#l!ǫ!F+"2bKĐ^i f*jѳZD9XDBqhI(/."@(Gcdدk+YЁL](c[(H\YmD(ф\| /1Y#{lQtGnSI$ 6Q)B- T45TrFPoSUeDƑٓ e` Zl0R+`b{nVap@G@ U EM)1-ad0<㕆=Q 1 iɂK*zfY#]h9G_ 1'c l`PUم 4- 0Y hEDA {h@x x zq )'@"qQbW |"J|AOrQc48VOg,8 ¾<’ vT$:,d|^^^¶{hƔڌ22t&ll\$w|Z~5;EȄ]&H.)_O?q!N悟TRm V6`$h"he<05!SLא,ę b 1XH8Tr@Ե@ -eIΘ@Kp!TI(߬ цfQ"pL'.=Hrd,vcF.Ek9P,TBh& )vEGI" T5S(38s.K2hhrj뭸*$Y7J ľecZ E`&G miHgN-~4Iz.- ! O? ("8.nK. .䤣T8* FBQ MG7S0@*\`toUi*YTTTD[q]]]3i=qvvveetuoႯÙލ罽Զϰ! ?,@,!oܵF2Gt({xHU>^,'s e3[a. &q;_^5%765544)P[;52 "4C;2!=10(źC$ !=BDA;obextool-0.35/images/svg_large.gif0000644000076400007640000000525211127517241017374 0ustar gerhardrgerhardrGIF89a04 %  ; $3$"&"$"+I+:-a,.+046342686M>@=EHEAC@DFDFHESRM&OLNK(&OQNY*V/].0b'^41/d f,`mC`.em994e^`]Hg,l?kFhPgCD_VPp-x6u-zMr9uDvlnk2~Zu5~>}?|=7XV[~IGFxzw^aJRhMPXYăJvXU_P~@p`XnstUԍwyx[xbUh͋}ɁZ晛gԜ_敠nޠoܔdmꤦn耳اr쭪Э}ڟ沴Έܧ۷迷нಯ¾Ü㾾ȩİջ! ,04H*8ÇHŋ-Fć&H$E{+@F2͛8+ݦCڜiH' %:H>'WsSX1YGsMP&;D (̪Y1[J0a™&=Mn:%LeKR6m7an1+r#N>T=3=H&TBkOZ5B$6߰G$EJ>at9;)4\a$6[>@-3x7l=O=sT<;jSJZ"m&7r =H>ԳI3(=S>ۙr7ĺNJZ;kjC!yJL<ۼs =hN7\s7!`lһ 7L2|L*r (:頃8nHJwl 0.@@@@9#&˦ bĜsN7X{SM34!}#;MܔN1C9`I؅M(첧(L⺣N1dNN7h0cr* Hx >9yJ%kMNTC#/S }7$*J}jb֘z 5|+E-Ƽ61xI؆p7|l: C:ҋa3 f8:&}?qxMrh ! i0 T$tb7z$ri0+a@hژ^ d 0܆5% E-a0\1$*40 kl#iNO6aqdp!!pArCݠ7!РOPMYdsD-3( E8|"X @,Xp=GdcңGq|#H= b,0Y8 Dc8Dc,\9qK|a%)(A d{PN_:z3պ)R皏` xDZw84! H01 \@CZ=̑rAbg@cˈƂІcMm6؆'G,mLΠ2ާ6uNvRq0R,7qi@ЀX d`hNf*Ȇf)^3Ƽ 8πP9h#{۸ F fLfNȃjRqRoBDQ]jUW"՗De]jV԰&$bNf;;obextool-0.35/images/txt_icon.gif0000644000076400007640000000025411127517241017247 0ustar gerhardrgerhardrGIF89a@@XXX0004!,@YI ZT8@1dҷQw +WnWTh#]B @9AAIL5`ĀPqxtӅuz +;obextool-0.35/images/txt_large.gif0000644000076400007640000000313511127517241017412 0ustar gerhardrgerhardrGIF89a00yhӼmwћz²|qbzť}o~ոVSM}ĺsi\ziuuuЯӝkkkǠqi]xYTLҲaaaxtdJIG973yq1/+ӭ睖PLFͩzpb˲xn`{{z;;;쵙tx̣555\WNywqwgue̕лvչtϻж}m~krf`Wά蝒\YWپtk^ջpgZpnᦖ{󡝗ng[ĞκiaV}rcɻn˦pʷvvvje]tΜ`[SZUMSRPbbbldXTTTibXNNNROHεȦc\Rwm_׻|jŜ񺭚xrm:::c^Ukv߂vfʵɣ|ԵtTPIf_TzpaŹ}kؠſ@??깹)'%~@W`H8 @`H8@`D D@`8( b`!,00@H*4A܏#Jha*AYÉ 'ޚ W5F !DC=ԭЖM`R )?fּsgO+޼N- ZHB7À l =F 9sh9B1&,@aZsO%o$O=qBejA饔q7YcA )K4G6H9{!~b0nP@;obextool-0.35/images/uplevel.gif0000644000076400007640000000042411127517241017073 0ustar gerhardrgerhardrGIF89axxxppphhh```XXXPPPHHH@@@!,@` d9Z@aH( DA^ P0GxNC-`/0UE P$'*rGZuum#p]FA;obextool-0.35/images/vcs_icon.gif0000644000076400007640000000021711127517241017222 0ustar gerhardrgerhardrGIF87aXXXXXܨ,DI8k0 FX^DQH) V'/5Ar;`!@ZD4Z e! A`;obextool-0.35/images/vcs_large.gif0000644000076400007640000000431311127517241017365 0ustar gerhardrgerhardrGIF87a00l¬lt464lbT̂DĴR lRTRTIJƬL6Ҭ|z|Ttnd|\Fʼl|jdvμ\B|ztʴD"Ԟl$&$LFD>\Nr$" ʴ,.,LNLܺT.¼n ><>4lfdtR\Z\ܮҬ|ndʶ̄n~lT*,&$LJL|fdfd̺FD.^dz<ĎdԎLdԼZ ̞ljlD*zj|vd<64T:Č|̴rDd:||ܴt$dbdd>\.rҿlּvĴ|zdN^d|vttlf\Ķִ\JԴlεLJDܤlNԜ|䬦vʤtV|rfμ,*&<:A pN#A5Q$p~s7rQ8\lK6ŝ.2=;31dPG|!\DbS-! :xPJ4s`"7~#@S,XK$CeUƁ (n03:z3 `07߀B 0F2 1[, 4 :LHl3,8Cl1q L<-OCN(3H6H  tH3O/A,kпM(V\3" Q r,P{)^D2ĹĈTzJ/()Dʣ(eQ Q -,-׻elj y 08՜L1LnA./N= 2ei`[P+ 7.KûApmr1 P }BQ $bn v:5n|U 2X qSap?$'$r#a B aJ\&OLq pJlvqK$q&}ct"PF&\f3<@h߮)bЁbIkl$_h)=5ԃ$'O n- Ex``d @b 2FJ(E8 1La b4l oL]Ӟ.eC# G5*RjTMm9PCXVrd+VJVaj.VOp}\{lwGN;obextool-0.35/lang/0000755000076400007640000000000011127517645014414 5ustar gerhardrgerhardrobextool-0.35/lang/vcs_plug.de0000644000076400007640000001014211127517241016536 0ustar gerhardrgerhardr# # German language file for Siemens SMS-Plugin # array set vcs_plug_Text [list\ "Category" "Kategorie"\ "Start" "Start"\ "Alarm" "Alarm"\ "Description" "Beschreibung"\ "Repeat every" "Wiederholung pro"\ \ "Birthday" "Geburtstag"\ "Anniversary" "Jahrestag"\ "Special event" "Wichtiger Tag"\ "Memo" "Memo"\ "Phone call" "Anruf"\ "Meeting" "Treffen"\ \ "day" "Tag"\ "year" "Jahr"\ "month" "Monat"\ "week" "Woche"\ "Mo" "Mo"\ "Tu" "Di"\ "We" "Mi"\ "Th" "Do"\ "Fr" "Fr"\ "Sa" "Sa"\ "Su" "So"\ "Unexpected Repeat-Rule '%s' found!" "Unerwartete Widerhol-Regel '%s' gefunden!"\ " at the %s." " am %s."\ " on%s" " am%s"\ "%s date" "%s Datum"\ "%s time" "%s Zeit"\ " on every " " jeweils am "\ "VCal Folder: %s" "VCal Ordner: %s"\ "C&reate" "&Anlegen"\ "&Copy" "&Kopieren" \ "&Edit" "&Bearbeiten"\ "&Delete" "&Lschen"\ "E&xport..." "E&xportieren..."\ "&Close" "&Schlieen"\ "&Save" "S&ichern"\ "&Read all" "&Alle lesen"\ "Edit selected data record" "Gewhlten Datensatz bearbeiten"\ "Create new record using current selection" "Neuen Datesatz aus gewhltenm erstellen"\ "Create new data record" "Neuen Datensatz anlegen"\ "Delete selected data record" "Den gewlten Datensatz lschen"\ "Export all records to text file" "Datenstze in Textdatei schreiben"\ "Save entry to device" "Eintrag im Gert speichern"\ "Close list window" "Listenfenster schlieen"\ "Read all entries and open list" "Alle Eintrge lesen und Liste ffnen"\ "Close detail view window" "Detailansicht schlieen"\ "%s window already open!\nPlease" "%s Fenster bereits offen!\nBitte"\ " close it before opening a new one." " dieses Fenster vorher schlieen."\ "Unable to download file '%s'!" "Herunterladen der Datei '%s' fehlgeschlagen!"\ "Stop" "Stopp"\ "Reading all VCal entries..." "Lese alle VCal Eintrge..."\ "Reading %s..." "Lese %s..."\ "%d entries read." "%d Eintrge gelesen."\ "File does not seem to be a VCal file!" "Datei ist keine gltige VCal Datei!"\ "No version info in VCal File!" "Keine Versionsangaben in der VCal Datei!"\ "This plugin does not support version %s of VCal file!" "Dieses Plugin untersttzt nur Version %s der VCal Dateien!"\ "ASCII Text Files " "ASCII Text Dateien "\ "ASCII Files " "ASCII Dateien "\ "CSV Files " "CSV Files "\ "All files" "Alle Dateien"\ "Export file" "Export Datei"\ "%d records written to file '%s'" "%d Eintrge in Datei '%s' geschrieben"\ "VCal detail data" "VCal Einzeltermin"\ "No valid VCal entry for\n%s: %s" "Kein gltiger VCal Eintrag fr\n%s: %s"\ "Confirm" "Besttigung"\ "Do you really want to store this record?" "Wollen Sie diesen Datensatz wirklich speichern?"\ "Uploading file '%s' to '%s'..." "Datei '%s' wird nach '%s' hochgeladen..."\ "Missing records in stored entry:" "Fehlende Eintrge im Datensatz:"\ "Saved entries not identical to input entry:%s" "Gespeicherte Eintrge nicht identisch mit Eingaben:%s"\ "File '%s' stored" "Datei '%s' gespeichert"\ "Obextool VCal-Plugin %s" "Obextool VCal-Plugin %s"\ "New VCal Entry: %s" "Neuer VCal Eintrag: %s"\ "Edit VCal Entry: %s" "VCal Eintrag bearbeiten: %s"\ "VCal overview" "VCal Terminbersicht"\ "On Siemens mobiles, all uploaded" "Auf Siemens Handies sind alle hochgeladenen"\ " entries are deactivated by default." " Eintrge standardmig deaktiviert."\ " Don't forget to activate any modified" " Vergessen Sie nicht, jeden genderten Eintrag"\ " entry in the options of your phone directly." " in den Einstellungen Ihres Gertes wieder zu aktivieren."\ "No record selected for copying!" "Kein Eintrag zum Kopieren gewhlt!"\ "No record selected for editing!" "Kein Eintrag zum Bearbeiten gewhlt!"\ "No record selected for deleting!" "Kein Eintrag zum Lschen gewhlt!"\ "Do you really want to delete the appointment entry %s?" "Soll der Termineintrag %s wirklich gelscht werden?"\ "Deleting appointment entry" "Termineintrag lschen"\ "Schedule entry %s could not be deleted!" "Termineintrag konnte nicht gelscht werden!"\ ] set vcs_plug_Text_version "1.0" obextool-0.35/lang/adr_plug.da0000644000076400007640000000613111127517241016510 0ustar gerhardrgerhardr# # DA language file for Siemens SMS-Plugin # Provided by Jrgen Elgaard Larsen # array set adr_plug_Text [list\ "Address detail view" "Adresse detaljevisning"\ "Address book entry" "Adressebogsopslag"\ "Address list: %s" "Adresseliste: %s"\ "Address list" "Adresseliste"\ "%d index entries found," "%d indeks-opslag fundet"\ "No valid pointer file," "Ingen gyldig pointer-fil"\ " analyzing address book structure..." " analyserer bogstruktur..."\ "Number of entries from both files do not match!" "Antallet af opslag fra filerne er ikke ens"\ "\n%d entries found in '%s' and %d entries in '%s'" "\n%d opslag fundet i '%s' and %d i '%s'"\ "\nDeleted entries may be displayed." "\nSlettede opslag kan blive vist."\ "Processing address book contents..." "Behandler indhold af adressebog..."\ "Processing address book contents...OK." "Behandler indhold af adressebog...OK."\ "Invalid adress file or unsupported file format." "Ugyldig adressefil eller ikke understttet filformat."\ "\nUsually on Siemens phones only the file" "\nP Siemens-telefoner er det som regel kun"\ " called '5fxx.adr' contains the address book" " filen '5fxx.adr', der indeholder adresser."\ " data. '7fxx.adr' contains the pointer list" " '7fxx.adr' indeholder pointer-listen,"\ " which mark deleted entities and '9fxx.adr'" " som markerer slettede opslag, og '9fxx.adr'"\ " contains sort index entries." " indeholder sorteringsindex-opslag."\ "\nTry selecting the file '5fxx.adr' for displaying" "\nPrv at vlge filen '5fxx.adr' til visning"\ " the address book data." " af adressebogsdata."\ "%s window already open!\n" "%s-vinduet er allerede bent!\n"\ "Please close it before opening a new one." "Luk det venligt, fr du bner et nyt."\ "Unable to download file '%s'!" "Kunne ikke hente filen '%s'!"\ "No record selected for displaying!" "Inegn post valgt til visning!"\ "&Backward" "&Tilbage"\ "&Forward" "&Frem"\ "&Show" "&Vis"\ "&Close" "%Luk"\ "E&xport..." "E&xportr..."\ "Go to previous address record" "G til foregende adresseopslag"\ "Go to next address record" "G til nste adresseopslag"\ "Close detail view" "Luk detaljevisning"\ "Show address detail view" "ben detaljeret adressevisning"\ "Export data to text file" "Eksportr data til tekstfil"\ "Close address list" "Luk adresseliste"\ "Close detail window before closing list" "Luk detaljevinduet fr du lukker listen"\ "ASCII Text Files " "ASCII-tekstfiler "\ "ASCII Files " "ASCII-filer "\ "CSV Files " "CSV-filer "\ "All files" "Alle filer"\ "Export file" "Eksportr fil"\ "%d records written to file '%s'" "%d poster skrevet til fil '%s'"\ "Nr." "Nr."\ "Firstname" "Fornavn"\ "Lastname" "Efternavn"\ "Company" "Firma"\ "Street" "Vej"\ "City" "By"\ "Country" "Land"\ "ZIP" "Postnr"\ "Email" "Email"\ "URL" "URL"\ "Tel. Home" "Tlf. hjemme"\ "Tel. Work" "Tlf. arb."\ "Tel. Mobile" "Tlf. mobil"\ "Fax Nr.1" "Fax nr. 1"\ "Fax Nr.2" "Fax nr. 2" \ "Birthday" "Fdselsdag"\ "Revision" "Revision"\ ] set adr_plug_Text_version "0.2" obextool-0.35/lang/obextool.da0000644000076400007640000002471511127517241016556 0ustar gerhardrgerhardr# # DA language file for ObexTool # Provided by Jrgen Elgaard Larsen # array set obextool_Text [list\ "Program information" "Programinformation"\ "\nA program to communicate with mobile phones using" "\nEt program til kommunikation med mobiltelefoner"\ " the OBEX protocol (like Siemens, Ericsson or Nokia)" "via OBEX-protokollen (f.x. Siemens, Ericsson og Nokia)"\ "\nObexTool is licensed using the GNU General Public Licence," "\nObexTool er licenseret under GNU General Public Licence,"\ "\nsee http://www.gnu.org/copyleft/gpl.html" "\nse http://www.gnu.org/copyleft/gpl.html"\ "&File" "&Filer"\ "A&bout" "&Om" "Program information" "Programinformation"\ "&Upload" "&Send" "Upload a file" "Send en fil til telefonen"\ "D&ownload" "&Hent" "Download a file" "Hent en fil fra telefonen"\ "&New" "&Ny" "Create a new folder" "Opret en ny folder"\ "&Find" "&Find" "Find file or folder" "Find fil eller folder"\ "&Quit" "&Afslut" "Exit Obex tool" "Forlad ObexTool"\ "&Edit" "&Redigr"\ "&Cut" "K&lip" "Cut selection" "Klip valgt"\ "&Copy" "&Kopir" "Copy selection" "Kopir valgt"\ "&Paste" "&Indst" "Paste selection" "Indst valgt"\ "&Delete" "&Slet" "Delete selection" "Slet valgt"\ "&Rename" "&Omdb" "Rename selection" "Omdb valgt"\ "&View" "&Vis"\ "&Folder up" "&Folder op" "Up one folder level" "Et folder-niveau opad"\ "&Reload" "&Genindls" "Reread folder contents" "Genindls folderindhold"\ "&Properties" "&Egenskaber" "File or folder information" "Fil- eller folderinformation"\ "&Memory" "&Hukommelse" "Memory status" "Hukommelsesstatus"\ "&Options" "&Indstillinger"\ "&Toolbar" "&Vrktjslinie" "Show/hide toolbar" "Vis/gem vrktjslinie"\ "&Large icons" "&Store ikoner" "Display large icons" "Vis store ikoner"\ "&File list" "&Fil-liste" "Display file list" "Vis fil-liste"\ "&Details" "&Detaljer" "Display file details" "Vis fil-detaljer"\ "Version %s" "Version %s"\ "Error message" "Fejlmeddelelse"\ "Fatal Error:\n%s" "Alvorlig fejl:\n%s"\ "Warning message" "Advarsel"\ "\nPlease check your file permissions." "\nUndersg venligst dine fil-rettigheder."\ "All Files" "Alle filer"\ "Save file" "Gem fil"\ "Read file" "Ls fil"\ "ObexTool %s - input dialogue" "ObexTool %s - input-dialog"\ "ObexTool %s - text viewer" "ObexTool %s - tekstfremviser"\ "&Close" "&Luk"\ "Close" "Luk"\ "O&k" "&OK"\ "&Cancel" "&Annullr"\ "Cancel file name input" "Annullr filnavn-indtastning"\ "Close text window" "Luk tekst-vindue"\ "Accept file name" "Acceptr filnavn"\ \ "A folder with the name '%s' already exists!" "Der eksisterer allerede en folder med navn '%s'!"\ "\nCannot upload file." "\nKan ikke sende fil."\ "File '%s' already exists!" "Filen '%s' eksisterer allerede!"\ "\nDo you want to overwrite the existing file?" "\nVil du overskrive den eksisterende fil?"\ "Name collision" "Navnesammenfald"\ "File upload cancelled!" "Fil-sending afbrudt!"\ "File upload failed" "Fil-sending mislykkedes"\ "Remove of old version of '%s' failed!" "Sletning af gammel version af '%s' mislykkedes!"\ "File '%s' uploaded to '%s'" "Filen '%s' blev sendt til '%s'"\ "File '%s' could not be uploaded to '%s'!" "Filen '%s' kunne ikke sendes til '%s'"\ "New file name:" "Nyt filnavn:"\ "New name is identical to old name!" "Det nye navn er det samme som det gamle!"\ "File '%s' renamed to '%s'." "Filen '%s' blev omdbt til '%s'"\ "File or folder '%s' could not be renamed!" "Fil eller folder '%s' kunne ikke omdbes!"\ "No file or folder selected to delete!" "Ingen fil eller folder valgt til sletning!"\ "Do you really want to delete the folder '%s'?" "Vil du virkelig slette folderen '%s'?"\ "Do you really want to delete the file '%s'?" "Vil du virkelig slette filen '%s'?"\ "Confirmation" "Bekrft"\ "Delete action cancelled!" "Sletning afbrudt!"\ "File or folder '%s' could not be deleted!" "Fil eller folder '%s' kunne ikke slettes!"\ "\nFolders must be empty before deleting." "\nFoldere skal vre tomme for at kunne slettes."\ "Folder '%s' deleted." "Folder '%s' slettet."\ "File '%s' deleted." "Filen '%s' slettet."\ "Total %4.1f\nUsed %4.1f\nFree %4.1f" "Total %4.1f\nAnvendt %4.1f\nLedig %4.1f"\ " Memory status\n" "Lagerstatus"\ "===============\n" "===============\n"\ "Memory total: %s bytes\n" "Total lager: %s bytes\n"\ "Memory used: %s bytes\n" "Andvendt lager: %s bytes\n"\ "Memory free: %s bytes\n" "Ledig lager: %s bytes\n"\ "Device memory status" "Apparat-lagerstatus"\ \ "It seems, that your device does not" "Dit apparat understtter" \ " support the memory status feature." " benbart ikke lagerstatus." \ "\nMemory status will be disabled." "\nLagerstatus bliver slet fra." \ "Unable to create file '%s' in current folder %s!" "Kunne ikke oprette filen '%s' i nuvrnde folder %s!"\ \ "Edit file" "Redgr fil"\ "View file" "Vis fil"\ "Display text" "Vis tekst"\ "Upload file" "Send fil"\ "Download file" "Hent fil"\ "Cut file" "Klip fil"\ "Copy file" "Kopir fil"\ "Paste file" "Indst fil"\ "Open" "ben"\ "Delete" "Slet"\ "Rename" "Omdb"\ "New folder" "Ny folder"\ "Start plugin" "Start plugin"\ "%s\nDate: %s\nSize: %s\nUser: %s\nGroup: %s" "%s\nDato: %s\nStrrelse: %s\nBruger: %s\nGruppe: %s"\ "Plugin: %s loaded..." "Plugin: %s indlst..."\ "Downloading file '%s'..." "Henter fil '%s'..."\ "Uploading file '%s'..." "Sender fil '%s'..."\ "Unable to open file '%s'!" "Kunne ikke bne filen '%s'!"\ "Text view of file '%s'..." "Tekstvisning af fil '%s'..."\ "File: %s" "Fil: %s"\ "Executing editor '%s'..." "Starter editor '%s'..."\ "Executing viewer '%s'..." "Starter fremviser '%s'..."\ "Error in executing: %s %s" "Fejl ved start: %s %s"\ "Viewer '%s' finished." "Fremviser '%s' frdig."\ "\nError message: %s\nError code: %s" "\nFejlmeddelelse: %s\nFejlkode: %s"\ "Question" "Sprgsml"\ "Do you want to upload the modified file?" "vil du sende den ndrede fil?"\ "File upload failed" "Sending af fil mislykkedes"\ "Remove of old version of '%s' failed!" "Sletning af gamme version af '%s' mislykkedes!"\ "Upoading file '%s' to '%s'..." "Sender fil '%s' til '%s'..." \ "Moving file '%s' to '%s'..." "Flytter fil '%s' til '%s'..."\ "File move failed" "Flytning af fil mislykkedes"\ "File move from '%s' to '%s' failed!" "Flytning af fil fra '%s' til '%s' mislykkedes!"\ "File '%s' stored" "Fil '%s' gemt"\ "No default action specified for file type '%s'!" "Ingen standard-funktion defineret for filtype '%s'!"\ "New setup section added to options menu." "Ny indstillings-sektion tilfjet til indstillinger." \ "Name" "Navn" "File type" "Filtype" "Size" "Strrelse"\ "Date" "Dato" "U-perm" "Br.rett" "G-perm" "Gr.rett"\ "No file selected for downloading" "Ingen fil valgt til hentning"\ "Only files can be downloaded" "Kun filer kan hentes"\ "File member '%s' already exists!" "Fil-medlem '%s' findes allerede!"\ "File download cancelled!" "Fil-hentning afbrudt!"\ "Overwriting file '%s'!" "Overskriver fil '%s'!"\ "Error in downloading file '%s'!" "Fejl ved hentning af fil '%s'!"\ "Download of file '%s' failed!" "Hentning af fil '%s' mislykkedes!"\ "File '%s' saved as '%s'" "Fil '%s' gemt som '%s'"\ "Folder can only be deleted!" "Folder kan kun slettes!"\ "Nothing selected for cutting!" "Intet valgt til klip!"\ "Cutting '%s'..." "Klipper '%s'..."\ "Nothing selected for copying!" "Intet valgt til kopiering!"\ "Copying '%s'..." "Kopierer '%s'..."\ "Nothing selected for pasting!" "Intet valgt til indstning!"\ "Folder '%s' already exists!\nCannot paste file." "Folder '%s' findes allerede!\nKan ikke indstte fil."\ "File '%s' already exists in folder '%s'!" "Fil '%s' findes allerede i folder '%s'!"\ "You must specify a new file name or cancel the command." "Du m angive en ny fil eller annullere."\ "File '%s' pasted" "Fil '%s' indsat"\ "File paste of '%s' failed!" "Fil-indsttelse af '%s' mislykkedes!"\ "No file or folder selected!" "Ingen fil eller folder valgt!"\ "%d entries with\n" "%d poster med\n"\ "%d subfolders and\n" "%d underfoldere og\n"\ "%d files use\n" "%d filer bruger\n"\ "%d bytes of memory" "%d bytes lagerplads"\ "File properties: %s" "Fil-egenskaber: %s"\ "Properties for File '%s'..." "Egenskaber for fil '%s'..."\ "Folder properties: %s" "Folder-egenskaber: %s"\ "Properties for folder '%s'..." "Egenskaber for folder '%s'..."\ \ "Folder tree" "Folder-tr"\ "Folder contents" "Folder-indhold"\ "Use *, ? and \[ \] for wildcard matching" "Brug *, ? og \[ \] som joker-tegn"\ "Example: *pic\[a-z\]?\[0-9\].bm\[px\]" "Eksempel: *pic\[a-z\]?\[0-9\].bm\[px\]"\ "File pattern to find:" "Fil-mnster:"\ "Current directory is: %s" "Nuvrende folder er: %s"\ "Stop" "Stop" "Searching '%s'..." "Sger '%s'..."\ "Checked %d folders and %d files" "Undersgte %d foldere og %d filer"\ " *** Interrupted ***\n" " *** Afbrudt ***\n"\ "\nSearch time was %d seconds" "\nSgetid var %d sekunder"\ "\nStart folder was: %s" "\nStart-folder var: %s"\ "\nSearch pattern was: '%s'" "Sge-mnster var: '%s'"\ "\nNumber of results: %d" "\nAntal resultater: %d"\ "\nTotally used bytes: %d" "\nAnvendte bytes ialt: %d"\ "\n==========================\n" "\n==========================\n"\ "Search results:" "Sgeresultater:"\ "Searching '%s'..." "Sger '%s'..."\ "%d entries in folder '%s'" "%d poster i folder '%s'"\ "Folder contents reloaded" "Folder-indhold opdateret"\ "Name of new folder:" "Navn til ny folder:"\ "Cannot create folder '%s'!" "Kunne ikke oprette folder: '%s'!"\ "\nA folder with that name already exists." "\nDer eksisterer allerede en folder med det navn."\ "File member '%s' already exists!" "Fil-medlem '%s' findes allerede!"\ "Folder '%s' created" "Folder '%s' blev oprettet"\ "Could not create folder '%s'!" "Kunne ikke oprette folder '%s'!"\ "Already at upper most folder level!" "Allerede p verste folderniveau!"\ "Unknown type" "Ukendt type"\ "%s file" "%s fil" \ "Folder" "Folder"\ "Log file" "Log-fil"\ "Text file" "Tekst-fil"\ "Animation file" "Animation"\ "Address book file" "Adressebog-fil"\ "Configuration file" "Konfigurationsfil"\ "Bitmap picture file" "Bitmap-billede"\ "Midi ring tone file" "MIDI ringetone"\ "Java definition file" "Java definitionsfil"\ "Executable Java file" "Java-program"\ "Organizer entry file" "Kalender-fil"\ "Bussiness card file" "Visitkort"\ "SMS incoming file" "Indkommende SMS"\ "SMS outgoing file" "Udgende SMS"\ "Data base file" "Database-fil"\ "Data file" "Data-fil"\ ] set obextool_Text_version "0.32-alfa" obextool-0.35/lang/siemplug.de0000644000076400007640000000277611127517241016557 0ustar gerhardrgerhardr# # German language file for Siemens SMS-Plugin # array set siemplug_Text [list\ "%d minutes" "%d Minuten"\ "%d hours" "%d Stunden"\ "%d days" "%d Tage"\ "%d weeks" "%d Wochen"\ "none" "keine"\ "* internal error *" "* interner Fehler *"\ "Service center address:" "Service Center Adresse:"\ "Time stamp:" "Zeitstempel:"\ "Sender address:" "Absenderadresse:"\ "Undocumented header:" "Undokumentierter Header:"\ "Incoming SMS file: %s" "Eingehende SMS Datei: %s"\ "Validy period:" "Gltigkeitsdauer:"\ "Receiver address:" "Empfngeradresse:"\ "Outgoing SMS file: %s" "Ausgehende SMS Datei: %s"\ "No Siemens SMS file signature found!" "Keine Siemens SMS-Dateikennung gefunden!"\ "\nUnable to display SMS text." "\nSMS Text kann nicht angezeigt werden."\ "Unexpected window '%s'!" "Unerwartetes Fenster '%s'!"\ "Unexpected window class '%s'!" "Unerwartete Fensterklasse '%s'!"\ "SMS message saved as '%s'!" "SMS Meldung gesichert als '%s'!"\ "SMS-Text" "SMS Text"\ "&Close" "&Schliessen"\ "&Save" "S&peichern"\ "Write SMS text into file" "SMS Text in Textdatei schreiben"\ "Close SMS window" "SMS-Fenster schlieen"\ "SMS text:" "SMS Text:"\ "SMS data window already open!" "SMS Anzeigefenster ist bereits geffnet!"\ "\nPlease close it before opening a new one." "\nDas Fenster mu geschlossen sein bevor das nchste geffnet wird."\ "Unable to download file '%s' or file is empty!" "Datei '%s' kann nicht heruntergeladen werden oder list leer!"\ ] set siemplug_Text_version "0.3" obextool-0.35/lang/adr_plug.de0000644000076400007640000000625511127517241016523 0ustar gerhardrgerhardr# # German language file for Siemens SMS-Plugin # array set adr_plug_Text [list\ "Address detail view" "Addresse Detailansicht"\ "Address book entry" "Adressbucheintrag"\ "Address list: %s" "Adressenliste: %s"\ "Address list" "Adressenliste"\ "%d index entries found," "%d Indexeintrge gefunden,"\ "No valid pointer file," "Kein gltiger Pointerfile,"\ " analyzing address book structure..." " analysiere Adressbuchstruktur..."\ "Number of entries from both files do not match!" "Die Anzahl der Eintrge beider Dateien sind nicht gleich!"\ "\n%d entries found in '%s' and %d entries in '%s'" "\n%d Eintrge gefunden in '%s' und %d Eintrge in '%s'"\ "\nDeleted entries may be displayed." "\nGelschte Eintrge knnen angezeigt werden."\ "Processing address book contents..." "Bearbeite Adressbucheintrge..."\ "Processing address book contents...OK." "Bearbeite Adressbucheintrge...OK."\ "Invalid adress file or unsupported file format." "Ungltige Datei oder nicht untersttztes Dateiformat."\ "\nUsually on Siemens phones only the file" "\nblicherweise enthlt auf Siemens Handies"\ " called '5fxx.adr' contains the address book" " die Datei '5fxx.adr' die"\ " data. '7fxx.adr' contains the pointer list" " Adressdaten. '7fxx.adr' enthlt die Pointerliste"\ " which mark deleted entities and '9fxx.adr'" " die die gelschten Datenstze markiert und '9fxx.adr'"\ " contains sort index entries." " enthlt Sortierinformationen."\ "\nTry selecting the file '5fxx.adr' for displaying" "\nWhlen Sie die Datei '5fxx.adr' zur Anzeige"\ " the address book data." " der Adressbuchdaten."\ "%s window already open!\n" "%s Fenster bereits geffnet!\n"\ "Please close it before opening a new one." "Bitte dieses Fenster vorher schlieen."\ "Unable to download file '%s'!" "Datei '%s' konnte nicht heruntergeladen werden!"\ "No record selected for displaying!" "Kein Datensatz zur Anzeige makrkeirt!"\ "&Backward" "&Zurck"\ "&Forward" "&Weiter"\ "&Show" "&Anzeigen"\ "&Close" "&Schliessen"\ "E&xport..." "E&xportieren..."\ "Go to previous address record" "Zum vorherigen Eintrag"\ "Go to next address record" "Zum nchsten Eintrag"\ "Close detail view" "Detailansicht schlieen"\ "Show address detail view" "Adressdetails anzeigen"\ "Export data to text file" "Daten in Textdatei schreiben"\ "Close address list" "Adressliste schlieen"\ "Close detail window before closing list" "Die Deatilasicht muss vor der Liste geschlossenwerden"\ "ASCII Text Files " "ASCII Text Dateien "\ "ASCII Files " "ASCII Dateien "\ "CSV Files " "CSV Dateien "\ "All files" "Alle Dateien"\ "Export file" "Exportdatei"\ "%d records written to file '%s'" "%d Datenstze geschrieben in Datei '%s'"\ "Nr." "Nr."\ "Firstname" "Vorname"\ "Lastname" "Nachname"\ "Company" "Firma"\ "Street" "Strae"\ "City" "Ort"\ "Country" "Land"\ "ZIP" "PLZ"\ "Email" "EMail"\ "URL" "URL"\ "Tel. Home" "Tel. privat"\ "Tel. Work" "Tel. Arbeit"\ "Tel. Mobile" "Tel. Mobil"\ "Fax Nr.1" "Fax Nr.1"\ "Fax Nr.2" "Fax Nr.2" \ "Birthday" "Geburtstag"\ "Revision" "nderungsdatum"\ ] set adr_plug_Text_version "0.2" obextool-0.35/lang/obextool.de0000644000076400007640000002671611127517643016573 0ustar gerhardrgerhardr# # German language file for ObexTool # array set obextool_Text [list\ "Program information" "Programm Information"\ "\nA program to communicate with mobile phones using" "\nEin Programm zur Kommunikation mit mobilen Endgerten"\ " the OBEX protocol (like Siemens, Ericsson or Nokia)" " die das OBEX-Protokoll verwenden (wie Siemens, Ericsson oder Nokia)"\ "\nObexTool is licensed using the GNU General Public Licence," "\nObexTool ist lizensiert unter der GNU General Public Licence,"\ "\nsee http://www.gnu.org/copyleft/gpl.html" "\nsiehe http://www.gnu.org/copyleft/gpl.html"\ "&File" "&Datei"\ "A&bout" "&ber" "Program information" "Programm Information"\ "&Upload" "&Hochladen" "Upload a file" "Eine Datei 'hochladen'"\ "D&ownload" "He&runterladen" "Download a file" "Eine Datei 'herunterladen'"\ "&New" "&Neu" "Create a new folder" "Neuen Ordner anlegen"\ "&Find" "&Suchen" "Find file or folder" "Datei order Ordner suchen"\ "&Quit" "B&eenden" "Exit Obex tool" "ObexTool verlassen"\ "&Edit" "&Bearbeiten"\ "&Cut" "&Ausschneiden" "Cut selection" "Auswahl ausschneiden"\ "&Copy" "&Kopieren" "Copy selection" "Auswahl kopieren"\ "&Paste" "&Einfgen" "Paste selection" "Auswahl einfgen"\ "&Delete" "&Lschen" "Delete selection" "Auswahl lschen"\ "&Rename" "&Umbennenen" "Rename selection" "Auswahl umbennenen"\ "&View" "&Ansicht"\ "&Folder up" "&Ordner hoch" "Up one folder level" "Eine Ordnerebene hher"\ "&Reload" "&Neuladen" "Reread folder contents" "Ordnerinhalt neu einlesen"\ "&Properties" "&Eigenschaften" "File or folder information" "Datei oder Ordnerinformation"\ "&Memory" "&Speicher" "Memory status" "Speicherstatus"\ "&Options" "&Einstellungen"\ "&Toolbar" "&Werkzeugleiste" "Show/hide toolbar" "Werkzeugleiste anzeigen/verstecken"\ "&Large icons" "&Groe Symbole" "Display large icons" "Groe Symbole anzeigen"\ "&File list" "&Listenanzeige" "Display file list" "Listenanzeige Modus"\ "&Details" "&Details" "Display file details" "Detaillierte Anzeige"\ "Version %s" "Version %s"\ "Error message" "Fehlermeldung"\ "Fatal Error:\n%s" "Fataler Fehler:\n%s"\ "Warning message" "Warnmeldung"\ "\nPlease check your file permissions." "\nBitte berprfen Sie Ihre Dateiberechtigungen."\ "All Files" "Alle Dateien"\ "Save file" "Datei zum Speichern"\ "Read file" "Datei zum Lesen"\ "ObexTool %s - input dialogue" "ObexTool %s - Eingabedialog"\ "ObexTool %s - text viewer" "ObexTool %s - Textbetrachter"\ "&Close" "&Schliessen"\ "Close" "Schliessen"\ "O&k" "O&k"\ "&Cancel" "&Abbrechen"\ "Cancel file name input" "Dateieingabe abgebrochen"\ "Close text window" "Textfenster schlieen"\ "Accept file name" "Datei bernehmen"\ \ "A folder with the name '%s' already exists!" "Ein Ordner mit dem Namen '%s' existiert bereits!"\ "\nCannot upload file." "\nDatei kann nicht 'hochgeladen' werden."\ "File '%s' already exists!" "Datei '%s' existiert bereits!"\ "\nDo you want to overwrite the existing file?" "\nSoll die bestehende Datei berschrieben werden?"\ "Name collision" "Namenskollision"\ "File upload cancelled!" "File-Upload abgebrochen!"\ "File upload failed" "File-Upload fehlgeschlagen"\ "Remove of old version of '%s' failed!" "Lschen der alten Version von '%s' fehlgeschlagen!"\ "File '%s' uploaded to '%s'" "Datei '%s' hochgeladen als '%s'"\ "File '%s' could not be uploaded to '%s'!" "Datei '%s' konnte nicht hochgeladen werden als '%s'!"\ "New file name:" "Neuer Dateiname:"\ "New name is identical to old name!" "Der neue Name ist identisch mit dem alten Namen!"\ "File '%s' renamed to '%s'." "Datei '%s' umbenannt auf '%s'."\ "File or folder '%s' could not be renamed!" "Datei oder Ordner '%s' konnte nicht umbenannt werden!"\ "No file or folder selected to delete!" "Keine Datei oder Ordner zum Lschen markiert!"\ "Do you really want to delete the folder '%s'?" "Soll der Ordner '%s' wirklich gelscht werden?"\ "Do you really want to delete the file '%s'?" "Soll die Datei '%s' wirklich gelscht werden?"\ "Confirmation" "Besttigung"\ "Delete action cancelled!" "Lschaktion abgebrochen"\ "File or folder '%s' could not be deleted!" "Datei oder Ordner '%s' konnte nicht gelscht werden!"\ "\nFolders must be empty before deleting." "\nOrdner mssen vor dem Lschen leer sein."\ "Folder '%s' deleted." "Ordner '%s' gelscht."\ "File '%s' deleted." "Datei '%s' gelscht."\ "Total %4.1f\nUsed %4.1f\nFree %4.1f" "Gesamt %4.1f\nVerwendet %4.1f\nFrei %4.1f"\ " Memory status\n" " Speicherstatus\n"\ "===============\n" "================\n"\ "Memory total: %s bytes\n" "Gesamtspeicher: %s Bytes\n"\ "Memory used: %s bytes\n" "davon verwendet: %s Bytes\n"\ "Memory free: %s bytes\n" "freier Speicher: %s Bytes\n"\ "Device memory status" "Gertespeicher Status"\ \ "It seems, that your device does not" "Offensichtlich untersttzt Ihr Gert" \ " support the memory status feature." " nicht die Anzeige des freien Speichers." \ "\nMemory status will be disabled." "\nDie Speicheranzeige wird deaktiviert." \ "Unable to create file '%s' in current folder %s!" "Datei '%s' kann nicht im aktuellen Ordner %s erstellt werden!"\ \ "Edit file" "Datei bearbeiten"\ "View file" "Datei anzeigen"\ "Display text" "Textanzeige"\ "Upload file" "Hochladen"\ "Download file" "Herunterladen"\ "Cut file" "Ausschneiden"\ "Copy file" "Kopieren"\ "Paste file" "Einfgen"\ "Open" "ffnen"\ "Delete" "Lschen"\ "Rename" "Umbenennen"\ "New folder" "Neuer Ordner"\ "Start plugin" "Plugin starten"\ "%s\nDate: %s\nSize: %s\nUser: %s\nGroup: %s" "%s\nDatum: %s\nGre: %s\nBenutzer: %s\nGruppe: %s"\ "Plugin: %s loaded..." "Plugin: %s geladen..."\ "Downloading file '%s'..." "Datei '%s' wird heruntergeladen..."\ "Uploading file '%s'..." "Datei '%s' wird hochgeladen..."\ "Unable to open file '%s'!" "Datei '%s' kann nicht geffnet werden!"\ "Text view of file '%s'..." "Textanzeige fr '%s'..."\ "File: %s" "Datei: %s"\ "Executing editor '%s'..." "Bearbeitungsprogramm '%s' wird ausgefhrt..."\ "Executing viewer '%s'..." "Anzeigeprogramm '%s' wird ausgefhrt..."\ "Error in executing: %s %s" "Fehler beim Ausfhren von: %s %s"\ "Viewer '%s' finished." "Anzeigeprogramm '%s' beendet."\ "\nError message: %s\nError code: %s" "\nFehlermeldung: %s\nFehlercode: %s"\ "Question" "Rckfrage"\ "Do you want to upload the modified file?" "Soll die bearbeitete Datei hochgeladen werden?"\ "File upload failed" "Datei-Upload fehlgeschlagen"\ "Remove of old version of '%s' failed!" "Die alte Version der Datei '%s' konnte nicht entfernt werden!"\ "Upoading file '%s' to '%s'..." "Datei '%s' wird nach '%s' hochgeladen..." \ "Moving file '%s' to '%s'..." "Verschiebe '%s' nach '%s'..."\ "File move failed" "Verschieben der Datei fehlgeschlagen"\ "File move from '%s' to '%s' failed!" "Verschiebung von '%s' nach '%s' fehlgeschlagen!"\ "File '%s' stored" "Datei '%s' gespeichert"\ "No default action specified for file type '%s'!" "Keine Standardaktion fr Dateityp '%s' definiert!"\ "New setup section added to options menu." "Neuer Abschnitt 'Einstellungen' im Optionen Men hinzugefgt." \ "Name" "Name" "File type" "Dateityp" "Size" "Gre"\ "Date" "Datum" "U-perm" "Ben-Re." "G-perm" "Grp-Re."\ "No file selected for downloading" "Nichts gewhlt zum Herunterladen"\ "Only files can be downloaded" "Nur Dateien knnen heruntergeladen werden"\ "File member '%s' already exists!" "Ein Eintrag mit dem Namen '%s' existiert bereits!"\ "File download cancelled!" "Download abgebrochen!"\ "Overwriting file '%s'!" "Datei '%s' wird berschrieben!"\ "Error in downloading file '%s'!" "Fehler beim Herunterladen der Datei '%s'!"\ "Download of file '%s' failed!" "Download der Datei '%s' fehlgeschlagen!"\ "File '%s' saved as '%s'" "Datei '%s' gespeichert als '%s'"\ "Folder can only be deleted!" "Ordner knnen nur gelscht werden!"\ "Nothing selected for cutting!" "Nichts zum Ausschneiden gewhlt!"\ "Cutting '%s'..." "'%s' ausgeschnitten..."\ "Nothing selected for copying!" "Nichts zum Kopieren gewhlt!"\ "Copying '%s'..." "'%s' kopiert..."\ "Nothing selected for pasting!" "Nichts zum Einfgen gewhlt!"\ "Folder '%s' already exists!\nCannot paste file." "Ordner '%s' existiert!\nDatei kann nicht eingefgt werden."\ "File '%s' already exists in folder '%s'!" "Datei '%s' existiert bereits im Ordner '%s'!"\ "You must specify a new file name or cancel the command." "Ein neuer Name mu angegeben oder das Kommando abgebrochen werden."\ "File '%s' pasted" "Datei '%s' eingefgt"\ "File paste of '%s' failed!" "Einfgen der Datei '%s' fehlgeschlagen!"\ "No file or folder selected!" "Keine Datei oder Ordner gewhlt!"\ "%d entries with\n" "%d Eintrge mit\n"\ "%d subfolders and\n" "%d Unterordnern und\n"\ "%d files use\n" "%d Dateien belegen\n"\ "%d bytes of memory" "%d Byte Speicher"\ "File properties: %s" "Dateieigenschaften: %s"\ "Properties for File '%s'..." "Eigenschaften der Datei '%s'..."\ "Folder properties: %s" "Ordnereigenschaften: %s"\ "Properties for folder '%s'..." "Eigenschaften fr Ordner '%s'..."\ \ "Folder tree" "Ordnerstruktur"\ "Folder contents" "Ordnerinhalt"\ "Use *, ? and \[ \] for wildcard matching" "Die Zeichen *, ? and \[ \] knnen als Platzhalter verwendet werden"\ "Example: *pic\[a-z\]?\[0-9\].bm\[px\]" "Beispiel: *pic\[a-z\]?\[0-9\].bm\[px\]"\ "File pattern to find:" "Suche nach Dateimuster:"\ "Current directory is: %s" "Aktueller Ordner ist: %s"\ "Stop" "Abbruch" "Searching '%s'..." "Suche '%s'..."\ "Checked %d folders and %d files" "%d Ordner und %d Dateien geprft"\ " *** Interrupted ***\n" " *** Abgebrochen ***\n"\ "\nSearch time was %d seconds" "\nDie Suchzeit betrug %d Sekunden"\ "\nStart folder was: %s" "\nDer Startordner war: %s"\ "\nSearch pattern was: '%s'" "\nDas Suchmuster war: '%s'"\ "\nNumber of results: %d" "\nAnzahl der Erbegnisse: %d"\ "\nTotally used bytes: %d" "\nInsgesamt benutzer Speicher: %d"\ "\n==========================\n" "\n===================================\n"\ "Search results:" "Suchergenisse:"\ "Searching '%s'..." "Suche in '%s'..."\ "%d entries in folder '%s'" "%d Eintrge im Ordner '%s'"\ "Folder contents reloaded" "Ordnerinhalt neu eingelesen"\ "Name of new folder:" "Name des neuen Ordners:"\ "Cannot create folder '%s'!" "Ordner '%s' kann nicht angelegt werden!"\ "\nA folder with that name already exists." "\nEin Ordner mit diesem Namen existiert bereits."\ "File member '%s' already exists!" "Datei mit diesem Namen existiert bereits."\ "Folder '%s' created" "Ordner '%s' erzeugt"\ "Could not create folder '%s'!" "Ordner '%d' konnte nicht erzeugt werden!"\ "Already at upper most folder level!" "Bereits an der obersten Ordnerebene!"\ "Unknown type" "Unbekannter Typ"\ "%s file" "%s-Datei" \ "Folder" "Ordner"\ "Log file" "Logdatei"\ "Text file" "Textdatei"\ "Animation file" "Animationsdatei"\ "Address book file" "Adressbuchdatei"\ "Configuration file" "Konfigurationsdatei"\ "Bitmap picture file" "Bilddatei"\ "Midi ring tone file" "Midi-Klingelton"\ "Java definition file" "Java Definitionsdatei"\ "Executable Java file" "Ausfhrbares Javaprogramm"\ "Organizer entry file" "Terminplanereintrag"\ "Bussiness card file" "Vistitenkarte"\ "SMS incoming file" "Eingehende SMS-Datei"\ "SMS outgoing file" "Ausgehende SMS-Datei"\ "Data base file" "Datenbankdatei"\ "Data file" "Datendatei"\ ] set obextool_Text_version "0.35" obextool-0.35/lang/siemplug.da0000644000076400007640000000263311127517241016543 0ustar gerhardrgerhardr# # DA language file for Siemens SMS-Plugin # Provided by Jrgen Elgaard Larsen # array set siemplug_Text [list\ "%d minutes" "%d minutter"\ "%d hours" "%d timer"\ "%d days" "%d dage"\ "%d weeks" "%d uger"\ "none" "ingen"\ "* internal error *" "* intern fejl *"\ "Service center address:" "Service Center-adresse:"\ "Time stamp:" "Tidsstempel:"\ "Sender address:" "Afsenderadresse:"\ "Undocumented header:" "Udokumenteret header:"\ "Incoming SMS file: %s" "Indkommende SMS-fil: %s"\ "Validy period:" "Gyldighedsperiode"\ "Receiver address:" "Modtageradresse:"\ "Outgoing SMS file: %s" "Udgende SMS-fil: %s"\ "No Siemens SMS file signature found!" "Ingen Siemens SMS-filsignatur fundet!"\ "\nUnable to display SMS text." "\nKan ikke vise SMS-tekst."\ "Unexpected window '%s'!" "Uventet vindue '%s'!"\ "Unexpected window class '%s'!" "Uventet vinduestype '%s'!"\ "SMS message saved as '%s'!" "SMS-besked gemt som '%s'"\ "SMS-Text" "SMS-tekst"\ "&Close" "&Luk"\ "&Save" "&Gem"\ "Write SMS text into file" "Skriv SMS-tekst til fil"\ "Close SMS window" "Luk SMS-vindue"\ "SMS text:" "SMS-tekst:"\ "SMS data window already open!" "SMS-datavindue allerede bent!"\ "\nPlease close it before opening a new one." "\nLuk det venligst fr du bner et nyt"\ "Unable to download file '%s' or file is empty!" "Kunne ikke hente fil '%s' eller filen er tom!"\ ] set siemplug_Text_version "0.3" obextool-0.35/lang/vcs_plug.da0000644000076400007640000000751611127517241016545 0ustar gerhardrgerhardr# # DA language file for Siemens SMS-Plugin # Provided by Jrgen Elgaard Larsen # array set vcs_plug_Text [list\ "Category" "Kategori"\ "Start" "Start"\ "Alarm" "Alarm"\ "Description" "Beskrivelse"\ "Repeat every" "Gentag hver"\ \ "Birthday" "Fdselsdag"\ "Anniversary" "rsdag"\ "Special event" "Srlig begivenhed"\ "Memo" "Memo"\ "Phone call" "Telefonopringning"\ "Meeting" "Mde"\ \ "day" "dag"\ "year" "r"\ "month" "mned"\ "week" "uge"\ "Mo" "Ma"\ "Tu" "Ti"\ "We" "On"\ "Th" "To"\ "Fr" "Fr"\ "Sa" "L"\ "Su" "S"\ "Unexpected Repeat-Rule '%s' found!" "Uventet gentagelses-regel '%s' fundet!"\ " at the %s." " ved %s."\ " on%s" " p%s"\ "%s date" "%s dato"\ "%s time" "%s tid"\ " on every " " hver "\ "VCal Folder: %s" "VCal-folder"\ "C&reate" "&Opret"\ "&Copy" "&Kopir" \ "&Edit" "&Redigr"\ "&Delete" "&Slet"\ "E&xport..." "&Eksportr..."\ "&Close" "&Luk"\ "&Save" "&Gem"\ "&Read all" "Ls &alle"\ "Edit selected data record" "Redigr valgt datapost"\ "Create new record using current selection" "Opret ny post fra valgt"\ "Create new data record" "Opret ny datapost"\ "Delete selected data record" "Slet valgt datapost"\ "Export all records to text file" "Eksportr alle aftaler til tekstfil"\ "Save entry to device" "Gem post til apparat"\ "Close list window" "Luk listevindue"\ "Read all entries and open list" "Ls alle aftaler og ben liste"\ "Close detail view window" "Luk detaljevisningsvindue"\ "%s window already open!\nPlease" "%s-vinduet er allere bent! Luk det\n"\ " close it before opening a new one." "venligst fr du bner et nyt."\ "Unable to download file '%s'!" "Kunne ikke hente fil '%s'"\ "Stop" "Stop"\ "Reading all VCal entries..." "Lser alle VCal-aftaler..."\ "Reading %s..." "Lser %s..."\ "%d entries read." "%d aftaler lst."\ "File does not seem to be a VCal file!" "Filen er ikke en VCal-fil"\ "No version info in VCal File!" "Ingen versionsinfo i VCal-fil"\ "This plugin does not support version %s of VCal file!" "Denne plugin understtter ikke version %s af VCal-filer"\ "ASCII Text Files " "ASCII-tekstfiler "\ "ASCII Files " "ASCII-filer "\ "CSV Files " "CSV-filer "\ "All files" "Alle filer"\ "Export file" "Eksportr fil"\ "%d records written to file '%s'" "%d poster skrevet til fil '%s'"\ "VCal detail data" "VCal detalje-data"\ "No valid VCal entry for\n%s: %s" "Ingen gyldig VCal-aftale for\n%s: %s"\ "Confirm" "Bekrft"\ "Do you really want to store this record?" "Vil du virkelig gemme denne post?"\ "Uploading file '%s' to '%s'..." "Gemmer fil '%s' til '%s'..."\ "Missing records in stored entry:" "Manglende poster i gemt aftale:"\ "Saved entries not identical to input entry:%s" "Gemte filer ikke identiske med input:%s"\ "File '%s' stored" "Filen '%s' blev gemt"\ "Obextool VCal-Plugin %s" "Obextool VCal-Plugin %s"\ "New VCal Entry: %s" "Ny VCal-aftale: %s"\ "Edit VCal Entry: %s" "Redgr VCal-aftale"\ "VCal overview" "VCal-oversigt"\ "On Siemens mobiles, all uploaded" "P Siemens-mobiler er"\ " entries are deactivated by default." " alle aftaler som udgangspunkt deaktiveret."\ " Don't forget to activate any modified" " Glem ikke at aktivere evt. ndrede"\ " entry in the options of your phone directly." " aftaler direkte i din telefons indstillinger"\ "No record selected for copying!" "Ingen post valgt til kopiering!"\ "No record selected for editing!" "Ingen post valgt til redigering!"\ "No record selected for deleting!" "Ingen post valgt til sletning!"\ "Do you really want to delete the appointment entry %s?" "Vil du virkelig slette aftalen %s?"\ "Deleting appointment entry" "Sletter aftale"\ "Schedule entry %s could not be deleted!" "Skema-aftale %s kunne ikke slettes!"\ ] set vcs_plug_Text_version "1.0" obextool-0.35/lang/adr_plug.pl0000644000076400007640000000643311127517241016544 0ustar gerhardrgerhardr# # PL language file for Siemens SMS-Plugin # Provided by Kamil Nowak # array set adr_plug_Text [list\ "Address detail view" "Widok szczegowy adresw"\ "Address book entry" "Wpis do ksiki adresowej"\ "Address list: %s" "Lista adresw: %s"\ "Address list" "Lista adresw"\ "%d index entries found," "%d wpisw znaleziono"\ "No valid pointer file," "Nieprawidowy wskanik pliku"\ " analyzing address book structure..." " analizowanie struktury ksiki adresowej..."\ "Number of entries from both files do not match!" "Pewne wpisy z obu plikw nie pasuj"\ "\n%d entries found in '%s' and %d entries in '%s'" "\n%d wpisw znaleziono w '%s' i %d wpisw w '%s'"\ "\nDeleted entries may be displayed." "\nSkasowane wpisy mog by wywietlone."\ "Processing address book contents..." "Przeszukiwanie zawartoci ksiki adresowej..."\ "Processing address book contents...OK." "Przeszukiwanie zawartoci ksiki adresowej...Zakoczone pomylnie."\ "Invalid adress file or unsupported file format." "Nieprawidowy plik adresw lub niewaciwy format pliku."\ "\nUsually on Siemens phones only the file" "\nZwykle tylko na telefonach Siemens"\ " called '5fxx.adr' contains the address book" "plik '5fxx.adr' zawiera dane ksiki adresowej."\ " data. '7fxx.adr' contains the pointer list" "'7fxx.adr' zawiera list wskanikw"\ " which mark deleted entities and '9fxx.adr'" "ktry zaznacza usunite wpisy i '9fxx.adr'"\ " contains sort index entries." " zawiera posortowane wedug indeksu wpisy."\ "\nTry selecting the file '5fxx.adr' for displaying" "\nSprbuj wybra plik '5fxx.adr' aby wywietli"\ " the address book data." " ksik adresow z danymi."\ "%s window already open!\n" "%s okno jest ju otwarte!\n"\ "Please close it before opening a new one." "Prosz zamknij je jeli chcesz otworzy nowe."\ "Unable to download file '%s'!" "Nie mona cign pliku '%s'!"\ "No record selected for displaying!" "Nie zaznaczono rekordu do wywietlenia!"\ "&Backward" "&Cofnij"\ "&Forward" "&Dalej"\ "&Show" "&Poka"\ "&Close" "%Zamknij"\ "E&xport..." "E&ksportuj..."\ "Go to previous address record" "Id do porzedniego rekordu adresu"\ "Go to next address record" "Id do kolejnego rekordu adresu"\ "Close detail view" "Zamknij widok szczegowy"\ "Show address detail view" "Poka szczegowy widok adresw"\ "Export data to text file" "Eksportuj dane do pliku tekstowego"\ "Close address list" "Zamknij list adresw"\ "Close detail window before closing list" "Zanim zamkniesz list zamknij okno z widokiem szczegowym"\ "ASCII Text Files " "Pliki teksowe ASCII "\ "ASCII Files " "Pliki ASCII "\ "CSV Files " "Pliki CSV "\ "All files" "Wszystkie pliki"\ "Export file" "Eksportuj plik"\ "%d records written to file '%s'" "%d rekordw zapisanych do pliku '%s'"\ "Nr." "Nr."\ "Firstname" "Imi"\ "Lastname" "Nazwisko"\ "Company" "Firma"\ "Street" "Ulica"\ "City" "Miasto"\ "Country" "Kraj"\ "ZIP" "Kod pocztowy"\ "Email" "Email"\ "URL" "URL"\ "Tel. Home" "Tel. domowy"\ "Tel. Work" "Tel. praca"\ "Tel. Mobile" "Tel. komrkowy"\ "Fax Nr.1" "Fax nr. 1"\ "Fax Nr.2" "Fax nr. 2" \ "Birthday" "Data urodzin"\ "Revision" "Sprawdzanie"\ ] set adr_plug_Text_version "0.2" obextool-0.35/lang/obextool.pl0000644000076400007640000002562511127517241016606 0ustar gerhardrgerhardr# # PL language file for ObexTool # Provided by Kamil Nowak # array set obextool_Text [list\ "Program information" "Informacje o programie"\ "\nA program to communicate with mobile phones using" "\nProgram do komunikacji z telefonami komrkowymi dziki"\ " the OBEX protocol (like Siemens, Ericsson or Nokia)" " protokoowi OBEX (takimi jak Siemens, Ericsson lub Nokia)"\ "\nObexTool is licensed using the GNU General Public Licence," "\nObexTool objty jest licencj GNU General Public Licence,"\ "\nsee http://www.gnu.org/copyleft/gpl.html" "\nzobacz na http://www.gnu.org/copyleft/gpl.html"\ "&File" "&Plik"\ "A&bout" "&O programie" "Program information" "Informacje o programie"\ "&Upload" "&Wylij" "Upload a file" "Wylij plik"\ "D&ownload" "&cignij" "Download a file" "cignij plik"\ "&New" "&Nowy" "Create a new folder" "Stwrz nowy folder"\ "&Find" "&Znajd" "Find file or folder" "Znajd plik lub folder"\ "&Quit" "&Zakocz" "Exit Obex tool" "Zakocz ObexTool"\ "&Edit" "&Edytuj"\ "&Cut" "&Wytnij" "Cut selection" "Wytnij zaznaczone"\ "&Copy" "&Skopiuj" "Copy selection" "Skopiuj zaznaczone"\ "&Paste" "&Wklej" "Paste selection" "Wklej zaznaczone"\ "&Delete" "&Usu" "Delete selection" "Usu zaznaczone"\ "&Rename" "&Zmie nazw" "Rename selection" "Zmie nazw zaznaczonego"\ "&View" "&Widok"\ "&Folder up" "&Folder wyej" "Up one folder level" "Wyej o jeden poziom folderw"\ "&Reload" "&Odwie" "Reread folder contents" "Odwie zawarto folderw"\ "&Properties" "&Waciwoci" "File or folder information" "Informacje o folderze lub pliku"\ "&Memory" "&Pami" "Memory status" "Stan pamici"\ "&Options" "&Opcje"\ "&Toolbar" "&Pasek narzdzi" "Show/hide toolbar" "Poka/ukryj pasek narzdzi"\ "&Large icons" "&Due ikony" "Display large icons" "Wywietl due ikony"\ "&File list" "&Lista plikw" "Display file list" "Wywietl list plikw"\ "&Details" "&Szczegy" "Display file details" "Wywietl szczegy pliku"\ "Version %s" "Wersja %s"\ "Error message" "Bd"\ "Fatal Error:\n%s" "Bd krytyczny:\n%s"\ "Warning message" "Uwaga"\ "\nPlease check your file permissions." "\nSprawd prawa do pliku."\ "All Files" "Wszystkie pliki"\ "Save file" "Zapisz plik"\ "Read file" "Odczytaj plik"\ "ObexTool %s - input dialogue" "ObexTool %s - wejcie"\ "ObexTool %s - text viewer" "ObexTool %s - edytor tekstowy"\ "&Close" "&Zamknij"\ "Close" "Zamknij"\ "O&k" "O&k"\ "&Cancel" "&Anuluj"\ "Cancel file name input" "Anuluj wstawion nazw pliku"\ "Close text window" "Zamknij okno tekstowe"\ "Accept file name" "Zaakceptuj nazw pliku"\ \ "A folder with the name '%s' already exists!" "Folder '%s' ju istnieje!"\ "\nCannot upload file." "\nNie mona wysa pliku."\ "File '%s' already exists!" "Plik '%s' nie istnieje!"\ "\nDo you want to overwrite the existing file?" "\nChcesz zastpi istniejcy plik?"\ "Name collision" "Bd nazwy"\ "File upload cancelled!" "Anulowano wysyanie pliku!"\ "File upload failed" "Wysanie pliku nie powiodo si"\ "Remove of old version of '%s' failed!" "Usuwanie starszej wersji '%s' nie powiodo si!"\ "File '%s' uploaded to '%s'" "Plik '%s' wysano do '%s'"\ "File '%s' could not be uploaded to '%s'!" "Plik '%s' nie mg by wysany do '%s'"\ "New file name:" "Nowa nazwa pliku:"\ "New name is identical to old name!" "Nowa nazwa jest taka sama jak stara!"\ "File '%s' renamed to '%s'." "Zmieniono nazw pliku '%s' na '%s'"\ "File or folder '%s' could not be renamed!" "Nie mona byo zmieni nazwy pliku lub folderu '%s'!"\ "No file or folder selected to delete!" "Nie zanaczono adnego pliku lub folderu do usunicia!"\ "Do you really want to delete the folder '%s'?" "Czy na pewno chcesz usun folder '%s'?"\ "Do you really want to delete the file '%s'?" "Czy na pewno chcesz usun plik '%s'?"\ "Confirmation" "Potwierdzenie"\ "Delete action cancelled!" "Anulowano usuwanie!"\ "File or folder '%s' could not be deleted!" "Plik lub folder '%s' nie mg by usunity!"\ "\nFolders must be empty before deleting." "\nFoldery przed usuniciem musz by puste."\ "Folder '%s' deleted." "Folder '%s' usunity."\ "File '%s' deleted." "Plik '%s' usunity."\ "Total %4.1f\nUsed %4.1f\nFree %4.1f" "Cakowitej %4.1f\nUywanej %4.1f\nWolnej %4.1f"\ " Memory status\n" "Stan pamici"\ "===============\n" "===============\n"\ "Memory total: %s bytes\n" "Cakowita pami %s bajtw\n"\ "Memory used: %s bytes\n" "Uywana pami: %s bajtw\n"\ "Memory free: %s bytes\n" "Wolna pami: %s bajtw\n"\ "Device memory status" "Stan urzdzenia"\ \ "It seems, that your device does not" "Wydaje si, e w Twoim urzdzeniu" \ " support the memory status feature." " nie jest moliwe sprawdzenie stanu pamici." \ "\nMemory status will be disabled." "\nSprawdzanie stanu pamici zostanie wyczone." \ "Unable to create file '%s' in current folder %s!" "Nie jest moliwe utworzenie pliku '%s' w folderze %s!"\ \ "Edit file" "Edytuj plik"\ "View file" "Podgld pliku"\ "Display text" "Wywietl tekst"\ "Upload file" "Wylij plik"\ "Download file" "cignij plik"\ "Cut file" "Wytnij plik"\ "Copy file" "Skopiuj plik"\ "Paste file" "Wstaw plik"\ "Open" "Otwrz"\ "Delete" "Skasuj"\ "Rename" "Zmie nazw"\ "New folder" "Nowy folder"\ "Start plugin" "Uruchom plugin"\ "%s\nDate: %s\nSize: %s\nUser: %s\nGroup: %s" "%s\nData: %s\nRozmiar: %s\nUytkownik: %s\nGrupa: %s"\ "Plugin: %s loaded..." "Plugin: %s zaadowany..."\ "Downloading file '%s'..." "ciganie pliku '%s'..."\ "Uploading file '%s'..." "Wysyanie pliku '%s'..."\ "Unable to open file '%s'!" "Nie mona otworzy pliku '%s'!"\ "Text view of file '%s'..." "Podgld tekstowy pliku '%s'..."\ "File: %s" "Plik: %s"\ "Executing editor '%s'..." "Uruchamianie edytora '%s'..."\ "Executing viewer '%s'..." "Uruchamianie podgldu '%s'..."\ "Error in executing: %s %s" "Bd przy wykonywaniu: %s %s"\ "Viewer '%s' finished." "Podgld '%s' zakoczony."\ "\nError message: %s\nError code: %s" "\nBd: %s\nBd kodu: %s"\ "Question" "Pytanie"\ "Do you want to upload the modified file?" "Czy chcesz wysa zmodyfikowany plik?"\ "File upload failed" "Nie udao si wysa"\ "Remove of old version of '%s' failed!" "Nie udao si usun starszej wersji '%s'!"\ "Uploading file '%s' to '%s'..." "Wysyanie pliku '%s' do '%s'..." \ "Moving file '%s' to '%s'..." "Przenoszenie pliku '%s' do '%s'..."\ "File move failed" "Nie udao si przenie pliku"\ "File move from '%s' to '%s' failed!" "Nie udao si przenie pliku '%s' do '%s' !"\ "File '%s' stored" "Umieszczono plik '%s' "\ "No default action specified for file type '%s'!" "Nie przyporzdkowano adnej akcji do pliku '%s'!"\ "New setup section added to options menu." "Nowa sekcja dodana do menu opcji." \ "Name" "Nazwa" "File type" "Typ pliku" "Size" "Rozmiar"\ "Date" "Data" "U-perm" "Prawa U." "G-perm" "Prawa G."\ "No file selected for downloading" "Nic nie zaznaczono do cignicia"\ "Only files can be downloaded" "Tylko pliki mog by cignite"\ "File member '%s' already exists!" "Uytkownik pliku '%s' ju istnieje!"\ "File download cancelled!" "Anulowano ciganie pliku!"\ "Overwriting file '%s'!" "Nadpisanie pliku '%s'!"\ "Error in downloading file '%s'!" "Bd podczas cigania pliku '%s'!"\ "Download of file '%s' failed!" "Nie udao si cign pliku '%s' !"\ "File '%s' saved as '%s'" "Plik '%s' zapisano jako '%s'"\ "Folder can only be deleted!" "Folder mona tylko usun!"\ "Nothing selected for cutting!" "Nic nie zaznaczone do wycicia!"\ "Cutting '%s'..." "Wycinanie '%s'..."\ "Nothing selected for copying!" "Nic nie zaznaczono do kopiowania!"\ "Copying '%s'..." "Kopiowanie '%s'..."\ "Nothing selected for pasting!" "Nic nie zaznaczono do wklejania!"\ "Folder '%s' already exists!\nCannot paste file." "Folder '%s' ju istnieje!\nNie mona wklei pliku."\ "File '%s' already exists in folder '%s'!" "Plik '%s' ju istnieje w folderze '%s'!"\ "You must specify a new file name or cancel the command." "Musisz poda inn nazw lub anulowa."\ "File '%s' pasted" "Wstawiono plik '%s' "\ "File paste of '%s' failed!" "Nie udao si wklei pliku '%s' !"\ "No file or folder selected!" "Nie zaznaczono adnego pliku lub folderu!"\ "%d entries with\n" "%d obiektw w \n"\ "%d subfolders and\n" "%d podfolderach\n"\ "%d files use\n" "%d plikw uywanych\n"\ "%d bytes of memory" "%d bajtw pamici"\ "File properties: %s" "Waciwoci pliku"\ "Properties for File '%s'..." "Waciwoci dla pliku '%s'..."\ "Folder properties: %s" "Waciwoci folderu: %s"\ "Properties for folder '%s'..." "Waciwoci folderu '%s'..."\ \ "Folder tree" "Drzewo folderw"\ "Folder contents" "Zawarto folderw"\ "Use *, ? and \[ \] for wildcard matching" "Uyj *, ? i \[ \] w celu znalezienia"\ "Example: *pic\[a-z\]?\[0-9\].bm\[px\]" "Przykad: *pic\[a-z\]?\[0-9\].bm\[px\]"\ "File pattern to find:" "Szukanie pliku wedug wzoru:"\ "Current directory is: %s" "Obecny folder to: %s"\ "Stop" "Koniec" "Searching '%s'..." "Szukanie '%s'..."\ "Checked %d folders and %d files" "Sprawdzono %d folderw i %d plikw"\ " *** Interrupted ***\n" " *** Zatrzymano ***\n"\ "\nSearch time was %d seconds" "\nPrzeszukano w czasie %d sekund"\ "\nStart folder was: %s" "\nPocztkowy folder: %s"\ "\nSearch pattern was: '%s'" "Wzr pliku do szukania: '%s'"\ "\nNumber of results: %d" "\nLiczba rezultatw: %d"\ "\nTotally used bytes: %d" "\nCakowity zajty obszar w bajtach: %d"\ "\n==========================\n" "\n==========================\n"\ "Search results:" "Wynik szukania:"\ "Searching '%s'..." "Szukanie '%s'..."\ "%d entries in folder '%s'" "%d wpisw w '%s' folderach"\ "Folder contents reloaded" "Odwieono zawarto folderu"\ "Name of new folder:" "Nazwa nowego folderu:"\ "Cannot create folder '%s'!" "Nie mona utworzy folderu: '%s'!"\ "\nA folder with that name already exists." "\nFolder o tej nazwie ju istnieje."\ "File member '%s' already exists!" "Uytkownik pliku '%s' ju istnieje!"\ "Folder '%s' created" "Utworzono folder '%s' "\ "Could not create folder '%s'!" "Nie mona byo utworzy folderu '%s'!"\ "Already at upper most folder level!" "Nie mona przej do folderu wyej - najwyszy poziom folderu!"\ "Unknown type" "Nieznany typ"\ "%s file" "%s plik" \ "Folder" "Folder"\ "Log file" "Plik log."\ "Text file" "Plik tekstowy"\ "Animation file" "Animacja"\ "Address book file" "Plik ksiki adresowej"\ "Configuration file" "Plik konfiguracyjny"\ "Bitmap picture file" "Obraz bitmapa"\ "Midi ring tone file" "Dwik midi"\ "Java definition file" "Plik definicji javy"\ "Executable Java file" "Plik wykonawczy java"\ "Organizer entry file" "Plik organizatora"\ "Bussiness card file" "Plik wizytwki biznesowej"\ "SMS incoming file" "Plik SMS-w przychodzcych"\ "SMS outgoing file" "Plik SMS-w wychodzcych"\ "Data base file" "Plik bazy danych"\ "Data file" "Plik danych"\ ] set obextool_Text_version "0.33" obextool-0.35/lang/siemplug.pl0000644000076400007640000000271011127517241016566 0ustar gerhardrgerhardr# # PL language file for Siemens SMS-Plugin # Provided by Kamil Nowak # array set siemplug_Text [list\ "%d minutes" "%d minut"\ "%d hours" "%d godzin"\ "%d days" "%d dni"\ "%d weeks" "%d tygodni"\ "none" "aden"\ "* internal error *" "* bd wewntrzny *"\ "Service center address:" "Adres centrum obsugi:"\ "Time stamp:" "Znacznik czasu:"\ "Sender address:" "Adres nadawcy:"\ "Undocumented header:" "Nieznany nagwek:"\ "Incoming SMS file: %s" "Plik SMS-w przychodzcych: %s"\ "Validy period:" "Okres wanoci"\ "Receiver address:" "Adres odbiorcy:"\ "Outgoing SMS file: %s" "Plik SMS-w wychodzcych: %s"\ "No Siemens SMS file signature found!" "Nie znaleziono sygnatury pliku SMS Siemens!"\ "\nUnable to display SMS text." "\nNie mona wywietli treci SMS-a."\ "Unexpected window '%s'!" "Nieoczekiwane okno '%s'!"\ "Unexpected window class '%s'!" "Nieoczekiwana klasa okna '%s'!"\ "SMS message saved as '%s'!" "SMS zapisano jako'%s'"\ "SMS-Text" "Tre SMS-a"\ "&Close" "&Zakocz"\ "&Save" "&Zapisz"\ "Write SMS text into file" "Zapisz tre SMS-a do pliku"\ "Close SMS window" "Zamknij okno SMS"\ "SMS text:" "Tre SMS-a:"\ "SMS data window already open!" "Okno SMS jest ju otwarte!"\ "\nPlease close it before opening a new one." "\nProsz zamknij je zanim otworzysz nowe."\ "Unable to download file '%s' or file is empty!" "Nie mona cign pliku '%s' lub plik jest pusty!"\ ] set siemplug_Text_version "0.3" obextool-0.35/lang/vcs_plug.pl0000644000076400007640000001010111127517241016554 0ustar gerhardrgerhardr# # PL language file for Siemens SMS-Plugin # Provided by Kamil Nowak # array set vcs_plug_Text [list\ "Category" "Kategoria"\ "Start" "Start"\ "Alarm" "Alarm"\ "Description" "Opis"\ "Repeat every" "Liczba powtrze"\ \ "Birthday" "Urodziny"\ "Anniversary" "Rocznica"\ "Special event" "Szczeglna okazja"\ "Memo" "Pami"\ "Phone call" "Rozmowa telefoniczna"\ "Meeting" "Spotkanie"\ \ "day" "dzie"\ "year" "rok"\ "month" "miesic"\ "week" "tydzie"\ "Mo" "Po"\ "Tu" "Wt"\ "We" "r"\ "Th" "Cz"\ "Fr" "Pi"\ "Sa" "So"\ "Su" "Ni"\ "Unexpected Repeat-Rule '%s' found!" "Znaleziono nieoczekiwan zasad powtrze '%s'!"\ " at the %s." "o %s."\ " on%s" " w %s"\ "%s date" "%s data"\ "%s time" "%s czas"\ " on every " " na wszystkie "\ "VCal Folder: %s" "Folder VCal"\ "C&reate" "U&twrz"\ "&Copy" "&Skopiuj" \ "&Edit" "&Edytuj"\ "&Delete" "&Usu"\ "E&xport..." "E&ksportuj..."\ "&Close" "&Zamknij"\ "&Save" "&Zapisz"\ "&Read all" "Odczytaj wszystkie"\ "Edit selected data record" "Edytuj zaznaczony rekord"\ "Create new record using current selection" "Utwrz nowy rekord uywajc zaznaczonego"\ "Create new data record" "Utwrz nowy rekord"\ "Delete selected data record" "Usu zaznaczony rekord"\ "Export all records to text file" "Eksportuj wszystkie rekordy do pliku tekstowego"\ "Save entry to device" "Zapisz wpisy na urzdzeniu"\ "Close list window" "Zamknij okno listy"\ "Read all entries and open list" "Odczytaj wszystkie wpisy i otwrz list"\ "Close detail view window" "Otwrz okno z widokiem szczegw"\ "%s window already open!\nPlease" "%s otworzono ju okno!\nProsz"\ " close it before opening a new one." " zamknij je zanim otworzysz nowe."\ "Unable to download file '%s'!" "Nie mona cign pliku '%s'!"\ "Stop" "Stop"\ "Reading all VCal entries..." "Odczytywanie wpisw VCal..."\ "Reading %s..." "Odczytywanie %s..."\ "%d entries read." "%d wpisw odczytano."\ "File does not seem to be a VCal file!" "Wydaje si, e plik nie jest plikiem VCal"\ "No version info in VCal File!" "Nie znaleziono informacji o wersji w pliku VCal"\ "This plugin does not support version %s of VCal file!" "Ten plugin nie obsuguje wersji %s pliku VCal"\ "ASCII Text Files " "Pliki tekstowe ASCII "\ "ASCII Files " "Pliki ASCII "\ "CSV Files " "Pliki CSV "\ "All files" "Wszystkie pliki"\ "Export file" "Eksportuj plik"\ "%d records written to file '%s'" "%d rekordw zapisanych w pliku '%s'"\ "VCal detail data" "VCal szczegy danych"\ "No valid VCal entry for\n%s: %s" "Nie znaleziono poprawnych wpisw VCal dla\n%s: %s"\ "Confirm" "Potwierd"\ "Do you really want to store this record?" "Czy na pewno chcesz zapisa ten rekord?"\ "Uploading file '%s' to '%s'..." "Wysyanie pliku '%s' do '%s'..."\ "Missing records in stored entry:" "Brakuje rekordw we wpisach:"\ "Saved entries not identical to input entry:%s" "Zapisane wpisy nie s takie same jak wpisy na wejciu:%s"\ "File '%s' stored" "Plik '%s' zapisano"\ "Obextool VCal-Plugin %s" "Obextool VCal-Plugin %s"\ "New VCal Entry: %s" "Nowy wpis VCal: %s"\ "Edit VCal Entry: %s" "Edytuj wpis VCal"\ "VCal overview" "Podgld VCal"\ "On Siemens mobiles, all uploaded" "W telefonach Siemens wszystkie wysyane"\ " entries are deactivated by default." " wpisy s dezaktywowane domylnie."\ " Don't forget to activate any modified" " Nie zapomnij aktywowa zmienionych"\ " entry in the options of your phone directly." " wpisw w opcjach Twojego telefonu"\ "No record selected for copying!" "Nie zaznaczono rekordu do skopiowania!"\ "No record selected for editing!" "Nie zaznaczono rekordu do edycji!"\ "No record selected for deleting!" "Nie zaznaczono rekordu do usunicia!"\ "Do you really want to delete the appointment entry %s?" "Czy na pewno chcesz usun wpis o spotkaniu %s?"\ "Deleting appointment entry" "Usuwanie wpisu o spotkaniu"\ "Schedule entry %s could not be deleted!" "Wpis harmonogramu %s nie mg by usunity!"\ ] set vcs_plug_Text_version "1.0" obextool-0.35/lib/0000755000076400007640000000000011127517724014237 5ustar gerhardrgerhardrobextool-0.35/lib/pkgIndex.tcl0000644000076400007640000000126011127517724016513 0ustar gerhardrgerhardr# Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. package ifneeded obexlist 0.5 [list source [file join $dir obexlist.tcl]] package ifneeded obextree 0.4 [list source [file join $dir obextree.tcl]] package ifneeded obexfile 0.8 [list source [file join $dir obexfile.tcl]] obextool-0.35/lib/obexfile.tcl0000644000076400007640000004766711127517241016556 0ustar gerhardrgerhardr### ### OBEX protocol folder-listing xml-parser ### ### ### ### ### ### ### ### ### ### History: ### 20031107: config params obexexe and obexdev removed - a wrapper ### shell $OBEXDIR/obexftp.sh will be used in future - ger ### 20040504: parser reworked - newlines become ignored - ger ### 20040712: patch for Nokia 6230, provided by Michael Wikberg - ### thank you Michael! - ger ### 20050117: optional utf-8 encoding implemented - ger ### 20050205: optional html quoting implemented, list may be extended - ger ### 20050208: patch from Andreas Bhler for Ericsson T630/K700i for ### correct html-quoting included - thank you Andreas! - ger ### 20050610: optional add_lslash for Siemens C65V (also M50), see function ### obexftp, command "ls" - thanks to Thomas Sefzick - ger ### 20050706: local config values moved to central config ### etc/obextool.cfg. ### 20060115: " - thanks to M.Fedotov - ger ### 20081206: obexfileio changed to work with spaces in obexftp path, ### thanks to S.Huntley. ### Some old Alcatel's don't line root slashes - set new config ### parameter config,root_name (thanks to David Khling) - ger package provide obexfile 0.8 namespace eval ObexFile { ### encoding param variable encoding [getObexCfg config encoding] ### if html quoting is wanted... variable quote_map [getObexCfg config quote_map] ### Temporary file name prefix variable tmp_prefix [getObexCfg temp prefix] ### Siemens S65V requires the trailing slash on obexftp ls variable add_lslash [getObexCfg config add_lslash] ### Nokia 6670 requires the trailing slash on all directory names variable dir_slash [getObexCfg config dir_slash] ### Ommit root directory name on some old Alcatel's variable root_slash [getObexCfg config root_slash] ### Do not chdir for file sommands variable dont_chdir [getObexCfg config dont_chdir] ### date format variable date_format [getObexCfg file datefmt] variable array TAG set TAG(end) "/>" ### siemens M50 ### ericsson T610 set TAG(XML_identifier) \ " ### nokia 6230 ]> set TAG(DTD_identifier) \ "" ### motorola V500: ### all other known: set TAG(folder-listbeg) \ "" ### nokia 6230 specific ### ... does not appear in mmc-subdirectory ?!?! set TAG(parent-folder) \ " 0} { set i 0 set vname "" set ch1 [string index $fline $i] while {[name_sep $ch1]} { append vname $ch1 set ch1 [string index $fline [incr i]] # debug_out "ch1='$ch1' vname=$vname" if { $i >= $sl } break; } set fline [string range $fline [incr i] end] set fline [string trim $fline] # debug_out "fline=$fline" ### ### only keyword, no value follows (token=value)? ### # debug_out "ch1='$ch1'" set value "" if { $ch1 ne "=" } { set value "" set key($vname) $value set fline [string trimleft $fline] set sl [string length $fline] continue } ### ### value without quotes? ### set fline [string trim $fline] set ch1 [string index $fline [set i 0]] # debug_out "$ch1 ne '\"'" if { $ch1 ne "\"" } { set value [lindex [split $fline] 0] set $fline [string range $fline [string length $value] end] set key($vname) $value set fline [string trimleft $fline] set sl [string length $fline] continue } ### ### value with quotes (may include white spaces...) ### set sl [string length $fline] set ch1 [string index $fline [set i 1]] # debug_out "ch1 eq '$ch1'" while { $ch1 ne "\"" } { append value $ch1 set ch1 [string index $fline [incr i]] # debug_out "ch1='$ch1' $ch1 ne \"\"\" value=$value" if { $i >= $sl } break; } set fline [string range $fline $i end] set fline [string trimleft $fline] set sl [string length $fline] set key($vname) $value # debug_out "key($vname) ne \"$value\"" } } proc save_append { vname } { upvar $vname key if [info exists key] { return $key } else { return "" } } proc read_entry { stoken fline } { # debug_out "read_entry $stoken $fline" variable file_date set out_line {} set sidx [string length $stoken] set eidx [expr [string length $fline]-3] set fline [string range $fline $sidx $eidx] att_value_list dir_entry [string trim $fline] if {[info exists dir_entry(modified)]} { set file_date($dir_entry(name)) $dir_entry(modified) } else { set file_date($dir_entry(name)) "" } lappend out_line $dir_entry(name) lappend out_line [get_filetype $stoken $dir_entry(name)] lappend out_line [save_append dir_entry(size)] lappend out_line [format_date [save_append dir_entry(modified)]] lappend out_line [save_append dir_entry(user-perm)] lappend out_line [save_append dir_entry(group-perm)] return $out_line } proc obex_chkarg { cmd reason check } { debug_out "obex_chkarg $cmd $reason $check" 2 if ![string compare $check ""] { internal_error "called obexftp '$cmd' without '$reason'" } } proc get_filename { fn } { variable encoding variable quote_map if {$encoding ne ""} { set fn [encoding convertfrom $encoding $fn] } if {$quote_map ne ""} { set fn [string map $quote_map $fn] } return $fn } proc obexfileio { params } { variable encoding variable quote_map set obexecute [getObexCfg obexftp command] set ret_val {} set pipecmd "|$obexecute" foreach p $params {lappend pipecmd $p} debug_var pipecmd 3 set infile [open $pipecmd "r"] fconfigure $infile -translation binary ### single file read is done set lines [read -nonewline $infile] catch {close $infile} # debug_var lines 3 ### part, if no XML output (eg. --info command) if {[string first "<" $lines]<0} { foreach line [split $lines "\n"] {lappend ret_val [string trim $line]} return $ret_val } ### it is XML output... while {[set start [string first "<" $lines]]>=0} { set endst [string first ">" $lines] set nextl [string range $lines $start $endst] if {$encoding ne ""} { set nextl [encoding convertfrom $encoding $nextl] } if {$quote_map ne ""} { set nextl [string map $quote_map $nextl] } lappend ret_val [string trim $nextl] set lines [string range $lines [incr endst] end] } # debug_out "obexfileio -> $ret_val" 4 return $ret_val } proc obexftp { cmd args } { global OBEXDIR variable dont_chdir variable root_slash variable add_lslash variable dir_slash debug_out "obexftp $cmd $args" 3 set chdir [getObexCfg fileopt chdir] set fn1 [lindex $args 0] set fn2 [lindex $args 1] set fn3 [lindex $args 2] set ret_val {} case $cmd { ls { set cmd [getObexCfg fileopt list] obex_chkarg $cmd path $fn1 if {$dir_slash} {set add_lslash ""} ### We add a slash to file name (Thomas Sefzick) set nam [get_filename [file tail $fn1]]$add_lslash regexp .$ $fn1 fn2 if {$fn2 eq "/"} { if {$dir_slash} { set dir $fn1 set nam "" } elseif {$add_lslash eq "/"} { set dir "/" set nam "" } elseif {!$root_slash} { set dir "" set nam "" } else { set dir [get_filename [file dirname $fn1]] } } else { set dir [get_filename [file dirname $fn1]] } if {$nam eq "" && $dir eq ""} { set command "$cmd" } elseif {$nam eq ""} { set command "$chdir {$dir} $cmd" } elseif {$dir eq ""} { set command "$cmd {$nam}" } else { set command "$chdir {$dir} $cmd {$nam}" } } gf { set cmd [getObexCfg fileopt get] obex_chkarg $cmd pathname $fn1 if {$dont_chdir} { set fn1 [get_filename $fn1] set command "$cmd {$fn1}" } else { set dir [get_filename [file dirname $fn1]] set nam [get_filename [file tail $fn1]] set command "$chdir {$dir} $cmd {$nam}" } } pf { set cmd [getObexCfg fileopt put] obex_chkarg $cmd sourcename $fn1 obex_chkarg $cmd destination $fn2 set fn1 [get_filename $fn1] set fn2 [get_filename $fn2] set command "$chdir {$fn2} $cmd {$fn1}" } mv { set cmd [getObexCfg fileopt move] obex_chkarg $cmd sourcename $fn1 obex_chkarg $cmd destination $fn2 set fn1 [get_filename $fn1] set fn2 [get_filename $fn2] set command "$cmd {$fn1} {$fn2}" } rm { set cmd [getObexCfg fileopt delete] obex_chkarg $cmd pathname $fn1 if {$dont_chdir} { set fn1 [get_filename $fn1] set command "$cmd {$fn1}" } else { set dir [get_filename [file dirname $fn1]] set nam [get_filename [file tail $fn1]] set command "$chdir {$dir} $cmd {$nam}" } } md { set cmd [getObexCfg fileopt mkdir] obex_chkarg $cmd dirname $fn1 if {$dont_chdir} { set fn1 [get_filename $fn1] set command "$cmd {$fn1}" } else { set dir [get_filename [file dirname $fn1]] set nam [get_filename [file tail $fn1]] set command "$chdir {$dir} $cmd {$nam}" } } st { ### This only work for Siemens :-( set cmd [getObexCfg fileopt info] obex_chkarg $cmd status "dummy" set command "$cmd" } ca { ### Rerieve device capabilties set cmd [getObexCfg fileopt capability] obex_chkarg $cmd status "dummy" set command "$cmd" } ve { ### New option to retrieve obexftp version set cmd [getObexCfg fileopt version] obex_chkarg $cmd version "dummy" set command "$cmd" } default { internal_error "Unknown command: '$cmd' $args" } } return [obexfileio $command] } proc list_dir { path } { debug_out "list_dir $path" 4 variable separator variable file_date variable TAG set ret_val "" array unset file_date array set file_date {} set obex_dir [obexftp ls $path] set state begin foreach line $obex_dir { # debug_out "line=$line" 4 switch -- $state { begin { if {-1!=[string first $TAG(XML_identifier) $line]} {set state header} } header { if {-1!=[string first $TAG(DTD_identifier) $line]} {set state listing} } listing { if {-1!=[string first $TAG(folder-listbeg) $line]} {set state entities} } end_listing { if {-1!=[string first $TAG(folder-listend) $line]} {set state end_data} } entities { set stoken [lindex [split $line $separator] 0] if {![string compare $stoken $TAG(folder_begin)]} { lappend ret_val [read_entry $stoken $line] } elseif {![string compare $stoken $TAG(file_begin)]} { lappend ret_val [read_entry $stoken $line] #### TAG(parent-folder) is used on Nokia 6230-phone ... do nozzin ... #### patch from Michael Wikberg - 20040713 } elseif {![string match $TAG(parent-folder)* $stoken]} { } else { set state end_listing } } end_data { debug_out "line after listing ignored ignored..." 3 } default { debug_out "ignorin line: $line" 2 } } } debug_var ret_val 9 return $ret_val } proc get_tmpfile {ext} { variable tmp_prefix set idx 0 set local "$tmp_prefix[format %05d [expr int(rand()*10000)]]$idx.$ext" while {[file exists $local]} { debug_out "temp file name collision '$local'" if {[incr idx]>$max_tries} { internal_error [get_text "Unable to create temporary file '$local'!"] } set local "$tmp_prefix[format %05d [expr int(rand()*10000)]]$idx.$ext" } return $local } proc save_rename { from to } { set res [catch {file rename $from $to} err] if {$res} { set msg [get_text "File rename error!\nError: %s"] warning [format $msg $err] return $res } if {![file exists $to]} { set msg [get_text "File rename error - no destination '%s'!"] warning [format $msg $to] return -1 } if {[file exists $from]} { set msg [get_text "File rename error - source '%s' still exists!"] warning [format $msg $from] return -2 } return 0 } proc try_rename { name } { set idx 0 set renamed "" set max_tries 15 set fn $name.$idx while {[file exists $fn]} { if {[incr idx]>$max_tries} { internal_error [get_text "Unable to create temporary file for '$name'!"] } set fn $name.$idx debug_out "$name.$idx -> [file exists $fn]" 6 } if {[catch {file rename $name $fn} err]} { set msg [get_text "Rename to '%s' failed - error:\n%s\nRetrying..."] warning [format $msg $fn $err] } else { set renamed $fn debug_out "File '$name' temporarily renamed to '$renamed'" } return $renamed } proc read_file_tmp { path } { debug_out "read_file_tmp $path" 3 set idx 0 set renamed "" set max_tries 15 set ext [extension $path] set name [file tail $path] set curr_dir [pwd] while {[file exists $name]} { set renamed [try_rename $name] } set local [get_tmpfile $ext] set emesg \ [get_text "File '%s' renamed to '%s' - please rename it back manually."] obexftp gf $path if ![file exists $name] { set msg "Unable to create file '%s' in current folder %s!" warning [format $msg $name $curr_dir] return {} } debug_out "renaming '$name' to '$local'" 3 if [save_rename $name $local] { warning [format $emesg $name $renamed] return "" } if {![string_empty $renamed]} { if [save_rename $renamed $name] { warning [format $emesg $name $renamed] } debug_out "File renamed back to '$name'" 3 } return $local } proc write_file_tmp { local path } { debug_out "write_file_tmp $local $path" 3 set max_tries 15 set renamed "" set name [file tail $path] set dir_name [file dirname $path] set curr_dir [pwd] while {[file exists $name]} { set renamed [try_rename $name] } set emesg \ [get_text "File '%s' renamed to '%s' - please rename it back manually."] if [save_rename $local $name] { warning [format $emsg $name $renamed] return } debug_out "File '$local' renamed to '$name'" 4 if ![file exists $name] { if ![string_empty $renamed] { if [save_rename $renamed $name] { warning [format $emsg $name $renamed] return } debug_out "File '$renamed' renamed back to '$name'" 3 } set msg "Unable to create file '%s' in current folder %s!" warning [format $msg $path $curr_dir] return } obexftp pf $name $dir_name file delete $name debug_out "Local file '$name' deleted" 3 if {![string_empty $renamed]} { save_rename $renamed $name debug_out "File renamed back to '$name'" 3 } } ### ### very important "dir/file/any exists" function ### main problem is the different behaviour of the ### obex devices and the different "representation" ### of the file entities (with(out) size, with(out) ### permissions, with(out) file date ... ### proc path_exists { which path } { debug_out "path_exists $which $path" 3 ### ### check 1 complete path name ### set nam [file tail $path] set fnd [list_dir $path] # debug_var fnd 9 ### # if [llength $fnd] {return 1} foreach fil $fnd { set fnam [lindex $fil 0] set ftyp [lindex $fil 1] debug_out "$ftyp $fnam $fil" 9 set isfile ![string equal "folder" $ftyp] set nameeq [string equal $nam $fnam] debug_out "$fnam - $ftyp" 9 debug_out "$isfile && $nameeq" 9 switch $which { any { if {[expr $nameeq ]} {return 1} } dir { if {[expr $nameeq && !$isfile]} {return 1} } file { if {[expr $nameeq && $isfile]} {return 1} } default { internal_error "path_exists: invalid path type '$which'!" } } } ### ### check 2 file/folder name in upper level folder ### set path [file dirname $path] set fnd [list_dir $path] # debug_var fnd 9 #### if [llength $fnd] {return 1} foreach fil $fnd { set fnam [lindex $fil 0] set ftyp [lindex $fil 1] set isfile ![string equal "folder" $ftyp] set nameeq [string equal $nam $fnam] debug_out "$fnam - $ftyp" 3 debug_out "$isfile && $nameeq" 3 switch $which { any { if {[expr $nameeq ]} {return 1} } dir { if {[expr $nameeq && !$isfile]} {return 1} } file { if {[expr $nameeq && $isfile]} {return 1} } default { internal_error "path_exists: invalid path type '$which'!" } } } # ### # ### check 3 file/folder name in current dir by appending "/*" # ### # set path "$path/*" # set fnd [list_dir $path] # # debug_var fnd # #### if [llength $fnd] {return 1} # foreach fil $fnd { # set fnam [lindex $fil 0] # set ftyp [lindex $fil 1] # set isfile [string compare "folder" $ftyp] # set nameeq ![string compare $nam $fnam] # debug_var isfile 3 # debug_var nameeq 3 # switch $which { # any { if [expr $nameeq ] {return 1} } # dir { if [expr $nameeq && !$isfile] {return 1} } # file { return 0 } # default { # internal_error "path_exists: invalid path type '$which'!" # } # } # } return 0 } } ; ### end eval namespace obextool-0.35/lib/obextool.ini0000644000076400007640000003240111127517241016565 0ustar gerhardrgerhardr### ### Basic initialization of obex tool ### proc debug_out { msg args } { global OBX_Debug if {![info exists OBX_Debug]} return set lvl 1 set dbg 0 if [llength $args] { set lvl [lindex $args 0] } if {$OBX_Debug>=$lvl} { puts "DEBUG $lvl: $msg" } } proc debug_var { var args } { global OBX_Debug if {![info exists OBX_Debug]} return set lvl 1 if [llength $args] { set lvl [lindex $args 0] } if {$OBX_Debug>=$lvl} { upvar $var local if [info exists local] { puts "VARIA $lvl: $var=|$local|" } else { puts "VARIA $lvl: $var=*not set*" } } } proc debug_arr { lst args } { global OBX_Debug if {![info exists OBX_Debug]} return set lvl 1 if [llength $args] { set lvl [lindex $args 0] } if {$OBX_Debug>=$lvl} { upvar $lst arr if ![info exists arr] { puts "ARRAY $lvl: $lst=*not set*" return } if ![array exists arr] { puts "ARRAY $lvl: $lst=*no array*" return } foreach nam [array names arr] { puts "ARRAY $lvl: $lst\($nam\) =|$arr($nam)|" } } } proc debug_win { win args } { global OBX_Debug set lvl 1 if [llength $args] { set lvl [lindex $args 0] } if {![info exists OBX_Debug]} return if {$OBX_Debug>=$lvl} { puts "WINDOW $lvl: $win" } } ### ### Configuration file reading and version checking ### proc config_version_checking { version mod_ext } { global OBEXTOOLVERSION OBEXCFG set mod_file $OBEXCFG/obextool.$mod_ext debug_var mod_file 8 if [string_empty $version] { set msg "No version information found in '$mod_file'" } else { if {$version eq $OBEXTOOLVERSION} {return 1} set msg "Configuration file version $version in '$mod_file' does not fit" append msg " to program version $OBEXTOOLVERSION." } append msg "\nPlease check if all configuration parameters are set correctly" append msg " and ensure that the configuration file version is set to version" append msg " $OBEXTOOLVERSION by using the statement:" append msg "\n set ObexConfig(${mod_ext}_file,version) \"$OBEXTOOLVERSION\"\n" append msg "in file '$mod_file'." append msg "\nOtherwise the ObexTool might not work correctly." warning $msg return 0 } proc read_obextool_config { cfg_type } { global OBEXDIR OBEXCFG ObexConfig debug_var OBEXCFG debug_var OBEXDIR if [file exists $OBEXCFG/obextool.$cfg_type] { source $OBEXCFG/obextool.$cfg_type } else { set msg "Configuration file obextool.$cfg_type not found!" append msg "\nPlease check your installation or use the environment" append msg " variable OBEXTOOL_CFG to point to the directory where" append msg " your configuration files are stored." warning $msg } if ![info exists ObexConfig(${cfg_type}_file,version)] { config_version_checking "" $cfg_type } else { config_version_checking $ObexConfig(${cfg_type}_file,version) $cfg_type } } proc getObexCfg { section key } { global ObexConfig env if [info exists ObexConfig($section,$key)] { return $ObexConfig($section,$key) } else { debug_out "no config value 'ObexConfig($section,$key)' found!" return {} } } proc lang_env_warning { lang } { set msg "Configuration problem:" append msg \ "\nConfiguration value '$lang' found but no environment value \$$lang set!" append msg \ "\nPlease check your configuration file or set your \$lang variable." append msg "\nText translation will be disabled!" warning $msg } proc load_Messages { dict args } { debug_out "load_Messages $dict $args" 3 global env OBEXDIR [string tolower $dict]_Text ObexConfig set largs [llength $args] set language [getObexCfg config language] set version_var [string tolower $dict]_Text_version set req_version "" if $largs { set language [lindex $args 0] if {$largs > 1} { set req_version [lindex $args 1] } } switch $language { LC_MESSAGES - LC_ALL - LANG { set req_version "" if [info exists env($language)] { set language [string range $env($language) 0 1] } else { lang_env_warning $language } } LOCALE { set req_version "" if [info exists env(LC_ALL)] { set language [string range $env(LC_ALL) 0 1] } elseif [info exists env(LC_MESSAGES)] { set language [string range $env(LC_MESSAGES) 0 1] } elseif [info exists env(LANG)] { set language [string range $env(LANG) 0 1] } else { lang_env_warning $language } } } ## ## consider the BWidgets .rc files too ## set bw_lang [file join $::BWIDGET::LIBRARY "lang" "$language.rc"] if [file exists $bw_lang ] { option read $bw_lang } set lang_file [file join $OBEXDIR lang $dict.$language] if [file exist $lang_file] { source $lang_file set ObexConfig(config,language) $language if [string_empty $req_version] {return 0} catch {set version_val [eval set $version_var]} debug_var $version_var 2 debug_var version_val 3 if [info exists version_val] { puts "Found message file $lang_file version $version_val ..." if [string_equal $req_version $version_val] {return 0} set msg \ [format "Language file version %s does not fit module version %s"\ $version_val $req_version] append msg "\nPlease check if the language file is setup correctly." } else { set msg "No version information found in '$lang_file'!" } append msg "\nText translation will be disabled!" catch {unset [string tolower $dict]_Text} warning $msg } return 1 } proc get_text { msg args } { if [llength $args] { set dict [lindex $args 0] } else { set dict obextool } global ${dict}_Text if { [getObexCfg config language] eq "en" } { return $msg } if { ! [array exists ${dict}_Text] } { return $msg } if { ! [info exists ${dict}_Text($msg)] } { return $msg } return [set ${dict}_Text($msg)] } proc status_msg { msg } { set ObexTool::status $msg update } proc internal_error { msg } { global glb_dlg_width set lmsg [wrap_lines $msg $glb_dlg_width] MessageDlg .e -type ok -icon error \ -title [get_text "Error message"] \ -message [format [get_text "Fatal Error:\n%s"] $lmsg] exit 2 } proc warning { msg } { global glb_dlg_width set lmsg [wrap_lines $msg $glb_dlg_width] MessageDlg .w -type ok -icon warning\ -title [get_text "Warning message"] -message $lmsg } proc no_permission { msg } { append msg [get_text "\nPlease check your file permissions."] warning $msg } proc ask_yes_no { title msg } { global glb_dlg_width set lmsg [wrap_lines $msg $glb_dlg_width] set res [MessageDlg .q -type yesno -icon question \ -title $title -message $lmsg] return [expr ! $res] } proc string_empty { val } { return [expr ![string compare $val ""]] } proc string_equal { str1 str2 } { set se1 [string_empty $str1] set se2 [string_empty $str2] if [expr $se1&&$se2] {return 1} if [expr $se1||$se2] {return 0} return [expr ![string compare $str1 $str2]] } ### ### combination of: ### toplevel+titleframe+buttonbox ### caller MUST call "wm deiconfify" for window visibility ### proc new_window { w wtitle ftitle blist def args } { global OBX_Debug set tfont [getObexCfg font frames] toplevel $w wm withdraw $w set deb_btn [getObexCfg mouse_button right] if {[info exists OBX_Debug] && $OBX_Debug} { bind $w "debug_win %W" } if {[llength $args]} { wm transient $w [lindex $args 0] } wm title $w $wtitle set tf [TitleFrame $w.tf -text $ftitle -font $tfont -relief ridge] pack $tf -pady 5 -padx 2 -expand yes -fill both addbuttons $tf $blist $def bind $w "after idle \"destroy $w\"" return [$tf getframe] } ### ### new_window incl. scrollable frame (returned) ### caller MUST call "wm deiconfify" for window visibility ### proc new_swindow { w wtitle ftitle blist def args } { global OBX_Debug set tfont [getObexCfg font frames] set tf [new_window $w $wtitle $ftitle $blist $def $args] set sw [ScrolledWindow $tf.tw -auto both -scrollbar both] pack $sw -expand yes -fill both return $sw } ### ### Add a button box ### blist: { name1 helptext1 callback1 [ name2 ... ] } ### optionals arg: number of default button ### name honours "&" for hotkey creation ("O&k") ### proc addbuttons { win blist args } { # debug_out "addbuttons $win $blist $args" 6 set bfont [getObexCfg font buttons] set defb -1 set ibut 0 set bf [ButtonBox $win.bf] if [llength $args] {set defb [lindex $args 0]} foreach [list b_id help cmnd] $blist { debug_out "'$b_id' '$help' '$cmnd'" 8 set underl [string first "&" $b_id] if {$underl == -1} { set name $b_id } else { set name [string range $b_id 0 [expr $underl-1]] append name [string range $b_id [expr $underl+1] end] } set bstr "$bf add -text \"$name\" -font \"$bfont\"" if {$underl != -1} {append bstr " -underline $underl" } if ![string_empty $cmnd] {append bstr " -command \"$cmnd\"" } if ![string_empty $help] {append bstr " -helptext \"$help\""} if {$defb eq $ibut} {append bstr " -default active" } # debug_var bstr 3 eval $bstr incr ibut } pack $bf -pady 5 } proc save_filename { name type } { set typf [list [ObexTool::file_type $type] [list ".$type"]] set typa [list [get_text "All Files"] [list "*" ]] set outn [tk_getSaveFile -parent . \ -title [get_text "Save file"] \ -defaultextension $type \ -filetypes [list $typf $typa] \ -initialfile $name] return $outn } proc read_filename { name args } { debug_out "read_filename $name $args" set types $args set typf {} if ![llength $types] { set types [lsort [array names ::ObexTool::file_types]] } lappend typf [list [get_text "All Files"] [list "*"]] foreach etyp $types { if ![string_equal $etyp "folder"] { lappend typf [list [ObexTool::file_type $etyp] [list ".$etyp"]] } } set outn [tk_getOpenFile -parent . \ -title [get_text "Read file"] \ -defaultextension [ObexFile::extension $name] \ -filetypes $typf \ -initialfile $name] return $outn } ### ### currently $args is not used, mybe we use ### it for creating new dir in future -ger ### proc select_dirname { name args } { debug_out "select_dirname $name $args" set ndir [tk_chooseDirectory -parent . \ -title [get_text "Select directory"] \ -initialdir $name] return $ndir } proc filename_dlg { prompt name args } { global glb_dlg_width OBEXTOOLVERSION global filename_dlg_result debug_out "filename_dlg $name $args" 3 set bfont [getObexCfg font buttons] set top [toplevel .fn_dlg] if [info exists OBX_Debug] { bind $top "debug_win %W" } wm transient $top . set wtitle [get_text "ObexTool %s - input dialogue"] wm title $top [format $wtitle $OBEXTOOLVERSION] set i 0 foreach line $args { set lbl $top.l[incr i] set txt [wrap_lines $line $glb_dlg_width] pack [label $lbl -text $txt] } set filename_dlg_result "" set lf [LabelFrame $top.f -text $prompt -justify left] set le [Entry $lf.e -text $name -bg white -justify left \ -textvariable filename_dlg_result] pack $lf $le -expand 1 -fill x -padx 10 -pady 2 set buttons [list \ [get_text "O&k"] \ [get_text "Accept file name"] \ {set end 1} \ [get_text "&Cancel"] \ [get_text "Cancel file name input"] \ {set filename_dlg_result {};set end 1}] addbuttons $top $buttons 0 # center_dlg $top . BWidget::place $top 0 0 center . bind $top {set end 1} tkwait variable end destroy $top return $filename_dlg_result } proc wrap_lines { lines max_len } { set nln {} foreach line [split $lines "\n"] { lappend nln [join [wrap_line $line $max_len] "\n"] } return [join $nln "\n"] } proc wrap_line { name max_len } { debug_out "wrap_line $name $max_len" 5 set res {} while {[string length $name]>$max_len} { set dot_offs 0 for {set i $max_len} {$i>0} {incr i -1} { set ch [string index $name $i] if {[string_equal "." $ch]||[string_equal "\$" $ch]} { set dot_offs $i continue } #### if {![string is alnum $ch]} break if {![string is wordchar $ch]} break } if {!$i} { if $dot_offs { set i $dot_offs } else { set i $max_len } } lappend res [string range $name 0 $i] set name [string range $name [incr i] end] } if {$name ne ""} {lappend res $name} return $res } proc make_path { dir name } { if [string_equal [string index $dir end] "/"] { return "$dir$name" } else { return "$dir/$name" } } proc set_cursor { args } { if [llength $args] { . configure -cursor [getObexCfg gui cursor] update } else { . configure -cursor {} } } ### ### ObexFTP command options ### Have a look into the obexftp man page ### set ObexConfig(fileopt,get) "--get" set ObexConfig(fileopt,put) "--put" set ObexConfig(fileopt,list) "--list" set ObexConfig(fileopt,move) "--move" set ObexConfig(fileopt,info) "--info" set ObexConfig(fileopt,chdir) "--chdir" set ObexConfig(fileopt,mkdir) "--mkdir" set ObexConfig(fileopt,delete) "--delete" set ObexConfig(fileopt,version) "--version" set ObexConfig(fileopt,capability) "--capability" puts "Found ObexTool version $OBEXTOOLVERSION ..." obextool-0.35/lib/obexlist.tcl0000644000076400007640000010362511127517241016575 0ustar gerhardrgerhardr### ### ObexTool file list functions ### ### History: ### 20090201: preserve filedate param. implemented -ger ### package provide obexlist 0.5 namespace eval ObexList { variable array lb_entries variable scroll_window variable list_widget variable dblclick 0 variable list_mode [getObexCfg list initmode] variable scrollreg [list 0 0 1 1] variable array copy_selection variable array icon_actpos variable coord_last variable menu_id .obexCtxMnu variable icon_selected variable restore_cmd {} variable download_directory {} ################ menu-entry onitem action if [getObexCfg config filemove] { variable contextmenu [list \ [get_text "Start plugin"] handle ObexList::default_action \ [get_text "Display text"] show ObexList::default_action \ [get_text "View file"] view ObexList::default_action \ [get_text "Edit file"] edit ObexList::default_action \ [get_text "Open"] folder ObexList::default_action \ "-" file "" \ [get_text "Upload file"] file ObexTool::file_put \ [get_text "Download file"] file ObexList::file_get \ "-" file "" \ [get_text "Cut file"] file "ObexList::menu_edit cut" \ [get_text "Copy file"] file "ObexList::menu_edit copy" \ [get_text "Paste file"] any "ObexList::menu_edit paste" \ "-" both "" \ [get_text "Delete"] both ObexTool::file_delete \ [get_text "Rename"] both ObexTool::file_rename \ "-" any "" \ [get_text "New folder"] any ObexTree::new_folder \ ] } else { variable contextmenu [list \ [get_text "Start plugin"] handle ObexList::default_action \ [get_text "Display text"] show ObexList::default_action \ [get_text "View file"] view ObexList::default_action \ [get_text "Edit file"] edit ObexList::default_action \ [get_text "Open"] folder ObexList::default_action \ "-" file "" \ [get_text "Upload file"] file ObexTool::file_put \ [get_text "Download file"] file ObexList::file_get \ "-" file "" \ [get_text "Cut file"] file "ObexList::menu_edit cut" \ [get_text "Copy file"] file "ObexList::menu_edit copy" \ [get_text "Paste file"] any "ObexList::menu_edit paste" \ "-" both "" \ [get_text "Delete"] both ObexTool::file_delete \ "-" any "" \ [get_text "New folder"] any ObexTree::new_folder \ ] } proc create { w } { debug_out "ObexList::create $w" variable scroll_window $w variable list_mode set lmode [getObexCfg list initmode] debug_var lmode switch $lmode { listb {set list_mode [ObexList::new_listbox]} detail {set list_mode [ObexList::new_detail ]} icons {set list_mode [ObexList::new_iconbox]} default {set list_mode [ObexList::new_listbox]} } debug_var list_mode return $list_mode } proc add_cmenu { menuid mentry cmd args } { debug_out "add_cmenu $menuid $mentry $cmd $args" 3 if [string_equal $mentry "-"] { $menuid add separator } else { $menuid add command -label $mentry -command "$cmd $args" } } proc context_menu { mode args } { variable contextmenu variable list_widget variable lb_entries variable menu_id debug_out "context_menu $mode $args" 3 if [winfo exists $menu_id] { if [winfo viewable $menu_id] return } catch {destroy $menu_id} menu $menu_id -tearoff false set mousex [winfo pointerx .] set mousey [winfo pointery .] set name "" debug_out "mode=$mode" switch $mode { list { set obj [lindex $args 0] debug_out "obj=$obj" if ![string_empty $obj] { set name [$list_widget itemcget $obj -text] } } icons { set name [lindex [$list_widget gettags current] 0] } detail { set slist [$list_widget curselection] set yco [expr [winfo y [lindex $args 0]]+[lindex $args 1]] set idx [$list_widget nearest $yco] set sel [$list_widget get $idx] set name [lindex $sel 0] #debug_out "slist=$slist ancho=$ancho" } default { internal_error "context_menu: invalid list mode: '$mode'!" } } debug_var name 3 foreach [list mentry onitem action] $contextmenu { # debug_out "onitem=$onitem string_empty \"$name\" = [string_empty $name]" switch $onitem { none { if [string_empty $name] { add_cmenu $menu_id $mentry $action } } file { if ![string_empty $name] { set type [lindex $lb_entries($name) 1] if ![string_equal $type "folder"] { add_cmenu $menu_id $mentry $action $name } } } folder { if ![string_empty $name] { set type [lindex $lb_entries($name) 1] if [string_equal $type "folder"] { add_cmenu $menu_id $mentry $action $name } } } both { if ![string_empty $name] { add_cmenu $menu_id $mentry $action $name } } show { if ![string_empty $name] { set type [lindex $lb_entries($name) 1] if [is_viewable $type] { add_cmenu $menu_id $mentry $action $name show } } } view { if ![string_empty $name] { set type [lindex $lb_entries($name) 1] set exe [getObexCfg view $type] if ![string_empty $exe] { add_cmenu $menu_id $mentry $action $name view } } } edit { if ![string_empty $name] { set type [lindex $lb_entries($name) 1] set exe [getObexCfg edit $type] if ![string_empty $exe] { add_cmenu $menu_id $mentry $action $name edit } } } handle { if ![string_empty $name] { set type [lindex $lb_entries($name) 1] set ns [string toupper $type] if [load_plugin $ns] { eval "add_cmenu $menu_id \"$mentry\" ${ns}::default_handler $lb_entries($name)" } } } default { add_cmenu $menu_id $mentry $action } } } tk_popup $menu_id $mousex $mousey } proc help_text { name } { variable lb_entries set type [lindex $lb_entries($name) 1] set size [lindex $lb_entries($name) 2] set date [lindex $lb_entries($name) 3] set uprm [lindex $lb_entries($name) 4] set gprm [lindex $lb_entries($name) 5] set ftyp [ObexTool::file_type $type] set sfmt [get_text "%s\nDate: %s\nSize: %s\nUser: %s\nGroup: %s"] return [format $sfmt $ftyp $date $size $uprm $gprm] } proc load_plugin { nsp } { global OBEXDIR debug_out "load_plugin $nsp" 3 set pexists [info commands ::${nsp}::default_handler] debug_var pexists if {$pexists ne ""} {return 1} set plugin_path "$OBEXDIR/plugins/[string tolower $nsp]_*" set plugins [glob -nocomplain $plugin_path] debug_out "plugins=$plugins" if {![llength $plugins]} {return 0} foreach plug [lsort $plugins] { debug_out "loading plugin '$plug'..." source $plug status_msg [format [get_text "Plugin: %s loaded..."] $plug] } set setup [info commands ::${nsp}::setup] if {$setup ne ""} {return 1} set menu_entry [$ObexTool::mainframe getmenu Setup] if {$menu_entry ne ""} { $menu_entry add command -label "$nsp-Plugin" -command ::${nsp}::setup status_msg [get_text "New setup section added to options menu."] } return 1 } proc is_viewable { type } { debug_out "is_viewable $type" 5 set vtypes [getObexCfg file viewable] debug_var vtypes if {[lsearch $vtypes $type] == -1} {return 0} return 1 } proc view_file { path } { debug_out "view_file $path" 5 status_msg [format [get_text "Downloading file '%s'..."] $path] set_cursor on set name [ObexFile::read_file_tmp $path] set_cursor if [string_empty $name] { warning [format [get_text "Unable to open file '%s'!"] $name] return } set fd [open $name "r"] set txt [read $fd] close $fd file delete $name status_msg [format [get_text "Text view of file '%s'..."] $path] ObexTool::text_view [format [get_text "File: %s"] $path] $txt } proc default_action { args } { variable lb_entries debug_out "default_action $args" 3 set item $lb_entries([lindex $args 0]) set path [lindex $item 0] set type [lindex $item 1] set size [lindex $item 2] set editmode [lindex $args 1] if [string_equal $type folder] { set node [ObexTree::path2node $path] ObexTree::select_node "$node" $ObexTree::tree itemconfigure "$node" -open 1 return } ### ### Is a viewer ord editor program defined? ### debug_var editmode 1 set exe "" if ![string_empty $editmode] { set exe [getObexCfg $editmode $type] } if [string_empty $exe] { set exe [getObexCfg view $type] if ![string_empty $exe] { set editmode view } } if [string_empty $exe] { set exe [getObexCfg edit $type] if ![string_empty $exe] { set editmode edit } } debug_var editmode 2 if ![string_empty $exe] { switch $editmode { edit {set msg [format [get_text "Executing editor '%s'..."] $exe]} view {set msg [format [get_text "Executing viewer '%s'..."] $exe]} } ### ### viewer or editor program is defined ### status_msg [format [get_text "Downloading file '%s'..."] $path] set_cursor on set local [ObexFile::read_file_tmp $path] set_cursor debug_var local 8 status_msg $msg ; update set cmd "exec $exe $local" set ecode [catch "eval $cmd" error] if $ecode { set emesg "Error in executing: %s %s" append emesg "\nError message: %s\nError code: %s" warning [format $emesg $exe $local $error $ecode] } if [string_equal $editmode "view"] { ### viewer program closed - delete file and out... set msg [format [get_text "Viewer '%s' finished."] $exe] status_msg $msg file delete $local return } ### edit program closed - let's upload changed file ... set msg [get_text "Do you want to upload the modified file?"] if ![ask_yes_no [get_text "Question"] $msg] { file delete $local return } status_msg [format \ [get_text "Upoading file '%s' to '%s'..."] $local $path] set_cursor on ObexFile::obexftp rm $path ObexFile::write_file_tmp $local $path ObexTree::refresh_list [format [get_text "File '%s' stored"] $path] set_cursor return } ### ### Check if it's a "viewable" file... ### if ![is_viewable $type] { set ftype [ObexTool::file_type $type] set msg [get_text "No default action specified for file type '%s'!"] warning [format $msg $ftype] return } view_file $path } proc sel_single { type args } { variable dblclick variable coord_last debug_out "sel_single $type $args" 3 if $dblclick { do_select clear do_select set set dblclick 0 return } set x [lindex $args 0] set y [lindex $args 1] set coord_last [list $x $y] do_select set $args set dblclick 0 } proc double_click { type args } { variable dblclick 1 variable lb_entries debug_out "double_click $type $args" 3 set name [do_select get $args] if [string_empty $name] return debug_out "tags of selected: $name" set entr $lb_entries($name) set path [lindex $entr 0] set type [lindex $entr 1] if [string_equal $type folder] { default_action $name set dblclick 0 return } ### ### If a handler exists (or can be loaded) - lets execute ist... ### set ns [string toupper $type] if [load_plugin $ns] { eval "${ns}::default_handler $entr" set dblclick 0 return } ### otherwise the "normal action" is performed... default_action $name set dblclick 0 } proc new_listbox { } { variable list_mode listb variable scroll_window variable list_widget debug_out " ObexList::new_listbox" 3 if [winfo exists $scroll_window.list] { set list_widget $scroll_window.list } else { set list_widget [ListBox::create $scroll_window.list \ -background white -relief flat -borderwidth 0 -redraw 1 \ -dragevent 1 -dropenabled 0 -dragenabled 1 \ -width 20 -highlightthickness 0 -multicolumn true \ -highlightbackground blue -selectmode single\ -deltay [getObexCfg list lineheight] \ -droptypes { TREE_NODE {copy {} move {} link {}} LISTBOX_ITEM {copy {} move {} link {}}}] $scroll_window setwidget $list_widget } ### Define bindings set c $list_widget set left [getObexCfg mouse_button left] set right [getObexCfg mouse_button right] bind $c "ObexList::context_menu list" $c bindText "ObexList::sel_single list" $c bindText "ObexList::context_menu list" $c bindText "ObexList::double_click list" $c bindImage "ObexList::double_click list" return $list_mode } proc new_detail { } { variable list_mode detail variable scroll_window variable list_widget debug_out " ObexList::new_detail" 3 if [winfo exists $scroll_window.detail] { set list_widget $scroll_window.detail } else { set list_widget [tablelist::tablelist $scroll_window.detail \ -background white -font [getObexCfg list font]\ -labelrelief flat -showseparators 1 -stretch all\ -selectmode single -height 10 -width 100\ -columns [list 0 [get_text "Name"] \ 0 [get_text "File type"] \ 0 [get_text "Size"] right \ 0 [get_text "Date"] right \ 0 [get_text "U-perm"] \ 0 [get_text "G-perm"]] \ -labelcommand tablelist::sortByColumn] } $scroll_window setwidget $list_widget ### Define bindings set c [$list_widget bodypath] set left [getObexCfg mouse_button left] set right [getObexCfg mouse_button right] bind $c "after 100 ObexList::sel_single detail" bind $c "after 100 ObexList::double_click detail" bind $c "ObexList::context_menu detail %W %y" return $list_mode } proc new_iconbox { } { variable list_mode icons variable scroll_window variable list_widget variable scrollreg debug_out " ObexList::new_iconbox" 3 if [winfo exists $scroll_window.icons] { set list_widget $scroll_window.icons set w [winfo width $scroll_window.icons] set h [winfo height $scroll_window.icons] set scrollreg [list 0 0 $w $h] $list_widget configure -scrollregion $scrollreg } else { set list_widget [canvas $scroll_window.icons \ -scrollregion $scrollreg \ -relief sunken -borderwidth 2 -bg white ] } $scroll_window setwidget $list_widget # DragSite::include ObexList "LISTBOX_ITEM" 1 # DragSite::register $list_widget -dragevent 1 \ # -draginitcmd ObexList::iconic \ # -dragendcmd ObexList::iconec ### Define bindings set c $list_widget set left [getObexCfg mouse_button left] set right [getObexCfg mouse_button right] bind $c "ObexList::context_menu icons %x %y" bind $c "ObexList::sel_single icons %x %y" bind $c "ObexList::double_click icons %x %y" return $list_mode } proc iconic { args } { debug_out "ObexList::iconic $args" set i 0 foreach arg $args { debug_out "arg [incr i]: $arg" 5 } } proc iconec { args } { debug_out "ObexList::iconec $args" set i 0 foreach arg $args { debug_out "arg [incr i]: $arg" 5 } } proc file_get { args } { variable lb_entries variable download_directory debug_out "file_get $args" 3 set name [do_select get] debug_var name 5 if [string_empty $name] {set name [lindex $args 0]} debug_var name 5 if [string_empty $name] { set msg [get_text "No file selected for downloading"] status_msg $msg warning $msg return } debug_out "$lb_entries($name)" 8 set path [lindex $lb_entries($name) 0] set type [lindex $lb_entries($name) 1] set size [lindex $lb_entries($name) 2] set date [lindex $lb_entries($name) 3] if [string_equal $type "folder"] { set msg [get_text "Only files can be downloaded"] status_msg $msg warning $msg return } if [string_empty $download_directory] { set tmp_dir [getObexCfg download_dir define] if {![string_empty $tmp_dir]} { set download_directory $tmp_dir } } debug_var download_directory 3 set sel_dir [getObexCfg download_dir select] debug_var sel_dir 3 if {$sel_dir == 1} { set new_dir [select_dirname $download_directory] if {$new_dir eq ""} return set download_directory $new_dir } if {![string_empty $download_directory]} { set last_dir [pwd] set res [catch {cd $download_directory} err] if $res { set emesg [get_text "Unable to switch to directory: %s\n%s (%s)"] warning [format $emesg $err $res] return } } if [file exists $name] { set query [get_text "File member '%s' already exists!"] append query [get_text "\nDo you want to overwrite the existing file?"] if ![ask_yes_no [get_text "Name collision"] [format $query $name]] { status_msg [get_text "File download cancelled!"] if [info exists last_dir] {catch {cd $last_dir}} return } } status_msg [format [get_text "Downloading file '%s'..."] $path] set_cursor on ObexFile::obexftp gf $path set_cursor if ![file exists $name] { set msg [get_text "Error in downloading file '%s'!"] status_msg [format $msg $path] set msg [get_text "Download of file '%s' failed!"] no_permission [format $msg $path] if [info exists last_dir] {catch {cd $last_dir}} return } set fdate $ObexFile::file_date($name) if {[getObexCfg preserve filedate] && $fdate ne ""} { set dstr "" ; # 012345678901234 debug_var fdate 4 ; # 20090102T104518 append dstr [string range $fdate 0 3] "-" \ [string range $fdate 4 5] "-" \ [string range $fdate 6 7] " " \ [string range $fdate 9 10] ":" \ [string range $fdate 11 12] ":" \ [string range $fdate 13 14] set tstmp [clock scan $dstr] catch {file mtime $name $tstmp} } set msg [get_text "File '%s' saved as '%s'"] if {![string_empty $download_directory]} { append msg [get_text " in directory '%s'"] status_msg [format $msg $path $name $download_directory] } else { status_msg [format $msg $path $name] } if [info exists last_dir] {catch {cd $last_dir}} } proc do_select { cmd args } { variable list_mode variable list_widget variable lb_entries debug_out "do_select $cmd $args" 3 set names {} switch $cmd { get { switch $list_mode { listb { if ![string_empty [set sel [$list_widget selection get]]] { set names [file tail [ObexTree::node2path $sel]] debug_out "$list_mode:$sel=>$names" 3 } } icons { if ![string_empty [set sel [$list_widget find withtag selection]]] { set names [lindex [$list_widget gettags $sel] 0] debug_out "$list_mode:$sel=>$names" 3 } } detail { if ![string_empty [set sel [$list_widget curselection]]] { set names [lindex [$list_widget get $sel] 0] debug_out "$list_mode:$sel=>$names" 3 } } default { internal_error "selection: invalid list mode 1: '$list_mode'!" } } } set { switch $list_mode { listb { set node [lindex $args 0] $list_widget selection set $node } icons { set rect [$list_widget find withtag selection] if ![string_empty $rect] { $list_widget delete $rect } set name [lindex [$list_widget gettags current] 0] set selt [lindex [$list_widget find withtag $name] 0] if ![string_empty $selt] { set bbox [eval "$list_widget bbox $selt"] if ![string_empty $bbox] { set tags [list $name selection] eval "$list_widget create rectangle $bbox -tags \"$tags\"" } } } detail { if ![string_empty [set sel [$list_widget curselection]]] { $list_widget selection set $sel } } default { internal_error "selection: invalid list mode 2: '$type'!" } } } clear { switch $list_mode { listb { $list_widget selection clear } icons { set rect [$list_widget find withtag selection] if ![string_empty $rect] { $list_widget delete $rect } } detail { if ![string_empty [set sel [$list_widget curselection]]] { $list_widget selection clear $sel } } default { internal_error "selection: invalid list mode 3: '$list_mode'!" } } } default {internal_error "selection: selection command: '$cmd'!"} } debug_var names 3 return $names } proc menu_edit { action args } { variable copy_selection variable lb_entries variable selection debug_out "menu_edit $action $args" 3 set path {} set name [do_select get] if [string_empty $name] { set name [lindex $args 0] } if ![string_empty $name] { set path [lindex $lb_entries($name) 0] set size [lindex $lb_entries($name) 2] } ### ### Action is 'cut' - just save the $path ### if [string_equal $action "cut"] { if [string_empty $path] { status_msg [get_text "Nothing selected for cutting!"] return } if [string_equal [lindex $lb_entries($name) 1] "folder"] { warning [get_text "Folder can only be deleted!"] return } array unset copy_selection set copy_selection(cut) $path status_msg [format [get_text "Cutting '%s'..."] $path] return } ### ### Action is 'copy' - just save the $path ### if [string_equal $action "copy"] { if [string_empty $path] { status_msg [get_text "Nothing selected for copying!"] return } if [string_equal [lindex $lb_entries($name) 1] "folder"] { warning [get_text "Folder can only be deleted!"] return } array unset copy_selection set copy_selection(copy) $path status_msg [format [get_text "Copying '%s'..."] $path] return } ### ### Now action MUST be 'paste'... ### if ![string_equal $action "paste"] { internal_error "menu_edit: invalid action '$action'!" } debug_var copy_selection(copy) 6 debug_var copy_selection(cut) 6 if [info exists copy_selection(copy)] { set path $copy_selection(copy) } elseif [info exists copy_selection(cut)] { set path $copy_selection(cut) } else { status_msg [get_text "Nothing selected for pasting!"] return } ### ### Valid $copy_selection(...) found... ### set node [$ObexTree::tree selection get] if [string_empty $node] { internal_error "menu_edit: cannot extract current folder name!" } set dir_name [ObexTree::node2path $node] ### ### Get current folder name and set $action... ### debug_var path 3 set name [file tail $path] set destname [make_path $dir_name $name] ### ### Folder won't be overwritten ### set_cursor on if [ObexFile::path_exists dir $destname] { set msg [get_text "Folder '%s' already exists!\nCannot paste file."] warning [format $msg $destname] set_cursor return } ### ### Loop until a none-existing file is given ### set file_exists [ObexFile::path_exists file $destname] debug_var file_exists 6 while {$file_exists != 0} { set_cursor debug_out "file_exists=$file_exists" 3 set m1 [get_text "File '%s' already exists in folder '%s'!"] set m2 [get_text "You must specify a new file name or cancel the command."] set name [filename_dlg [get_text "New file name:"] $name \ [format $m1 $name $dir_name] $m2] if [string_empty $name] return set_cursor on set destname [make_path $dir_name $name] set file_exists [ObexFile::path_exists any $destname] } ### ### Let's move or copy the file ### status_msg [format [get_text "Downloading file '%s'..."] $path] set local [ObexFile::read_file_tmp $path] if [string_empty $local] { set_cursor return } status_msg [format [get_text "Uploading file '%s'..."] $local] ObexFile::write_file_tmp $local $destname if [info exists copy_selection(cut)] { set src_name $path ObexFile::obexftp rm $src_name } set_cursor ### ### (Un)success message ### if [ObexFile::path_exists file $destname] { ObexTree::refresh_list [format [get_text "File '%s' pasted"] $destname] } else { set msg [format [get_text "File paste of '%s' failed!"] $destname] status_msg $msg no_permission $msg } array unset copy_selection } proc show_props { } { variable lb_entries debug_out "ObexList::show_props" set name [do_select get] if [string_empty $name] { ObexTree::show_props } else { debug_var name 3 set path [lindex $lb_entries($name) 0] set txt [help_text $name] status_msg [format [get_text "Properties for File '%s'..."] $path] ObexTool::text_view [format [get_text "File properties: %s"] $name] $txt } } proc update_list { new_mode } { variable lb_entries variable list_mode variable list_widget variable icon_actpos variable scroll_window variable scrollreg [list 0 0 1 1] debug_out "ObexList::update_list $new_mode" debug_var list_mode debug_var list_widget set old_mode $list_mode set old_widget $list_widget # eval $list_widget delete [$list_widget items] end ### BWidget 1.4 if [winfo exists $old_widget] { switch $old_mode { listb { set items [$old_widget items 0 end] eval $old_widget delete $items } icons { eval $old_widget delete all } detail { eval $old_widget delete 0 end } } destroy [winfo children $scroll_window] pack forget $old_widget } set list_mode $new_mode switch $list_mode { listb { if [winfo exists $scroll_window.list] { set list_widget $scroll_window.list } else { new_listbox } set icon_font [getObexCfg list font] foreach item $ObexTree::dir_list { set node [ObexTree::path2node $item] set name [file tail $item] set type [lindex $lb_entries($name) 1] set icon [ObexTool::filetype_icon $type] # debug_out "Bitmap::get $icon" 4 $list_widget insert end $node -font $icon_font \ -text $name -image [Bitmap::get $icon] } $scroll_window setwidget $list_widget } icons { if [winfo exists $scroll_window.icons] { set list_widget $scroll_window.icons } else { new_iconbox } update set icon_actpos(x) [getObexCfg icon xstart] set icon_actpos(y) [getObexCfg icon ystart] set winw [winfo width $list_widget] foreach item $ObexTree::dir_list { insert_icon $item $winw } $scroll_window setwidget $list_widget update_scrollreg # set icon_font [getObexCfg list font] # $list_widget insert end $node -font $icon_font # $scroll_window setwidget $list_widget } detail { if [winfo exists $scroll_window.detail] { set list_widget $scroll_window.detail } else { new_detail } foreach item $ObexTree::dir_list { set name [file tail $item] set type [lindex $lb_entries($name) 1] set size [lindex $lb_entries($name) 2] set date [lindex $lb_entries($name) 3] set uprm [lindex $lb_entries($name) 4] set gprm [lindex $lb_entries($name) 5] set ftyp [ObexTool::file_type $type] set icon [ObexTool::filetype_icon $type] $list_widget insert end [list $name $ftyp $size $date $uprm $gprm] $list_widget cellconfigure end,0 -image [Bitmap::get $icon] } update $scroll_window setwidget $list_widget } default { internal_error "Invalid list display mode: '$new_mode'!" } } set ObexTool::list_mode $new_mode } proc icon_drag { w x y } { variable coord_last variable icon_selected if [info exists icon_selected] { set tgs $icon_selected } else { set tag [$w gettags current] set tgs [$w find withtag [lindex $tag 0]] } set ox [$w canvasx [lindex $coord_last 0]] set oy [$w canvasy [lindex $coord_last 1]] set nx [$w canvasx $x] set ny [$w canvasy $y] foreach ent $tgs { $w move $ent [expr $nx-$ox] [expr $ny-$oy] } set coord_last [list $x $y] } proc update_scrollreg {} { variable scroll_window variable list_widget variable scrollreg foreach item [$list_widget find all] { set bbox [$list_widget bbox $item] if {[lindex $bbox 0]<[lindex $scrollreg 0]} { set scrollreg [lreplace $scrollreg 0 0 [lindex $bbox 0]] } if {[lindex $bbox 1]<[lindex $scrollreg 1]} { set scrollreg [lreplace $scrollreg 1 1 [lindex $bbox 1]] } if {[lindex $bbox 2]>[lindex $scrollreg 2]} { set scrollreg [lreplace $scrollreg 2 2 [lindex $bbox 2]] } if {[lindex $bbox 3]>[lindex $scrollreg 3]} { set scrollreg [lreplace $scrollreg 3 3 [lindex $bbox 3]] } } $scroll_window.icons config -scrollregion $scrollreg } proc icon_enter { w name args } { # debug_out "icon_enter: register \$w $name $args" variable restore_cmd set help [help_text "$name"] DynamicHelp::register $w balloon $help if ![llength $args] { set restore_cmd {} return } set img [lindex [$w itemconfigure current -image] 4] set restore_cmd [list $w itemconfigure current -image $img] # debug_var restore_cmd set nimg [lindex $args 0] # debug_var nimg $w itemconfigure current -image $nimg } proc icon_leave { w } { variable restore_cmd # debug_out "icon_leave: unregister \$w balloon" eval $restore_cmd DynamicHelp::register $w balloon update destroy $DynamicHelp::_top } proc insert_icon { item winw } { variable lb_entries variable icon_actpos variable list_widget variable scroll_window debug_out "insert_icon $item $winw" 9 set name [file tail $item] set type [lindex $lb_entries($name) 1] set alti "" if [string equal $type "folder"] { set icon [Bitmap::get [ObexTool::filetype_icon folder large]] set alti [Bitmap::get [ObexTool::filetype_icon openfold large]] } else { set icon [Bitmap::get [ObexTool::filetype_icon $type large]] } set tgs [list $name icons] set icon_font [getObexCfg icon font] ### draw icon set w $list_widget set itm [$w create image $icon_actpos(x) $icon_actpos(y) \ -tags $tgs -image $icon] DynamicHelp::register $w balloon [help_text $name] $w bind $itm "ObexList::icon_enter $w {$name} $alti" $w bind $itm "ObexList::icon_leave $w" DragSite::register $w -dragevent 1 \ -draginitcmd ObexList::iconic \ -dragendcmd ObexList::iconec # DragSite::setdrag $scroll_window $w\ # ObexList::iconic \ # ObexList::iconec ### get size of icon set itms [$list_widget find withtag $name] set bbox [eval "$list_widget bbox $itms"] ### text position starts at lower bbox value set y2 [lindex $bbox 3] ### calculate line wrapping set max_len [getObexCfg icon txt_maxlen] set lines [wrap_line $name $max_len] ### draw all text lines set line_height [getObexCfg icon lineheight] foreach lin $lines { $list_widget create text $icon_actpos(x) $y2 -font $icon_font \ -tags [list $name icons] -text $lin -anchor n incr y2 $line_height } ### check if boundingbox exceeds window width set itms [$list_widget find withtag $name] set bbox [eval "$list_widget bbox $itms"] ### ... if yes move last icon to beginning of next line if {[lindex $bbox 2]>$winw} { set x0 [getObexCfg icon xstart] set dy [getObexCfg icon y_offs] set dx [expr $x0-$icon_actpos(x)] $list_widget move $name $dx $dy ### and calculate new icon position set icon_actpos(x) [expr $x0+[getObexCfg icon x_offs]] incr icon_actpos(y) [getObexCfg icon y_offs] } else { incr icon_actpos(x) [getObexCfg icon x_offs] } } } obextool-0.35/lib/obextree.tcl0000644000076400007640000002717711127517241016570 0ustar gerhardrgerhardr### ### Tree part of the obex tool implamentation ### ### Main functions for mataging the folder tree (left part of the gui) ### and the interface to the list part (right part of the gui) ### ### Interface components: ### ObexList::lb_entries - array with file detail information with ### names as indices ### ObexTree::dir_list - list of names in current folder ### ### History: ### 20050610: Implementation of an 8-bit clean character ### mapping (just hex code) -ger ### package provide obextree 0.4 namespace eval ObexTree { variable tree_font [getObexCfg tree font] variable list_frame variable dblclick variable dir_list variable dir_path variable ObxMap variable ObxUnm variable tree # Let's make a bit-clean charmapping (hex) for {set i 0} {$i <= 255} {incr i} { set c [format %c $i] set enc [format %.2x $i] set ObxMap($c) $enc set ObxUnm($enc) $c } proc path2node { str } { variable ObxMap debug_out "path2node $str" 3 set str [string map [array get ObxMap] $str] return $str } proc node2path { str } { variable ObxUnm if [string_equal $str "home"] {return /} set str [string map [array get ObxUnm] $str] return $str } proc create { frame } { variable tree variable list_frame debug_out "create $frame" 3 set lineheight [getObexCfg tree height] set pw [PanedWindow $frame.pw -side top] ############################################################ # Left window setup # set pane [$pw add -weight 2] set tfr [TitleFrame $pane.lf -text [get_text "Folder tree"]] set sw [ScrolledWindow [$tfr getframe].sw -relief sunken -borderwidth 2] set tree [Tree $sw.tree -background white -deltay $lineheight -redraw 0\ -relief flat -borderwidth 0 -width 25 -highlightthickness 0\ -opencmd "ObexTree::moddir 1" \ -closecmd "ObexTree::moddir 0"] $sw setwidget $tree pack $sw $tfr -side top -expand yes -fill both # ############################################################ ############################################################ # Right window setup # set pane [$pw add -weight 8] set list_frame [TitleFrame $pane.lf] set sw [ScrolledWindow [$list_frame getframe].sw \ -auto both -borderwidth 2] pack $sw $list_frame -fill both -expand yes pack $pw -fill both -expand yes # ############################################################ set left [getObexCfg mouse_button left] $tree bindText "ObexTree::select 1" $tree bindText "ObexTree::select 2" return $sw } proc init {} { variable tree variable tree_font debug_out " ObexTree::init" 3 $tree insert end root home \ -text / -data / -drawcross allways \ -font $tree_font -open 0 -image [Bitmap::get openfold_icon] getdir home / #### select 1 home select_node home $tree configure -redraw 1 } proc drop { tree lbox ttnode op type snode } { debug_out "ObexTree::drop $tree $lbox $ttnode $op $type $snode" } proc find_file {} { variable found_list {} variable filsiz 0 variable dircnt 0 variable filcnt 0 global prg_msg bail vinc set dir [curr_dir] if [string_empty $dir] {set dir /} set h1 [get_text "Use *, ? and \[ \] for wildcard matching"] set h2 [get_text "Example: *pic\[a-z\]?\[0-9\].bm\[px\]"] set h3 [format [get_text "Current directory is: %s"] $dir] set pat [filename_dlg [get_text "File pattern to find:"] "*" $h1 $h2 $h3] if [string_empty $pat] return set start [clock seconds] set bail 0 set vinc 1 ProgressDlg .prg -command {set bail 1;destroy .prg} \ -variable vinc -textvariable prg_msg \ -type infinite -stop [get_text "Stop"] -width 50 -maximum 20 \ -title [format [get_text "Searching '%s'..."] $pat] scan_dir $pat $dir if [winfo exists .prg] {destroy .prg} set end [clock seconds] set secs [expr $end-$start] set numf [llength $found_list] set txt "" if $bail { set txt [get_text " *** Interrupted ***\n"] } append txt [format [get_text "Checked %d folders and %d files"] $dircnt $filcnt] append txt [format [get_text "\nSearch time was %d seconds"] $secs] append txt [format [get_text "\nSearch pattern was: '%s'"] $pat] append txt [format [get_text "\nStart folder was: %s"] $dir] append txt [format [get_text "\nNumber of results: %d"] $numf] append txt [format [get_text "\nTotally used bytes: %d"] $filsiz] append txt [get_text "\n==========================\n"] append txt [join $found_list "\n"] ObexTool::text_view [get_text "Search results:"] $txt } proc list_directory { path } { debug_out "list_directory $path" set_cursor on if [getObexCfg config dir_slash] { set dlist [ObexFile::list_dir "$path/"] } else { set dlist [ObexFile::list_dir $path] } set_cursor return $dlist } proc scan_dir { pattern path } { variable found_list variable filsiz variable dircnt variable filcnt global prg_msg bail vinc debug_out "scan_dir $pattern $path" 3 if $bail return set path [make_path $path ""] set prg_msg [format [get_text "Searching '%s'..."] $path] foreach ent [list_directory $path] { set name [lindex $ent 0] set ftyp [lindex $ent 1] set size [lindex $ent 2] set vinc 1 if [string match -nocase $pattern $name] { lappend found_list $path$name if ![string_empty $size] {incr filsiz $size} } if [string_equal $ftyp "folder"] { incr dircnt scan_dir $pattern $path$name } else { incr filcnt } } } proc show_props {} { debug_out "ObexTree::show_props" set path [curr_dir] if [string_empty $path] { warning [get_text "No file or folder selected!"] return } set ents [list_directory $path] set size 0 set acnt 0 set fcnt 0 set dcnt 0 foreach ent $ents { set typ [lindex $ent 1] incr acnt if [string_equal $typ "folder"] { incr dcnt } else { incr fcnt set fsiz [lindex $ent 2] if ![string_empty $fsiz] {incr size $fsiz} } } set txt [format [get_text "%d entries with\n" ] $acnt] append txt [format [get_text "%d subfolders and\n"] $dcnt] append txt [format [get_text "%d files use\n" ] $fcnt] append txt [format [get_text "%d bytes of memory" ] $size] status_msg [format [get_text "Properties for folder '%s'..."] $path] ObexTool::text_view [format [get_text "Folder properties: %s"] $path] $txt } proc getdir { node path } { variable tree variable dir_list variable dir_path $path variable tree_font debug_out "ObexTree::getdir $node $path" 3 set lfiles {} set d_list {} set f_list {} set ents [list_directory $path] set path [make_path $path ""] set sub [$tree nodes $node] if ![string_empty $sub] {$tree delete $sub} foreach ent $ents { set name [lindex $ent 0] set ftyp [lindex $ent 1] set ent [lreplace $ent 0 0 $path$name] set ::ObexList::lb_entries($name) $ent debug_out "::ObexList::lb_entries($name)->$ent" 8 if ![string_equal $ftyp "folder"] { lappend lfiles $name lappend f_list $path$name continue } else { lappend d_list $path$name } ### zeeze are folders set icon [ObexTool::filetype_icon $ftyp] set nnode [path2node $path$name] if [$tree exists $nnode] {$tree delete $nnode} $tree insert end $node $nnode \ -text $name \ -font $tree_font \ -image [Bitmap::get $icon] \ -drawcross allways \ -data $path$name } $tree itemconfigure $node -drawcross allways \ -data $lfiles -open 1 \ -image [Bitmap::get openfold_icon] set dir_list {} if [llength $d_list] {eval "lappend dir_list [lsort $d_list]"} if [llength $f_list] {eval "lappend dir_list [lsort $f_list]"} set msg [get_text "%d entries in folder '%s'"] status_msg [format $msg [llength $ents] $path] } proc moddir { open node } { variable tree debug_out "ObexTree::moddir $node" 3 if $open { getdir $node [node2path $node] } else { $tree closetree $node $tree itemconfigure $node -image [Bitmap::get folder_icon] } } proc curr_dir {} { variable tree set node [$tree selection get] if [string_empty $node] { return "" } else { return [node2path $node] } } proc select { num node } { variable tree variable dblclick debug_out "ObexTree::select $num $node" 3 set dblclick 1 if { $num == 1 } { if { [lsearch [$tree selection get] $node] != -1 } { unset dblclick return } select_node $node } if { $num == 2 } { if { [lsearch [$tree selection get] $node] != -1 } { $tree itemconfigure "$node" -open 1 moddir 1 $node } } } proc select_node { node } { debug_out "ObexTree::select_node $node" 3 variable tree variable dir_path variable list_frame set path [node2path $node] $tree selection set "$node" set sub [$tree itemcget $node -data] debug_var sub 5 if ![string_equal $node $sub] { $tree delete $sub } $tree itemconfigure "$node" -drawcross allways getdir $node $path set sub [$tree itemcget $node -data] debug_out "tree nodes $node=[$tree nodes $node]" 5 foreach subnode [$tree nodes "$node"] { set name [$tree itemcget "$subnode" -text] } $tree itemconfigure $node -open 1 ObexList::update_list $ObexList::list_mode set ftr [format [get_text "List of folder %s"] $dir_path] $list_frame configure -text $ftr } proc refresh_list { msg } { variable tree set node [$tree selection get] if ![string_empty $node] { select_node $node } if [string_empty $msg] { set msg [get_text "Folder contents reloaded"] } status_msg $msg ObexTool::file_status 0 } proc new_folder {} { set dir [curr_dir] set new_dir [filename_dlg [get_text "Name of new folder:"] ""] if [string_empty $new_dir] return set path [make_path $dir $new_dir] set_cursor on if [ObexFile::path_exists any $path] { set_cursor set msg [format [get_text "Cannot create folder '%s'!"] $path] if [ObexFile::path_exists dir $path] { append msg [get_text "\nA folder with that name already exists."] } else { append msg [get_text "\nA file with that name already exists."] } warning $msg return } ObexFile::obexftp md $path if [ObexFile::path_exists dir $path] { refresh_list [format [get_text "Folder '%s' created"] $path] } else { no_permission [format [get_text "Could not create folder '%s'!"] $path] } set_cursor } proc up_level {} { variable tree debug_out "up_level" 3 set node [$tree selection get] if [string_empty "$node"] return debug_var node set pnode [$tree parent "$node"] if [string_empty "pnode" ] return if [string_equal $pnode root] { warning [get_text "Already at upper most folder level!"] return } debug_var pnode select_node "$pnode" } proc expand { but } { variable tree debug_out "ObexTree::expand $tree $but" 3 set cur [$tree selection get] if [string_empty $cur] { if { $but == 0 } { $tree opentree $cur } else { $tree closetree $cur } } } } obextool-0.35/plugins/0000755000076400007640000000000011127517242015145 5ustar gerhardrgerhardrobextool-0.35/plugins/vcs_plugin.tcl0000644000076400007640000010624411127517242020031 0ustar gerhardrgerhardr### ### VCal plugin for ObexTool ### ### (c) Gerhard Reithofer, Techn. EDV Reithofer - 2003-05 ### gerhard.reithofer@tech-edv.co.at http://www.tech-edv.co.at ### ### See COPYING for further details ### namespace eval ::VCS { variable version 1.0 variable show_alarmtime 0 variable siemens_warning 1 variable init_all_entries 1 variable export_header_line 1 variable exportfile "obexvcal.txt" variable label_font {Helvetica 12 bold} variable dialog_font {Helvetica 12} variable listbox_font {Helvetica 12} variable date_lbformat "%4d-%02d-%02d %02d:%02d:%02d" variable tmp_prefix "/tmp/vcal_data" variable date_separator "." variable time_separator ":" variable label_width 16 variable supported_vcal_ver "1.0" variable obext_date "%4d%02d%02dT%02d%02d%02d" variable vcal_entr variable vcentry_idx variable vcal_numbers variable top_level .vcal variable top_list .vlist variable pathname variable dataframe variable lb_widget variable prev_widget variable array repeat_day variable array vcal_array variable array years array set years {start 1970 last 2100} load_Messages vcs_plug [getObexCfg config language] $version variable cat_name set cat_name(CATEGORIES) [get_text "Category" vcs_plug] set cat_name(DTSTART) [get_text "Start" vcs_plug] set cat_name(DALARM) [get_text "Alarm" vcs_plug] set cat_name(DESCRIPTION) [get_text "Description" vcs_plug] set cat_name(RRULE) [get_text "Repeat every" vcs_plug] variable cat_type set {cat_type(ANNIVERSARY)} [get_text "Birthday" vcs_plug] set {cat_type(TCELEBRATE)} [get_text "Anniversary" vcs_plug] set {cat_type(VALENTINE)} [get_text "Special event" vcs_plug] set {cat_type(MISCELLANEOUS)} [get_text "Memo" vcs_plug] set {cat_type(PHONE CALL)} [get_text "Phone call" vcs_plug] set {cat_type(MEETING)} [get_text "Meeting" vcs_plug] variable cat_rule set cat_rule(D1) [get_text "day" vcs_plug] set cat_rule(YD1) [get_text "year" vcs_plug] set cat_rule(MD1) [get_text "month" vcs_plug] set cat_rule(W1) [get_text "week" vcs_plug] set cat_rule(D7) [get_text "week" vcs_plug] variable wdaylist [list MO TU WE TH FR SA SU] variable weekdays set weekdays([lindex $wdaylist 0]) [get_text "Mo" vcs_plug] set weekdays([lindex $wdaylist 1]) [get_text "Tu" vcs_plug] set weekdays([lindex $wdaylist 2]) [get_text "We" vcs_plug] set weekdays([lindex $wdaylist 3]) [get_text "Th" vcs_plug] set weekdays([lindex $wdaylist 4]) [get_text "Fr" vcs_plug] set weekdays([lindex $wdaylist 5]) [get_text "Sa" vcs_plug] set weekdays([lindex $wdaylist 6]) [get_text "Su" vcs_plug] ################################################################## ### Simple utility functions ### ### Just for debugging.... ### proc debug_vcal { vl lv } { foreach entr $vl { debug_var entr $lv } } ### ### ... to avoid octal interpretation on leading zeroes ### proc ztrim { value } { regsub ^0+(.+) $value \\1 retval return $retval } ### ### Extract entry of listbox labels ### proc cat_label { key } { variable cat_name debug_out "cat_label $key" 5 if [info exists cat_name($key)] { set rv $cat_name($key) } else { set rv [string toupper [string index $key 0]] append rv [string tolower [string range $key 1 end]] } debug_var rv 5 return $rv } ### ### Extract a value for a category ### proc cat_value { key } { variable cat_type debug_out "cat_type $key" 5 if [info exists cat_type($key)] { set rv $cat_type($key) } else { set rv [string toupper [string index $key 0]] append rv [string tolower [string range $key 1 end]] } debug_var rv 5 return $rv } ### ### Extract value for a repetition rule ### proc rul_value { rlist } { variable wdaylist variable weekdays variable cat_rule variable cat_name debug_out "rul_value $rlist" 5 set rlist [split $rlist " "] set rule [lindex $rlist 0] set rpar [lrange $rlist 1 end] if {[lsearch [array names cat_rule] $rule]<0} { set msg [get_text "Unexpected Repeat-Rule '%s' found!" vcs_plug] warning [format $msg $rule] return [list "" "" ""] } set rv $cat_rule($rule) debug_var rv 5 debug_var rule 5 switch $rule { MD1 { append rv [format [get_text " at the %s." vcs_plug] [ztrim $rpar]] } D7 - W1 { set days "" debug_var rpar foreach d $wdaylist { if {[lsearch $rpar $d]>=0} { append days " $weekdays($d)" } } append rv [format [get_text " on%s" vcs_plug] $days] } } return $rv } ################################################################## ### Low level widgets ### ### Combo entry (for appointment category and repetition rules) ### proc combo_entry { w id ckey } { variable cat_type variable label_font variable dialog_font variable label_width debug_out "combo_entry $w $id $ckey" 5 set value "" set name $w.[string tolower $id] set dname [cat_label $id] set lf [LabelFrame $name -text $dname -justify left \ -width $label_width -font $label_font] foreach cate [array names cat_type] { lappend cl $cat_type($cate) } if [info exists cat_type($ckey)] { set value $cat_type($ckey) } else { set value } # set txt $ckey ComboBox $lf.c -values $cl -text $value -font $dialog_font \ -entrybg white -justify left -disabledbackground white pack $lf.c $lf ### ### Currently we do not allow to change the catagory ### if {[string_equal $id "CATEGORIES"]&&![string_equal $ckey ""]} { $lf.c configure -state disabled } else { $lf.c setvalue first } } ### ### Date/time entry (for apointment and alarm) ### proc dtime_entry { w id val } { variable years variable label_font variable dialog_font variable date_separator variable time_separator variable label_width variable obext_date debug_out "dtime_entry $w $id $val" 5 set res [scan $val $obext_date Y M D h m s] set name $w.[string tolower $id] set dname [cat_label $id] set lbl [format [get_text "%s date" vcs_plug] $dname] set l1 [LabelFrame ${name}d -text $lbl -justify left \ -width $label_width -font $label_font] SpinBox $l1.dy -text $Y -width 4 -font $dialog_font \ -range [list $years(start) $years(last) 1] \ -textvariable ::VCS::SB_year label $l1.d1 -text $date_separator SpinBox $l1.dm -text $M -width 2 -font $dialog_font -range [list 1 12 1] \ -textvariable ::VCS::SB_month label $l1.d2 -text $date_separator SpinBox $l1.dd -text $D -width 2 -font $dialog_font -range [list 1 31 1] \ -textvariable ::VCS::SB_day set lbl [format [get_text "%s time" vcs_plug] $dname] set l2 [LabelFrame ${name}t -text $lbl -justify left \ -width $label_width -font $label_font] SpinBox $l2.th -text $h -width 2 -font $dialog_font -range [list 0 23 1]\ -textvariable ::VCS::SB_hour label $l2.t1 -text $time_separator SpinBox $l2.tm -text $m -width 2 -font $dialog_font -range [list 0 59 1]\ -textvariable ::VCS::SB_minute label $l2.t2 -text $time_separator SpinBox $l2.ts -text $s -width 2 -font $dialog_font -range [list 0 59 1]\ -textvariable ::VCS::SB_second eval "pack [winfo children $l1] -side left" eval "pack [winfo children $l2] -side left" pack $l1 $l2 -fill x } ### ### Dynamic dialog part for apointment repetition rules ### Consisting of: combobox (day, week, month, year) ### spinbox (day on monthly repetition only) ### checkboxes (weekdays on weekly repetition only) ### proc rrule_entry { w id val } { variable cat_rule variable cat_name variable weekdays variable repeat_day variable label_font variable dialog_font variable label_width variable date_separator debug_out "rrule_entry $w $id $val" 5 set rlist [split $val " "] set rule [lindex $rlist 0] set rpar [lrange $rlist 1 end] if {[lsearch [array names cat_rule] $rule]<0} { set msg [get_text "Unexpected Repeat-Rule '%s' found!" vcs_plug] warning [format $msg $rule] return } set name $w.[string tolower $id] set l1 [LabelFrame ${name}r -text $cat_name(RRULE) -justify left \ -width $label_width -font $label_font] foreach r [array names cat_rule] { lappend cl $cat_rule($r) } ComboBox $l1.c -values $cl -text $cat_rule($rule) -font $dialog_font \ -entrybg white -justify left -disabledbackground white eval "pack [winfo children $l1] -side left" if {[string_equal $rule "W1"]&&[string_equal $rpar ""]} { $l1.c setvalue first } else { $l1.c configure -state disabled } pack $l1 -fill x switch $rule { MD1 { set l2 [LabelFrame ${name}d -text [get_text " on every " vcs_plug] \ -justify left -width $label_width -font $label_font] SpinBox $l2.s -text $rpar -width 2 -range [list 1 31 1] \ -font $dialog_font -textvariable ::VCS::SB_day label $l2.p -text $date_separator eval "pack [winfo children $l2] -side left" pack $l2 -anchor w } D7 - W1 { set l3 [LabelFrame ${name}d -text [get_text " on every " vcs_plug]\ -justify left -width $label_width -font $label_font] foreach d [list MO TU WE] { set vn "wday_${d}" set rb $l3.[string tolower $d] checkbutton $rb -variable VCS::repeat_day($d) -text $weekdays($d) } eval "pack [winfo children $l3] -side left" pack $l3 -fill x set l4 [frame ${name}x] foreach d [list SU SA FR TH] { set vn "wday_${d}" set rb $l4.[string tolower $d] checkbutton $rb -variable VCS::repeat_day($d) -text $weekdays($d) } eval "pack [winfo children $l4] -side right" pack $l4 -fill x foreach d [array names weekdays] { if {[lsearch $rpar $d]<0} { set VCS::repeat_day($d) 0 } else { set VCS::repeat_day($d) 1 } } } } } ### ### Simple label entry - surprised ? ;-) ### proc label_entry { w id dval } { variable label_font variable dialog_font variable label_width debug_out "label_entry $w $id $dval" 5 set name $w.[string tolower $id] set dname [cat_label $id] LabelFrame $name -text $dname -justify left \ -width $label_width -font $label_font Entry $name.e -text $dval -bg white -justify left -font $dialog_font pack $name.e $name -expand 1 -fill x } ###################################################################### ### High level "master" widgets definitions and methods ### ### Listbox with all VCal entries ### proc create_listbox { path } { variable listbox_font variable label_font variable lb_widget variable cat_name variable top_list variable version set buttons [list \ [get_text "&Edit" vcs_plug]\ [get_text "Edit selected data record" vcs_plug]\ "[namespace current]::show_single"\ [get_text "&Copy" vcs_plug] \ [get_text "Create new record using current selection" vcs_plug]\ "[namespace current]::new_vcentry 1"\ [get_text "C&reate" vcs_plug]\ [get_text "Create new data record" vcs_plug]\ "[namespace current]::new_vcentry 0"\ [get_text "&Delete" vcs_plug]\ [get_text "Delete selected data record" vcs_plug]\ "[namespace current]::delete_rec"\ [get_text "E&xport..." vcs_plug]\ [get_text "Export all records to text file" vcs_plug]\ "[namespace current]::export_data"\ [get_text "&Close" vcs_plug]\ [get_text "Close list window" vcs_plug]\ "after idle {destroy $top_list}"\ ] set wintitle [get_text "Obextool VCal-Plugin %s" vcs_plug] set ftitle [format [get_text "VCal Folder: %s" vcs_plug] $path] set wtitle [format $wintitle $version] set sw [new_swindow $top_list $wtitle $ftitle $buttons 5 .] set lb_widget [tablelist::tablelist $sw.lbx \ -background white\ -font $listbox_font\ -labelrelief flat \ -showseparators 1 \ -columns [list 0 "#" right \ 0 $cat_name(CATEGORIES) \ 0 $cat_name(DTSTART) \ 0 $cat_name(DALARM) \ 0 $cat_name(DESCRIPTION) \ 0 $cat_name(RRULE)] \ -labelcommand tablelist::sortByColumn \ -height 15 -width 100 -stretch all] $lb_widget columnconfigure 0 -sortmode integer pack $lb_widget -expand yes -fill both $sw setwidget $lb_widget bind [$lb_widget bodypath] \ "[namespace current]::show_single" BWidget::place $top_list 0 0 center . wm deiconify $top_list } ### ### insert an entry and values into appointment detail view ### proc insert_vcentry { w id val } { debug_out "insert_vcentry $w $id $val" 5 switch $id { DTSTART - AALARM - DALARM { dtime_entry $w $id $val } CATEGORIES { combo_entry $w $id $val } RRULE { rrule_entry $w $id $val } default { label_entry $w $id $val } } } ### ### insert one entry/line into listbox overwiew ### proc update_listbox { num mode } { variable obext_date variable vcal_numbers variable date_lbformat variable vcentry_idx variable vcal_array variable vcal_entr variable lb_widget variable top_list debug_out "update_listbox $num $mode" 4 set lentry(CATEGORIES) {} set lentry(DTSTART) {} set lentry(DALARM) {} set lentry(DESCRIPTION) {} set lentry(RRULE) {} if [set_vcal_entr $vcal_array($num)] return foreach entr $vcentry_idx { set idx [string first "," $entr] set typ [string range $entr 0 [expr $idx-1]] set vid [string range $entr [expr $idx+1] end] if {$typ eq "VEVENT"} { switch $vid { DTSTART - AALARM - DALARM { set res [scan $vcal_entr($entr) $obext_date Y M D h m s] if {$res == 6} { set lentry($vid) [format $date_lbformat $Y $M $D $h $m $s] } else { set lentry($vid) $vcal_entr($entr) } } CATEGORIES { set lentry($vid) [cat_value $vcal_entr($entr)] } RRULE { set lentry($vid) [rul_value $vcal_entr($entr)] } DESCRIPTION { set lentry($vid) $vcal_entr($entr) } } } } ### ### Handle listbox entries, if "insert" mode ### vcal_numbers handling is done by caller ### if [string_equal $mode "insert"] { $lb_widget insert end [list $num\ $lentry(CATEGORIES)\ $lentry(DTSTART)\ $lentry(DALARM)\ $lentry(DESCRIPTION)\ $lentry(RRULE)] } else { set vcal_numbers {} set imax [$lb_widget index end] for {set i 0} {$i<$imax} {incr i} { set id [lindex [$lb_widget get $i] 0] lappend vcal_numbers $id if {$id == $num} { $lb_widget delete $i if [string_equal $mode "replace"] { $lb_widget insert $i [list $num\ $lentry(CATEGORIES)\ $lentry(DTSTART)\ $lentry(DALARM)\ $lentry(DESCRIPTION)\ $lentry(RRULE)] $lb_widget see $i $lb_widget selection clear 0 end $lb_widget selection set $i } } } } } ### ### check if window $which already exists ### proc win_check { which name } { debug_out "win_check $which $name" 4 if [winfo exists $which] { set msg [get_text "%s window already open!\nPlease" vcs_plug] append msg [get_text " close it before opening a new one." vcs_plug] warning [format $msg $name] return 1 } return 0 } ################################################################# ### Data management and file i/o functions ### ### Read one single VCal file and return list of VCal lines ### proc read_entry { path } { debug_out "read_entry $path" 4 set local [ObexFile::read_file_tmp $path] if [string_empty $local] { warning [format [get_text "Unable to download file '%s'!" vcs_plug] $path] return {} } set fd [open $local "r"] fconfigure $fd -translation crlf set vc_lines [split [read $fd] "\n"] close $fd file delete $local return $vc_lines } ### ### Download all VCal entries from the mobile ### $vcal_numbers is the list of VCal file names (in reading order) ### $vcal_array($name) internal storage of VCal file number as index ### proc download_entries { path } { variable vcal_numbers variable vcal_array global prg_msg bail vinc debug_out "download_entries $path" 4 set flist [ObexFile::list_dir $path] set vmax [expr [llength $flist]-1] ProgressDlg .prg -command {set bail 1} \ -variable vinc -textvariable prg_msg -maximum $vmax\ -type normal -stop [get_text "Stop" vcs_plug] -width 50\ -title [get_text "Reading all VCal entries..." vcs_plug] set vinc 0 set bail 0 set vcal_numbers {} foreach entr $flist { if [string_equal [lindex $entr 1] "vcs"] { set fname [lindex $entr 0] set dentr "$path/$fname" set prg_msg [format [get_text "Reading %s..." vcs_plug] $dentr] set vcard [read_entry $dentr] if [string_empty $vcard] {return 0} set id [file rootname $fname] set vcal_array($id) $vcard lappend vcal_numbers $id incr vinc if $bail break status_msg [format [get_text "%d entries read." vcs_plug] $vinc] } } if [winfo exists .prg] {destroy .prg} return $vinc } ### ### Analyse VCal lines and store VEVENT records in an array indexed ### by "GROUP,INDEX", where GROUP is the value of last BEGIN: key and ### INDEX the active field name (line DTSTART, RRULE...) ### proc set_vcal_entr { vcard } { variable supported_vcal_ver variable vcentry_idx variable vcal_entr debug_out "set_vcal_entr $vcard" 4 ### We use unset var, because of TCL 8.2 compatibility if [info exists vcal_entr] {unset vcal_entr} if {![string equal [lindex $vcard 0] "BEGIN:VCALENDAR"]} { warning [get_text "File does not seem to be a VCal file!" vcs_plug] return 1 } set level {} set vcentry_idx {} foreach vc $vcard { if [string_empty $vc] continue set si [string first ":" $vc] set key [string range $vc 0 [expr $si-1]] set val [string range $vc [expr $si+1] end] switch $key { BEGIN { set level [concat $val $level] } END { set level [lrange $level 1 end] } default { set lvl [lindex $level 0] set idx "$lvl,$key" set vcal_entr($idx) $val lappend vcentry_idx $idx ### debug_out "vcal_entr($idx)=$vcal_entr($idx)" 5 } } } if ![info exists vcal_entr(VCALENDAR,VERSION)] { warning [get_text "No version info in VCal File!" vcs_plug] debug_vcal $vcentry_idx 1 return 1 } if ![string_equal $vcal_entr(VCALENDAR,VERSION) $supported_vcal_ver] { set msg \ [get_text "This plugin does not support version %s of VCal file!" vcs_plug] warning [format $msg $vcal_entr(VCALENDAR,VERSION)] debug_vcal $vcentry_idx 1 return 1 } debug_vcal $vcentry_idx 8 return 0 } ### ### Create format to write data back to phone (VCal http://www.imc.org/pdi/) ### proc format_output { w id val } { variable repeat_day variable cat_type variable cat_rule variable obext_date debug_out "format_output $w $id $val" 5 set name $w.[string tolower $id] switch $id { DTSTART - AALARM - DALARM { ; ### dtime_entry $w $id $val set l1 ${name}d set l2 ${name}t set Y [ztrim [$l1.dy cget -text]] set M [ztrim [$l1.dm cget -text]] set D [ztrim [$l1.dd cget -text]] set h [ztrim [$l2.th cget -text]] set m [ztrim [$l2.tm cget -text]] set s [ztrim [$l2.ts cget -text]] return [format "$obext_date" $Y $M $D $h $m $s] } CATEGORIES { ; ### combo_entry $w $id $val set lf $name set val [$lf.c cget -text] foreach cat [array names cat_type] { if [string_equal $val $cat_type($cat)] { return $cat } } } RRULE { ; ### rrule_entry $w $id $val set rule "" set l1 ${name}r set rval [$l1.c cget -text] foreach cat [array names cat_rule] { if [string_equal $rval $cat_rule($cat)] { set rule $cat break; } } if [string_empty $rule] {return ""} ### debug_var rule switch $rule { MD1 { ### set l2 ${name}d ### set v2 [ztrim [$l2.s cget -text]] ### return [format "%s %02d" $rule $v2] ### Repeating day is sync'd with day of start date - ger set day [$w.dtstartd.dd cget -text] return [format "%s %02d" $rule $day] } D7 - W1 { set wdays "" foreach d [list MO TU WE TH FR SA SU] { ### debug_var ::VCS::repeat_day($d) if $VCS::repeat_day($d) { append wdays " $d" } } return "$rule$wdays" } default { return $rule } } } default { set val [$name.e cget -text] return $val } } } ### ### Listbox callback on selection (Edit) of an entry ### proc export_data { } { variable export_header_line variable exportfile variable lb_widget variable top_list set def_ext [file extension $exportfile] set types [list [list [get_text "ASCII Text Files " vcs_plug] \ [list .txt]]\ [list [get_text "ASCII Files " vcs_plug] \ [list .dat]]\ [list [get_text "CSV Files " vcs_plug] \ [list .csv]]\ [list [get_text "All files" vcs_plug] [list "*"]]] set outn [tk_getSaveFile -parent $top_list\ -title [get_text "Export file" vcs_plug] \ -defaultextension $def_ext\ -filetypes $types\ -initialfile $exportfile] if [string_empty $outn] return debug_var outn 4 set new_ext [file extension $outn] if [string_empty $new_ext] { set outn $outn$def_ext } switch $new_ext { .txt { set separator "\t" } .dat { set separator ";" } .csv { set separator "," } default { set separator "\t" } } set numrecs 0 set fd [open $outn "w"] set imax [$lb_widget columncount] if $export_header_line { set row {} for {set i 0} {$i<$imax} {incr i} { lappend row [$lb_widget columncget $i -title] } set line [join $row $separator] puts $fd $line } foreach row [$lb_widget get 0 end] { set line [join $row $separator] puts $fd $line incr numrecs } close $fd set msg [get_text "%d records written to file '%s'" vcs_plug] status_msg [format $msg $numrecs $outn] } ### ### Listbox callback on selection (Delete) of an entry ### proc delete_rec { } { variable pathname variable lb_widget variable vcal_entr debug_out "delete_rec" 4 ### Parameter $w currently not used here - ger set selidx [$lb_widget curselection] if [string_empty $selidx] { warning [get_text "No record selected for deleting!" vcs_plug] return } set selected [$lb_widget get $selidx] set id [lindex $selected 0] ### if [set_vcal_entr $vcal_array($id)] return set delname $id.vcs set vcaldir [file dirname $pathname] set delpath "$vcaldir/$delname" set qry [get_text\ "Do you really want to delete the appointment entry %s?" vcs_plug] set title [get_text "Deleting appointment entry" vcs_plug] if [ask_yes_no $title [format $qry $id]] { set_cursor on ObexFile::obexftp rm $delpath ObexTree::refresh_list "" set err 0 foreach entr $ObexTree::dir_list { if [string_equal $entr $delpath] { set err 1 } } if $err { set msg [get_text "Schedule entry %s could not be deleted!"] no_permission [format $msg $id] } else { update_listbox $id delete } set_cursor } } ### ### Listbox callback on selection (Edit) of an entry ### proc show_single { } { variable vcal_array variable top_level variable top_list variable version variable pathname variable lb_widget debug_out "show_single" 4 if [win_check $top_level [get_text "VCal detail data" vcs_plug] ] return set selidx [$lb_widget curselection] if [string_empty $selidx] { warning [get_text "No record selected for editing!" vcs_plug] return } set selected [$lb_widget get $selidx] set id [lindex $selected 0] set newname $id.vcs set old_dir [file dirname $pathname] set pathname "$old_dir/$newname" set vcard [read_entry $pathname] if [string_empty $vcard] return if [set_vcal_entr $vcard] return vc_dialog $top_list $pathname 0 0 set vcal_array($id) $vcard ### update_listbox $id replace } ### ### Save data (write back) callback on "Save" inVCal detail view ### proc save_data { path is_new } { variable top_list variable top_level variable vcal_entr variable vcal_array variable vcentry_idx variable prev_widget variable tmp_prefix variable dataframe debug_out "save_data $path $is_new" 4 set vcs_dir [file dirname $path] set id [file rootname [file tail $path]] set backup(VCALENDAR,VERSION) "$vcal_entr(VCALENDAR,VERSION)" set result [list "BEGIN:VCALENDAR" \ $backup(VCALENDAR,VERSION) \ "BEGIN:VEVENT" ] foreach rule [array names cat_rule] { set rcheck($rule) {} } set dcheck "" foreach entr $vcentry_idx { set idx [string first "," $entr] set typ [string range $entr 0 [expr $idx-1]] set vid [string range $entr [expr $idx+1] end] if {$typ eq "VEVENT"} { set vc_entr [format_output $dataframe $vid $vcal_entr($entr)] if [string_equal $vid "RRULE"] { ### Rules with "W1" and "D7" are ignored -> no weekdays! if [string_equal $vc_entr "W1"] continue if [string_equal $vc_entr "D7"] continue } set backup($entr) $vc_entr debug_var backup($entr) 6 if [string_empty $vc_entr] { set msg [get_text "No valid VCal entry for\n%s: %s" vcs_plug] warning [format $msg $vid $vc_entr] return } lappend result "$vid:$vc_entr" } debug_var entr 5 } lappend result "END:VEVENT" "END:VCALENDAR" if ![ask_yes_no [get_text "Confirm" vcs_plug] \ [get_text "Do you really want to store this record?" vcs_plug]] { return 1 } debug_var result 3 set cnt 0 while 1 { set fn $tmp_prefix[incr cnt].tmp if ![file exists $fn] break } set fd [open $fn "w"] fconfigure $fd -translation crlf foreach line $result { puts $fd $line debug_var line 6 } debug_var fn 3 close $fd set msg [get_text "Uploading file '%s' to '%s'..." vcs_plug] status_msg [format $msg $fn $path] ### We don't check if file exists - even on new entry... ObexFile::write_file_tmp $fn $path ### ### Consistency checks ### set vcard [read_entry $path] if [string_empty $vcard] return if [set_vcal_entr $vcard] return set bk_list [array names backup] set vc_list [array names vcal_entr] set msg {} if {[llength $bk_list] != [llength $vc_list]} { set msg [get_text "Missing records in stored entry:" vcs_plug] foreach idx $bk_list { if ![info exists vcal_entr($idx)] { set code [lindex [split $idx ","] 1] append msg [format "\n$code:$backup($idx)"] } } foreach idx $vc_list { if ![info exists backup($idx)] { append msg [format "\n$idx:$vcal_entr($idx)"] } } } else { foreach idx $vc_list { if ![string_equal $backup($idx) $vcal_entr($idx)] { append msg [format "\n%s\n%s" $vcal_entr($idx) $backup($idx)] } } if ![string_empty $msg] { set msg [format \ [get_text "Saved entries not identical to input entry:%s" vcs_plug]\ $msg] } } if ![string_empty $msg] {warning [format $msg]} destroy $top_level set msg [get_text "File '%s' stored" vcs_plug] ObexTree::refresh_list [format $msg $path] if [winfo exists $prev_widget] { wm deiconify $prev_widget } ### is it the lis subwindow? if [string_equal $prev_widget $top_list] { set vcal_array($id) $vcard if $is_new { lappend vcal_numbers $id update_listbox $id insert } else { update_listbox $id replace } } return 0 } proc new_vcentry { copy } { debug_out "new_vcentry $copy" 4 variable supported_vcal_ver variable show_alarmtime variable vcal_numbers variable vcal_entr variable lb_widget variable top_level variable top_list variable pathname if [win_check $top_level [get_text "VCal detail data" vcs_plug] ] return set id 0 set vcs_dir [file dirname $pathname] debug_var vcal_numbers 3 while 1 { if {[lsearch $vcal_numbers [incr id]]<0} break } set newpath "$vcs_dir/$id.vcs" set tomorrow [expr [clock seconds]+(60*60*24)] set date [clock format $tomorrow -format "%Y%m%dT%H%M00"] if $copy { set selidx [$lb_widget curselection] if [string_empty $selidx] { warning [get_text "No record selected for copying!" vcs_plug] return } set selidx [$lb_widget curselection] debug_var selidx 4 set selected [$lb_widget get $selidx] debug_var selected 3 set id [lindex $selected 0] set vcard [read_entry "$vcs_dir/$id.vcs"] set_vcal_entr $vcard } else { if [info exists vcal_entr] {unset vcal_entr} } ### debug_var newpath ### debug_arr vcal_entr set vc_new [list "BEGIN:VCALENDAR" \ "VERSION:$supported_vcal_ver" \ "BEGIN:VEVENT"] ### debug_var vcal_entr(VEVENT,CATEGORIES) if [info exists vcal_entr(VEVENT,CATEGORIES)] { lappend vc_new "CATEGORIES:$vcal_entr(VEVENT,CATEGORIES)" } else { # lappend vc_new "CATEGORIES:MISCELLANEOUS" lappend vc_new "CATEGORIES:" } ### debug_var vcal_entr(VEVENT,DTSTART) if [info exists vcal_entr(VEVENT,DTSTART)] { lappend vc_new "DTSTART:$vcal_entr(VEVENT,DTSTART)" } else { lappend vc_new "DTSTART:$date" } if ($show_alarmtime) { ### debug_var vcal_entr(VEVENT,DALARM) if [info exists vcal_entr(VEVENT,DALARM)] { lappend vc_new "DALARM:$vcal_entr(VEVENT,DALARM)" } else { lappend vc_new "DALARM:$date" } } ### debug_var vcal_entr(VEVENT,RRULE) if [info exists vcal_entr(VEVENT,RRULE)] { lappend vc_new "RRULE:$vcal_entr(VEVENT,RRULE)" } else { lappend vc_new "RRULE:W1" } ### debug_var vcal_entr(VEVENT,DESCRIPTION) if [info exists vcal_entr(VEVENT,DESCRIPTION)] { lappend vc_new "DESCRIPTION:$vcal_entr(VEVENT,DESCRIPTION)" } else { lappend vc_new "DESCRIPTION:" } lappend vc_new "END:VEVENT" "END:VCALENDAR" ### debug_var vc_new 4 if [set_vcal_entr $vc_new] return vc_dialog $top_list $newpath 1 0 } ################################################################### ### Top level dialogues and fillup functions ### ### Single appointment detail view ### proc vc_dialog { parent path is_new is_top } { variable version variable top_list variable top_level variable vcal_entr variable vcentry_idx variable dataframe variable label_font variable prev_widget $parent debug_out "vc_dialog $parent $path $is_new $is_top" 4 set buttons [list \ [get_text "&Save" vcs_plug]\ [get_text "Write entry to device" vcs_plug]\ "[namespace current]::save_data $path $is_new"] if $is_top { lappend buttons \ [get_text "&Read all" vcs_plug]\ [get_text "Read all entries and open list" vcs_plug]\ "[namespace current]::vc_listbox $path" set active 2 set parent . } else { set active 1 set parent $top_list } lappend buttons \ [get_text "&Close" vcs_plug]\ [get_text "Close detail view window"]\ "after idle {[namespace current]::close_dialog $prev_widget}" set tstr [get_text "Obextool VCal-Plugin %s" vcs_plug] set wtitle [format $tstr $version] if $is_new { set frame_str [get_text "New VCal Entry: %s" vcs_plug] } else { set frame_str [get_text "Edit VCal Entry: %s" vcs_plug] } set ftitle [format $frame_str [file tail $path]] set dataframe [new_window $top_level $wtitle $ftitle $buttons $active $parent] foreach entr $vcentry_idx { set idx [string first "," $entr] set typ [string range $entr 0 [expr $idx-1]] set vid [string range $entr [expr $idx+1] end] if {$typ eq "VEVENT"} { insert_vcentry $dataframe $vid $vcal_entr($entr) } debug_var entr 5 } BWidget::place $top_level 0 0 center . wm deiconify $top_level } ### ### Close dialog ### proc close_dialog { prev } { variable top_level destroy $top_level wm deiconify $prev } ### ### Create listbox of all VCal entries ### proc vc_listbox { path } { variable version variable top_list variable top_level variable lb_widget variable vcal_numbers debug_out "vc_listbox $path" 4 if [win_check $top_list [get_text "VCal overview" vcs_plug]] return set vcs_dir [file dirname $path] set vcs_id [file tail [file rootname $path]] if ![download_entries $vcs_dir] return catch {destroy $top_level} create_listbox $vcs_dir set cnt 0 set sel -1 foreach num $vcal_numbers { update_listbox $num insert if {$num eq $vcs_id} {set sel $cnt} incr cnt } if {$sel != -1} { $lb_widget selection set $sel $lb_widget see $sel } } ### ### ObexTool main entry point ### proc default_handler { args } { variable top_level variable init_all_entries variable pathname [lindex $args 0] debug_out "[namespace current]::default_handler $args" 5 if [win_check $top_level [get_text "VCal detail data" vcs_plug] ] return if $init_all_entries { vc_listbox $pathname } else { set vcard [read_entry $pathname] if [string_empty $vcard] return if [set_vcal_entr $vcard] return vc_dialog . $pathname 0 1 } } ### ### Warning on load of plugin - there is a strange behaviour on ### Siemens phones - ger ### if $siemens_warning { set msg [get_text "On Siemens mobiles, all uploaded" vcs_plug] append msg [get_text " entries are deactivated by default." vcs_plug] append msg [get_text " Don't forget to activate any modified" vcs_plug] append msg [get_text " entry in the options of your phone directly." vcs_plug] warning $msg } } return $::VCS::version obextool-0.35/plugins/smo_siem.tcl0000644000076400007640000000247111127517242017470 0ustar gerhardrgerhardr### ### SMS outgoing plugin for ObexTool ### ### (c) Gerhard Reithofer, Techn. EDV Reithofer - 2003-05 ### gerhard.reithofer@tech-edv.co.at http://www.tech-edv.co.at ### ### See COPYING for further details ### namespace eval ::SMO { source $OBEXDIR/plugins/siemplug.tcl load_Messages siemplug [getObexCfg config language] $version proc add_flag_data { tf } { global SMS_FLAG PDU_TYPE variable header_data set sa_data [pdu2phone $SMS_FLAG(SCA)] set ts_data [get_vp_value $SMS_FLAG(VP) $PDU_TYPE(VPF)] set rc_data [pdu2phone $SMS_FLAG(DA)] set hd_data $header_data set sa_lbl [get_text "Service center address:" siemplug] set ts_lbl [get_text "Validy period:" siemplug] set rc_lbl [get_text "Receiver address:" siemplug] set hd_lbl [get_text "Undocumented header:" siemplug] foreach key [list sa ts rc hd] { eval "label_entry $tf.$key $${key}_lbl $${key}_data" } } proc default_handler { args } { debug_out "[namespace current]::default_handler $args" 5 global global_msg set path [lindex $args 0] set len [init_plugin $path] if {$len < 0} return set title [get_text "Outgoing SMS file: %s" siemplug] set stext [pdu2txt $global_msg $len] sms_dialog [format $title $path] $stext } } return $::SMO::version obextool-0.35/plugins/siemplug.tcl0000644000076400007640000005164411127517242017510 0ustar gerhardrgerhardr##################################################################### # # TCL SMS mini library # # by Gerhard Reithofer # Techn. EDV Reithofer, Technical software solutions # mailto:gerhard.reithofer@tech-edv.co.at # http://www.tech-edv.co.at # # See COPYING for further details # # This is a part of our self-developed SMS-library, which is also # a part of our GSM-library for TCL. # You may find it on our web server: # http://www.tech-edv.co.at/programmierung/gplsw.html # # Information mostly retrieved from: # # Developer's Guide: # SMS with the SMS PDU-mode # Version 1.2 (30.07.97) by Siemens AG # found at: http://www.min.at/prinz/s25/smspdu.pdf # # ... you will find many, many, many usefult things at the # (M)obile (I)nformation (N)etwork # site by Richard Prinz Richard.Prinz@min.at # # ... and NOBI's real great GSM site # http://www.nobbi.com/ # global SMS_FLAG PDU_TYPE SMS_MSG_VALID SMS_MSG_VP_VALUE ############################################## # # SMS PDU type byte - DELIVER mode # # Bit 7 - Reply Path set PDU_DEF(RP) 0 # Bit 6 - User Data Header Indicator set PDU_DEF(UDHI) 0 # Bit 5 - Status Report Request set PDU_DEF(SRR) 0 # Bit 4+3 - Valid Period Flag - no value set PDU_DEF(VPF) 0 # Bit 2 - Reject Duplicate set PDU_DEF(RD) 0 # Bit 1+0 - Message Type Indicator (default is SMS-SUBMIT) set PDU_DEF(MTI) 1 ############################################## # # SMS FLAGS default - DELIVER mode # ############################################## # # Specify SMS -> fromphone set SMS_DEF(SCA) "00" # Extract PDU flag later # set SMS_DEF(PDU) [set_pdu_flags -1] # Message reference -> 00-FF set SMS_DEF(MR) "00" # Destination address (phone number) # set SMS_DEF(DA) [phone2pdu $pnum] # Protocol IDentifier -> PDU has tobe treted as sms set SMS_DEF(PID) "00" # Data Coding Scheme -> default 7-bit coding set SMS_DEF(DCS) "00" # Validy Period flag -> no value given (PDU_DEF(VPF) must be 0) set SMS_DEF(VP) "" # debug_var SMS_MSG_VP_VALUE(2) # debug_out "1 SMS_MSG_VP_VALUE [array names SMS_MSG_VP_VALUE]" # # Character map found at: # http://www.dreamfabric.com/sms/default_alphabet.html # Many thanks to the dream team: # Joakim Eriksson, Niclas Finne, Lars Olsson, # Lars Petterson, Karl-Petter kesson, Erik Klintskog # # list 0 - standad char mapping from GSM 03.38. to ISO-8859-1 # list 1 - char after escape GSM # list 3 - corr. ISO char # # 0 - means unsupoorted (like greek alphabet, Euro symbol...) # proc pdu2iso { str } { debug_out "CALL: pdu2iso $str" 3 set gsm_default_alphabet [list [list \ 64 163 36 165 232 233 250 236 242 199 10 216 248 13 197 229 \ 0 95 0 0 0 0 0 0 0 0 0 0 198 230 223 202 \ 32 33 34 35 0 37 38 39 40 41 42 43 44 45 46 47 \ 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 \ 161 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 \ 80 81 82 83 84 85 86 87 88 89 90 196 214 209 220 167 \ 191 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 \ 112 113 114 115 116 117 118 119 120 121 122 228 246 241 252 224]\ [list 10 20 40 41 47 60 61 62 64 101]\ [list 12 94 123 125 92 91 126 93 124 0]\ ] set notsup " " set unknow "?" set cmap [lindex $gsm_default_alphabet 0] set escp [lindex $gsm_default_alphabet 1] set esci [lindex $gsm_default_alphabet 2] set rval "" set blist {} set sl [string length $str] for {set i 0} {$i < $sl} {incr i} { scan [string index $str $i] "%c" b lappend blist $b } set lc -1 set cnt 0 set stl [llength $blist] while {$cnt < $stl} { set inp [lindex $blist $cnt] ; ### nth character set map [lindex $cmap $inp] ; ### mapped value if {$map eq {}} {set map -1} # puts "inp=$inp" switch -- $map { -1 { ; ### unknown chacter (not found in cmap) - should never appear!!! puts "\007" ; ### HELP! append rval $unknow debug_out "rval=$rval" 1 exit 0 } 0 { ; ### unsupported character append rval $notsup } 13 { ; ### CR/LF problem...do nothin under Unix } 27 { ; ### escaped chacter set inp [lindex $str [incr cnt]] ; ### fetch next char set escidx [lsearch $escp $inp] ; ### is it a valid escape char? if {$escidx == -1} { append rval [format "%c" 27] } else { append rval [lindex $esci $escidx] } } default { ; ### the result directly append rval [format "%c" $map] } } set lc $map incr cnt } debug_out "RETURN: pdu2iso $rval" 3 return $rval } proc set_pdu_flags { val } { global PDU_TYPE PDU_DEF debug_out "CALL: set_pdu_flags $val" 3 if {$val == -1} { ##### SUBMIT mode - MS -> SMSC # Bit 7 - Reply Path -> 0 set PDU_TYPE(RP) $PDU_DEF(RP) # Bit 6 - User Data Header Indicator -> 0 set PDU_TYPE(UDHI) $PDU_DEF(UDHI) # Bit 5 - Status Report Request -> 0 set PDU_TYPE(SRR) $PDU_DEF(SRR) # Bit 4+3 - Valid Period Flag -> see get_vp_value set PDU_TYPE(VPF) $PDU_DEF(VPF) # Bit 2 - Reject Duplicate -> 0 set PDU_TYPE(RD) $PDU_DEF(RD) # Bit 1+0 - Message Type Indicator - must be "01" set PDU_TYPE(MTI) $PDU_DEF(MTI) set val [expr ($PDU_TYPE(RP) <<7) | \ ($PDU_TYPE(UDHI)<<6) | \ ($PDU_TYPE(SRR) <<5) | \ ($PDU_TYPE(VPF) <<3) | \ ($PDU_TYPE(RD) <<2) | \ $PDU_TYPE(MTI)] # disp_sms_flags # puts "set_pdu_flag -> $val" } else { ##### DELIVER mode SMSC -> MS # Bit 7 - Reply Path set PDU_TYPE(RP) [expr ($val & 128) >> 7] # Bit 6 - User Data Header Indicator set PDU_TYPE(UDHI) [expr ($val & 64) >> 6] # Bit 5 - Statue Report Inidicator set PDU_TYPE(SRI) [expr ($val & 32) >> 5] # Bit 4+3 - VPF - should only be of interest at SUBMIT set PDU_TYPE(VPF) [expr ($val & 24) >> 3] # Bit 2 - More Message to Send set PDU_TYPE(MMS) [expr ($val & 4) >> 2] # Bit 1+0 - Message Type Indicator set PDU_TYPE(MTI) [expr $val & 3] } set rval [format "%02x" $val] debug_out "RETURN: set_pdu_flags $rval" 3 return $rval } proc readc { len } { global global_msg debug_out "CALL: readc $len" 8 set rval [string range $global_msg 0 [expr $len-1]] set global_msg [string range $global_msg $len end] debug_out "RETURN: readc '$rval'" 3 return $rval } ############################################ # # ...the strange pdu stufffffffffffffffffff # ############################################ proc swap_bytes { num } { debug_out "CALL: swap_bytes $num" 3 set rval "" set len [string length $num] for {set i 0} {$i<$len} {incr i 2} { append rval "[string index $num [expr $i+1]][string index $num $i]" } debug_out "RETURN: swap_bytes $rval" 3 return $rval } proc get_vp_value { pdu vpf } { global SMS_MSG_VP_VALUE SMS_MSG_VALID debug_out "CALL: get_vp_value $pdu $vpf" 3 set SMS_MSG_VALID(NONE) 0 set SMS_MSG_VALID(RESERVED) 1 set SMS_MSG_VALID(RELATIVE) 2 set SMS_MSG_VALID(ABSOLUTE) 3 set SMS_MSG_VP_VALUE($SMS_MSG_VALID(NONE)) [get_text "none" siemplug] set SMS_MSG_VP_VALUE($SMS_MSG_VALID(RESERVED)) "* Error *" set SMS_MSG_VP_VALUE($SMS_MSG_VALID(RELATIVE)) \ [list [get_text "%d minutes" siemplug]\ [get_text "%d hours" siemplug]\ [get_text "%d days" siemplug]\ [get_text "%d weeks" siemplug]] set vp "" set fmt_str $SMS_MSG_VP_VALUE($vpf) # debug_out "$SMS_MSG_VALID(RELATIVE) == $vpf => [string_equal $SMS_MSG_VALID(RELATIVE) $vpf]" if [string_equal $vpf $SMS_MSG_VALID(NONE)] { set vp $fmt_str } elseif [string_equal $vpf $SMS_MSG_VALID(RESERVED)] { set vp $fmt_str } elseif [string_equal $vpf $SMS_MSG_VALID(RELATIVE)] { scan $pdu "%x" val if {$val <= 143} { set vp [format [lindex $fmt_str 0] [expr ($val+1)*5]] } elseif { $val <= 167} { set vp [format [lindex $fmt_str 1] [expr 12+($val-143)/2]] } elseif { $val <= 196} { set vp [format [lindex $fmt_str 2] [expr ($val-166)]] } else { set vp [format [lindex $fmt_str 3] [expr ($val-192)]] } } elseif [string_equal $vpf $SMS_MSG_VALID(ABSOLUTE)] { set vp [format $fmt_str [pdu2time $pdu]] } else { set vp [get_text "* internal error *" siemplug] } debug_out "RETURN: get_vp_value $vp" 3 return $vp } proc read_vp_value { vpf } { debug_out "CALL: read_vp_value" 3 switch $vpf { 0 { ### NO SMS_FLAG(VP) preset set vp "" } 1 { ### reserved - unused - should we call "error"? set vp "" } 2 { ### "relative" period (integer) set vp [readc 2] } 3 { ### "absolute" period (timestamp) set vp [readc 14] } } debug_out "RETURN: read_vp_value $vp" 3 return $vp } proc read_pdu_flags { pdu } { global SMS_FLAG PDU_TYPE global_msg debug_out "CALL: read_pdu_flags" 3 if [info exists PDU_TYPE] {unset PDU_TYPE} if [info exists SMS_FLAG] {unset SMS_FLAG} set global_msg $pdu # Service Center Adress set SMS_FLAG(SCA) [read_pdu_phone 1] # Protocol Data Unit set SMS_FLAG(PDU) [readc 2] scan $SMS_FLAG(PDU) "%x" dec set_pdu_flags $dec # disp_sms_flags # puts "PDU_TYPE(MTI)=$PDU_TYPE(MTI)" switch $PDU_TYPE(MTI) { 0 { ### SMS-DELIVER ### Message Reference ### We do NOT GET this value but we ### MUST GENERATE it (e.g. 00) in DELIVER mode # ??? set SMS_FLAG(MR) [readc 2] ### Originator Address set SMS_FLAG(OA) [read_pdu_phone 0] ### Protocol IDentifier set SMS_FLAG(PID) [readc 2] ### Data Coding Scheme set SMS_FLAG(DCS) [readc 2] ### SMS Center Time Stamp set SMS_FLAG(SCTS) [readc 14] # puts "DEBUG: $SMS_FLAG(OA) $SMS_FLAG(PID) $SMS_FLAG(DCS) $SMS_FLAG(SCTS)" } 1 { ### SMS-SUBMIT ### Message Reference ### We do NOT GET this value but we ### MUST GENERATE it (e.g. 00) in DELIVER mode set SMS_FLAG(MR) [readc 2] ### Destination Address set SMS_FLAG(DA) [read_pdu_phone 0] ### Protocol IDentifier set SMS_FLAG(PID) [readc 2] ### Data Coding Scheme set SMS_FLAG(DCS) [readc 2] ### Validy Period - returned as explaining string it the moment set SMS_FLAG(VP) [read_vp_value $PDU_TYPE(VPF)] # puts "DEBUG: Gltigkeitsdauer: $ValidPeriod" } 2 { ### SMS-COMMAND - reserved warning "Message type SMS-COMMAND not supportet!" return -1 } default { warning "Invalid PDU_TYPE flag MTI: $PDU_TYPE(MTI)!" return -1 } } # User Data Length set SMS_FLAG(UDL) [readc 2] scan $SMS_FLAG(UDL) "%x" len debug_out "RETURN: read_pdu_flags $len" 3 return $len } proc pdu2phone { pdu } { debug_out "RETURN: pdu2phone $pdu" 3 set toa [string range $pdu 0 1] set num [swap_bytes [string range $pdu 2 end]] set lch [expr [string length $num]-1] set lc [string toupper [string index $num $lch]] if {$lc eq "F"} { set num [string range $num 0 [expr $lch-1]] } if {$toa == 91} { set num "+$num" } debug_out "RETURN: pdu2phone $num" 3 return $num } proc read_pdu_phone { octets } { debug_out "CALL: read_pdu_phone $octets" 3 set hex [readc 2] scan $hex "%x" len # if len is number of octets (SCA only)!!! if ($octets) { set len [expr ($len-1)*2] } else { if [expr $len%2] { incr len } } # we read 1 byte TOA and the hex digits set pdu [readc [expr $len+2]] debug_out "RETURN: read_pdu_phone $pdu" 3 return $pdu } proc pdu2time { timestamp } { debug_out "CALL: pdu2time $timestamp" 3 set dtz [swap_bytes $timestamp] set date "20[string range $dtz 0 1]" append date ".[string range $dtz 2 3].[string range $dtz 4 5]" set time "[string range $dtz 6 7]" append time ":[string range $dtz 8 9]:[string range $dtz 10 11]" # Let's remove leading zeroes to avoid "Invalid octal number 08"... set zdata [string range $dtz 12 end] regsub ^0+(.+) $zdata \\1 znum set zone [expr $znum/4] if {$zone > 12} { set res [list $date $time "-[expr 24-$zone]h" ] } else { set res [list $date $time [format "+%dh" $zone]] } debug_out "RETURN: pdu2time $res" 3 return $res } proc phone2pdu { num } { debug_out "CALL: phone2pdu $num" 3 # bit length byte # 7 - always 1 # 6-4 - type of number: 001 (international) or 000 (unknown) # 3-0 - NPI: 0000 # -> 0x91 for international # 0x81 for unknown (national) numbers # bugs : no valid digit checking is done (apeces, chars...) # if {"+" eq [string index $num 0]} { set toa "91" set num [string range $num 1 end] } else { set toa "81" } set lnu [string length $num] # if length is odd, then we append a "F" if [expr $lnu%2] { append num "F" } set res "" set len [string length $num] for {set i 1} {$i < $len} {set i [expr $i+2]} { append res [string index $num $i ] append res [string index $num [expr $i-1]] } set rval [format "%02X%s%s" $lnu $toa $res] debug_out "RETURN: phone2pdu $rval" 3 return $rval } proc debug_bin { n b1 b2 } { # debug_out "debug_bin $n $b1 $b2" 6 if {$b1<=255} { binary scan [format %c $b1] B* bits1 set hex1 [format %02x $b1] } else { binary scan [format %c [expr $b1 & 255 ]] B* r1 binary scan [format %c [expr ($b1 & 65280)>>8]] B* r2 set bits1 "$r2 $r1" set hex1 [format %04x $b1] } if {$b2<=255} { binary scan [format %c $b2] B* bits2 set hex2 [format %02x $b2] } else { binary scan [format %c [expr $b2 & 255 ]] B* r1 binary scan [format %c [expr ($b2 & 65280)>>8]] B* r2 set bits2 "$r2 $r1" set hex2 [format %04x $b2] } # puts "$n '$bits1' '$bits2' $hex1 $hex2 $b1 $b2" } ### Convert packed 7-bit data to a list of single bytes (in decimal) proc unpack_pdu { msg udl } { debug_out "CALL: unpack_pdu $msg $udl" 5 set outstr "" set revbyte {} # bit masks 0 1 2 3 4 5 6 set nmask [list 127 63 31 15 7 3 1] set omask [list 128 192 224 240 248 252 254] ### Let's convert the hex codes into a list of bytes set lmsg [string length $msg] for {set i 0} {$i < $lmsg} {incr i 2} { set buffi [string range $msg $i [expr $i+1]] scan $buffi "%x" dec lappend revbyte $dec } set i 0 set buffo [lindex $revbyte $i] set out [expr $buffo & [lindex $nmask $i]] incr i while {[llength $out]<$udl} { set lsh [expr $i%7] set rsh [expr 8-$lsh] set buffn [lindex $revbyte $i] set byteo [expr $buffo & [lindex $omask $lsh]] set byten [expr $buffn & [lindex $nmask $lsh]] set bitso [expr $byteo>>$rsh] set bitsn [expr $byten<<$lsh] set outch [expr $bitso|$bitsn] lappend out $outch if [expr {$lsh == 6} && {[llength $out]<$udl}] { lappend out [expr ($buffn & [lindex $omask $lsh]) >> 1] } set buffo $buffn incr i } debug_out "RETURN: unpack_pdu $out" 5 return $out } proc pdu2txt { msg udl } { ### now we convert the integer list to pdu chars... debug_out "CALL: pdu2txt $msg $udl" 5 set out [unpack_pdu $msg $udl] set str "" foreach b $out { append str [format "%c" $b] } set outstr [pdu2iso $str] debug_out "RETURN: pdu2txt $outstr" 5 return $outstr } proc sms_message2txt { pdu } { global SMS_FLAG PDU_TYPE debug_out "CALL: sms_message2txt $pdu" 3 set msglen [read_pdu_flags $pdu] ; ### sets also $global_msg set txt [pdu2txt $global_msg $msglen] debug_out "RETURN: sms_message2txt $txt" 3 return $txt } ################################################################## # # Here go the common ObexTool functions ... the following code # is NOT part of out GSM-library # ################################################################## ################################################################## # # BEGIN - Namespace variable declarations # variable version 0.3 variable dlg_title \ "ObexTool SMS-Plugin $version - (c) Gerhard Reithofer 2003-05" variable pathname "" variable top_level .sms variable label_width 24 variable header_data "" variable dialog_font {Helvetica 10} variable label_font {Helvetica 10 bold} variable window_font {fixed 12} variable window_width 60 variable window_height 20 variable magic_siemens "0b0b" variable sms_hex_len 350 variable main_frame # # END - Namespace variable declarations # ################################################################## proc label_entry { name elabel dval } { variable label_font variable dialog_font variable label_width debug_out "label_entry $name $elabel $dval" 5 LabelEntry $name -label $elabel -labelwidth $label_width \ -labelfont $label_font -justify left \ -text $dval -entrybg white -font $dialog_font pack $name -expand 1 -fill x } proc save_message { } { variable pathname variable top_level variable main_frame debug_out "save_message" 5 set name [file tail [file rootname $pathname]] set sl [string length $name] set nname "" for {set i 0} {$i<$sl} {incr i} { set c [string index $name $i] if {[string is wordchar $c]||$c eq "."||$c eq "-"} { append nname $c } else { append nname _ } } set oname [save_filename $nname.txt txt] if [string_empty $oname] return set header {} set smstxt {} set smslbl "" set wlist [winfo children $main_frame] foreach win $wlist { set class [winfo class $win] debug_out "$class: $win" 6 switch $class { LabelEntry { set title [$win cget -label] set value [$win cget -text] lappend header "$title $value" } LabelFrame { set smslbl [$win cget -text] } Text { set smstxt [$win get 0.0 end] } default { set msg [get_text "Unexpected window class '%s'!" siemplug] internal_error [format $msg $class] } } } lappend header "$smslbl\n$smstxt" set fd [open $oname "w"] foreach line $header { puts $fd $line } close $fd destroy $top_level status_msg [format [get_text "SMS message saved as '%s'!" siemplug] $oname] } proc sms_dialog { title sms_text } { variable top_level variable label_font variable label_width variable window_width variable window_height variable window_font variable main_frame variable dlg_title set buttons [list [get_text "&Save" siemplug] \ [get_text "Write SMS text into file"] \ "[namespace current]::save_message"\ [get_text "&Close" siemplug] \ [get_text "Close SMS window"] \ "after idle {destroy $top_level}"] set main_frame [new_window $top_level $dlg_title $title $buttons 1 .] ### Add incoming/outgoing specific flag data (see sm?_* plugin files) add_flag_data $main_frame ### Add SMS text window frame set lf [LabelFrame $main_frame.lbl -font $label_font\ -justify left -text [get_text "SMS text:"]] pack $lf -expand 1 -fill x set tw [text $main_frame.txt -font $window_font -wrap word\ -width $window_width -height $window_height] pack $tw -expand 1 -fill x debug_var tw 7 $tw insert end $sms_text BWidget::place $top_level 0 0 center . wm deiconify $top_level } proc read_file { path binary } { debug_out "read_file $path" 5 set local [ObexFile::read_file_tmp $path] if [string_empty $local] { return {} } set fd [open $local "r"] if $binary {fconfigure $fd -translation binary} set res [read $fd] close $fd file delete $local return $res } proc init_plugin { smsfile } { debug_out "init_plugin $smsfile" 5 global PDU_TYPE SMS_FLAG global_msg variable top_level variable header_data variable model_params variable pathname $smsfile variable magic_siemens variable sms_hex_len ### ### Is a SMS window already open? ### if [winfo exists $top_level] { set msg [get_text "SMS data window already open!" siemplug] append msg \ [get_text "\nPlease close it before opening a new one." siemplug] warning $msg return -1 } ### ### Read SMS file ### set bin [read_file $smsfile 1] if [string_empty $bin] { set msg [get_text "Unable to download file '%s' or file is empty!" siemplug] warning [format $smsfile $smsfile] return -1" } set res [binary scan $bin H* sms] debug_out "sms_slen=[string length $sms] -> [string range $sms 0 3]" if ![string_equal [string range $sms 0 3] $magic_siemens] { set msg [get_text "No Siemens SMS file signature found!" siemplug] append msg [get_text "\nUnable to display SMS text." siemplug] warning $msg return -1 } ### The 1st $header_max bytes are (currently unused) header data!?!?!? ### The sms message part is always 175 bytes, whereas the data beyond ### the used data may be filled with 0xff. ### Many thanks to Hendrik Sattler , the creator ### of SCMxx (http://www.hendrik-sattler.de/scmxx/) for his help and hints. set header_len [expr [string length $sms] - $sms_hex_len] set pdu_data [string range $sms $header_len end] set header_data [string range $sms 0 [incr header_len -1]] ### ### Interprete the pdu header - this sets also $global_msg ### set msglen [read_pdu_flags $pdu_data] return $msglen } obextool-0.35/plugins/adr_plugin.tcl0000644000076400007640000005174111127517242020005 0ustar gerhardrgerhardr### ### Siemens address book reader 0.1 ### A plugin for the ObexTool ### (c) Gerhard Reithofer, Techn. EDV Reithofer, 2003-2004 ### ### mailto:gerhard.reithofer@tech-edv.co.at ### http://www.tech-edv.co.at/programmierung/en/gplsw.html ### ### Information mostly "stolen" from ### the source code of the Flexmem Tool by Hendrik Sattler, ### the programmer of the great command line tool: scmxx ### http://www.hendrik-sattler.de/scmxx/ ### http://freshmeat.net/projects/scmxx/ ### http://sourceforge.net/projects/scmxx/ ### and from the TOT-Consult homepage ### http://www.tot-consult.com/siemens/ ### ### Remarks: ### I had only 1 small file for my tests, so don't expect that it ### works really good. My handy (Siemens M50) does NOT support ### Siemens addressbook files. ### It seems that there ar 3 file formats currently available, ### which may be distinguished by the file name: ### [579]f0${version}.adr ### where version is 2, 7 or 8, but I'm not sure, so the user has ### to select the correct file from the directory. The version ### is only handled by this book only by the number of records in ### an address book entry. ### namespace eval ::ADR { variable version 0.2 variable top_list .alist variable top_level .adrdat variable label_font {Helvetica 12} variable dialog_font {Helvetica 12} variable listbox_font {Helvetica 12} variable lb_widget variable dataframe variable field_cnt variable label_width 15 variable entry_width 50 variable idxprefix "7F" variable export_header_line 1 variable exportfile "obextadr.txt" variable dlg_title \ "ObexTool ADR-Plugin $version - (c) Gerhard Reithofer 2003-2004" variable ADR_FORMAT variable DATA_ARR variable DATA_REC set ADR_FORMAT(19) [list \ "Firstname" 0 "Lastname" 1 "Company" 2 \ "Street" 3 "City" 4 "Country" 5 "ZIP" 9 \ "Email" 7 "URL" 8 \ "Tel. Home" 10 "Tel. Work" 11 "Tel. Mobile" 12 "Fax Nr.1" 13 \ "NTyp Home" 14 "NTyp Work" 15 "NTyp Mobile" 16 "NTyp Fax1" 17 \ "Revision" 18] set ADR_FORMAT(28) [list \ "Firstname" 0 "Lastname" 1 "Company" 2 \ "Street" 3 "City" 4 "Country" 5 "ZIP" 11 \ "Email 1" 8 "Email 2" 9 "URL" 10 \ "Tel. Home" 12 "Tel. Work" 13 "Tel. Mobile" 14 "Fax Nr.1" 15 "Fax Nr.2" 16 \ "NTyp Home" 17 "NTyp Work" 18 "NTyp Mobile" 19 "NTyp Fax1" 20 "NTyp Fax2" 21 \ "Birthday" 25 "Revision" 22] set ADR_FORMAT(29) [list \ "Firstname" 0 "Lastname" 1 "Company" 2 \ "Street" 3 "City" 4 "Country" 5 "ZIP" 11 \ "Email" 8 "URL" 9 \ "Tel. Home" 12 "Tel. Work" 13 "Tel. Mobile" 14 "Fax Nr.1" 15 "Fax Nr.2" 16 \ "NTyp Home" 17 "NTyp Work" 18 "NTyp Mobile" 19 "NTyp Fax1" 20 "NTyp Fax2" 21 \ "Birthday" 25 "Revision" 22] load_Messages adr_plug [getObexCfg config language] $version ### ### check if tolevel $which already exists ### proc win_check { which name args } { debug_out "win_check $which $name" 4 if [winfo exists $which] { set msg [get_text "%s window already open!\n" adr_plug] if [llength $args] { append msg [lindex $args 0] } else { append msg [get_text "Please close it before opening a new one." adr_plug] } warning [format $msg $name] return 1 } return 0 } proc mem_map { path } { debug_out "mem_map $path" 4 set local [ObexFile::read_file_tmp $path] if [string_empty $local] { warning [format [get_text "Unable to download file '%s'!" adr_plug] $path] return {} } set fd [open $local r] fconfigure $fd -translation binary set fc [read $fd] close $fd file delete $local return $fc } proc read_binary { bin idx which } { # debug_out "read_binary \$bin, $idx, $which" # disp_ascii $bin switch -glob $which { b* { set size 1 } s* { set size 2 } l* { set size 4 } default { if [string is integer $which] { set size $which } else { internal_error "Invalid parameter which '%which' in read_binary" } } } set offs1 [expr $idx*$size] set offs2 [expr $offs1+$size-1] set strl [string range $bin $offs1 $offs2] return $strl } proc letohs { str2 } { # debug_out "letohs $str2" set res [scan $str2 "%c%c" b0 b1] # debug_out "letohs [format %02x $b1] [format %02x $b0]" if {$res < 2} { puts stderr "ERROR: letohs str2"; return 0 } return [expr ($b1<<8)+$b0] } proc letohl { str4 } { set res [scan $str4 "%c%c%c%c" b0 b1 b2 b3] if {$res < 4} { puts stderr "ERROR: letohl str4"; return 0 } if {$b3 >= 128} { # debug_out "[format %02x $b3][format %02x $b2]\ #[format %02x $b1][format %02x $b0]" if {$b3==255&&$b3==255&&$b3==255&&$b3==255} {return -1} return [expr (($b3& 127)<<24)+($b2<<16)+($b1<<8)+$b0] } return 0 } proc encode_chars { str16 } { # debug_out "encode_chars !$str16!" # debug_out "len str16=[string length $str16]" set hex00 [format "%c%c" 0 0] if {$str16 eq $hex00} {return ""} # disp_ascii $str16 set str "" set slen [expr [string length $str16]/2] for {set i 0} {$i < $slen} {incr i} { set uc [read_binary $str16 $i 2] if {$uc eq $hex00} break set res [scan $uc "%c%c" b1 b0] append str [format %c [expr ($b0<<8)+$b1]] } return $str } proc get_verify_offsets { filename } { debug_out "get_verify_offsets $filename" 2 set fcontents [mem_map $filename] set flen [expr [string length $fcontents]/4] debug_out "flen=$flen" for {set i 0} {$i < $flen} {incr i} { set str4 [read_binary $fcontents $i long] set int32 [letohl $str4] # debug_out "int32=0x[format %x $int32]=$int32" 4 if $int32 { lappend ptrlist $int32 } } return $ptrlist } proc get_offsets { fields entrycount adrfile } { set flen [string length $adrfile] set counter 0 set ptrlist {} set fill [format "%c" 0xdd] set skip [format "%c" 0xee] set i [expr ($fields+5)*2] while {$counter < $entrycount && $i < $flen} { while {[read_binary $adrfile $i byte] eq $fill} {incr i} if {[read_binary $adrfile $i byte] eq $skip} { incr i } else { lappend ptrlist $i set entrysize 0 set adroffs [string range $adrfile $i end] for {set k 0} {$k < $fields} {incr k} { set str2 [read_binary $adroffs $k short] # debug_out "i=$i, len str2=[string length $str2]" set entrysize [expr $entrysize + [letohs $str2]] } set i [expr $i + (2*$fields) + $entrysize] } } return $ptrlist } proc process_all_data { fields adrfile adr_list } { variable field_cnt $fields variable ADR_FORMAT variable DATA_ARR set cnt 0 set rval {} set field_names {} if ![info exists ADR_FORMAT($fields)] { internal_error \ "Unexpected file format error:\nNo ADR_FORMAT($fields) found!" } foreach [list idx val] $ADR_FORMAT($fields) { if ![regexp "^NTyp" $idx] { lappend field_names $idx } } set numrecs [llength $adr_list] set adrlist [concat $adr_list [string length $adrfile]] for {set i 0} {$i < $numrecs} {incr i} { set offs1 [lindex $adrlist $i] set offs2 [lindex $adrlist [expr $i+1]] #### debug_out "record $i: [format %x $offs1] .. [format %x $offs2]" 5 set adr [string range $adrfile $offs1 $offs2] process_data $adr $fields set row {} foreach field $field_names { if [info exists DATA_ARR($field)] { lappend row $DATA_ARR($field) } else { lappend row "" } } lappend rval [concat [incr cnt] $row] } return $rval } proc read_date_rec { num } { variable DATA_REC # debug_out "print_rec $pref $args" set val [lindex $DATA_REC $num] set rec [ObexFile::format_date $val] return $rec } proc read_data_rec { idx } { variable DATA_REC set val [lindex $DATA_REC $idx] set rec [encode_chars $val] ## debug_out "read_data_rec $idx => $rec" 5 return $rec } proc read_teln_rec { type field } { variable DATA_REC set bnum [lindex $DATA_REC $field] set ttyp [lindex $DATA_REC $type] set hexff [format "%c" 0xff] if {$field eq $hexff||$ttyp eq $hexff} { return {} } scan $ttyp %c ntyp # debug_out "ntyp=$ntyp" 4 if {$ntyp == 145} { set num "+" } else { set num "" } set i -1 append bnum $hexff while {$hexff != [set byte [read_binary $bnum [incr i] byte]]} { scan $byte %c tnum set inum [format %d [expr $tnum&0xf]] append num $inum if {$tnum<=0xf0} { set inum [format %d [expr ($tnum>>4)&0xf]] append num $inum } } ## debug_out "read_teln_rec $type $field => $num" 4 return $num } proc process_data { adr1 fields } { variable ADR_FORMAT variable DATA_ARR variable DATA_REC # debug_out "process_data \$adr1 $fields" 4 if ![info exists ADR_FORMAT($fields)] { internal_error \ "Unexpected file format error:\nNo ADR_FORMAT($fields) found!" } ### array set addrarr $ADR_FORMAT($fields) set plen 0 set DATA_REC {} set addr {} set sizes {} for {set i 0} {$i < $fields} {incr i} { set str2 [read_binary $adr1 $i short] set rlen [letohs $str2] lappend sizes $rlen incr plen $rlen } set adrdata [string range $adr1 [expr $fields*2] end] # debug_out "sizeof adrdata: [string length $adrdata], datalen: $plen" 5 set addr 0 for {set i 0} {$i < $fields} {incr i} { set size [lindex $sizes $i] set offs [expr $addr+$size-1] set rec [string range $adrdata $addr $offs] lappend DATA_REC $rec incr addr $size } array set addr_arr $ADR_FORMAT($fields) foreach idx [array names addr_arr] { # debug_out "idx=$idx" 5 switch -glob $idx { "Birthday" - "Revision" { set DATA_ARR($idx) [read_date_rec $addr_arr($idx)] } "Tel.*" - "Fax*" { if {$fields == 19} { set typoffs 4 } else { set typoffs 5 } set typidx $addr_arr($idx) set numidx [expr $typidx + $typoffs] set DATA_ARR($idx) [read_teln_rec $numidx $typidx] } default { set DATA_ARR($idx) [read_data_rec $addr_arr($idx)] } } } } proc label_entry { w name dname dval args } { variable label_font variable dialog_font variable label_width variable entry_width debug_out "label_entry $w $dname $dval" 5 set name $w.$name set entr [LabelEntry $name -label $dname -justify left\ -labelwidth $label_width -labelfont $label_font\ -text $dval -entrybg white -width $entry_width\ -font $dialog_font] pack $entr if [llength $args] { $entr configure -state [lindex $args 0] } return $entr } proc select_row { args } { variable top_list variable lb_widget variable field_cnt variable dataframe debug_out "select_row $args" 4 set selidx [$lb_widget curselection] if [string_empty $selidx] return $lb_widget selection clear $selidx if ![llength $args] return set inc [lindex $args 0] set newidx [ expr $selidx + $inc] set max [expr [$lb_widget size]-1] if {$newidx > $max||$newidx < 0} { set newidx $selidx } $lb_widget selection set $newidx $lb_widget see $newidx set selected [$lb_widget get $newidx] set flen [$lb_widget columncount] for {set i 0} {$i<$flen} {incr i} { set field [$lb_widget columncget $i -title] $dataframe.entr$i configure -text [lindex $selected $i] } } proc show_single { } { variable top_list variable top_level variable field_cnt variable lb_widget variable dlg_title variable dataframe variable label_font variable dialog_font variable label_width variable entry_width debug_out "show_single" 4 if [win_check $top_level [get_text "Address detail view" adr_plug]] return set selidx [$lb_widget curselection] if [string_empty $selidx] { warning [get_text "No record selected for displaying!" adr_plug] return } set selected [$lb_widget get $selidx] set buttons [list [get_text "&Backward" adr_plug] \ [get_text "Go to previous address record" adr_plug]\ "[namespace current]::select_row -1"\ [get_text "&Close" adr_plug]\ [get_text "Close detail view" adr_plug]\ "after idle {destroy $top_level}"\ [get_text "&Forward" adr_plug]\ [get_text "Go to next address record" adr_plug]\ "[namespace current]::select_row 1"] set title [get_text "Address book entry" adr_plug] set dataframe [new_window $top_level $dlg_title $title $buttons 1 $top_list] debug_out "selected=$selected" 4 set flen [$lb_widget columncount] for {set i 0} {$i<$flen} {incr i} { set field [$lb_widget columncget $i -title] set value [lindex $selected $i] pack [LabelEntry $dataframe.entr$i -label "$field:"\ -labelwidth $label_width -labelfont $label_font\ -text $value -entrybg white -justify left\ -width $entry_width -font $dialog_font] } BWidget::place $top_level 0 0 center $top_list wm deiconify $top_level } proc create_listbox { fields adrfile adr_list adr_path } { variable ADR_FORMAT variable top_list variable dlg_title variable lb_widget variable label_font variable listbox_font if ![info exists ADR_FORMAT($fields)] { format_warning return } set field_names [list 0 [get_text "Nr." adr_plug] right] foreach [list idx val] $ADR_FORMAT($fields) { if ![regexp "^NTyp" $idx] { lappend field_names 0 [get_text $idx adr_plug] } } debug_out "field_names=$field_names" 3 set title [format [get_text "Address list: %s" adr_plug] $adr_path] set buttons [list [get_text "&Show" adr_plug]\ [get_text "Show address detail view" adr_plug]\ "[namespace current]::show_single"\ [get_text "E&xport..." adr_plug]\ [get_text "Export data to text file" adr_plug]\ "[namespace current]::export_data"\ [get_text "&Close" adr_plug]\ [get_text "Close address list" adr_plug]\ "after idle [namespace current]::close_listbox"] set sw [new_swindow $top_list $dlg_title $title $buttons 0] set lb_widget [tablelist::tablelist $sw.lbx \ -background white\ -font $listbox_font\ -labelrelief flat \ -showseparators 1 \ -columns $field_names \ -labelcommand tablelist::sortByColumn \ -height 15 -width 100 -stretch all] $lb_widget columnconfigure 0 -sortmode integer pack $lb_widget -expand yes -fill both $sw setwidget $lb_widget bind [$lb_widget bodypath] \ "[namespace current]::show_single" BWidget::place $top_list 0 0 center . wm deiconify $top_list debug_out "fields=$fields ADR_FORMAT($fields)=$ADR_FORMAT($fields)" 5 set AddrList [process_all_data $fields $adrfile $adr_list] debug_out "LLength AddrList=[llength $AddrList]" 5 foreach entr $AddrList { $lb_widget insert end $entr } } proc close_listbox {} { variable top_list variable top_level set win [get_text "Address detail view" adr_plug] set msg [get_text "Close detail window before closing list" adr_plug] if [win_check $top_level $win $msg] return destroy $top_list } proc read_adr_data { filename idx_file } { variable ADR_FORMAT debug_out "adr_listbox $filename $idx_file" 5 set indexcount 0 set ptr_list {} ## read offset list of valid entries if [ObexFile::path_exists file $idx_file] { ## ptr_list = ptrlist (adr2csv H.S.) set ptr_list [get_verify_offsets $idx_file] # foreach ptr $ptr_list {puts "Offs: [format %08x $ptr]"} set indexcount [llength $ptr_list] debug_out "indexcount=$indexcount" 4 } if $indexcount { set msg [format [get_text "%d index entries found," adr_plug] $indexcount] } else { set msg [get_text "No valid pointer file," adr_plug] } append msg [get_text " analyzing address book structure..." adr_plug] status_msg $msg set adrfile [mem_map $filename] debug_out "Size of adrfile: [string length $adrfile]" 2 ## extract the number of fields set fields [letohs [read_binary $adrfile 0 short]] set entrycount [letohs [read_binary $adrfile 1 short]] debug_out "fields=$fields, entrycount=$entrycount" 6 ## compare the number of entries of both files if {$indexcount && $indexcount != $entrycount} { set afil [file tail $filename] set ifil [file tail $idx_file] set msg \ [get_text "Number of entries from both files do not match!" adr_plug] append msg \ [get_text "\n%d entries found in '%s' and %d entries in '%s'" adr_plug] append msg [get_text "\nDeleted entries may be displayed." adr_plug] warning [format $msg $entrycount $afil $indexcount $ifil] set indexcount 0 set ptr_list {} } ## adr_list = ptrlist5 (adr2csv H.S.) status_msg [get_text "Processing address book contents..." adr_plug] set adr_list [get_offsets $fields $entrycount $adrfile] status_msg [get_text "Processing address book contents...OK." adr_plug] set offsetcount [llength $ptr_list] debug_out "offset values: $offsetcount" 3 ## verify that the offsets are correct if $indexcount { set tmp_list $adr_list set adr_list {} for {set counter 0} {$counter < $offsetcount} {incr counter} { for {set k 0} {$k < $offsetcount} {incr k} { set offset [lindex $tmp_list $k] set index [lindex $ptr_list $k] if {$offset == $index} { set fmt "offset 0x%08x was verified by pointer list." lappend adr_list $offset } else { if $index { set fmt "offset 0x%08x was NOT found in pointer list!" } } status_msg [format $fmt $offset] } } } create_listbox $fields $adrfile $adr_list $filename } ### ### Listbox callback on selection (Edit) of an entry ### proc export_data {} { variable export_header_line variable exportfile variable lb_widget set def_ext [file extension $exportfile] set types [list [list [get_text "ASCII Text Files " adr_plug] \ [list .txt]]\ [list [get_text "ASCII Files " adr_plug] \ [list .dat]]\ [list [get_text "CSV Files " adr_plug]\ [list .csv]]\ [list [get_text "All files" adr_plug] [list "*"]]] set outn [tk_getSaveFile -parent $lb_widget\ -title [get_text "Export file" adr_plug] \ -defaultextension $def_ext\ -filetypes $types\ -initialfile $exportfile] if [string_empty $outn] return debug_var outn set new_ext [file extension $outn] if [string_empty $new_ext] { set outn $outn$def_ext } switch $new_ext { .txt { set separator "\t" } .dat { set separator ";" } .csv { set separator "," } default { set separator "\t" } } set numrecs 0 set fd [open $outn "w"] set imax [$lb_widget columncount] if $export_header_line { set row {} for {set i 0} {$i<$imax} {incr i} { lappend row [$lb_widget columncget $i -title] } set line [join $row $separator] puts $fd $line } foreach row [$lb_widget get 0 end] { set line [join $row $separator] puts $fd $line incr numrecs } close $fd set msg [get_text "%d records written to file '%s'" adr_plug] status_msg [format $msg $numrecs $outn] } proc format_warning {} { set msg \ [get_text "Invalid adress file or unsupported file format." adr_plug] append msg \ [get_text "\nUsually on Siemens phones only the file" adr_plug] append msg \ [get_text " called '5fxx.adr' contains the address book" adr_plug] append msg \ [get_text " data. '7fxx.adr' contains the pointer list" adr_plug] append msg \ [get_text " which mark deleted entities and '9fxx.adr'" adr_plug] append msg \ [get_text " contains sort index entries." adr_plug] append msg \ [get_text "\nTry selecting the file '5fxx.adr' for displaying" adr_plug] append msg \ [get_text " the address book data." adr_plug] warning $msg } ### MAIN entry point ### proc default_handler { args } { variable top_list variable datafile variable idxprefix variable pathname [lindex $args 0] variable datafile [file tail $pathname] variable dir_name [file dirname $pathname] if [win_check $top_list [get_text "Address list" adr_plug] ] return set indexfile "$idxprefix[string range $datafile 2 end]" read_adr_data $pathname "$dir_name/$indexfile" } } obextool-0.35/plugins/smi_siem.tcl0000644000076400007640000000244611127517242017464 0ustar gerhardrgerhardr### ### SMS incoming plugin for ObexTool ### ### (c) Gerhard Reithofer, Techn. EDV Reithofer - 2003-05 ### gerhard.reithofer@tech-edv.co.at http://www.tech-edv.co.at ### ### See COPYING for further details ### namespace eval ::SMI { source $OBEXDIR/plugins/siemplug.tcl load_Messages siemplug [getObexCfg config language] $version proc add_flag_data { tf } { global SMS_FLAG PDU_TYPE variable header_data set sa_data [pdu2phone $SMS_FLAG(SCA)] set ts_data [pdu2time $SMS_FLAG(SCTS)] set se_data [pdu2phone $SMS_FLAG(OA)] set hd_data $header_data set sa_lbl [get_text "Service center address:" siemplug] set ts_lbl [get_text "Time stamp:" siemplug] set se_lbl [get_text "Sender address:" siemplug] set hd_lbl [get_text "Undocumented header:" siemplug] foreach key [list sa ts se hd] { eval "label_entry $tf.$key $${key}_lbl $${key}_data" } } proc default_handler { args } { debug_out "[namespace current]::default_handler $args" 5 global global_msg set path [lindex $args 0] set len [init_plugin $path] if {$len < 0} return set title [get_text "Incoming SMS file: %s" siemplug] set stext [pdu2txt $global_msg $len] sms_dialog [format $title $path] $stext } } return $::SMI::version obextool-0.35/obextool.tk0000755000076400007640000006245111127517242015672 0ustar gerhardrgerhardr#!/bin/sh # The next line is executed by /bin/sh, but not tcl \ exec wish "$0" ${1+"$@"} ### ### ObexTool 0.35 ### (c) Gerhard Reithofer, Techn EDV Reithofer, 2003-2006 ### ObexTool is licensed using the GNU General Public Licence, ### see http://www.gnu.org/copyleft/gpl.html set OBX_Debug 0 ### ### The ObexTool default directory - change if necessary ### set ObexTool_defdir /usr/share/obextool ### ### ObexTool Version (moved here from lib/obextool.ini) ### set OBEXTOOLVERSION 0.35 ### ### Ensure that the warp_lines call in the ### common dialogues (obextool.ini) use the global variable ### $glb_dlg_width - ger ### set glb_dlg_width 60 option add *Dialog.msg.font {Helvetica -12 bold} userDefault option add *Dialog.msg.wrapLength 0 userDefault option add *Dialog.msg.width $glb_dlg_width userDefault package require BWidget package require tablelist ### ### ObexTool header message ### proc obex_header { msg } { global OBEXTOOLVERSION puts "ObexTool $OBEXTOOLVERSION" puts " (c) Gerhard Reithofer, Techn EDV Reithofer, 2003-2008" puts " ObexTool is licensed using the GNU General Public Licence," puts " see http://www.gnu.org/copyleft/gpl.html" puts "$msg" } ### ### Usage message ### proc obex_usage { args } { global argv0 set exit_code 0 set alen [llength $args] if {$alen>1} { puts "Error: [lindex $args 0]" } if {$alen>2} { set exit_code [lindex $args 1] } obex_header "Usage: [file tail $argv0] \[opt arg\]..." puts " --help" puts " --version" puts " --obexcmd obexftp-wrapper-command" puts " --obexdir obextool-main-directory" puts " --obexcfg obextool-config-directory" puts " --setconf key value" puts " --memstat 0|1" puts " --debug level" puts " Use the environment value:" puts " OBEXTOOL to define an ObexTool main default directory (--obexdir)," puts " OBEXCMD to define an obexftp default command string (--obexcmd) and" puts " OBEXTOOL_CFG to define a default config directory (--obexcfg)." exit $exit_code } ### ### Check for $OBEXDIR definition: ### ### The OBEXDIR path is currently determined this way, ordered by priority: ### 1. check if the command line option "--obexdir" is used ### 2. check the environment variable called OBEXTOOL is set ### 3. check the contents of the TCL-variable "ObexTool_defdir" ### 4. check if in the subdirectory "lib" of the directory where ### "obextool.tk" is located, a file exists with the name ### "obextool.ini" - if yes, this is the OBEXTOOL directory ### # existing startup directory has lowest priority - default set OBEXDIR [file normalize [file dirname $argv0]] # $ObexTool_defdir directory overrides startup directory if {[file exists $ObexTool_defdir/lib/obextool.ini]} { set OBEXDIR $ObexTool_defdir } # environment value overrides defaults if {[info exists env(OBEXTOOL)]} { set OBEXDIR $env(OBEXTOOL) } # commad line overrides all - MUST be defined correctly if {$argc} { foreach {opt arg} $argv { switch -- $opt { --help { obex_usage } --version { obex_header "Use --help for detailed information." exit 0 } --obexdir { set OBEXDIR $arg } default { } } } } if {![file exists $OBEXDIR/lib/obextool.ini]} { puts "$msg" puts "ObexTool startup error: unable to find the ObexTool main directory '$dir'!" puts "Ensure to start the main executable directly or set the environment" puts "variable OBEXTOOL the ObexTool main directory, e.g." puts " export OBEXTOOL=/usr/local/obext01a" puts "or use the command line parameter '--obexdir' to define the ObexTool main" puts "directory. If you want to startup the ObexTool from another directory," puts "create a shell program, which points to the full pathname of the" puts "main executable obextool.tk, file links will NOT work. E.g.:" puts " $ObexTool_defdir/obextool.tk" puts "You may also change the default directory variable 'ObexTool_defdir'" puts "in the main executable obextool.tk to fit your suits." exit 1 } ### ### Check for $OBEXCFG definition: ### The OBEXCFG path (this is new) - where to find the configuration files: ### 1. check if the command line option "--obexcfg" is used ### 2. check the subdirectory "etc" of the main directory (OBEXDIR/etc) ### 3. check the environment variable called OBEXTOOL_CFG is set, ### which points to the configuration directory ### set OBEXCFG $OBEXDIR/etc if {[info exists env(OBEXTOOL_CFG)]} { set OBEXCFG $env(OBEXTOOL_CFG) } if {$argc} { foreach {opt arg} $argv { switch -- $opt { --obexcfg { set OBEXCFG $arg } default { } } } } ### ### Basic initialization of ObexTool ### The last and only dedicated source statement ### source $OBEXDIR/lib/obextool.ini ### ### Read the main configuration file first ### read_obextool_config cfg ### ### Environmet $OBEXCMD as config value override and ### --obexcfg default (idea from Hendrik Sattler) ### if [info exists env(OBEXCMD)] { set ObexConfig(obexftp,command) $env(OBEXCMD) } ### ### Command line overrides: ### --help, --version, --obexdir and --obexcfg are redundant, ### as they are managed in an earlier state. ### if $argc { # foreach [list opt arg] $argv for {set i 0} {$i<$argc} {incr i} { set opt [lindex $argv $i] set arg [lindex $argv [incr i]] debug_out "opt=$opt arg=$arg" switch -- $opt { --help { obex_usage } --version { obex_header "Use --help for command line information." ; exit 0 } --obexcmd { set ObexConfig(obexftp,command) $arg } --obexdir { set OBEXDIR $arg } --obexcfg { set OBEXCFG $arg } --memstat { set ObexConfig(config,memstatus) $arg } --setconf { set val [lindex $argv [incr i]] set ObexConfig($arg) $val } --debug { set OBX_Debug $arg } default { obex_usage "Invalid option '$opt'" 1 } } } debug_var OBEXCFG } ### ### Load language dependent messages ### load_Messages obextool [getObexCfg config language] $OBEXTOOLVERSION ### ### Read all other configuration files ### ext-config uses function 'get_text' ### read_obextool_config typ read_obextool_config ext ### ### Now let's load the obextool packages ### lappend auto_path $OBEXDIR/lib package require obexfile package require obexlist package require obextree ##################################################### # # # Begin of ObexTool namespace part # # # ##################################################### namespace eval ObexTool { variable version $::OBEXTOOLVERSION variable mainframe variable mem_used 0 variable dl_last_val 0 variable dl_active_v 0 variable array file_types variable obexftp_version "<=0.10.3" variable mobile_manufact "*unknown*" variable mobile_model "*unknown*" variable status_prefix {Got info} array set file_types [getObexCfg cfg file_types] proc text_view { title txt } { variable version debug_out "text_view $title \$txt" 3 set font [getObexCfg textwin font] set width [getObexCfg textwin width] set height [getObexCfg textwin height] set top .txt_view set blist [list [get_text "&Close"] \ [get_text "Close text window"]\ "after idle {destroy $top}"] set wtitle [format [get_text "ObexTool %s - text viewer"] $version] set sw [new_swindow $top $wtitle $title $blist 0 .] debug_var sw set tw [text $sw.txt -width $width -height $height -font $font \ -wrap none -bg white] pack $tw $sw setwidget $tw $tw insert end $txt BWidget::place $top 0 0 center . wm deiconify $top } ######################################################### # # ObexTool file functions - file interface # ... no error checkin now ... somethin for todo! # ######################################################### proc file_put { args } { variable file_types debug_out "file_put $args" 3 set type "" set name [ObexList::do_select get $ObexList::list_mode] if ![string_empty $name] { set path [lindex $ObexList::lb_entries($name) 0] set type [lindex $ObexList::lb_entries($name) 1] } if [string_empty $type] { set inpn [read_filename $name] } else { set inpn [read_filename $name $type] } if [string_empty $inpn] return set dir [ObexTree::curr_dir] if [string_empty $dir] return set size [file size $inpn] set name [file tail $inpn] set dest [make_path $dir $name] set_cursor on if [ObexFile::path_exists dir $dest] { set msg [get_text "A folder with the name '%s' already exists!"] append msg [get_text "\nCannot upload file."] warning [format $msg $dest] set_cursor return } set overwrite 0 if [ObexFile::path_exists file $dest] { set query [get_text "File '%s' already exists!"] append query [get_text "\nDo you want to overwrite the existing file?"] if ![ask_yes_no [get_text "Name collision"] [format $query $dest]] { status_msg [get_text "File upload cancelled!"] set_cursor return } set overwrite 1 } if $overwrite { ObexFile::obexftp rm $dest } ObexFile::obexftp pf $inpn $dir if [ObexFile::path_exists file $dest] { set msg [get_text "File '%s' uploaded to '%s'"] ObexTree::refresh_list [format $msg $inpn $dest] } else { set msg [get_text "File '%s' could not be uploaded to '%s'!"] no_permission [format $msg $inpn $dest] } set_cursor } proc file_rename { args } { variable old_name if [llength $args] { debug_out "llength \$args=[llength $args]" 5 set name [lindex $args 0] set path [make_path [ObexTree::curr_dir] $name] } else { set name [ObexList::do_select get $ObexList::list_mode] debug_var name 5 if [string_empty $name] { warning [get_text "No file or folder selected to delete!"] return } set path [lindex $ObexList::lb_entries($name) 0] } set old_name $name set new_name [filename_dlg [get_text "New file name:"] $name] if [string_empty $new_name] return debug_var new_name if [string_equal $new_name $old_name] { warning [get_text "New name is identical to old name!"] return } set dir_name [ObexTree::curr_dir] if [string_empty $dir_name] return set_cursor on set opath [make_path $dir_name $old_name] set npath [make_path $dir_name $new_name] debug_out "opath=$opath, npath=$npath" ObexFile::obexftp mv $opath $npath if [ObexFile::path_exists any $npath] { set msg [get_text "File '%s' renamed to '%s'."] ObexTree::refresh_list [format $msg $opath $npath] } else { set msg [get_text "File or folder '%s' could not be renamed!"] no_permission [format $msg $opath] } set_cursor } proc file_delete { args } { debug_out "file_delete $args" 3 if [llength $args] { debug_out "llength \$args=[llength $args]" 5 set name [lindex $args 0] set path [make_path [ObexTree::curr_dir] $name] } else { set name [ObexList::do_select get $ObexList::list_mode] debug_var name 5 if [string_empty $name] { warning [get_text "No file or folder selected to delete!"] return } set path [lindex $ObexList::lb_entries($name) 0] } set type [lindex $ObexList::lb_entries($name) 1] debug_var type 4 if [string_equal $type "folder"] { set query [get_text "Do you really want to delete the folder '%s'?"] } else { set query [get_text "Do you really want to delete the file '%s'?"] } if ![ask_yes_no [get_text "Confirmation"] [format $query $path]] { status_msg [get_text "Delete action cancelled!"] return } debug_var path 3 set_cursor on ObexFile::obexftp rm $path if [ObexFile::path_exists any $path] { set msg [get_text "File or folder '%s' could not be deleted!"] if [string_equal $type "folder"] { append msg [get_text "\nFolders must be empty before deleting."] } no_permission [format $msg $path] } else { if [string_equal $type "folder"] { ObexTree::refresh_list [format [get_text "Folder '%s' deleted."] $path] } else { ObexTree::refresh_list [format [get_text "File '%s' deleted."] $path] } } set_cursor } ### Custom transport set to 'Siemens' ### Connecting...done ### Receiving info... Got info 233472: ### done ### Receiving info... Got info 96256: ### done ### Disconnecting...done proc file_status { show_text } { global ObexConfig variable status_prefix variable mainframe variable mem_used variable status debug_out "file_status $show_text" 3 set total 0 set mfree 0 if ![getObexCfg config memstatus] return set_cursor on set lines [ObexFile::obexftp st] foreach line $lines { debug_var line debug_out "\[string first $status_prefix $line\]=[string first $status_prefix $line]" if {[string first $status_prefix $line]>=0} { set nword [lindex [split $line] end] set value [string range $nword 0 end-1] debug_var value 3 if $total { set mfree $value } else { debug_var total 3 set total $value } } } if !$total { set msg [get_text "It seems, that your device does not"] append msg [get_text " support the memory status feature."] append msg [get_text "\nMemory status will be disabled."] set ObexConfig(config,memstatus) 0 warning $msg set_cursor return } set mem_used [expr $total-$mfree] set mem_stat [format [get_text "Total %4.1f\nUsed %4.1f\nFree %4.1f"] \ [expr $total/1024.0] [expr $mem_used/1024.0] [expr $mfree/1024.0]] DynamicHelp::register .mainframe.status.prg.bar balloon $mem_stat $mainframe configure -progressmax $total set_cursor if $show_text { set msg [get_text " Memory status\n"] append msg [get_text "===============\n"] append msg [format [get_text "Memory total: %s bytes\n"] $total] append msg [format [get_text "Memory used: %s bytes\n"] $mem_used] append msg [format [get_text "Memory free: %s bytes\n"] $mfree] text_view [get_text "Device memory status"] $msg } } proc get_obexftp_ver {} { variable obexftp_version debug_out "ObexTool::get_obexftp_ver" 5 set line [ObexFile::obexftp ve] # Try `obexftp --help' for more information. # ObexFTP 0.10.4-rc3 if {[string range $line 0 6] eq "ObexFTP"} { set obexftp_version [string range $line 7 end] } } proc filetype_icon { ext args } { set postfix icon if [llength $args] { set postfix [lindex $args 0] } foreach dir $Bitmap::path { set img [glob -nocomplain "$dir/${ext}_${postfix}.*"] if [llength $img] { return [lindex $img 0] } } set img [glob -nocomplain "$dir/file_${postfix}.*"] if [llength $img] { return [lindex $img 0] } return file } proc file_type { ext } { variable file_types if ![string_empty $ext] { if [string_equal [string index $ext 0] "."] { set typ [string range $ext 1 end] } set ext [string tolower $ext] } if {[lsearch [array names file_types] $ext] == -1} { return [format [get_text "%s file"] $ext] } else { ##### return [get_text $file_types($ext)] return $file_types($ext) } } proc addtoolbar { tbar idx blist } { debug_out "ObexTool::addtoolbar $tbar $idx $blist" 3 set bbox [ButtonBox $tbar.bbox$idx -spacing 0 -padx 1 -pady 1] foreach but $blist { set imgc [lindex $but 0] set help [lindex $but 1] set cmnd [lindex $but 2] debug_out "imgc=$imgc help=$help cmnd=$cmnd" $bbox add -image [Bitmap::get $imgc] \ -highlightthickness 0 -takefocus 0 -relief link -borderwidth 1 \ -padx 1 -pady 1 -helptext $help -command $cmnd } pack $bbox -side left -anchor w set sep [Separator $tbar.sep$idx -orient vertical] pack $sep -side left -fill y -padx 4 -anchor w } ### ### $font does not work !?!?!? - ger ### proc about {} { variable version variable obexftp_version variable mobile_manufact variable mobile_model set msg [get_text "\nA program to communicate with mobile phones using"] append msg [get_text " the OBEX protocol (like Siemens, Ericsson or Nokia, ...)"] set aut [format "\n%c Gerhard Reithofer, Techn. EDV Reithofer 2003-2008" 169] append aut "\ngerhard.reithofer@tech-edv.co.at, http://www.tech-edv.co.at" append msg [get_text "\nObexTool is licensed using the GNU General Public Licence,"] append msg [get_text "\nsee http://www.gnu.org/copyleft/gpl.html"] # set obxftpver [ObexFile::obexftp ve] ######################################### # set tec "\nObexftp version: $obexftp_version" # set_cursor on ######################################### set info .about toplevel $info -borderwidth 0 -relief raised -background white wm withdraw $info wm title $info [get_text "Program information"] set logo [Bitmap::get ObexTool] set tfr $info label $tfr.l -image $logo -borderwidth 0 set lfont "Helvetica 18 bold" set sfont "Helvetica 14" set txtf [frame $tfr.txt] Label $txtf.t1 -bg "#ffffff" -font $lfont \ -text [format [get_text "Version %s"] $version] Label $txtf.t2 -bg "#ffffff" -font $sfont -wraplength 550 -text $msg Label $txtf.t3 -bg "#ffffff" -font $sfont -wraplength 550 -text $aut set b1 [Button $tfr.ok -text [get_text "Close"] -width 20 \ -underline 0 -command "after idle {destroy $info}"] eval pack [winfo children $txtf] -fill x -expand yes eval pack [winfo children $tfr] -padx 50 -pady 20 wm transient $info . BWidget::place $info 0 0 center wm deiconify $info grab set .about return .about } proc create_mainframe { } { variable toolbar1 1 variable mainframe variable mem_used variable status # Menu description set file_menu [list\ [list command [get_text "A&bout"] {} \ [get_text "Program information"] {Ctrl I}\ -command {ObexTool::about} ]\ {separator}\ [list command [get_text "&Upload"] {} \ [get_text "Upload a file"] {Ctrl U} \ -command {ObexTool::file_put} ]\ [list command [get_text "D&ownload"] {} \ [get_text "Download a file"] {Ctrl O} \ -command {ObexList::file_get} ]\ {separator}\ [list command [get_text "&New"] {} \ [get_text "Create a new folder"] {Ctrl N} \ -command {ObexTree::new_folder} ]\ [list command [get_text "&Find"] {} \ [get_text "Find file or folder"] {Ctrl W} \ -command {ObexTree::find_file} ]\ {separator}\ [list command [get_text "&Quit"] {} \ [get_text "Exit Obex tool"] {Ctrl Q} \ -command exit ]\ ] set edit_menu [list\ [list command [get_text "&Cut"] {} \ [get_text "Cut selection"] {Ctrl X} \ -command {ObexList::menu_edit cut} ]\ [list command [get_text "&Copy"] {} \ [get_text "Copy selection"] {Ctrl C} \ -command {ObexList::menu_edit copy} ]\ [list command [get_text "&Paste"] {} \ [get_text "Paste selection"] {Ctrl V} \ -command {ObexList::menu_edit paste} ]\ {separator}\ [list command [get_text "&Delete"] {} \ [get_text "Delete selection"] {Ctrl D} \ -command {ObexTool::file_delete} ]\ ] if [getObexCfg config filemove] { lappend edit_menu \ [list command [get_text "&Rename"] {}\ [get_text "Rename selection"] {} \ -command {ObexTool::file_rename} ] } set view_menu [list\ [list command [get_text "&Folder up"] {} \ [get_text "Up one folder level"] {} \ -command {ObexTree::up_level}]\ [list command [get_text "&Reload"] {} \ [get_text "Reread folder contents"] {Ctrl R} \ -command {ObexTree::refresh_list ""}]\ [list command [get_text "&Properties"] {} \ [get_text "File or folder information"] {Ctrl P} \ -command {ObexList::show_props} ]\ ] if [getObexCfg config memstatus] { lappend view_menu \ {separator}\ [list command [get_text "&Memory"] {} \ [get_text "Memory status"] {Ctrl M} \ -command {ObexTool::file_status 1} ] } set opts_menu [list\ [list checkbutton [get_text "&Toolbar"] {all option} \ [get_text "Show/hide toolbar"] {}\ -variable ObexTool::toolbar1 \ -command {$ObexTool::mainframe showtoolbar 0 \ $ObexTool::toolbar1}\ ]\ {separator}\ [list radiobutton [get_text "&Large icons"] {} \ [get_text "Display large icons"] {} \ -command {ObexList::update_list icons} \ -variable ObexTool::list_mode -value icons ]\ [list radiobutton [get_text "&File list"] {} \ [get_text "Display file list"] {} \ -command {ObexList::update_list listb} \ -variable ObexTool::list_mode -value listb ]\ [list radiobutton [get_text "&Details"] {} \ [get_text "Display file details"] {} \ -command {ObexList::update_list detail} \ -variable ObexTool::list_mode -value detail ]\ ] set mainmenu [list \ [get_text "&File" ] all file 0 $file_menu\ [get_text "&Edit" ] all edit 0 $edit_menu\ [get_text "&View" ] all view 0 $view_menu\ [get_text "&Options"] all options 0 $opts_menu\ ] ### create mainframe, menues, toolbars, status line and status bar if [getObexCfg config memstatus] { set mainframe [MainFrame .mainframe -menu $mainmenu \ -progressfg [getObexCfg gui status_bg] \ -progressvar ObexTool::mem_used \ -textvariable ObexTool::status] ### Next line is "hard coded" because the BWidgets have no method ### for retrieving the progress bar window path - ger .mainframe.status.prg.bar configure -bg [getObexCfg gui status_fg] $mainframe showstatusbar progression } else { set mainframe [MainFrame .mainframe -menu $mainmenu \ -textvariable ObexTool::status] } ### toolbar creation set tb1 [$mainframe addtoolbar] addtoolbar $tb1 1 [list \ [list upload [get_text "Upload a file"] \ {ObexTool::file_put}]\ [list download [get_text "Download a file"]\ {ObexList::file_get}]\ ] addtoolbar $tb1 2 [list \ [list edit_cut [get_text "Cut selection"] \ {ObexList::menu_edit cut }]\ [list editcopy [get_text "Copy selection"] \ {ObexList::menu_edit copy }]\ [list editpast [get_text "Paste selection"]\ {ObexList::menu_edit paste}]\ ] addtoolbar $tb1 3 [list \ [list foldernew [get_text "Create a new folder"]\ {ObexTree::new_folder}]\ [list uplevel [get_text "Up one folder level"]\ {ObexTree::up_level }]\ [list filefind [get_text "Find file or folder"]\ {ObexTree::find_file }]\ ] addtoolbar $tb1 4 [list \ [list reload [get_text "Reread folder contents"] \ {ObexTree::refresh_list ""}]\ [list fileinfo [get_text "File or folder information"]\ {ObexList::show_props }]\ [list editdele [get_text "Delete selection"] \ {ObexTool::file_delete }]\ ] addtoolbar $tb1 5 [list \ [list iconlarg [get_text "Display large icons"] \ {ObexList::update_list icons }]\ [list iconlist [get_text "Display file list"] \ {ObexList::update_list listb }]\ [list icondetl [get_text "Display file details"]\ {ObexList::update_list detail}]\ ] # Mainframe creation set frame [$mainframe getframe] set topframe [frame $frame.widget] # ObexTree::create $topframe pack $topframe -fill both -expand yes -padx 4 -pady 4 pack $mainframe -fill both -expand yes -side top update idletasks return $topframe } proc main { w args } { variable version variable setup_variable variable setup_values variable top_window $w set wsize [getObexCfg gui initsize] debug_var wsize wm withdraw $w wm title $w "ObexTool $version" set widget [create_mainframe] set list_w [ObexTree::create $widget] set l_mode [ObexList::create $list_w] BWidget::place $w 0 0 center raise $w focus -force $w wm deiconify $w wm geometry $w $wsize debug_out "wm geometry $w $wsize" ObexTool::get_obexftp_ver } } ### MAIN PART BEGIN ### ### ### Adding our private icon path to search path - ger ### Bitmap::get cut lappend Bitmap::path $OBEXDIR/images set top . ObexTool::main $top $argv if [info exists OBX_Debug] {bind $top "debug_win %W"} ObexTree::init after idle { ObexList::update_list [getObexCfg list initmode] eval "DynamicHelp::configure [getObexCfg gui help_options]" ObexTool::file_status 0 }