// WriteSyso creates a resource file from the version info and optionally an icon func (vi *VersionInfo) WriteSyso(filename string) error { // Channel for generating IDs newID := make(chan uint16) go func() { for i := uint16(1); ; i++ { newID <- i } }() // Create a new RSRC section coff := coff.NewRSRC() // ID 16 is for Version Information coff.AddResource(16, 1, sizedReader{&vi.Buffer}) // If icon is enabled if vi.IconPath != "" { if err := addIcon(coff, vi.IconPath, newID); err != nil { return err } } coff.Freeze() // Write to file return writeCoff(coff, filename) }
func run(fnamein, fnameico, fnameout string) error { newid := make(chan uint16) go func() { for i := uint16(1); ; i++ { newid <- i } }() coff := coff.NewRSRC() if fnamein != "" { manifest, err := binutil.SizedOpen(fnamein) if err != nil { return fmt.Errorf("Error opening manifest file '%s': %s", fnamein, err) } defer manifest.Close() id := <-newid coff.AddResource(RT_MANIFEST, id, manifest) fmt.Println("Manifest ID: ", id) } if fnameico != "" { for _, fnameicosingle := range strings.Split(fnameico, ",") { err := addicon(coff, fnameicosingle, newid) if err != nil { return err } } } coff.Freeze() return write(coff, fnameout) }
func run(fnamein, fnameico, fnameout string) error { manifest, err := binutil.SizedOpen(fnamein) if err != nil { return fmt.Errorf("Error opening manifest file '%s': %s", fnamein, err) } defer manifest.Close() var icons []ico.ICONDIRENTRY var iconsf *os.File if fnameico != "" { iconsf, err = os.Open(fnameico) if err != nil { return err } defer iconsf.Close() icons, err = ico.DecodeHeaders(iconsf) if err != nil { return err } } newid := make(chan uint16) go func() { for i := uint16(1); ; i++ { newid <- i } }() coff := coff.NewRSRC() coff.AddResource(RT_MANIFEST, <-newid, manifest) if len(icons) > 0 { // RT_ICONs group := GRPICONDIR{ICONDIR: ico.ICONDIR{ Reserved: 0, // magic num. Type: 1, // magic num. Count: uint16(len(icons)), }} for _, icon := range icons { id := <-newid r := io.NewSectionReader(iconsf, int64(icon.ImageOffset), int64(icon.BytesInRes)) coff.AddResource(RT_ICON, id, r) group.Entries = append(group.Entries, GRPICONDIRENTRY{icon.IconDirEntryCommon, id}) } // RT_GROUP_ICON coff.AddResource(RT_GROUP_ICON, <-newid, group) } coff.Freeze() return write(coff, fnameout) }
func rundata(fnamedata, fnameout string) error { if !strings.HasSuffix(fnameout, ".syso") { return fmt.Errorf("Output file name '%s' must end with '.syso'", fnameout) } symname := strings.TrimSuffix(fnameout, ".syso") ok, err := regexp.MatchString(`^[a-z0-9_]+$`, symname) if err != nil { return fmt.Errorf("Internal error: %s", err) } if !ok { return fmt.Errorf("Output file name '%s' must be composed of only lowercase letters (a-z), digits (0-9) and underscore (_)", fnameout) } dat, err := binutil.SizedOpen(fnamedata) if err != nil { return fmt.Errorf("Error opening data file '%s': %s", fnamedata, err) } defer dat.Close() coff := coff.NewRDATA() coff.AddData("_brsrc_"+symname, dat) coff.AddData("_ersrc_"+symname, io.NewSectionReader(strings.NewReader("\000\000"), 0, 2)) // TODO: why? copied from as-generated coff.Freeze() err = write(coff, fnameout) if err != nil { return err } //FIXME: output a .c file fmt.Println(strings.Replace(`#include "runtime.h" extern byte _brsrc_NAME[], _ersrc_NAME; /* func get_NAME() []byte */ void ·get_NAME(Slice a) { a.array = _brsrc_NAME; a.len = a.cap = &_ersrc_NAME - _brsrc_NAME; FLUSH(&a); }`, "NAME", symname, -1)) return nil }