作者: 邓明轩
创建客户端程序
T r ans c o de r AP I 客户 端是 以 Bla ck Be rry 应用 形式存 在于智 能手 机的 ,所 以, 要创建 客户 端的 加解密 应用 ,需 要使 用 Bla ck Be rry 开发 环境 开发 一个 Bla ck Be rr y 应 用程 序。
本例使 用 Bla c kB er r y JDE P l ug-In F o r E cl ip s e 1 . 1 开发 环境创 建了 一个名 为 T r an sc o derCli en t 的 Bla ck Be rr y 项 目。 有关 Bla c kBe rry 项目 的创 建过 程以 及 Bla ck Be rry JDE P lu g-In Fo r E cl i ps e 的具 体使用 ,请 参考 相关 文档 ,本章 节只描 述 T r ans c o de rCli en t 项 目创 建过 程中的 关键步 骤, 不 对项目 创建 的每 一个 过程 进行描 述。
创 建 Bla ck B er r y 项 目 后 , 创 建 一 个 ja v a 包 以 包 含 将 要 创 建 的 j a v a 类 , 本 例 使 用
“ o r g .b bt es t ing . t r ans c o der ” 作为包 名。 然后 在该 包中创 建 T r ans c o der AP I 客 户端的 入口程 序, 名为 Ma in App 。
注意, 一般而 言 T r ans c o de r AP I 客户 端加 解密 应用会 以自启 动方 式启 动, 不需 要用户 干预 , 本例考 虑到 测试 的便 利性 , 通过 应用 程序 图标 的方 式启动 应用 , 然 后通 过菜 单启动 客户 端加 解密线 程。
在 Ma in App 类文 件中 对代 码进行 修改 ,使 其如 以下 代码:
package org.damon.transcoder;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.container.MainScreen;
public class MainApp extends UiApplication {
public static void main(String[] args) { MainApp _app = new MainApp();
_app.enterEventDispatcher();
}
public MainApp() {
MainScreen screen = new MyScreen( );
this .pushScreen(screen);
}
}
如果读 者仔 细阅读 Ma in Ap p 中的方 法,可 以发 现该 类主要 是创 建了 应用 程序 入口, 在程 序 入口中 创建 了 MyS c re en 类 的实例 ,并 将该 实例 显示 出来。 所以 ,下 一步 的工 作就是 要创 建 MyS cre en 类 , 读者在按 以 下步 骤 创 建 MyS cr ee n 类 之前 编 译本项 目 的话会 出 现找 不 到 类 MyS cre en 的错 误。
在包 o r g .b bt es t ing . t r ans c o d er 中创 建类 M ySc r ee n , 创 建过程 中选 择继承 类 Ma in S cr ee n , 然 后 编辑 M ySc r ee n 类, 使其如 以下代 码:
package org.bbtest .transcoder;
import net.rim.device.api.crypto.transcoder.TranscoderManager;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.EditField;
import net.rim.device.api.ui.container.MainScreen;
public class MyScreen extends MainScreen {
private MenuItem start = new MenuItem( "start" , 200000, 10) {
public void run() {
register();
}
};
private EditField logField = new EditField();
public MyScreen() {
this .addMenuItem( start ); logField .setText( "Transcoder Testing client" ); this .add( logField );
}
private void register() { this .log( "start to register" ); try {
MyTranscoder transcoder = new MyTranscoder(); transcoder.SetScreen( this ); TranscoderManager .register (transcoder);
} catch (Exception e) {
System. out .println( "Exception while registering:" + e);
this .log( "Exception while registering:" + e);
}
}
public void log( final String msg) {
UiApplication. getUiApplication ().invokeLater( new Runnable() {
public void run() {
logField .setText( logField .getText() + "/n" + msg); System. out .println(msg);
}
});
}
}
在以上 的 MyS c re en 类 中主 要是创 建一 个屏 幕, 在该 屏幕上 添加 一个 菜单 项, 用户可 以点 击 这个菜 单项 启动 客户 端加 解密应 用。 启动 的过 程就 是将一 个 My T r ans c o de r 类 传递给 系统 , 让系统 在处 理所 有数 据的 时候都 调用这 个 My T r ans co der 类。
因为我 们在 本项 目中 还没 有创 建 My T r ans c o de r 类, 此 时编译 项目 会出 现找 不到 MyT r ans c o der
类的错 误。 下面 的工 作就 是要创 建 M yT r ans c o der 类 ,这也 是创 建 T r ans c o de r 客户端 加解 密
应用的 最关 键步 骤。
在 包 o r g .b bt es t . t r ans c o der 中创 建 名 为 M y T r ans c o der 的 类 , 创 建 过 程 中 选 择 继 承 类
net .rim .d ev ic e.ap i. crypt o . t r a ns c o der . T r ans c o der 。创建 该类后 修改 其代 码, 结果 如下:
package org.bbtest .transcoder;
import java.io.InputStream;
import java.io.OutputStream;
import net.rim.device.api.crypto.transcoder.Transcoder;
import net.rim.device.api.util.IntHashtable;
public class MyTranscoder extends Tran scoder {
private MyScreen screen = null ;
public MyTranscoder() {
super (( byte ) 20);
}
public void SetScreen(MyScreen screen) {
this . screen = screen;
}
public boolean decode(InputStream input, OutputStream output, IntHashtable context) {
this . screen .log( "decodeing" );
try {
int readByte = input.read();
while (readByte != -1) { output.write(readByte); readByte = input.read();
}
output.flush();
} catch (Exception e) { this . screen .log( "Exception in decode:" + e); return false ;
}
return true ;
}
public boolean encode(InputStream input, OutputStream output,
IntHashtable context) {
this . screen .log( "encodeing" );
try {
int readByte = input.read();
while (readByte != -1) { output.write(readByte); readByte = input.read();
}
output.flush();
} catch (Exception e) { this . screen .log( "Exception in decode:" + e); return false ;
}
return true ;
}
public boolean willTranscode(IntHashtable context) {
return true ;
}
}
完成代 码输 入后 尝试 编译 该项目 , 如 果读 者使 用缺 省的 “ 自动 编译 ” 的 设置, 则在保 存代 码 的时候 开发环 境会自 动进 行编译 。在编 译过程 中出 现错误 的话按 系统提 示对 错误进 行修改 。
最终形成 的 c o d 文件 就可 以用于 部署 了。
加载客户端程序
在完成 应用 创建 过程 后, 就要开 始加 载客 户端 的程 序了。 在这 里要 注意 的是 成功部 署客 户端 加解密 应用 后, 该应 用将 作用于 这个 用户 的所 有数 据, 如 果服 务器 商地 面有 没有部 署对 应加 解密应用 , 用 户将会 无法 接收数据 , 同 时也无 法向 服务器 发送 数据 。 所 以在 测试的 时候要 考 虑到其 它测 试用 户, 在生 产环境 中部 署的 过程 中更 是要注 意配 置过 程对 生产 用户的 影响 。 本 例只说 明测 试环 境中 的配 置过程 ,所 以不 考虑 生产 环境配 置过 程的 统筹 安排 。 为了加 载客 户端 程序 , 首 先要做 的是 对客 户端 程序 进行签 名, 因为 客户 端加 解密程 序使 用到 了受控制 的 AP I , 没有 签名 的话将 无法 运行 。 有 关客 户端应 用的 签名 密钥 的申 请和签 名工 具 的使用 请参 考相 关文 档。
对客户 端程 序进 行签 名后 , 可以通 过 ja v alo ad e r 将客 户端程序 的 c o d 文件 直接 通过 US B 连线 安装到 Bla ck B er r y 智 能手 机上。 当然 读者 也可 以选 择自己 熟悉 的方 式, 如 O T A 方式 或者 是 Bla ck Be rry Des kt o p M an ag e r 的 方式 将应 用安 装到 Bla c kBe rry 智能 手机 上。 安装完 该应 用后 如果 读者 尝试 在 Bla ck Be rry 智能手 机上运 行该 程序 的话 , 会 发现该 应用 程序 仍无法 正常 工作 。其 原因 是 Bla c kBe rr y 平 台对 于 T r ans c o der 的 使用 控制 比较 严格, 必须 在
BE S 服务 器上 做相 应设置 才可以 在客 户端运 行 T r an sc o der AP I 相关的 应用 。
要在客 户端 运行 T r ans c o de r AP I 相关的 应用 , 必 须在 BE S 服务器上 为该 用户 创建一 个 IT P o li cy , 并在 IT P o li cy 中指 定客户 端程序 的 has h 码。
获取 c o d 文件 的 has h 码有 多种方 式, 如果 是自 己开 发的 c o d 应用 ,可 以在开 发环境 生成 的 对应 的 jad 文件 中得到 该 c o d 应用 的 has h 码, 下面 是 T r ans c o der Cli en t .c o d 对 应的 j ad 文件
T r ans c o de rCli en t .ja d 的 内容 , 其中 第 9 行 的 RIM-C OD -S HA 1 的 内容 就是 该 c o d 文 件的 has 码,
使 用 时 注 意 将 中 间 的 空 格 删 除 , 本 例 中 得 到 的 结 果 是 :
0 1 f 25 24 f 0 0 f a 5 9 0 89 6 05 2 556 b6f 7 f 1 55 4 5 0 27 e 5 2 。
|
ja v alo ad er 得到 一个 c o d 文 件对应 的 has h 码。 J a v alo ad er 命令 的格 式如 下:
Ja v alo ad er s ib li ng in f o <c o d 文件名 >
本例中 为了 更好 地显 示 ja v alo ad er 命令 的输 出, 在命 令行界 面执 行以 下命 令将 输出的 结果 写 入文 件 c : /t e m p/c o di n f o . t xt 中:
ja v alo ad er s ib li ng in f o t r ans c o der cl ien t .c o d > c : /t emp /co di n f o . t x t
得到 的 c o di n f o . t xt 打开以后如下 图:
其中 Has h 一 栏显 示的就 是 T r ans c o derCli en t .c o d 对应的 has h 码。
获取 c o d 的 h as h 码以 后需 要将 该 has h 码 配置 到 IT P o li cy 中, 编辑 所创 建的 I T P o li cy ,选择
“ S ecurity ”标 签页 ,下图 是在 BE S 5 . 0 W eb 管理 界面 中得到 的载 图:
在选择 “ S ecu rit y ” 签标页 后,滚 动页 面, 找到 “ S ec urit y T r ans c o der Co d F il e Ha s hes ”一 栏, 将上面 找到 的 has h 码填入 ,如下 图:
|
在完 成 IT P o li cy 配 置后 , 所 安装 的 T r ans c o derCli en t 应 用就可 以正 常运 行了 , 运 行该应 用后 , 可以选 择菜 单中 的“ S t a rt ”菜单 项启 动客 户端 加解 密应用 。
在启动 客户 端加 解密 应用 后, 会 发现 该 Bla c kB er r y 智 能手机 无法 正常 收发 邮件 , 这是 因为 服
务 器 端 没 有 部 署 对 应 的 加 解 密 程 序 。 只 有 在 服 务 器 端 也 部 署 对 应 的 加 解 密 程 序 后 整 个
T r ans c o de r 应 用才 能正常 工作, 下 面将 描述 服务器 端应用 的部 署过 程。
配置服务器端 程序
如之前 描述的 , T r ans c o der 服务器 端程 序是通 过 BE S 服务器 上的 注册 表配 置的 。 要 配置 服务
器 T r ans c o der 程序 , 需要 访 问 BE S 服 务器 , 将我们创 建 的服务器端 程 序,也就 是 生成 的
MyT r ans c o der .d ll 拷贝 到 BE S 服务器上,本 例 将 M yT r ans c o der .d ll 拷贝 在 BE S 服务器的
“ c : /w o rk s pa ce/t r ans c o der ”目录 下。
然后, 在 BE S 服务 器所在 的 W in do w s 操 作系 统下运 行“ r eg edit ” 启动 注册表 编辑器 。在 注
册 表 编 辑 器 中 找 到 以 下 配 置 : “ HK E Y_ L O CAL_ MA CHI NE /S OF TW AR E / R esea r ch In Mot ion /Bla ck Be r ry En t er p ris e S e r ve r /Dis pa t ch e r ” 。 在初 始状态 下, “ Dis pa t ch e r ” 配 置中不 会出 面“ T r ans c o der ” 子项目 ,此时需要 对“ Dis pa t ch er ”项点击右 键,选 择“新 建 - > 项 ” , 在新 建项对 话框 中输 入项 目名 为 “ T r ans c o der ” 。 完成 “ T r a ns c o der ” 项创 建后 , 双击 “ T r ans c o de r ” 项打开该项,并 点击右键,选择“新建 - > 字符 串值” ,在新建字符串 值对话框中,在名称 一 栏输入 “ T r ans c o der ” ,在 数据一栏输 入 服务器 端应 用 dll 文件的 全 路径名 称 ,本例中 为
“ c : /w o rk s pa ce/t r ans c o der / MyT r ans c o der .d ll ” 。 配置后 的结果 如下 图:
完成该 配置 之后 需要 重启 BE S 服务器 的 Dis pa t ch er 任务才 能让 所配 置的 dll 调 入内存 ,重 启 的时候 可以 通过 W in d o w s 的服务 管理 器重 启, 也可 以通过 BE S 管理 界面 重启 整个 BE S 服务 器。 注 意, 因 为在 本例中 的 My T r ans c o de r .d ll 在载入 时会尝 试在 目录 “ c : /t r ans c o der ” 目 录下 生成日 志文 件, 所以 读者 如果使 用本 例的 My T r ans c o der .d ll ,在 重新 启动 BE S 服务器 之前 需 要手工 创建 目录 : “ c :/ t r an sc o der ” , 以避 免程 序出现 错误导 致 BE S 服 务器 无法 启动。 下图 为
BE S 5 . 0 W eb 管 理界 面中重 启 BE S 服务 器的 方法 :
在服务 器重 启过 程中 注意 观察 BE S 服 务器 的 Dis pa t ch er 的日 志, 该 日志 在 BE S 服务器 安装 日
录 的 Log s 目 录 下 , 本 例 在 “ C : /P r og r am F il es /R esea r ch In Mot io n/Bla ck Be rry En t e rpris e S er v er / Logs ”目 录中 。在 缺省配 置下 , Dis pa t ch e r 任 务的日 志以 “ APP _DIS P ” 开头, 如: “ APP _DISP _0 1 _ 2 0 1 0 02 0 2 _00 01 . t xt ”。
如果服 务器 端应 用加 载成 功的话 , 可以 在 Dis pa t ch e r 日 志中 发现 “ T r ans c o der DLL lo ad ed ”一 句,如 下图 :
如果无法 加载的 话也会有 对应的错 误,出 现无法加 载错误的 话有可 能是注册 表中输入 的 dll 路径不 对, 需 要检 查 T r ans c o der 项 的内 容。 如果 在 Dis pa t ch er 日 志中 根本 没有发 现 t r ans c o der 相关的 日志 , 则说明 注册 表配置 没有 生效 , 有 可能 注册表 项的 名称 或者 是位 置不对 , 需要 检 查注册 表中 的 T r ans c o de r 项是不 是在 正确 位置 。
测试结果
对应用 进行 测试 会发 现, 如果客 户端 和服 务器 端都 正确部署 了 T r ans c o der 加 密解应 用, 智能 手机可 以正 常收 发邮 件。 因为本 例中 的 T r ans c o de r 加密解 应用 是一 个“ 空” 的加解 密应 用, 并没有 对数 据进 行加 解密 操作, 所以 在测 试过 程中的 表现和 没有部 署 T r ans c o de r 加 密解 应用 的情况 相同 。不 过, 读者 可以 从 T r ans c o der 日志 ( 本 例为 c : /t r ans c o der / T r ans c o der -Log . t xt ) 中 看到所 有服 务器 和客 户端 交互的 数据都 被 T r ans c o de r 加 密解 应用 载获 了。
代码分析
服务器 端代码分析
为了让 读者 更好 地了 解 T r a ns c o der AP I 的 使用 ,下面 对服务 器端 代码 进行 分析 。
#in cl ud e " s t da fx.h "
#in cl ud e " BE S T r ans c o der AP I. h"
#in cl ud e <io s t r eam > 以上代 码为 头文 件引 入代 码, 主要 是要 引入 名为 “ BE S T r ans c o derAP I. h ” , 该头 文件内 定义 了 T r ans c o de r AP I 使 用所 需要 的函数 与常 量等 关键 元素 。
F ILE * logF il e;
ch ar LogF il eN am e[ 6 4 ]="c :// T r ans c o der // T r ans c o de r -Log . t xt" ; 以上代 码为 日志 文件 句柄 与日志 文件 名的 定义 ,日 志操作 在 T r ans c o de r AP I 的 使用中 并不 是 必要的 , 本例 为了让 应用 执行有 更加 明显 的, 可以 跟踪的 结果 , 所以通 过日 志文件 记录相 关 信息。 本例 中的 日志 文件 名硬编 码为 “ c: // T r ans c o de r // T r ans c o der -Log . t xt ” , 读 者可以 根据 测 试环境 的情 况进 行修 改, 注意要 调整变 量 LogF il eN a m e 数 组的 上界 。
DEF INE_ BE S _T RA NSC OD E R_ DLL
以上这句 为 T r ans c o der AP I 定义语 句的 引入 ,这句 是 T r ans c o der AP I 使用 的关键 ,为了 让头 文件 “ BE S T r ans c o der AP I. h ”中的相关定义可以在本程序中使用,必须通过语 句 DEF INE_ BE S _T RA NSC OD E R_ DLL 将 预定 义好 的相 关元 素引入 。 对 c/ c++ 中 的预定 义机制 有疑 惑 的读者 可以 阅读 相关 文档 以了解 这句 语句 的含 义, 当然 , 也 可以 不深究 这句 语句的 语法 , 只 记住 在 T r ans c o der AP I 使用 时必须 有这 句语 句也 可以 。
BOO L AP IE NTR Y Dll Ma in ( HA NDLE h Mo du le, DWO RD ul_ r easo n_f o r _c al l, LP V OI D lp R e s er v ed )
{
prin t f( " Lo ad in g Dl l" ) ;
r et urn T RU E ;
}
以上为 本 dll 应用 的入 口, 按 dll 的载入 机制 ,这 个函 数在服 务器 载入 该 dll 时被 调用。 本例 只是在 标准 输出 中输 出了 “ Lo ad in g Dll ” , 并没 有执 行其它 操作 。
__ decls pec ( dl l e xpo rt )
in t __cdec l Lo ad D LL( )
{
logF il e = f o pen( LogF il eN am e , "a" ) ; fprin t f( logF il e,"t ryin g t o c al l Lo ad Dl l" ) ; r et urn 0 ;
}
以上代码 为 dll 载 入代 码, 适合加 入一 些只 需要 在载 入过程 中运 行一 次的 代码 ,如本 例中 日 志文件 的打 开只 需要 在 dl l 载入时 运行 一次 ,所 以在 这里加 入日 志文 件打 开的 语句 f o pen 。 此外, 本例 的该 函数 还在 日志文 件中 记录 了“ t r yin g t o c al l Lo ad Dll ”字符 串。 在实际 环境 中这 里可 以加 入加解 密应 用初 始化 的代 码, 比如 在这 里可 以加入 连接 C A 获 取服 务器密 钥的 代码 。 此 函数 返回 0 , 表示 加载 成功 , 实 际环境 中此 处可 以根 据初 始化代 码的 运 行情况 决定 返回 什么 值, 如果初 始化 失败 , 则 可以 返回其它 非 0 值。 注意 , 如果返 回其 它非
0 值 ,该 dll 将不 会被 载入 内存, 相关 的加 解密 方法 也不会 被调 用。
__ decls pec ( dl l e xpo rt )
v o id __cd ecl F r ee DL L( )
{
fprin t f( logF il e,"Dl l fre e") ;
}
F r ee Dl l 函数 为 dll 释放 函数,可 以加 入连 接关 闭等资 源释放 代码 。 本例 不需要 释放资源, 所 以在该 函数 中只 是通 过日 志文件 记录 了字 符串 “ Dl l fre e ”。
__ decls pec ( dl l e xpo rt )
uns ig ned c ha r __ cd ecl G et ID ( )
{
uns ig ned lo ng T r ans c o de rID =2 0 ; fprin t f( logF il e,"t ryin g t o g et I D" ) ; r et urn ( uns ig ned c ha r ) T r ans c o de rID ;
}
G et ID 函 数需 要返 回本 应用 的 ID , 本例 使用 2 0 作 为应 用 ID , 所以 返回 2 0 。 注意 要确定 返回 的值 是 uns ig ned c ha r 类型。
__ decls pec ( dl l e xpo rt )
in t __cdec l W il l T r ans c o de( c o ns t T r ans c o derCo n t e xt *c o ns t c o n t e xt )
{
r et urn 0 ;
}
W il lT r ans c o de 用于 确定是 否需要 对消 息进 行加 解密 操作 , 返 回非 零值 表示 不需 要进行 加解 密 操作, 本例 对所 有消 息都 返回 0 , 表示 对所 有消息 都需要 进行 加解 密操 作。
__ decls pec ( dl l e xpo rt )
in t __cdec l En c o de ( T r ans co derIn putSt r eam *c o ns t in put , T r a ns c o derOut putSt r eam *c o ns t o ut put , c o ns t T r ans c o der Co n t e xt *c o ns t c o n t e xt )
{
函数 Enc o de 用于 对消 息进 行加密 操作 ,注 意参 数有 i np ut , o ut put , c o n t e xt ,其中 inpu t 为 系统传 入的 输入 流, o ut pu t 为传给 系统 的输 出流 , 本 函数的 主要 工作 就是 从 in p ut 中获取 数 据,进 行加 密操 作, 然后 通过 o ut pu t 传 送给 系统。
fprin t f( logF il e,"t es t in g enc o de is r un ni ng no w") ;
以上代 码在 日志 文件 中输 出“ t es t in g enc o de is run ni ng no w ” , 用于记 录 Enc o de 事 件。
uns ig ned c ha r r ead C;
fprin t f( logF il e," /n enc o de r ead c ha r : " ) ;
whi le ( in put - >R ead ( & r ead C) )
{
fprin t f( logF il e,"%c" ,r ea dC) ;
o ut put ->W rit e( r eadC ) ;
}
以上代 码定 义了变 量 r eadC , 调用 inpu t 的 R ea d 方法 将数据 读到变 量 r eadC 中, 然后 将 r eadC
输出到 日志 文件 中进 行记 录, 同 时调 用 o ut pu t 的 W ri t e 方法 将 r eadC 中的 数据 写入 到 o ut pu t
输出流 中。 通过 不断 的循 环可以 将 inpu t 中 的所 有数 据传送 到 o ut pu t 中。 本段代 码是 加密 操作 的关 键, 在 本例 中只 是将 数据 原封不 动地 传送 到 o ut pu t 输出流 中, 在 现实环 境中 需要 在这 里对 数据进 行处 理, 完成 加密操 作后才 将数 据写 入到 o ut pu t 输出流中 。
r et urn 0 ;
}
最后, 本函 数返 回零 表示 加密成 功。
__ decls pec ( dl l e xpo rt )
in t __cdec l D ec o de( T r ans c o derIn putSt r eam *c o ns t in put , T r a ns c o derOut putSt r eam *c o ns t o ut put , c o ns t T r ans c o der Co n t e xt *c o ns t c o n t e xt )
{ D
fprin t f( logF il e," /n dec o de r ead c ha r : " ) ;
uns ig ned c ha r r ead C;
whi le ( in put - >R ead ( & r ead C) )
{
fprin t f( logF il e,"%c" ,r ea dC) ;
o ut put ->W rit e ( r eadC ) ;
}
以上代 码定 义了变 量 r eadC , 类 似于 Enc o de 函 数中的 循环 , 这 里通 过循 环将 in p ut 中的所 有 数据写入 到 o ut pu t 中。 同 样, 在 现实 环境中 需要 对 i np ut 中读取 的数 据进 行处 理, 完 成解 密 后才写入 到 o ut pu t 中。
r et urn 0 ;
}
最后本 函数 返回 零表 示解 密成功 。
手机端 代码分析
以下为 手机 端代 码分 析:
手机端 应用 的关 键是 需要 调用 T r ans c o de rMa na g e r 的 r eg ist er 函数 将加 解密 客户端 注册 到系 统中。
25 |
MyTranscoder transcoder = new MyTranscoder(); transcoder.SetScreen( this ); TranscoderManager .register (transcoder);
} catch (Exception e) {
System. out .println( "Exception while registering:" + e);
this .log( "Exception while registering:" + e);
}
}
本 段 代 码 的 关 键 是 新 建 一 个 My T r ans c o der 类 的 实 例 , 名 为 t r ans c o de r , 然 后 调 用
T r ans c o de rMa na g er 的 r eg is t er 将 t r ans c o de r 注 册到系 统中。
package org.bbtest .transcoder;
import java.io.InputStream;
import java.io.OutputStream;
import net.rim.device.api.crypto.transcoder.Transcoder;
import net.rim.device.api.util.IntHashtable; 以上代码 为包定 义语句 和相 关类的 import , 主要一点 是要 import 名为 net.rim.device.api.crypto.transcoder.Transcoder 的类。
public class MyTranscoder extends Transcoder {
以上为 MyTranscoder 类的 类定义语 句,声 明 My Tr an s co de r 类是 Transcoder 类 的子类。
private MyScreen screen = null ;
以上为类 属性定 义,本 例只 定义了 screen 一 个属性, 用于更新 主屏幕 。
public MyTranscoder() {
super (( byte ) 20);
} 此处为 MyTranscoder 的构 造函数, 适合加 入 初始 化相 关的代码 。注意 在加入 初始 化代码之 前 必须通过 super 语句调 用父 类的构造 函数 。 而且 要注意 , 调用 super 时要传 入客户 端加解密 应用 的 ID 。在以 上章节 描述 Tr a ns co der 客户端应 用时提到 客户端应 用需要 通过 getID 方法的返 回 和服务器 端应用 相关的 ID 。 在本例中 , 通 过 super 的调 用将 ID 传给 父类 Transcod er, 从而使用 父类的 getID 函 数,这 样就 不用自己 实现 getID 函 数了 。
public void SetScreen(MyScreen screen) {
this . screen = screen;
} 本函数是 为 screen 属性指 定对象, 会 在 MyTranscod er 实例化后 被主屏 幕类调用 , 主要作用 是 在 MyTranscoder 实例 中保 存屏幕类 的句柄 ,从而 调用 主屏幕的 相关方 法以刷 新主 屏幕显示 的 内容。该 函数在 Transcod er API 使用过程 中必不是 必须的。
public boolean decode(InputStream input, OutputStream output, IntHashtable context) {
this . screen .log( "decodeing" );
try {
int readByte = input.read();
|
}
output.flush();
} catch (Exception e) { this . screen .log( "Exception in decode:" + e); return false ;
}
return true ;
}
public boolean encode(InputStream input, OutputStream output,
IntHashtable context) { this . screen .log( "encodeing" ); try {
int readByte = input.read();
while (readByte != -1) { output.write(readByte); readByte = input.read();
}
output.flush();
} catch (Exception e) { this . screen .log( "Exception in decode:" + e); return false ;
}
return true ;
}
encode 用于对数 据进行加 密操作, 因为对 于 input 的 read 操作和 output 的 w ir te 操作有可 能 会抛出导 常,所 以需要 通过 try,catch 语句捕获 异常 。在 try 语句 段中定 义了变 量 re ad By t e , 通过调用 input 的 read 函 数将数据 读入到 readByte 中,然后 再将 readByte 中 的数据写 入到 output 中。最后 本函数返 回 true 表示加 密成功 。
public boolean willTranscode(IntHashtable context) {
return true ;
}
}
W il lT r ans c o de 函数 用于确 定是否 对消 息进 行加 解密 操作 , 本 例对 所有 消息都 返回 t ru e , 表示 对所有 消息 都进 行加 解密 操作。
BlackBerry SDK下载
相关链接:
使用BlackBerry Transcoder API 集成第三方加密方案(一)
使用BlackBerry Transcoder API 集成第三方加密方案(二)
使用BlackBerry Transcoder API 集成第三方加密方案(三)