TimeTrial.java
上传用户:gyyuli
上传日期:2013-07-09
资源大小:3050k
文件大小:6k
源码类别:

J2ME

开发平台:

Java

  1. import javax.microedition.rms.*;
  2. import java.util.*;
  3. import java.io.*;
  4. public class TimeTrial extends BaseRMS {
  5.   public static final int TT_DATE = 0;
  6.   public static final int TT_DAYS = 1;
  7.   public static final int TT_PLAYS = 2;
  8.   public static final int MAX_NUM_DAYS = 30;
  9.   public static final int MAX_NUM_PLAYS = 10;
  10.   
  11.   Calendar currentCalendar;
  12.   Date currentDate;
  13.   int  currentDateAsInt; // YYYYMMDD
  14.   
  15.   private int timeTrialType;
  16.   private String value;
  17.   private String decryptedValue;
  18.   private int numDays;
  19.   private int numPlays;
  20.   /**
  21.    * Constructor
  22.    */
  23.   public TimeTrial(String rmsName,int timeTrialType) throws Exception {
  24.     super(rmsName);
  25.     setTimeTrialType(timeTrialType);
  26.     
  27.     currentDate = new Date();
  28.     currentCalendar = Calendar.getInstance();
  29.     currentCalendar.setTime(currentDate);      
  30.     currentDateAsInt = getCurrentDateAsInt();
  31.     
  32.   }
  33.   /**
  34.    * Change TimeTrial Method
  35.    */
  36.   public void setTimeTrialType(int timeTrialType) throws Exception {
  37.     if(timeTrialType == TT_DATE || timeTrialType == TT_DAYS || timeTrialType == TT_PLAYS) {
  38.       this.timeTrialType = timeTrialType;
  39.     } else {
  40.      throw new Exception("Invalid Time Trial Option");
  41.     }
  42.   }
  43.   /**
  44.    * Check if App is Exired
  45.    */
  46.   public boolean isValid(String value) throws Exception {
  47.     boolean result = false;
  48.     this.value = value;
  49.     decryptedValue = Base64.decodeToString(value);
  50.     switch (this.timeTrialType) {
  51.       case TT_DATE: result = isValidDate(); break;
  52.       case TT_DAYS: result = isValidDays(); break;
  53.       case TT_PLAYS: result = isValidPlays(); break;
  54.     };
  55.     return result;
  56.   }
  57.   /**
  58.    * Time Trial by Date
  59.    */
  60.   private boolean isValidDate() throws Exception {
  61.     boolean result = false;
  62.         
  63.     Date expireDate = new Date();
  64.     Calendar expireCalendar = Calendar.getInstance();
  65.     expireCalendar.set(Calendar.YEAR,Integer.parseInt(decryptedValue.substring(0,4)));
  66.     expireCalendar.set(Calendar.MONTH,Integer.parseInt(decryptedValue.substring(4,6)));
  67.     expireCalendar.set(Calendar.DAY_OF_MONTH,Integer.parseInt(decryptedValue.substring(6,8)));
  68.     expireDate = expireCalendar.getTime();
  69.     if (currentDate.getTime() < expireDate.getTime())
  70.       result = true;
  71.     return result;
  72.   }
  73.   /**
  74.    * Time Trial By Number of Days
  75.    */
  76.   private boolean isValidDays() throws Exception {
  77.     boolean result = false;
  78.     
  79.     loadTimeTrialData();   
  80.     if (currentDateAsInt - numDays < Integer.parseInt(decryptedValue)) {
  81.       result = true;      
  82.     }
  83.     return result;
  84.   }
  85.   /**
  86.    * Time Trial By Number of Plays
  87.    */
  88.   private boolean isValidPlays() throws Exception {
  89.     boolean result = false;
  90.     loadTimeTrialData();
  91.     System.out.println("Play: " + decryptedValue + " Plays RMS: " + numPlays);
  92.     if (numPlays <= Integer.parseInt(decryptedValue)) {     
  93.       updatePlays(++numPlays);
  94.       result = true;
  95.     }
  96.     
  97.     return result;
  98.   }
  99.   public void loadTimeTrialData() throws Exception {
  100.     try {
  101.       // Will call either loadData() or createDefaultData()
  102.       this.open();
  103.       if (this.getRecordStore() != null)
  104.         this.close();
  105.     } catch (Exception e) {
  106.       throw new Exception("Error loading Settings" + e);
  107.     }
  108.   }
  109.   private void updatePlays(int numPlays) throws Exception {
  110.     try {
  111.       // load current scores
  112.       this.open();
  113.       // Update
  114.       this.numPlays = numPlays;      
  115.       updateData();
  116.       // close
  117.       if (this.getRecordStore() != null)
  118.         this.close();
  119.     } catch (Exception e) {
  120.       throw new Exception(this.getRMSName() + "::updateTimeTrial::" + e);
  121.     }
  122.   }
  123.   
  124.   private int getCurrentDateAsInt() {
  125.     StringBuffer sb = new StringBuffer();
  126.     sb.append(String.valueOf(currentCalendar.get(Calendar.YEAR)));
  127.     if (currentCalendar.get(Calendar.MONTH) < 10)      
  128.       sb.append("0" + String.valueOf(currentCalendar.get(Calendar.MONTH)));
  129.     else
  130.       sb.append(String.valueOf(currentCalendar.get(Calendar.MONTH)));
  131.     sb.append(String.valueOf(currentCalendar.get(Calendar.DAY_OF_MONTH)));      
  132.       
  133.     return Integer.parseInt(sb.toString());        
  134.   }
  135.   ////////////////////////////////////////////////////////////
  136.   // RMS Related methods (loadData,createDefaultData, updateData) inherited from BaseRMS
  137.   protected void loadData() throws Exception {
  138.     try {
  139.         byte[] record = this.getRecordStore().getRecord(1);
  140.         DataInputStream istream = new DataInputStream(new ByteArrayInputStream(record,0,record.length));
  141.         numDays = istream.readInt();
  142.         numPlays = istream.readInt();
  143.     } catch (Exception e) {
  144.       throw new Exception (this.getRMSName() + "::loadData::" + e);
  145.     }
  146.   }
  147.   /**
  148.    * Default values for numDays will be currentDay (first day
  149.    * the user plays the game
  150.    * 
  151.    * numPlays is defaulted to zero number times played
  152.    */
  153.   protected void createDefaultData() throws Exception {
  154.     try {                      
  155.       numDays = currentDateAsInt;      
  156.       numPlays = 0;
  157.       
  158.       ByteArrayOutputStream bstream = new ByteArrayOutputStream(12);
  159.       DataOutputStream ostream = new DataOutputStream(bstream);
  160.       ostream.writeInt(numDays);
  161.       ostream.writeInt(numPlays);
  162.       ostream.flush();
  163.       ostream.close();
  164.       byte[] record = bstream.toByteArray();
  165.       this.getRecordStore().addRecord(record,0,record.length);
  166.     } catch (Exception e) {
  167.       throw new Exception(this.getRMSName() + "::createDefaultData::" + e);
  168.     }
  169.   }
  170.   protected void updateData() throws Exception {
  171.     try { 
  172.       ByteArrayOutputStream bstream = new ByteArrayOutputStream(12);
  173.       DataOutputStream ostream = new DataOutputStream(bstream);
  174.       ostream.writeInt(numDays);
  175.       ostream.writeInt(numPlays);
  176.       ostream.flush();
  177.       ostream.close();
  178.       byte[] record = bstream.toByteArray();
  179.       this.getRecordStore().setRecord(1, record, 0, record.length);
  180.     } catch(Exception e) {
  181.       throw new Exception(this.getRMSName() + "::updateData::" + e);
  182.     }
  183.   }
  184. }