func addIcon(coff *coff.Coff, fname string, newID <-chan uint16) error { f, err := os.Open(fname) if err != nil { return err } //defer f.Close() don't defer, files will be closed by OS when app closes icons, err := ico.DecodeHeaders(f) if err != nil { return err } 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(f, int64(icon.ImageOffset), int64(icon.BytesInRes)) coff.AddResource(rtIcon, id, r) group.Entries = append(group.Entries, gRPICONDIRENTRY{IconDirEntryCommon: icon.IconDirEntryCommon, ID: id}) } id := <-newID coff.AddResource(rtGroupIcon, id, group) } return nil }
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) }