1 package com.tapina.robe.module;
2
3 import com.tapina.robe.runtime.ByteArrayUtils;
4 import com.tapina.robe.runtime.DataBlock;
5
6 import java.util.logging.Logger;
7
8 /***
9 * This interface represents a RISC OS Module.
10 * Other interfaces represent additional capabilities of modules.
11 * @see com.tapina.robe.swi.SWIHandler
12 */
13 public abstract class Module extends DataBlock {
14 private static final int TITLE_STRING = 0x10;
15 private static final int HELP_STRING = 0x14;
16
17 protected final Logger log = Logger.getLogger(getClass().getName());
18
19 protected Module() {
20 super(0);
21 }
22
23 public String getName() {
24 final String className = getClass().getName();
25 return className.substring(className.lastIndexOf('.') + 1);
26 }
27
28 public String getHelp() {
29 final String name = getName();
30 final StringBuffer help = new StringBuffer(name.length() + 40);
31 help.append(name);
32 if (name.length() < 8) {
33 help.append('\t');
34 }
35 help.append('\t').append("9.99 (06 Jun 2005) ROBE");
36 return help.toString();
37 }
38
39 byte[] data = null;
40
41 public final int getSize() {
42 return 0x34 + getName().length() + getHelp().length() + 2;
43 }
44
45 public final void setSize(int newSize) {
46 throw new UnsupportedOperationException("Cannot set size of a module");
47 }
48
49 public byte[] getBytes() {
50 if (data == null) {
51 data = new byte[getSize()];
52 final int titleOffset = 0x34;
53 ByteArrayUtils.putInt(data, TITLE_STRING, titleOffset);
54 ByteArrayUtils.putString0(data, titleOffset, getName());
55 final int helpOffset = titleOffset + getName().length() + 1;
56 ByteArrayUtils.putInt(data, HELP_STRING, helpOffset);
57 ByteArrayUtils.putString0(data, helpOffset, getHelp());
58 }
59 return data;
60 }
61 }