вторник, 29 июля 2008 г.

Не надо использовать ничего из com.sun.*

В общем, я почти дописала свой мидлет. И оказалось, что на целевой телефон (Nokia N73) он вообще отказывается ставиться. Authorisation error и все. Погуглив, узнала, что во всем виноват пакет com.sun.midp.io.Base64. Люди пишут, что вообще не стоит использовать какие-либо возможности из пакетов, которые называются com.sun.*, ибо это приводит к несовместимости мидлета с некоторыми устройствами. А так как работа с Base64 все-таки нужна, пришлось добавить в код следующее:
private static char[] base64map = new char[64];

static
{
  int i = 0;
  for (char c = 'A'; c <= 'Z'; c++)
  {
    base64map[i++] = c;
  }
  for (char c = 'a'; c <= 'z'; c++)
  {
    base64map[i++] = c;
  }
  for (char c = '0'; c <= '9'; c++)
  {
    base64map[i++] = c;
  }
  base64map[i++] = '+';
  base64map[i++] = '/';
}

private static String base64Encode(byte[] in, int offset, int length)
{
  byte[] src = new byte[length];

  for (int i = 0; i < length; ++i)
  {
    src[i] = in[offset + i];
  }
  return base64Encode(src);
}

private static String base64Encode(byte[] in)
{
  int iLen = in.length;
  int oDataLen = (iLen * 4 + 2) / 3;// output length without padding
  int oLen = ((iLen + 2) / 3) * 4;// output length including padding
  char[] out = new char[oLen];
  int ip = 0;
  int op = 0;
  int i0;
  int i1;
  int i2;
  int o0;
  int o1;
  int o2;
  int o3;
  while (ip < iLen)
  {
    i0 = in[ip++] & 0xff;
    i1 = ip < iLen ? in[ip++] & 0xff : 0;
    i2 = ip < iLen ? in[ip++] & 0xff : 0;
    o0 = i0 >>> 2;
    o1 = ((i0 & 3) << 4) | (i1 >>> 4);
    o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
    o3 = i2 & 0x3F;
    out[op++] = base64map[o0];
    out[op++] = base64map[o1];
    out[op] = op < oDataLen ? base64map[o2] : '=';
    op++;
    out[op] = op < oDataLen ? base64map[o3] : '=';
    op++;
  }
  return new String(out);
}
Теперь вместо
content = Base64.encode(src, i * CHUNK_SIZE, CHUNK_SIZE);
нужно писать
content = base64Encode(src, i * CHUNK_SIZE, CHUNK_SIZE);

Комментариев нет: