Portable Adium source code

Home page > OS X Portable Applications > Portable Adium source code

Source code index | Portable Adium script source code:


Shell Script (release 4.0)

Portable Adium.app is packaged using the Platypus script wrapper from http://sveinbjorn.sytes.net/platypus

#!/bin/sh -x

##########################################################################
#
#   Portable Adium
#   $Revision: 4.0
#
#   The Contents of this file are made available subject to the terms
#   of the following license
#
#          - GNU General Public License Version 2.1
#
#   Carlo Gandolfi, Paolo Portaluri January 2007
#
#   GNU General Public License Version 2.1
#   =============================================
#   Copyright 2007 by:
#      Carlo Gandolfi - http://www.freesmug.org
#      Paolo Portaluri - http://plus2.it/~paolo/
#
#   This program is free software; you can redistribute it and/or
#   modify it under the terms of the GNU General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   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 library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
##########################################################################

# Reset PATH
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH

appurl=com.adiumX.adiumX.plist
appid=Adium

userplistbase="Library/Preferences"
userplist="$userplistbase/$appurl"
upl="$userplist"

userprefbase="Library/Application Support"
# userpref="$HOME/$userprefbase/$appid"
userpref="$HOME/$userprefbase/Adium 2.0"

usercachebase="$HOME/Library/Caches"
usercache="$usercachebase/$appid"

p_userbase="$1/Contents/Resources/app"
p_userpref="$p_userbase/$userprefbase/Adium 2.0"
p_userplist="$p_userbase/$userplistbase"
copy_pref="$p_userbase/../CopyPref_Done"

CD="$p_userbase/../CocoaDialog.app/Contents/MacOS/CocoaDialog"
appicon="$p_userbase/../appIcon.icns"
cautionicon="$p_userbase/../P_${appid}_Caution.icns"

# ========================================================
# CDokmessage
# CocoaDialog Ok/Cancel message box
# $1 "text"
# $2 "informative text"
# $3 "--no-cancel" = don't show a cancel button
# ========================================================

function CDokmessage {
    beep
    "$CD" ok-msgbox  --icon-file "$appicon" \
    --text "$1" --informative-text "$2" "$3"
}

function CDokmessagec {
    beep
    "$CD" ok-msgbox  --icon-file "$cautionicon" \
    --text "$1" --informative-text "$2" "$3"
}

function beep {
    /usr/bin/osascript << EOT
    tell application "Finder"
    beep
    end tell
EOT
}

# ========================================================
# bsd_command_check
# Check that the required BSD command are installed
# ========================================================

function command_check_msg {
message1="One or more *BSD commands* to run Portable $appid were not found on \
this machine. You must install the BSD Subsystem package that is in the \
following folder on disk 1 of your Mac OS X installation DVD:\n/Welcome to Mac \
OS X/Optional Installs.\n\nNow quit."
button=`/usr/bin/osascript << EOT
    tell application "Finder"
    beep
    display dialog "$message1" buttons {"Quit"} \
        with icon caution default button "Quit"
    set result to button returned of result
    end tell
EOT`
if test "$button" == "Quit"; then                # Quit application
    exit 112
fi
}

function bsd_command_check {      # written by Patrick Luby    
commands="awk cp defaults diskutil echo grep ln mkfifo mkdir mv plutil ps rm sed sleep touch"
for i in $commands ; do
    if [ ! -x "/usr/bin/$i" -a ! -x "/bin/$i" -a ! -x "/usr/sbin/$i" -a ! -x "/sbin/$i" ] ; then
        # Return 96 + 16 if a command is not found
        command_check_msg;
        exit 112;
    fi
done
}

# ========================================================
# osx_version_check
# Check that the user is running Mac OS X 10.4 or higher
# ========================================================

function version_check_msg {
message1="You are running OS X version $version.\n\
Portable $appid can only be opened on Mac OS X 10.4 or higher."
button=`/usr/bin/osascript << EOT
    tell application "Finder"
    beep
    display dialog "$message1" buttons {"Quit"} \
        with icon caution default button "Quit"
    set result to button returned of result
    end tell
EOT`
if test "$button" == "Quit"; then                # Quit application
    exit 113
fi

}

function osx_version_check {     # written by Patrick Luby    
if [ -x "/usr/bin/sw_vers" ] ; then
    # Return 96 + 17 if it is a bad version
    version=`/usr/bin/sw_vers | grep '^ProductVersion:' | awk '{ print $2 }'`
    case "$version" in
        10.[0123]) version_check_msg ; exit 113;;
        10.[0123].*) version_check_msg ; exit 113;;
    esac
fi
}

# ========================================================
# quitapp
# Check if local app is open and quit
# ========================================================

function quitapp {
    if ps cx | grep '[0-9] '"$appid"'$' > /dev/null; then
        rv=` CDokmessage "$appid is already running on this system" \
        "Only one copy can be run at a time. \
Quit running $appid and reopen Portable $appid." "--no-cancel" `
        if [ "$rv" == "1" ] ; then                # Quit application
            exit 0
        fi
    fi
}

# ========================================================
# repair
# Repair preferences if Portable Application crashed
# ========================================================

function restore {
    for i in $upl ; do
        if [ -f "$HOME/$i.pabu" ] ; then
            mv "$HOME/$i" "$HOME/$i.old"
            mv "$HOME/$i.pabu" "$HOME/$i"
        fi
    done
    if [ -d "$userpref.pabu" ] ; then
        mv "$userpref" "$userpref.old"
        mv "$userpref.pabu" "$userpref"
    fi
}

function restorepabu {
        if  [ -f "$HOME/$userplist" ] || \
        [ -f "$HOME/$userplist2" ] || \
        [ -d "$userpref" ] ; then
        removemsg="Portable $appid has not restored local preferences back-up. \
Local preferences already exists. You are now restoring preferences back-up \
renaming existing as $appid.old."
    else
        removemsg="Portable $appid has not restored local preference back-up. \
You are now restoring them."
    fi
    rv=` CDokmessagec "Restore local preferences back-up" "$removemsg" `
    if [ "$rv" == "1" ] ; then
        if restore ; then
            CDokmessage "$appid Preferences back-up Restore done" \
"Local $appid preferences back-up restored with success." "--no-cancel" > /dev/null
        else
            CDokmessagec "$appid Preferences back-up Restore error" \
        "Local $appid preferences back-up can't be restored. Now quit." "--no-cancel" \
        > /dev/null
            exit 0
        fi
    elif [ "$rv" == "2" ] ; then
        repair
    fi
}

function copy {
    rm -rf "$HOME/$appid Pref BackUp/"
    for i in $upl ; do
        if  [ -f "$HOME/$i.pabu" ] ; then
            mkdir -p "$HOME/$appid Pref BackUp/$userplistbase"
            mv "$HOME/$i.pabu" "$HOME/$appid Pref BackUp/$i"
        fi
    done
    if [ -d "$userpref.pabu" ] ; then
        mkdir -p "$HOME/$appid Pref BackUp/$userprefbase"
        mv "$userpref.pabu" \
        "$HOME/$appid Pref BackUp/$userprefbase/$appid"
    fi
    cp "$p_userbase/../CopyPrefBU_ReadMe.txt" "$HOME/$appid Pref BackUp/ReadMe.txt"
}

function copypabu {
    rv=` CDokmessagec "Copy local preferences back-up" \
    "Portable $appid has not restored local preference back-up. \
You are now copying them to \"$HOME/$appid Pref BackUp/\" folder." `
    if [ "$rv" == "1" ] ; then
        if copy ; then
            CDokmessage "$appid Preferences back-up Copy done" "Preferences \
back-up copied to \"$HOME/$appid Pref BackUp/\" folder with success." \
"--no-cancel" > /dev/null
        else
            CDokmessagec "$appid Preferences back-up Copy error" "Preferences \
back-up can't be copied to \"$HOME/$appid Pref BackUp/\" folder. Now quit." \
"--no-cancel" > /dev/null
            exit 0
        fi
    elif [ "$rv" == "2" ] ; then
        repair
    fi
}

function repair {
    if  [ -d "$usercache.pabu" ] ; then
        rm -rf "$usercache.pabu"            # Delete backup cache
    fi
    if [ -h "$userpref" ] ; then
        rm -f "$userpref"                    # Delete symlink
    fi
    if  [ -f "$HOME/$userplist.pabu" ] || \
    [ -d "$userpref.pabu" ] ; then
        beep    
        text2="Local $appid preferences back-up not restored"
        informativetext2="A temporary back-up of local $appid preferences \
still exist, Portable $appid crashed without restoring this back-up. You can \
Restore local preferences back-up now or Copy to \""$HOME/$appid" BackUp\" \
folder to manually restore later."
        rv=`"$CD" msgbox  --icon-file "$cautionicon" \
        --text "$text2" --informative-text "$informativetext2" \
        --button1 "Restore" --button2 "Copy"`
        if [ "$rv" == "1" ] ; then
            restorepabu            
        elif [ "$rv" == "2" ] ; then
            copypabu
        fi    
    fi
}

# ========================================================
# check_p_asf
# Check and create Portable Application Support folders
# ========================================================

function check_p_asf {
    readonly=`diskutil info "$p_userbase" | grep "Read Only" | awk '{ print $3 }'`
    if [ "$readonly" = Yes ]; then
        CDokmessagec "Portable $appid is on a locked volume" "Portable $appid can't \
be opened on a locked volume. Now quit." "--no-cancel" > /dev/null
        exit 0
    else
        if [ ! -d "$p_userpref" ] ; then
            mkdir -p "$p_userpref"
        fi
        if [ ! -d "$p_userplist" ] ; then
            mkdir -p "$p_userplist"
        fi
    fi
}

# ========================================================
# bu/recover preference
# BackUp existing preference and restore portable ones
# ========================================================

function bu_plist {
    for i in $upl ; do
        if  [ -f "$HOME/$i" ] ; then
            mv "$HOME/$i" "$HOME/$i.pabu"
        fi
    done
}

function recover_plist {
    for i in $upl ; do
        if  [ -f "$HOME/$i.pabu" ] ; then
            mv "$HOME/$i.pabu" "$HOME/$i"
        else
            rm -f "$HOME/$i"
        fi
    done
}

function recover_p_plist {
    for i in $upl ; do
        if [ -f "$p_userbase/$i" ] ; then
            cp "$p_userbase/$i" "$HOME/$i"
        fi
    done
}

function bu_p_plist {
    for i in $upl ; do
        if [ -f "$HOME/$i" ] ; then
            cp "$HOME/$i" "$p_userbase/$i"
        fi
    done
}

# ========================================================
# copy_local_pref
# Copy local preferences to Portable Application
# ========================================================

function runcopypref {    # written by Kevin Hendricks 
    rm -f /tmp/hpipe
    mkfifo /tmp/hpipe
    "$CD" progressbar --indeterminate --title "Copying $appid Preferences" \
    --text "Copying \"$userpref\". Please wait..." < /tmp/hpipe &
    exec 3<> /tmp/hpipe
    echo -n . >&3
    # do all of your work here
    cp -R "$userpref" "$p_userpref"
    exec 3>&-
    wait
    rm -f /tmp/hpipe
}

function check_asf {
    if [ -d "$p_userpref" ] ; then
        # delete p_userpref if it still exist
        rm -Rf "$p_userpref"
    else
        mkdir -p "$p_userpref"
    fi
}

# copy Preferences Folder
function copy_pf {
    userprefsize=`du -hc "$userpref" | cut -f1 | tail -1`
    freesize=`df -h "$p_userbase" | tail -1 | awk '{print $4}'`
    buserprefsize=`du -c "$userpref" | cut -f1 | tail -1`
    bfreesize=`df "$p_userbase" | tail -1 | awk '{print $4}'`
    if [ $buserprefsize -lt $bfreesize ] ; then
        rv=` CDokmessage "Copy $appid Preferences" \
        "Your $appid Preferences are $userprefsize. \
You have $freesize available. Copy to Portable $appid?" `
        if [ "$rv" == "1" ] ; then
            if check_asf ; bu_p_plist ; runcopypref ; then
                touch -f "$copy_pref"
                "$CD" bubble --title "$appid Preferences copied" --text "Local \
$appid Preferences copied to Portable $appid with success." \
--icon-file "$appicon"
            else
                "$CD" bubble --title "$appid Preferences copy error" \
--text "An error occurred copying $appid Preferences to Portable $appid." \
--icon-file "$cautionicon"
            fi
        fi
        else
        CDokmessagec "No space to copy $appid Preferences" \
        "Your $appid Preferences are $userprefsize. \
You have $freesize available. There is no enough space. Portable $appid will \
open without copy existing $appid Preferences." "--no-cancel" > /dev/null
    fi
}

function copy_local_pref {
    if [ ! -f "$copy_pref" ] && [ -d  "$userpref" ] ; then
    beep
    text="Copy Preferences"
    informativetext="Copy the existing $appid Preferences \
on this system to Portable $appid?"
    rv=`"$CD" msgbox --no-newline --icon-file "$appicon" \
    --text "$text" --informative-text "$informativetext" \
    --button1 "Copy" --button2 "Don't Copy" --button3 "Never"`
        if [ "$rv" == "1" ] ; then
            copy_pf
        elif [ "$rv" == "3" ] ; then
            touch -f "$copy_pref" 
        fi
    fi
}

# ========================================================
# bu/recover cache
# BackUp existing cache
# ========================================================

function bu_cache {
    if [ -d "$usercache" ] ; then
        mv "$usercache" "$usercache.pabu"
    fi
}

function recover_cache {
    if  [ -d "$usercache.pabu" ] ; then
        mv "$usercache.pabu" "$usercache"
    fi
}

function remove_p_cache {
    if  [ -d "$usercache" ] ; then
        rm -rf "$usercache"
    fi
}

# ========================================================
# run
# Open Portable Application
# ========================================================

function run_app {
    defaults write "$p_userbase/$appid.app/Contents/info" "Preference Folder Location" \
    "$p_userbase/Library/Application Support/Adium 2.0"
    plutil -convert xml1 "$p_userbase/$appid.app/Contents/Info.plist"
    "$p_userbase/$appid.app/Contents/MacOS/$appid"
}

# ========================================================
# open_p_app
# Run Portable Application script
# ========================================================

function set_p_app {
    bu_plist            # Backup of existing preference
    bu_cache            # Backup exixting Cache folder
    recover_p_plist        # Recover portable preference
}

function close_p_app {
    bu_p_plist            # Backup portable preference
    remove_p_cache        # Remove portable cache
    recover_cache        # Restore existing cache
    recover_plist        # Restore existing preference
}

function open_p_app {
    if set_p_app ; then
        "$CD" bubble --title "Portable $appid setup ok" --text "Portable \
$appid open with success." --icon-file "$appicon" &
    else
        CDokmessagec "Portable $appid setup error" \
"An error occour while opening portable preferences. Now quit." "--no-cancel" > /dev/null
    close_p_app
    exit 0
    fi
    run_app                 # Run application from external drive
    if close_p_app ; then
    "$CD" bubble --title "Portable $appid quit" --text "Portable \
$appid quit with success." --icon-file "$appicon" &
    else
    CDokmessagec "Portable $appid quit error" \
"Portable $appid can't restore local cache." "--no-cancel" > /dev/null
    fi
}

bsd_command_check
osx_version_check
check_p_asf
quitapp
repair
copy_local_pref
open_p_app
exit 0

Shell Script (Release 3.0)

Portable Adium.app is packaged using the Platypus script wrapper from http://sveinbjorn.sytes.net/platypus


AppleScript (from release 2.1)

tell application "System Events" to set perc to the path of container of (path to me) as alias
set perc to quoted form of POSIX path of perc
do shell script "defaults write " & perc & "app/Adium.app/Contents/info \"Preference Folder Location\" " & perc & "app/profile"
do shell script "plutil -convert xml1 " & perc & "app/Adium.app/Contents/Info.plist"
do shell script "open " & perc & "app/Adium.app"

Shell Script (till release 1.0)

From Adium wiki page, this is the script that start Adium from any device:

#!/bin/sh

here="`dirname \"$0\"`"
echo "Starting Adium from '$here'."
defaults write "$here/app/Adium.app/Contents/info" "Preference Folder Location" "$here/profile"
plutil -convert xml1 "$here/app/Adium.app/Contents/Info.plist"
open "$here/app/Adium.app"
echo "Done!"
echo "When finish, quit Terminal.app before eject your portable device."

EOF
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License