diff --git a/Kaju Admin App/App.xojo_code b/Kaju Admin App/App.xojo_code index cb3c154..6760ec8 100644 --- a/Kaju Admin App/App.xojo_code +++ b/Kaju Admin App/App.xojo_code @@ -214,5 +214,7 @@ Inherits Application #tag EndConstant + #tag ViewBehavior + #tag EndViewBehavior End Class #tag EndClass diff --git a/Kaju Admin App/Kaju Admin.xojo_project b/Kaju Admin App/Kaju Admin.xojo_project index 8535277..2995466 100644 --- a/Kaju Admin App/Kaju Admin.xojo_project +++ b/Kaju Admin App/Kaju Admin.xojo_project @@ -26,15 +26,16 @@ Class=CheckBoxChanger;Controls/CheckBoxChanger.xojo_code;&h5115CD40;&hE8B14E5;fa Class=FolderItemAlias;Other Classes/FolderItemAlias.xojo_code;&h53EF1AE5;&h6AF5D169;false Class=HTTPSSocket;../Kaju Classes/Kaju/HTTPSSocket.xojo_code;&h5ACDFAEB;&h11400316;false Plist=Info;Custom Plist/Info.plist;&h7393D7FF;&h74C1A7FF;false +Class=KajuFile;KajuFile.xojo_code;&h1A7FF7FF;&h0;false AppMenuBar=MainMenuBar MajorVersion=1 MinorVersion=5 -SubVersion=2 +SubVersion=3 NonRelease=0 Release=3 InfoVersion=Kaju Admin -LongVersion=v.1.5.2 -ShortVersion=1.5.2 +LongVersion=v.1.5.3 +ShortVersion=1.5.3 WinCompanyName=MacTechnologies Consulting WinInternalName= WinProductName= diff --git a/Kaju Admin App/KajuFile.xojo_code b/Kaju Admin App/KajuFile.xojo_code new file mode 100644 index 0000000..997f651 --- /dev/null +++ b/Kaju Admin App/KajuFile.xojo_code @@ -0,0 +1,246 @@ +#tag Class +Protected Class KajuFile + #tag Method, Flags = &h21 + Private Sub CreateRSAKeys() + if mPrivateKey = "" then + if not Crypto.RSAGenerateKeyPair( 2048, mPrivateKey, mPublicKey ) then + raise new Kaju.KajuException( "Could not generate RSA keys", CurrentMethodName ) + end if + end if + + return + End Sub + #tag EndMethod + + #tag Method, Flags = &h0 + Function ExportFilename() As String + return mExportFilename + End Function + #tag EndMethod + + #tag Method, Flags = &h0 + Sub ExportTo(f As FolderItem) + dim data as JSONItem = DataToJSON + data.Compact = false + data.EscapeSlashes = false + + // + // Perform $VERSION$ substitutions + // + dim keys() as string = Array( Kaju.UpdateInformation.kMacBinaryName, Kaju.UpdateInformation.kWindowsBinaryName, _ + Kaju.UpdateInformation.kLinuxBinaryName ) + + dim lastVersionIndex as integer = data.Count - 1 + for versionIndex as integer = 0 to lastVersionIndex + dim thisVersionData as JSONItem = data( versionIndex ) + dim thisVersion as string = thisVersionData.Value( kVersionName ) + for each binaryKey as string in keys + if thisVersionData.HasName( binaryKey ) then + dim binaryData as JSONItem = thisVersionData.Value( binaryKey ) + dim url as string = binaryData.Value( Kaju.BinaryInformation.kKeyURL ) + url = InsertVersion( url, thisVersion ) + binaryData.Value( Kaju.BinaryInformation.kKeyURL ) = url + end if + next + next + + dim dataString as string = data.ToString + + dim sig as string = Crypto.RSASign( dataString, PrivateKey ) + sig = EncodeHex( sig ) + + dataString = Kaju.kUpdatePacketMarker + sig + EndOfLine.UNIX + dataString + + dim tos as TextOutputStream = TextOutputStream.Create( f ) + tos.Write dataString + tos = nil + + mExportFilename = f.Name + + End Sub + #tag EndMethod + + #tag Method, Flags = &h0 + Shared Function InsertVersion(originalURL As String, version As String) As String + return originalURL.ReplaceAllB( "$VERSION$", version ) + End Function + #tag EndMethod + + #tag Method, Flags = &h0 + Sub Load(f As FolderItem) + dim tis as TextInputStream = TextInputStream.Open( f ) + tis.Encoding = Encodings.UTF8 + dim contents as string = tis.ReadAll() + tis.Close + tis = nil + + dim root as new JSONItem( contents ) + + mPrivateKey = root.Lookup( kPrivateKeyName, "" ) + mPublicKey = root.Lookup( kPublicKeyName, "" ) + + // + // Going to use the orinal default here in case this is an old file + // + mExportFilename = root.Lookup( kExportFilenameName, "UpdateInformation.html" ) + + redim KajuData( -1 ) + + dim data as JSONItem = root.Lookup( kDataName, nil ) + if data isa JSONItem then + dim lastIndex as integer = data.Count - 1 + for i as integer = 0 to lastIndex + dim update as new Kaju.UpdateInformation( data( i ) ) + KajuData.Append update + next + end if + End Sub + #tag EndMethod + + #tag Method, Flags = &h0 + Function PrivateKey() As String + CreateRSAKeys + return mPrivateKey + End Function + #tag EndMethod + + #tag Method, Flags = &h0 + Function PublicKey() As String + CreateRSAKeys + return mPublicKey + End Function + #tag EndMethod + + #tag Method, Flags = &h0 + Sub SaveTo(f As FolderItem) + dim master as JSONItem = ToJSON + master.Compact = false + + dim toSave as string = master.ToString + + dim bs as BinaryStream = BinaryStream.Create( f, true ) + bs.Write( toSave ) + bs.Close + + dim tis as TextInputStream = TextInputStream.Open( f ) + dim compare as string = tis.ReadAll + tis.Close + + dim jCompare as new JSONItem( compare ) + jCompare.Compact = master.Compact + + if not StrComp( toSave, jCompare.ToString, 0 ) = 0 then + raise new IOException + end if + + End Sub + #tag EndMethod + + + #tag ComputedProperty, Flags = &h0 + #tag Getter + Get + dim data as new JSONItem( "[]" ) + for each update as Kaju.UpdateInformation in KajuData + data.Append update.ToJSON + next + + return data + End Get + #tag EndGetter + DataToJSON As JSONItem + #tag EndComputedProperty + + #tag Property, Flags = &h0 + KajuData() As Kaju.UpdateInformation + #tag EndProperty + + #tag Property, Flags = &h0 + mExportFilename As String = "UpdateInformation.json" + #tag EndProperty + + #tag Property, Flags = &h21 + Private mPrivateKey As String + #tag EndProperty + + #tag Property, Flags = &h21 + Private mPublicKey As String + #tag EndProperty + + #tag ComputedProperty, Flags = &h0 + #tag Getter + Get + dim root as new JSONItem + root.Value( kPrivateKeyName ) = PrivateKey + root.Value( kPublicKeyName ) = PublicKey + root.Value( kExportFilenameName ) = ExportFilename + + dim data as JSONItem = DataToJSON + root.Value( kDataName ) = data + + return root + End Get + #tag EndGetter + ToJSON As JSONItem + #tag EndComputedProperty + + + #tag Constant, Name = kDataName, Type = String, Dynamic = False, Default = \"KajuData", Scope = Private + #tag EndConstant + + #tag Constant, Name = kExportFilenameName, Type = String, Dynamic = False, Default = \"ExportFilename", Scope = Private + #tag EndConstant + + #tag Constant, Name = kPrivateKeyName, Type = String, Dynamic = False, Default = \"PrivateKey", Scope = Private + #tag EndConstant + + #tag Constant, Name = kPublicKeyName, Type = String, Dynamic = False, Default = \"PublicKey", Scope = Private + #tag EndConstant + + #tag Constant, Name = kVersionName, Type = String, Dynamic = False, Default = \"Version", Scope = Public + #tag EndConstant + + + #tag ViewBehavior + #tag ViewProperty + Name="Index" + Visible=true + Group="ID" + InitialValue="-2147483648" + Type="Integer" + #tag EndViewProperty + #tag ViewProperty + Name="Left" + Visible=true + Group="Position" + InitialValue="0" + Type="Integer" + #tag EndViewProperty + #tag ViewProperty + Name="mExportFilename" + Group="Behavior" + InitialValue="UpdateInformation.json" + Type="String" + #tag EndViewProperty + #tag ViewProperty + Name="Name" + Visible=true + Group="ID" + Type="String" + #tag EndViewProperty + #tag ViewProperty + Name="Super" + Visible=true + Group="ID" + Type="String" + #tag EndViewProperty + #tag ViewProperty + Name="Top" + Visible=true + Group="Position" + InitialValue="0" + Type="Integer" + #tag EndViewProperty + #tag EndViewBehavior +End Class +#tag EndClass diff --git a/Kaju Admin App/WndAdmin.xojo_window b/Kaju Admin App/WndAdmin.xojo_window index 362ee84..8f1197c 100644 --- a/Kaju Admin App/WndAdmin.xojo_window +++ b/Kaju Admin App/WndAdmin.xojo_window @@ -147,7 +147,7 @@ Begin Window WndAdmin Bold = False Border = True CueText = "" - DataField = "Version" + DataField = "#KajuFile.kVersionName" DataSource = "" Enabled = False Format = "" @@ -2444,21 +2444,6 @@ End End Sub #tag EndMethod - #tag Method, Flags = &h21 - Private Sub CreateRSAKeys() - if RSAPrivateKey = "" then - if not Crypto.RSAGenerateKeyPair( 2048, RSAPrivateKey, RSAPublicKey ) then - MsgBox "Could not create RSA key pairs." - self.Close - else - self.ContentsChanged = true - end if - end if - - return - End Sub - #tag EndMethod - #tag Method, Flags = &h21 Private Sub DeleteVersion() dim curIndex as integer = lbVersions.ListIndex @@ -2466,9 +2451,12 @@ End return end if + dim version as Kaju.UpdateInformation = lbVersions.RowTag( curIndex ) lbVersions.ListIndex = -1 lbVersions.RemoveRow( curIndex ) + MyKajuFile.KajuData.Remove MyKajuFile.KajuData.IndexOf( version ) + if curIndex > 0 then curIndex = curIndex - 1 end if @@ -2481,48 +2469,27 @@ End #tag Method, Flags = &h21 Private Function DoSave() As Boolean + StoreFieldsToVersionRow() + dim f as FolderItem = Document if f is nil then return DoSaveAs() end if - dim r as boolean dim savedContentsChanged as boolean = self.ContentsChanged - dim master as new JSONItem - master.Compact = false - - master.Value( kPrivateKeyName ) = RSAPrivateKey - master.Value( kPublicKeyName ) = RSAPublicKey - - dim data as JSONItem = KajuJSON - master.Value( kDataName ) = data - - dim toSave as string = master.ToString - - dim bs as BinaryStream = BinaryStream.Create( f, true ) - bs.Write( toSave ) - bs.Close - - dim tis as TextInputStream = TextInputStream.Open( f ) - dim compare as string = tis.ReadAll - tis.Close - - r = StrComp( toSave, compare, 0 ) = 0 - self.ContentsChanged = not r - - if not r then - MsgBox "Save failed!" - end if - - return r + dim r as boolean + MyKajuFile.SaveTo( f ) + r = true + ContentsChanged = false - Exception err as RuntimeException + Exception err as IOException self.ContentsChanged = savedContentsChanged - return false + MsgBox "Save failed!" Finally UpdateWindowTitle + return r End Function #tag EndMethod @@ -2585,7 +2552,7 @@ End #tag Method, Flags = &h21 Private Sub HashFromURL(url As String, version As String, hashField As TextField) url = url.Trim - url = InsertVersion( url, version ) + url = KajuFile.InsertVersion( url, version ) if url = "" then return @@ -2620,12 +2587,6 @@ End End Sub #tag EndMethod - #tag Method, Flags = &h21 - Private Function InsertVersion(originalURL As String, version As String) As String - return originalURL.ReplaceAllB( "$VERSION$", version ) - End Function - #tag EndMethod - #tag Method, Flags = &h21 Private Function IsDataValid() As Boolean StoreFieldsToVersionRow() @@ -2639,8 +2600,7 @@ End dim msg as string dim lastRow as integer = lbVersions.ListCount - 1 for row as integer = 0 to lastRow - dim j as JSONItem = lbVersions.RowTag( row ) - dim u as new Kaju.UpdateInformation( j ) + dim u as Kaju.UpdateInformation = lbVersions.RowTag( row ) if not u.IsValid then r = false msg = u.InvalidReason @@ -2658,83 +2618,34 @@ End #tag EndMethod #tag Method, Flags = &h21 - Private Sub JSONToFields(data As JSONItem) - // - // Handle the named controls first - // - - dim savedDirty as boolean = self.ContentsChanged - - ClearFields() - - self.Loading = true - - dim lastIndex as integer = ControlCount - 1 - for i as integer = 0 to lastIndex - dim c as Control = self.Control( i ) - - dim fieldName as string = ControlDataField( c ) - if fieldName <> "" then - ControlValue( c ) = data.Lookup( fieldName, nil ) - end if - - next - - // - // Binaries - // - - if data.HasName( Kaju.UpdateInformation.kMacBinaryName ) then - cbMacBinary.Value = true - dim binary as new Kaju.BinaryInformation( false, data.Value( Kaju.UpdateInformation.kMacBinaryName ) ) - fldMacBinaryHash.Text = binary.Hash - fldMacBinaryURL.Text = binary.URL + Private Function MyKajuFile() As KajuFile + if mMyKajuFile is nil then + mMyKajuFile = new KajuFile end if - if data.HasName( Kaju.UpdateInformation.kWindowsBinaryName ) then - cbWindowsBinary.Value = true - dim binary as new Kaju.BinaryInformation( true, data.Value( Kaju.UpdateInformation.kWindowsBinaryName ) ) - fldWindowsExecutable.Text = binary.ExecutableName - fldWindowsBinaryHash.Text = binary.Hash - fldWindowsBinaryURL.Text = binary.URL - end if - - if data.HasName( Kaju.UpdateInformation.kLinuxBinaryName ) then - cbLinuxBinary.Value = true - dim binary as new Kaju.BinaryInformation( true, data.Value( Kaju.UpdateInformation.kLinuxBinaryName ) ) - fldLinuxExecutable.Text = binary.ExecutableName - fldLinuxBinaryHash.Text = binary.Hash - fldLinuxBinaryURL.Text = binary.URL - end if - - self.Loading = false - - AdjustControls() - self.ContentsChanged = savedDirty - End Sub + return mMyKajuFile + End Function #tag EndMethod #tag Method, Flags = &h21 Private Sub NewVersion() StoreFieldsToVersionRow() - CreateRSAKeys() - lbVersions.AddRow "1.0.0d1" - - dim j as new JSONItem() - j.Value( "Version" ) = lbVersions.Cell( lbVersions.LastIndex, 0 ) + dim version as new Kaju.UpdateInformation + version.Version = lbVersions.Cell( lbVersions.LastIndex, 0 ) dim prevIndex as integer = LastVersionRow if prevIndex <> -1 and prevIndex < lbVersions.ListCount then - dim prevItem as JSONItem = lbVersions.RowTag( prevIndex ) + dim prevItem as Kaju.UpdateInformation = lbVersions.RowTag( prevIndex ) if prevItem <> nil then - dim fieldName as string = fldAppName.DataField - j.Value( fieldName ) = prevItem.Lookup( fieldName, "" ) + version.AppName = prevItem.AppName end if end if - lbVersions.RowTag( lbVersions.LastIndex ) = j + MyKajuFile.KajuData.Append version + + lbVersions.RowTag( lbVersions.LastIndex ) = version lbVersions.ListIndex = lbVersions.LastIndex self.ContentsChanged = true End Sub @@ -2745,24 +2656,12 @@ End if f is nil or not f.Exists or f.Directory then raise new NilObjectException end if + MyKajuFile.Load f - dim tis as TextInputStream = TextInputStream.Open( f ) - tis.Encoding = Encodings.UTF8 - - dim dataString as string = tis.ReadAll - tis = nil - - dataString = ReplaceLineEndings( dataString, EndOfLine ) - - dim master as new JSONItem( dataString ) - RSAPrivateKey = master.Value( kPrivateKeyName ) - RSAPublicKey = master.Value( kPublicKeyName ) - - dim data as JSONItem = master.Value( kDataName ) - dim lastIndex as integer = data.Count - 1 - for i as integer = 0 to lastIndex - dim version as JSONItem = data( i ) - lbVersions.AddRow version.Value( "Version" ).StringValue + dim versions() as Kaju.UpdateInformation = MyKajuFile.KajuData + for i as integer = 0 to versions.Ubound + dim version as Kaju.UpdateInformation = versions( i ) + lbVersions.AddRow version.Version lbVersions.RowTag( lbVersions.LastIndex ) = version next i @@ -2776,10 +2675,19 @@ End AdjustControls Exception err as RuntimeException - MsgBox "Could not open document." - - self.Close - return + select case err + case IsA EndException, IsA ThreadEndException + // + // Pass it on + // + raise err + + case else + MsgBox "Could not open document." + + self.Close + return + end select End Sub #tag EndMethod @@ -2789,7 +2697,7 @@ End return end if - dim j as new JSONItem( "{}" ) + dim version as Kaju.UpdateInformation = lbVersions.RowTag( LastVersionRow ) // // Gather the textfield data first @@ -2802,7 +2710,7 @@ End dim fieldName as string = ControlDataField( c ) if fieldName <> "" then dim value as Variant = ControlValue( c ) - j.Value( fieldName ) = value + version.SetByName( fieldName ) = value end if next @@ -2810,13 +2718,14 @@ End // // Binaries // - if cbMacBinary.Value then dim binary as new Kaju.BinaryInformation( false ) binary.Hash = fldMacBinaryHash.Text.Trim binary.URL = fldMacBinaryURL.Text.Trim - j.Value( Kaju.UpdateInformation.kMacBinaryName ) = binary.ToJSON + version.MacBinary = binary + else + version.MacBinary = nil end if if cbWindowsBinary.Value then @@ -2825,7 +2734,9 @@ End binary.Hash = fldWindowsBinaryHash.Text.Trim binary.URL = fldWindowsBinaryURL.Text.Trim - j.Value( Kaju.UpdateInformation.kWindowsBinaryName ) = binary.ToJSON + version.WindowsBinary = binary + else + version.WindowsBinary = nil end if if cbLinuxBinary.Value then @@ -2834,10 +2745,12 @@ End binary.Hash = fldLinuxBinaryHash.Text.Trim binary.URL = fldLinuxBinaryURL.Text.Trim - j.Value( Kaju.UpdateInformation.kLinuxBinaryName ) = binary.ToJSON + version.LinuxBinary = binary + else + version.LinuxBinary = nil end if - lbVersions.RowTag( LastVersionRow ) = j + End Sub #tag EndMethod @@ -2860,6 +2773,67 @@ End End Sub #tag EndMethod + #tag Method, Flags = &h21 + Private Sub VersionToFields(version As Kaju.UpdateInformation) + // + // Handle the named controls first + // + + dim savedDirty as boolean = self.ContentsChanged + + ClearFields() + + self.Loading = true + + dim lastIndex as integer = ControlCount - 1 + for i as integer = 0 to lastIndex + dim c as Control = self.Control( i ) + + dim fieldName as string = ControlDataField( c ) + if fieldName <> "" then + try + ControlValue( c ) = version.GetByName( fieldName ) + catch err as KeyNotFoundException + ControlValue( c ) = nil + end try + end if + + next + + // + // Binaries + // + + if version.MacBinary isa Kaju.BinaryInformation then + cbMacBinary.Value = true + dim binary as Kaju.BinaryInformation = version.MacBinary + fldMacBinaryHash.Text = binary.Hash + fldMacBinaryURL.Text = binary.URL + end if + + if version.WindowsBinary isa Kaju.BinaryInformation then + cbWindowsBinary.Value = true + dim binary as Kaju.BinaryInformation = version.WindowsBinary + fldWindowsExecutable.Text = binary.ExecutableName + fldWindowsBinaryHash.Text = binary.Hash + fldWindowsBinaryURL.Text = binary.URL + end if + + if version.LinuxBinary isa Kaju.BinaryInformation then + cbLinuxBinary.Value = true + dim binary as Kaju.BinaryInformation = version.LinuxBinary + fldLinuxExecutable.Text = binary.ExecutableName + fldLinuxBinaryHash.Text = binary.Hash + fldLinuxBinaryURL.Text = binary.URL + end if + + self.Loading = false + + AdjustControls() + self.ContentsChanged = savedDirty + End Sub + #tag EndMethod + #tag ComputedProperty, Flags = &h0 #tag Getter @@ -2879,29 +2853,6 @@ End Document As FolderItem #tag EndComputedProperty - #tag ComputedProperty, Flags = &h21 - #tag Getter - Get - StoreFieldsToVersionRow() - - dim combined as new JSONItem( "[]" ) - combined.Compact = false - - dim lastIndex as integer = lbVersions.ListCount - 1 - for row as integer = 0 to lastIndex - dim j as JSONItem = lbVersions.RowTag( row ) - if j <> nil then - combined.Append j - end if - next - - return combined - - End Get - #tag EndGetter - Private KajuJSON As JSONItem - #tag EndComputedProperty - #tag Property, Flags = &h21 Private LastVersionRow As Integer = -1 #tag EndProperty @@ -2937,28 +2888,14 @@ End #tag EndProperty #tag Property, Flags = &h21 - Private Platforms() As String + Private mMyKajuFile As KajuFile #tag EndProperty #tag Property, Flags = &h21 - Private RSAPrivateKey As String - #tag EndProperty - - #tag Property, Flags = &h21 - Private RSAPublicKey As String + Private Platforms() As String #tag EndProperty - #tag Constant, Name = kDataName, Type = String, Dynamic = False, Default = \"KajuData", Scope = Private - #tag EndConstant - - #tag Constant, Name = kPrivateKeyName, Type = String, Dynamic = False, Default = \"PrivateKey", Scope = Private - #tag EndConstant - - #tag Constant, Name = kPublicKeyName, Type = String, Dynamic = False, Default = \"PublicKey", Scope = Private - #tag EndConstant - - #tag EndWindowCode #tag Events lbVersions @@ -2968,7 +2905,7 @@ End dim row as integer = me.ListIndex if row <> -1 and me.RowTag( row ) <> nil then - JSONToFields( me.RowTag( row ) ) + VersionToFields( me.RowTag( row ) ) else ClearFields end if @@ -3239,10 +3176,9 @@ End #tag Events btnCopyPublicKey #tag Event Sub Action() - CreateRSAKeys() dim c as new Clipboard - c.Text = RSAPublicKey + c.Text = MyKajuFile.PublicKey c.Close End Sub #tag EndEvent @@ -3267,49 +3203,15 @@ End dim dlg as new SaveAsDialog dlg.PromptText = "Export the file that will be served to your app through your web site:" - dlg.Filter = FileTypes1.TextHtml dlg.ActionButtonCaption = "Export" - dlg.SuggestedFileName = "UpdateInformation.html" + dlg.SuggestedFileName = MyKajuFile.ExportFilename dim f as FolderItem = dlg.ShowModalWithin( self ) if f is nil then return end if - dim data as JSONItem = KajuJSON - data.Compact = false - data.EscapeSlashes = false - - // - // Perform $VERSION$ substitutions - // - dim keys() as string = Array( Kaju.UpdateInformation.kMacBinaryName, Kaju.UpdateInformation.kWindowsBinaryName, _ - Kaju.UpdateInformation.kLinuxBinaryName ) - - dim lastVersionIndex as integer = data.Count - 1 - for versionIndex as integer = 0 to lastVersionIndex - dim thisVersionData as JSONItem = data( versionIndex ) - dim thisVersion as string = thisVersionData.Value( fldVersion.DataField ) - for each binaryKey as string in keys - if thisVersionData.HasName( binaryKey ) then - dim binaryData as JSONItem = thisVersionData.Value( binaryKey ) - dim url as string = binaryData.Value( Kaju.BinaryInformation.kKeyURL ) - url = InsertVersion( url, thisVersion ) - binaryData.Value( Kaju.BinaryInformation.kKeyURL ) = url - end if - next - next - - dim dataString as string = data.ToString - - dim sig as string = Crypto.RSASign( dataString, RSAPrivateKey ) - sig = EncodeHex( sig ) - - dataString = Kaju.kUpdatePacketMarker + sig + EndOfLine.UNIX + dataString - - dim tos as TextOutputStream = TextOutputStream.Create( f ) - tos.Write dataString - tos = nil + MyKajuFile.ExportTo( f ) Exception err As RuntimeException MsgBox "Could not export data." @@ -3343,7 +3245,7 @@ End dim uc as new Kaju.UpdateChecker( App.PrefFolder ) uc.AllowedStage = me.MenuValue - dim s as string = KajuJSON.ToString + dim s as string = MyKajuFile.DataToJSON.ToString uc.TestUpdate( s ) me.MenuValue = -1 diff --git a/Kaju Classes/Kaju.xojo_code b/Kaju Classes/Kaju.xojo_code index 908b495..555cace 100644 --- a/Kaju Classes/Kaju.xojo_code +++ b/Kaju Classes/Kaju.xojo_code @@ -382,7 +382,7 @@ Protected Module Kaju #tag Constant, Name = kUpdatePacketMarker, Type = String, Dynamic = False, Default = \"KAJU ", Scope = Protected #tag EndConstant - #tag Constant, Name = Version, Type = String, Dynamic = False, Default = \"1.5.2", Scope = Protected + #tag Constant, Name = Version, Type = String, Dynamic = False, Default = \"1.5.3", Scope = Protected #tag EndConstant diff --git a/Kaju Classes/Kaju/UpdateInformation.xojo_code b/Kaju Classes/Kaju/UpdateInformation.xojo_code index 09093c0..db08420 100644 --- a/Kaju Classes/Kaju/UpdateInformation.xojo_code +++ b/Kaju Classes/Kaju/UpdateInformation.xojo_code @@ -66,6 +66,20 @@ Inherits Kaju.Information End Sub #tag EndMethod + #tag Method, Flags = &h0 + Function GetByName(propName As String) As Variant + dim prop as Introspection.PropertyInfo = PropInfoDictionary.Value( propName ) + return prop.Value( self ) + End Function + #tag EndMethod + + #tag Method, Flags = &h0 + Sub SetByName(propName As String, Assigns value As Variant) + dim prop as Introspection.PropertyInfo = PropInfoDictionary.Value( propName ) + prop.Value( self ) = value + End Sub + #tag EndMethod + #tag Property, Flags = &h0 AppName As String @@ -149,6 +163,26 @@ Inherits Kaju.Information PlatformBinary As Kaju.BinaryInformation #tag EndComputedProperty + #tag ComputedProperty, Flags = &h21 + #tag Getter + Get + static dict as Dictionary + if dict is nil then + dict = new Dictionary + dim ti as Introspection.TypeInfo = GetTypeInfo( Kaju.UpdateInformation ) + dim props() as Introspection.PropertyInfo = ti.GetProperties + for each prop as Introspection.PropertyInfo in props + dict.Value( prop.Name ) = prop + next + end if + + return dict + + End Get + #tag EndGetter + Private Shared PropInfoDictionary As Dictionary + #tag EndComputedProperty + #tag Property, Flags = &h0 ReleaseNotes As String #tag EndProperty @@ -188,6 +222,56 @@ Inherits Kaju.Information StageCode As Integer #tag EndComputedProperty + #tag ComputedProperty, Flags = &h0 + #tag Getter + Get + dim j as new JSONItem( "{}" ) + + dim props() as Introspection.PropertyInfo = Introspection.GetType( self ).GetProperties + for each prop as Introspection.PropertyInfo in props + if prop.IsComputed or not prop.CanRead or not prop.CanWrite or not prop.IsPublic then + continue for prop + end if + + dim propType as Introspection.TypeInfo = prop.PropertyType + dim propTypeName as string = propType.Name + dim isGood as boolean + select case propTypeName + case "String", "Double", "Single", "Text", "Boolean" + isGood = true + + end select + + if not isGood then + // + // See if it's an integer of some sort + // + if propTypeName.Left( 3 ) = "Int" or propTypeName.Left( 4 ) = "UInt" then + isGood = true + end if + end if + + if isGood then + j.Value( prop.Name ) = prop.Value( self ) + end if + next + + if MacBinary Isa Kaju.BinaryInformation then + j.Value( kMacBinaryName ) = MacBinary.ToJSON + end if + if WindowsBinary Isa Kaju.BinaryInformation then + j.Value( kWindowsBinaryName ) = WindowsBinary.ToJSON + end if + if LinuxBinary Isa Kaju.BinaryInformation then + j.Value( kLinuxBinaryName ) = LinuxBinary.ToJSON + end if + + return j + End Get + #tag EndGetter + ToJSON As JSONItem + #tag EndComputedProperty + #tag Property, Flags = &h0 UseTransparency As Boolean = True #tag EndProperty diff --git a/Kaju Update Test v1.kaju b/Kaju Update Test v1.kaju index 2a85bb1..74b15e0 100644 --- a/Kaju Update Test v1.kaju +++ b/Kaju Update Test v1.kaju @@ -1,120 +1,121 @@ { "PrivateKey":"308204BB020100300D06092A864886F70D0101010500048204A5308204A10201000282010100D1DE526C8D98CCBFFDB4BD71487AC16205CF851696FB2910ABBC564BFEC1261A53A90794102BCC80EFB3CED3F8E73D90FF4C426D2315DE5E31A1A6C7563A21EADBD91B1DD637FAE0BED539C186BCB81DD865CC2A2F9427F717AA5E837C53AB90691569FC45EE17AF0ACD80E0C24C864EE86D4DBB7A6010E09B4E0BC556004E02980388C654A1C676A31E3AF788754E0CF7DEEC8236D55EDD5BB7490011B27CDEE5E254099FDE98C17D5F85014622D64C3BFB6A77200050FB2C8DF9A1ACEE50CF5A8353CE68304F91EC4F463E76BCF90A15152D03308B229FFE91E4906990D0E5F2E5C3ACC106E58DB1A37095DCBD5E233D7ED4A41AA263A73C54D4F12A113881020111028201002B354D3477815754B43BCCA661BEEB942E5F6E395B51D3BFAAE302B54B09A5F65C84AEBC99EAE656C7F0503AB33EAACB076286258739354FA0CE75290A392519C3D9DFEF8DFC776A81A45EB6E708BC7E9D7E5EBD6426083A66C131938A89B2617F0BF02C68C013EF550C311F370FC14C7B259000F38C3FB5C59F208A82A5B5B4DDCEF8E9E0B91F862F58B67963C5C7E13E048D8F26984632A3E18F4D9EE0049236F6F4AF272341F51DB8902F2C1E741140A2B6FF7C0334842EFB4EABFD265327237382BCBB6830CFC848E2C8353960A22CE8363B4F299D9B3065BC5C4489589C5AF4B8389E5BBB5E82C0CFBB40A03C832A407F6120A58D95BDA473B730CA7A7702818100DA9DB083837A18AD27CE7FC6A8762982B98939FB508E2104D1C1755E65D09A1D544FFDC4F11A78903B56DFD0A1237AB71D27417007A51DCE32E8E8EDD9295930FA78EEDC18370EBFA480E3670D5522DC8DFA8A94A553219C167E9C08D6442138BBD8972A5CD068E2CC95E9C82C6111909F41BD91E063DC82ACB5A62706ED73D302818100F5C1B189B236CB86DE7C44E34487A2D67ED1DE61E1ACC45049651B965F0F836918E2D65FA78696AF43F5E8DDCEB4958A772B8B9BE294C661CC4E24DE2AC1ACE046227C390ADA9CE10D47CC2F8B75B7AC1AB2BF979D0028122192DA3521D625DA58B1ADB8879D80DFD7AE281B9B08DD833EBAAC5F09638E4D3FA4FCBE119571DB0281804D2898A6E31C08B595942D18F029B44C417BBA1C76C8C05C0DCBCF12420D6391E185A4DC18DC2A8D421EA958B157D0F555956263C67682FD7B614326C51DA7023A48CCC626AA05349469B9ABE69684C6503A4F074968A273533BBE99B508FCAA9CA6CBF0D576BB9B5743F8288822426F474461064F324DD3C47C58C27AEA651D02818100D8D8151F24C6EFD15AE61EAA69A4DAF97EF569DDE53E16A131B390CFF98628A806E644AEC0FE48B8C37EA04B3DEAA210C380C67A7CA163BFB444F35A9E326B5C7A1E6D9BBE486C4E1AC6E15720B32997DB526CD1120F326A59DBEDB669265DA28A7EA85786B8266B27B7C9094C8F5A0A648698179EDF5F715646486B78ED46570281806AD89D03EF77E1E3507B3105D04DCA1DCF84CCC9B5B4AE02BC1084C20C476BDFCB2E2EF6A04F1AB0AC60CD42A2696487E00477D5C27435F1BA04CED16F741CC4713EE0DF7DD8BE0596A42A5995886D0C989AB8DA642CE0803F4C7BA4F36795025CFEF4B33423A4309309DE6EDB6F65AF71CD3A79CD67458A1067DE6A21067E83", "PublicKey":"30820120300D06092A864886F70D01010105000382010D00308201080282010100D1DE526C8D98CCBFFDB4BD71487AC16205CF851696FB2910ABBC564BFEC1261A53A90794102BCC80EFB3CED3F8E73D90FF4C426D2315DE5E31A1A6C7563A21EADBD91B1DD637FAE0BED539C186BCB81DD865CC2A2F9427F717AA5E837C53AB90691569FC45EE17AF0ACD80E0C24C864EE86D4DBB7A6010E09B4E0BC556004E02980388C654A1C676A31E3AF788754E0CF7DEEC8236D55EDD5BB7490011B27CDEE5E254099FDE98C17D5F85014622D64C3BFB6A77200050FB2C8DF9A1ACEE50CF5A8353CE68304F91EC4F463E76BCF90A15152D03308B229FFE91E4906990D0E5F2E5C3ACC106E58DB1A37095DCBD5E233D7ED4A41AA263A73C54D4F12A113881020111", + "ExportFilename":"UpdateInformation.html", "KajuData":[ { - "Version":"1.1 (10)", - "ReleaseNotes":"
This is a fake update for v.1.1 (10). It will really point to a binary of 1.0. (This demonstrates the use of the optional build number for final versions.)<\/p>\n\r
In other words, the app will replace itself.<\/p>\n\n
NOTE<\/b>: The update will warn you that the update will require a payment. THIS IS A LIE!!<\/u> It’s only set that way to test the “Requires Payment” option.<\/p>\n\n This is a fake update for v.1.1 (10). It will really point to a binary of 1.0. (This demonstrates the use of the optional build number for final versions.)<\/p>\n\r In other words, the app will replace itself.<\/p>\n\n NOTE<\/b>: The update will warn you that the update will require a payment. THIS IS A LIE!!<\/u> It’s only set that way to test the “Requires Payment” option.<\/p>\n\n A phony development version pointing to the same binary. Meant as a placeholder to demonstrate multiple versions.<\/p>\n\n Note that this version has a name change.<\/p>",
- "ImageURL":"",
- "UseTransparency":false,
- "MinimumRequiredVersion":"",
"AppName":"New Kaju Update Test",
- "RequiresPayment":false,
+ "ImageURL":"",
+ "LinuxBinary":{
+ "Hash":"921DAF87E4CE227BB36FCE64A88EC887",
+ "URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Linux.zip",
+ "ExecutableName":"Kaju Update Test"
+ },
"MacBinary":{
- "Hash":"600DAE3C8C9AC6B581C5EFCBDC6AA59E",
+ "Hash":"580E5E1739AACA02BC6436DF41D3C960",
"URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Mac.zip"
},
+ "MinimumRequiredVersion":"",
+ "ReleaseNotes":" A phony development version pointing to the same binary. Meant as a placeholder to demonstrate multiple versions.<\/p>\n\n Note that this version has a name change.<\/p>",
+ "RequiresPayment":false,
+ "UseTransparency":false,
+ "Version":"1.2.2d5",
"WindowsBinary":{
- "Hash":"8E071A66783625B2DE8E65E310E213A8",
+ "Hash":"70027AF7061DC79F56A6C5CD93C4C95E",
"URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Win.zip",
"ExecutableName":"Kaju Update Test.exe"
- },
- "LinuxBinary":{
- "Hash":"0C3E778999CAA6BBF5FA51301BE517DC",
- "URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Linux.zip",
- "ExecutableName":"Kaju Update Test"
}
},
{
- "Version":"1.2.1a4",
- "ReleaseNotes":" A phony alpha pointing to the same binary. Meant as a placeholder to demonstrate multiple versions.<\/p>",
- "ImageURL":"",
- "UseTransparency":false,
- "MinimumRequiredVersion":"",
"AppName":"Kaju Update Test",
- "RequiresPayment":false,
+ "ImageURL":"",
+ "LinuxBinary":{
+ "Hash":"921DAF87E4CE227BB36FCE64A88EC887",
+ "URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Linux.zip",
+ "ExecutableName":"Kaju Update Test"
+ },
"MacBinary":{
- "Hash":"600DAE3C8C9AC6B581C5EFCBDC6AA59E",
+ "Hash":"580E5E1739AACA02BC6436DF41D3C960",
"URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Mac.zip"
},
+ "MinimumRequiredVersion":"",
+ "ReleaseNotes":" A phony alpha pointing to the same binary. Meant as a placeholder to demonstrate multiple versions.<\/p>",
+ "RequiresPayment":false,
+ "UseTransparency":false,
+ "Version":"1.2.1a4",
"WindowsBinary":{
- "Hash":"8E071A66783625B2DE8E65E310E213A8",
+ "Hash":"70027AF7061DC79F56A6C5CD93C4C95E",
"URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Win.zip",
"ExecutableName":"Kaju Update Test.exe"
- },
- "LinuxBinary":{
- "Hash":"0C3E778999CAA6BBF5FA51301BE517DC",
- "URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Linux.zip",
- "ExecutableName":"Kaju Update Test"
}
},
{
- "Version":"1.2b2",
- "ReleaseNotes":" A phony beta pointing to the same binary. Meant as a placeholder to demonstrate multiple versions.<\/p>\n\n IMPORTANT<\/b>: The URL’s for the binaries have been intentionally switched to test the hash function. Attempting to update to this version should result in an error.<\/b>",
- "ImageURL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Some_Image_beta.png",
- "UseTransparency":true,
- "MinimumRequiredVersion":"",
"AppName":"Kaju Update Test",
- "RequiresPayment":false,
+ "ImageURL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Some_Image_beta.png",
+ "LinuxBinary":{
+ "Hash":"070DF4E3FC0B42F646999C613EE2B2F8",
+ "URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Win.zip",
+ "ExecutableName":"Kaju Update Test"
+ },
"MacBinary":{
"Hash":"770CBE477DFB2F24040697997835CE00",
"URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Linux.zip"
},
+ "MinimumRequiredVersion":"",
+ "ReleaseNotes":" A phony beta pointing to the same binary. Meant as a placeholder to demonstrate multiple versions.<\/p>\n\n IMPORTANT<\/b>: The URL’s for the binaries have been intentionally switched to test the hash function. Attempting to update to this version should result in an error.<\/b>",
+ "RequiresPayment":false,
+ "UseTransparency":true,
+ "Version":"1.2b2",
"WindowsBinary":{
"Hash":"DAE0E76052F66DDB4784E01830A02D14",
"URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Mac.zip",
"ExecutableName":"Kaju Update Test.exe"
- },
- "LinuxBinary":{
- "Hash":"070DF4E3FC0B42F646999C613EE2B2F8",
- "URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Win.zip",
- "ExecutableName":"Kaju Update Test"
}
},
{
- "Version":"0.9",
- "ReleaseNotes":" A fake release that should never appear. (Except in Preview.)<\/p>",
- "ImageURL":"",
- "UseTransparency":false,
- "MinimumRequiredVersion":"",
"AppName":"Kaju Update Test",
- "RequiresPayment":false,
+ "ImageURL":"",
+ "LinuxBinary":{
+ "Hash":"921DAF87E4CE227BB36FCE64A88EC887",
+ "URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Linux.zip",
+ "ExecutableName":"Kaju Update Test"
+ },
"MacBinary":{
- "Hash":"600DAE3C8C9AC6B581C5EFCBDC6AA59E",
+ "Hash":"580E5E1739AACA02BC6436DF41D3C960",
"URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Mac.zip"
},
+ "MinimumRequiredVersion":"",
+ "ReleaseNotes":" A fake release that should never appear. (Except in Preview.)<\/p>",
+ "RequiresPayment":false,
+ "UseTransparency":false,
+ "Version":"0.9",
"WindowsBinary":{
- "Hash":"8E071A66783625B2DE8E65E310E213A8",
+ "Hash":"70027AF7061DC79F56A6C5CD93C4C95E",
"URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Win.zip",
"ExecutableName":"Kaju Update Test.exe"
- },
- "LinuxBinary":{
- "Hash":"0C3E778999CAA6BBF5FA51301BE517DC",
- "URL":"http:\/\/www.mactechnologies.com\/Kaju_Test\/Kaju_Update_Test_Linux.zip",
- "ExecutableName":"Kaju Update Test"
}
}
]
diff --git a/README.md b/README.md
index 333932d..6bb3ad3 100644
--- a/README.md
+++ b/README.md
@@ -392,5 +392,11 @@ Add a translation for each, then submit a pull request as outlined above.
- Added what should be an unneeded, but apparently necessary, GOTO to the Windows script.
1.5.2 (July 17, 2015)
+
- Added Italian translation.
+1.5.3 (July 20, 2015)
+
+- **Admin app**: Split the file settings from the Admin window so a file can be manipulated independently.
+- **Admin app**: Save the last export file name to suggest it for the next export.
+
diff --git a/Update Test Files (Upload These)/Kaju_Update_Test_Linux.zip b/Update Test Files (Upload These)/Kaju_Update_Test_Linux.zip
index 912753a..62df4fd 100644
Binary files a/Update Test Files (Upload These)/Kaju_Update_Test_Linux.zip and b/Update Test Files (Upload These)/Kaju_Update_Test_Linux.zip differ
diff --git a/Update Test Files (Upload These)/Kaju_Update_Test_Mac.zip b/Update Test Files (Upload These)/Kaju_Update_Test_Mac.zip
index 5557f32..eeb399b 100644
Binary files a/Update Test Files (Upload These)/Kaju_Update_Test_Mac.zip and b/Update Test Files (Upload These)/Kaju_Update_Test_Mac.zip differ
diff --git a/Update Test Files (Upload These)/Kaju_Update_Test_Win.zip b/Update Test Files (Upload These)/Kaju_Update_Test_Win.zip
index af63ba9..ff01243 100644
Binary files a/Update Test Files (Upload These)/Kaju_Update_Test_Win.zip and b/Update Test Files (Upload These)/Kaju_Update_Test_Win.zip differ
diff --git a/Update Test Files (Upload These)/UpdateInformation.html b/Update Test Files (Upload These)/UpdateInformation.html
index ed64974..5d7d4e3 100644
--- a/Update Test Files (Upload These)/UpdateInformation.html
+++ b/Update Test Files (Upload These)/UpdateInformation.html
@@ -1,118 +1,118 @@
-KAJU 6C241FEEA7B9DFEA19783BE3D609A793A83C1D3EE5B6248A3AE5C1C1D793A98ABAA77284527D3A68BE926AB694DFC337F0D3CD96203FB7463DAA66BE8ECA94A6733470949C771C33F47BCF22CBAB15693CEA34BC8CBE1E27B3E354922820FDE6CDB0E4423BA9EFFF552634CBB99B35D483D4A69268EF5229A39EB4F6BF465A173C6964066A82227C089D3D106D33EA7E6B86FA91020AA2F5B2D0FD9480A98288DFA81908ADF20E90AE48D28FDDB516764B884F49F2D75130B7FB3B478FC7ED92E60513B2D8750A1AA176DBC39B73B279FC8D8BD4C919ABF68CFA8CB029EDF53B473C3D43028F82AB11145C05C38CF7C532845209D95B6E484B77E342D5E95C86
+KAJU 3A9F6F608297FE245CF0742B858AA0594956CA3F0C6922375C9D99E0E5E568793660C8B0EFDC28C5D428EC5E764CFEFF7E60B20833F758F9EA04B0E5910B30CF10BE835C620407C2AD903C46F6203734E0848367FADB02B696F7B1FB10EF740FF36C83AAB6D5884D4401D987BAE02D6C9F8EA5E961F81E678C3E997516DB1383B56F10272CDFBDADCAB704F59B489BA28E7B03CADA9B4A45EC4DAB77969D5D2F6A9FE3809259F3B0E678029428B7B9200EA32DCC15B2C24A38C7AD8CF268BEA38F4A57BC00F30CF6B388269AB270D7590D48B2869B03F5A325206426DE4FCEEABCA091757EEAC4A6AACF7CEF30B2341782ED0C9B80AFEBA5A52BF36800790DE6
[
{
- "Version":"1.1 (10)",
- "ReleaseNotes":" This is a fake update for v.1.1 (10). It will really point to a binary of 1.0. (This demonstrates the use of the optional build number for final versions.) In other words, the app will replace itself. NOTE: The update will warn you that the update will require a payment. THIS IS A LIE!! It’s only set that way to test the “Requires Payment” option. This is a fake update for v.1.1 (10). It will really point to a binary of 1.0. (This demonstrates the use of the optional build number for final versions.) In other words, the app will replace itself. NOTE: The update will warn you that the update will require a payment. THIS IS A LIE!! It’s only set that way to test the “Requires Payment” option. A phony development version pointing to the same binary. Meant as a placeholder to demonstrate multiple versions. Note that this version has a name change. A phony development version pointing to the same binary. Meant as a placeholder to demonstrate multiple versions. Note that this version has a name change. A phony alpha pointing to the same binary. Meant as a placeholder to demonstrate multiple versions. A phony alpha pointing to the same binary. Meant as a placeholder to demonstrate multiple versions. A phony beta pointing to the same binary. Meant as a placeholder to demonstrate multiple versions. IMPORTANT: The URL’s for the binaries have been intentionally switched to test the hash function. Attempting to update to this version should result in an error. A phony beta pointing to the same binary. Meant as a placeholder to demonstrate multiple versions. IMPORTANT: The URL’s for the binaries have been intentionally switched to test the hash function. Attempting to update to this version should result in an error.Changes<\/h3>\n
",
+ "RequiresPayment":false,
+ "UseTransparency":true,
+ "Version":"1.2b2",
"WindowsBinary":{
"Hash":"DAE0E76052F66DDB4784E01830A02D14",
"URL":"http://www.mactechnologies.com/Kaju_Test/Kaju_Update_Test_Mac.zip",
"ExecutableName":"Kaju Update Test.exe"
- },
- "LinuxBinary":{
- "Hash":"070DF4E3FC0B42F646999C613EE2B2F8",
- "URL":"http://www.mactechnologies.com/Kaju_Test/Kaju_Update_Test_Win.zip",
- "ExecutableName":"Kaju Update Test"
}
},
{
- "Version":"0.9",
- "ReleaseNotes":"\n
Changes<\/h3>\n
",
- "ImageURL":"http://www.mactechnologies.com/Kaju_Test/Some_Image_beta.png",
- "UseTransparency":true,
- "MinimumRequiredVersion":"",
"AppName":"Kaju Update Test",
- "RequiresPayment":false,
+ "ImageURL":"http://www.mactechnologies.com/Kaju_Test/Some_Image_beta.png",
+ "LinuxBinary":{
+ "Hash":"070DF4E3FC0B42F646999C613EE2B2F8",
+ "URL":"http://www.mactechnologies.com/Kaju_Test/Kaju_Update_Test_Win.zip",
+ "ExecutableName":"Kaju Update Test"
+ },
"MacBinary":{
"Hash":"770CBE477DFB2F24040697997835CE00",
"URL":"http://www.mactechnologies.com/Kaju_Test/Kaju_Update_Test_Linux.zip"
},
+ "MinimumRequiredVersion":"",
+ "ReleaseNotes":"\n
Changes
\n\n
",
- "ImageURL":"",
- "UseTransparency":false,
- "MinimumRequiredVersion":"",
"AppName":"Kaju Update Test",
- "RequiresPayment":true,
+ "ImageURL":"",
+ "LinuxBinary":{
+ "Hash":"921DAF87E4CE227BB36FCE64A88EC887",
+ "URL":"http://www.mactechnologies.com/Kaju_Test/Kaju_Update_Test_Linux.zip",
+ "ExecutableName":"Kaju Update Test"
+ },
"MacBinary":{
- "Hash":"600DAE3C8C9AC6B581C5EFCBDC6AA59E",
+ "Hash":"580E5E1739AACA02BC6436DF41D3C960",
"URL":"http://www.mactechnologies.com/Kaju_Test/Kaju_Update_Test_Mac.zip"
},
+ "MinimumRequiredVersion":"",
+ "ReleaseNotes":"Changes
\n\n
",
+ "RequiresPayment":true,
+ "UseTransparency":false,
+ "Version":"1.1 (10)",
"WindowsBinary":{
- "Hash":"8E071A66783625B2DE8E65E310E213A8",
+ "Hash":"70027AF7061DC79F56A6C5CD93C4C95E",
"URL":"http://www.mactechnologies.com/Kaju_Test/Kaju_Update_Test_Win.zip",
"ExecutableName":"Kaju Update Test.exe"
- },
- "LinuxBinary":{
- "Hash":"0C3E778999CAA6BBF5FA51301BE517DC",
- "URL":"http://www.mactechnologies.com/Kaju_Test/Kaju_Update_Test_Linux.zip",
- "ExecutableName":"Kaju Update Test"
}
},
{
- "Version":"1.2.2d5",
- "ReleaseNotes":"
A fake release that should never appear. (Except in Preview.)
", - "ImageURL":"", - "UseTransparency":false, - "MinimumRequiredVersion":"", "AppName":"Kaju Update Test", - "RequiresPayment":false, + "ImageURL":"", + "LinuxBinary":{ + "Hash":"921DAF87E4CE227BB36FCE64A88EC887", + "URL":"http://www.mactechnologies.com/Kaju_Test/Kaju_Update_Test_Linux.zip", + "ExecutableName":"Kaju Update Test" + }, "MacBinary":{ - "Hash":"600DAE3C8C9AC6B581C5EFCBDC6AA59E", + "Hash":"580E5E1739AACA02BC6436DF41D3C960", "URL":"http://www.mactechnologies.com/Kaju_Test/Kaju_Update_Test_Mac.zip" }, + "MinimumRequiredVersion":"", + "ReleaseNotes":"A fake release that should never appear. (Except in Preview.)
", + "RequiresPayment":false, + "UseTransparency":false, + "Version":"0.9", "WindowsBinary":{ - "Hash":"8E071A66783625B2DE8E65E310E213A8", + "Hash":"70027AF7061DC79F56A6C5CD93C4C95E", "URL":"http://www.mactechnologies.com/Kaju_Test/Kaju_Update_Test_Win.zip", "ExecutableName":"Kaju Update Test.exe" - }, - "LinuxBinary":{ - "Hash":"0C3E778999CAA6BBF5FA51301BE517DC", - "URL":"http://www.mactechnologies.com/Kaju_Test/Kaju_Update_Test_Linux.zip", - "ExecutableName":"Kaju Update Test" } } ] \ No newline at end of file