|
16 | 16 | package libraries |
17 | 17 |
|
18 | 18 | import ( |
| 19 | +"bytes" |
| 20 | +"encoding/binary" |
19 | 21 | "errors" |
20 | 22 | "fmt" |
| 23 | +"io" |
21 | 24 |
|
22 | 25 | "github.com/arduino/arduino-cli/internal/arduino/cores" |
23 | 26 | "github.com/arduino/arduino-cli/internal/arduino/globals" |
@@ -90,6 +93,234 @@ func (library *Library) String() string { |
90 | 93 | returnlibrary.Name+"@"+library.Version.String() |
91 | 94 | } |
92 | 95 |
|
| 96 | +func (library*Library)MarshalBinary() []byte { |
| 97 | +buffer:=bytes.NewBuffer(make([]byte,0,4096)) |
| 98 | +writeString:=func(instring) { |
| 99 | +inBytes:= []byte(in) |
| 100 | +binary.Write(buffer,binary.NativeEndian,uint16(len(inBytes))) |
| 101 | +buffer.Write(inBytes) |
| 102 | +} |
| 103 | +writeStringArray:=func(in []string) { |
| 104 | +binary.Write(buffer,binary.NativeEndian,uint16(len(in))) |
| 105 | +for_,i:=rangein { |
| 106 | +writeString(i) |
| 107 | +} |
| 108 | +} |
| 109 | +writeMap:=func(inmap[string]bool) { |
| 110 | +binary.Write(buffer,binary.NativeEndian,uint16(len(in))) |
| 111 | +fork,v:=rangein { |
| 112 | +writeString(k) |
| 113 | +binary.Write(buffer,binary.NativeEndian,v) |
| 114 | +} |
| 115 | +} |
| 116 | +writePath:=func(in*paths.Path) { |
| 117 | +ifin==nil { |
| 118 | +writeString("") |
| 119 | +}else { |
| 120 | +writeString(in.String()) |
| 121 | +} |
| 122 | +} |
| 123 | +writeString(library.Name) |
| 124 | +writeString(library.Author) |
| 125 | +writeString(library.Maintainer) |
| 126 | +writeString(library.Sentence) |
| 127 | +writeString(library.Paragraph) |
| 128 | +writeString(library.Website) |
| 129 | +writeString(library.Category) |
| 130 | +writeStringArray(library.Architectures) |
| 131 | +writeStringArray(library.Types) |
| 132 | +writePath(library.InstallDir) |
| 133 | +writeString(library.DirName) |
| 134 | +writePath(library.SourceDir) |
| 135 | +writePath(library.UtilityDir) |
| 136 | +binary.Write(buffer,binary.NativeEndian,int32(library.Location)) |
| 137 | +// library.ContainerPlatform *cores.PlatformRelease `json:""` |
| 138 | +binary.Write(buffer,binary.NativeEndian,int32(library.Layout)) |
| 139 | +binary.Write(buffer,binary.NativeEndian,library.DotALinkage) |
| 140 | +binary.Write(buffer,binary.NativeEndian,library.Precompiled) |
| 141 | +binary.Write(buffer,binary.NativeEndian,library.PrecompiledWithSources) |
| 142 | +writeString(library.LDflags) |
| 143 | +binary.Write(buffer,binary.NativeEndian,library.IsLegacy) |
| 144 | +binary.Write(buffer,binary.NativeEndian,library.InDevelopment) |
| 145 | +writeString(library.Version.String()) |
| 146 | +writeString(library.License) |
| 147 | +//writeStringArray(library.Properties.AsSlice()) |
| 148 | +writeStringArray(library.Examples.AsStrings()) |
| 149 | +writeStringArray(library.declaredHeaders) |
| 150 | +writeStringArray(library.sourceHeaders) |
| 151 | +writeMap(library.CompatibleWith) |
| 152 | +returnbuffer.Bytes() |
| 153 | +} |
| 154 | + |
| 155 | +func (library*Library)UnmarshalBinary(in io.Reader)error { |
| 156 | +readString:=func() (string,error) { |
| 157 | +varlenuint16 |
| 158 | +iferr:=binary.Read(in,binary.NativeEndian,&len);err!=nil { |
| 159 | +return"",err |
| 160 | +} |
| 161 | +res:=make([]byte,len) |
| 162 | +if_,err:=in.Read(res);err!=nil { |
| 163 | +return"",err |
| 164 | +} |
| 165 | +returnstring(res),nil |
| 166 | +} |
| 167 | +readStringArray:=func() ([]string,error) { |
| 168 | +varlenuint16 |
| 169 | +iferr:=binary.Read(in,binary.NativeEndian,&len);err!=nil { |
| 170 | +returnnil,err |
| 171 | +} |
| 172 | +res:=make([]string,len) |
| 173 | +fori:=rangeres { |
| 174 | +varerrerror |
| 175 | +res[i],err=readString() |
| 176 | +iferr!=nil { |
| 177 | +returnnil,err |
| 178 | +} |
| 179 | +} |
| 180 | +returnres,nil |
| 181 | +} |
| 182 | +readMap:=func() (map[string]bool,error) { |
| 183 | +varlenuint16 |
| 184 | +iferr:=binary.Read(in,binary.NativeEndian,&len);err!=nil { |
| 185 | +returnnil,err |
| 186 | +} |
| 187 | +res:=map[string]bool{} |
| 188 | +fori:=uint16(0);i<len;i++ { |
| 189 | +k,err:=readString() |
| 190 | +iferr!=nil { |
| 191 | +returnnil,err |
| 192 | +} |
| 193 | +varvbool |
| 194 | +iferr:=binary.Read(in,binary.NativeEndian,&v);err!=nil { |
| 195 | +returnnil,err |
| 196 | +} |
| 197 | +res[k]=v |
| 198 | +} |
| 199 | +returnres,nil |
| 200 | +} |
| 201 | +varerrerror |
| 202 | +library.Name,err=readString() |
| 203 | +iferr!=nil { |
| 204 | +returnerr |
| 205 | +} |
| 206 | +library.Author,err=readString() |
| 207 | +iferr!=nil { |
| 208 | +returnerr |
| 209 | +} |
| 210 | +library.Maintainer,err=readString() |
| 211 | +iferr!=nil { |
| 212 | +returnerr |
| 213 | +} |
| 214 | +library.Sentence,err=readString() |
| 215 | +iferr!=nil { |
| 216 | +returnerr |
| 217 | +} |
| 218 | +library.Paragraph,err=readString() |
| 219 | +iferr!=nil { |
| 220 | +returnerr |
| 221 | +} |
| 222 | +library.Website,err=readString() |
| 223 | +iferr!=nil { |
| 224 | +returnerr |
| 225 | +} |
| 226 | +library.Category,err=readString() |
| 227 | +iferr!=nil { |
| 228 | +returnerr |
| 229 | +} |
| 230 | +library.Architectures,err=readStringArray() |
| 231 | +iferr!=nil { |
| 232 | +returnerr |
| 233 | +} |
| 234 | +library.Types,err=readStringArray() |
| 235 | +iferr!=nil { |
| 236 | +returnerr |
| 237 | +} |
| 238 | +installDir,err:=readString() |
| 239 | +iferr!=nil { |
| 240 | +returnerr |
| 241 | +} |
| 242 | +library.InstallDir=paths.New(installDir) |
| 243 | +library.DirName,err=readString() |
| 244 | +iferr!=nil { |
| 245 | +returnerr |
| 246 | +} |
| 247 | +sourceDir,err:=readString() |
| 248 | +library.SourceDir=paths.New(sourceDir) |
| 249 | +iferr!=nil { |
| 250 | +returnerr |
| 251 | +} |
| 252 | +utilityDir,err:=readString() |
| 253 | +iferr!=nil { |
| 254 | +returnerr |
| 255 | +} |
| 256 | +library.UtilityDir=paths.New(utilityDir) |
| 257 | +varlocationint32 |
| 258 | +iferr:=binary.Read(in,binary.NativeEndian,&location);err!=nil { |
| 259 | +returnerr |
| 260 | +} |
| 261 | +library.Location=LibraryLocation(location) |
| 262 | +// library.ContainerPlatform *cores.PlatformRelease `json:""` |
| 263 | +varlayoutint32 |
| 264 | +iferr:=binary.Read(in,binary.NativeEndian,&layout);err!=nil { |
| 265 | +returnerr |
| 266 | +} |
| 267 | +library.Layout=LibraryLayout(layout) |
| 268 | +iferr:=binary.Read(in,binary.NativeEndian,&library.DotALinkage);err!=nil { |
| 269 | +returnerr |
| 270 | +} |
| 271 | +iferr:=binary.Read(in,binary.NativeEndian,&library.Precompiled);err!=nil { |
| 272 | +returnerr |
| 273 | +} |
| 274 | +iferr:=binary.Read(in,binary.NativeEndian,&library.PrecompiledWithSources);err!=nil { |
| 275 | +returnerr |
| 276 | +} |
| 277 | +library.LDflags,err=readString() |
| 278 | +iferr!=nil { |
| 279 | +returnerr |
| 280 | +} |
| 281 | +iferr:=binary.Read(in,binary.NativeEndian,&library.IsLegacy);err!=nil { |
| 282 | +returnerr |
| 283 | +} |
| 284 | +iferr:=binary.Read(in,binary.NativeEndian,&library.InDevelopment);err!=nil { |
| 285 | +returnerr |
| 286 | +} |
| 287 | +version,err:=readString() |
| 288 | +iferr!=nil { |
| 289 | +returnerr |
| 290 | +} |
| 291 | +library.Version=semver.MustParse(version) |
| 292 | +library.License,err=readString() |
| 293 | +iferr!=nil { |
| 294 | +returnerr |
| 295 | +} |
| 296 | +// props, err := readStringArray() |
| 297 | +// if err != nil { |
| 298 | +// return err |
| 299 | +// } |
| 300 | +// library.Properties, err = properties.LoadFromSlice(props) |
| 301 | +// if err != nil { |
| 302 | +// return err |
| 303 | +// } |
| 304 | +examples,err:=readStringArray() |
| 305 | +iferr!=nil { |
| 306 | +returnerr |
| 307 | +} |
| 308 | +library.Examples=paths.NewPathList(examples...) |
| 309 | +library.declaredHeaders,err=readStringArray() |
| 310 | +iferr!=nil { |
| 311 | +returnerr |
| 312 | +} |
| 313 | +library.sourceHeaders,err=readStringArray() |
| 314 | +iferr!=nil { |
| 315 | +returnerr |
| 316 | +} |
| 317 | +library.CompatibleWith,err=readMap() |
| 318 | +iferr!=nil { |
| 319 | +returnerr |
| 320 | +} |
| 321 | +returnnil |
| 322 | +} |
| 323 | + |
93 | 324 | // ToRPCLibrary converts this library into an rpc.Library |
94 | 325 | func (library*Library)ToRPCLibrary() (*rpc.Library,error) { |
95 | 326 | pathOrEmpty:=func(p*paths.Path)string { |
|