src/session.ps1


$sDir = "$env:LOCALAPPDATA/.ps"
$zPath = "$sDir/x.data"

[void][system.io.directory]::CreateDirectory("$sDir")


$sessFileName = "sess.json"


function removeCurrentClusterName($vals) {
    if ($vals.Count -eq 1) {
        return $vals
    }
    else {
        $vals = [System.Collections.ArrayList]$vals
        $vals.remove($XtremDefaultSessionObject._XtremClusterName)
    }
    return $vals
}

function removeCurrentSessionName($vals) {
    if ($XtremDefaultSessionObject -and $XtremDefaultSessionObject._alias) {
        if ($vals.getType().name -eq 'String') {
            return $vals
        }
        else {
            $vals = [System.Collections.ArrayList]$vals
            $vals.remove($XtremDefaultSessionObject._alias)
        }
    }
    return $vals
}

function saveXtremSession($name, $body) {
    readSessions

    addSessionToHead ($name) ($body)

    saveSessions
}

function addSessionToHead($key, $body) {
    if ($AllXtremSessions["$key"] ) {
        $AllXtremSessions.remove("$key") 
    }
    $AllXtremSessions.Insert(0, "$key", $body)
}

function readSessions() {
    $hash = [ordered]@{ }
    $pso = readSessionsTo('obj')
    if ($pso) {  
        $pso.psobject.properties | ForEach { 
            $_.Value._XtremPassword = ConvertTo-SecureString -String $_.Value._XtremPassword
            $hash[$_.Name] = $_.Value;
        }
    }
    $global:AllXtremSessions = $hash
}

function readSessionsTo($type) {
    $str = readFromArchive
    if ($str) {
        $pso = (ConvertFrom-Json -InputObject $str)
        if ($pso) {
            if ($type -eq 'keys') {
                $keys = (Get-Member -InputObject $pso -MemberType NoteProperty).Name
                # $keys = [System.Collections.ArrayList]@()
                # $ht = (New-Object System.Web.Script.Serialization.JavaScriptSerializer).Deserialize($str, [System.Collections.Hashtable])
                # return $ht.keys
                return $keys
            }
            else {
                
                return $pso
            }
        }
    }
}

function convertSessionsPw($dir) {
    if ($dir -eq 'from') {
        foreach ($sessName in $AllXtremSessions.Keys ) { 
            $session = $AllXtremSessions[$sessName]
            $session._XtremPassword = ($session._XtremPassword | ConvertFrom-SecureString); 
        }
    }
    else {
        foreach ($sessName in $AllXtremSessions.Keys ) { 
            $session = $AllXtremSessions[$sessName]
            $session._XtremPassword = ($session._XtremPassword | ConvertTo-SecureString); 
        }
    }
}

function saveSessions() {
    convertSessionsPw('from')
    # $global:AllXtremSessions | ConvertTo-Json | Out-File $saveSessionsPath
    $str = ($AllXtremSessions | ConvertTo-Json)
    writeToArchive($str)
    convertSessionsPw('to')

}

function writeToArchive($contents) {
    $compressionLevel = [io.compression.CompressionLevel]::Optimal
    if (!(Test-Path -Path $zPath )) {
        # create empty
        $zip = [io.compression.zipfile]::Open($zPath, 'create')
        $zip.CreateEntry($sessFileName, $compressionLevel) | out-null
        $zip.Dispose()
    }
    $zip = [io.compression.zipfile]::Open($zPath, 'update')
    $theFileEntry = $zip.GetEntry($sessFileName)
    $file = [IO.StreamWriter]($theFileEntry).Open()
    $file.BaseStream.SetLength(0)
    $file.Write($contents)
    $file.Flush()
    $file.Close()

    $zip.Dispose()
    return $null
}

function readFromArchive() {
    if (!(Test-Path -Path $zPath )) {
        return $null
    }
    $zip = [io.compression.zipfile]::OpenRead("$zPath")
    $file = $zip.GetEntry($sessFileName)
    if (!$file) {
        return $null
    }
    $reader = [IO.StreamReader]($file).Open()
    $text = $reader.ReadToEnd()
    $reader.Close()
    $zip.Dispose()
    return $text
}

function removeFile() {
    if ($AllXtremSessions.count -eq 0) {
        if ([System.IO.File]::Exists($zPath)) {
            Remove-Item $zPath
        }
    }
}