001    package org.bridj;
002    import org.bridj.ann.*;
003    import java.util.List;
004    import java.util.Date;
005    
006    /**
007     * Wraps a value which size is the same as the 'time_t' C type (defined in time.h)
008     * @author Olivier
009     */
010    public final class TimeT extends AbstractIntegral {
011        
012            public static final int SIZE = Platform.TIME_T_SIZE;
013            static {
014                    BridJ.register();
015            }
016            
017        public TimeT(long value) {
018            super(value);
019        }
020        
021        public Date toDate() {
022                    return new Date(value);
023        }
024        
025        public static TimeT valueOf(long value) {
026                    return new TimeT(value);
027        }
028            
029            public static TimeT valueOf(Date value) {
030                    return valueOf(value.getTime());
031        }
032        
033        @Override
034        public String toString() {
035                    return "TimeT(value = " + value + ", time = " + toDate() + ")";
036        }
037            
038            @Struct(customizer = timeval_customizer.class)
039            public static class timeval extends StructObject {
040                     
041                    public long getTime() {
042                            return seconds() * 1000 + milliseconds();
043                    }
044                    
045                    @Field(0) 
046                    public long seconds() {
047                            return this.io.getCLongField(this, 0);
048                    }
049                    @Field(0) 
050                    public timeval seconds(long seconds) {
051                            this.io.setCLongField(this, 0, seconds);
052                            return this;
053                    }
054                    public final long seconds_$eq(long seconds) {
055                            seconds(seconds);
056                            return seconds;
057                    }
058                    @Field(1) 
059                    public int milliseconds() {
060                            return this.io.getIntField(this, 1);
061                    }
062                    @Field(1) 
063                    public timeval milliseconds(int milliseconds) {
064                            this.io.setIntField(this, 1, milliseconds);
065                            return this;
066                    }
067                    public final int milliseconds_$eq(int milliseconds) {
068                            milliseconds(milliseconds);
069                            return milliseconds;
070                    }
071            }
072    
073            public static class timeval_customizer extends StructIO.DefaultCustomizer {
074                    @Override
075                    public void beforeLayout(StructIO io, List<StructIO.AggregatedFieldDesc> aggregatedFields) {
076                            StructIO.AggregatedFieldDesc secondsField = aggregatedFields.get(0);
077                            if (Platform.isWindows() || !Platform.is64Bits())
078                                    secondsField.byteLength = 4;
079                            else
080                                    secondsField.byteLength = 8;
081                            
082                            secondsField.alignment = secondsField.byteLength;
083                    }
084            }
085    }