helyoWAP

TUTORIAL WML
(15)
Programas comentados: phone23.wml

Autor: Helio Fonseca Rosa

Esta página contém muitas figuras. Aguarde a carga se a conexão estiver lenta.


O conceito de "atividades" ou "contextos" da Phone.com

A empresa Phone.com (ex-Unwired Planet - daí a sigla UP)  inventou a HDML (Handeld Devices Markup Language) que deu origem à WML.
Na documentação do UP.SDK da HDML havia referência à procedimentos avançados que visavam tornar os programas mais estruturados. Definia-se então o conceito de ATIVIDADE , que podia ser entendida como uma tarefa ou um conjunto de tarefas. Estando em uma atividade, era possível definir e/ou  desviar o programa para uma atividade embutida ou aninhada dentro dela (uma "sub-atividade"). Dentro desta atividade mais interna era possível definir novamente uma atividade ou  mais atividades interiores, resultando em vários níveis de processamento embutidos. 

[Em tempo: estou usando os verbos no passado pois comecei a estudar programação "wireless" pela HDML,  até "descobrir" a existência de sua sucessora , a WML. No entanto, a HDML está bem viva, nos celulares pioneiros neste tipo de serviço e (de modo transparente para o usuário) nos gateways e celulares WAP utilizados no Brasil, até a data desta publicação. A HDML é anterior ao padrão WAP.]

Nas nossas aplicações rotineiras já utilizamos  procedimentos "semelhantes" , por exemplo, quando um card "chama" ou se desvia para um segundo card e este se desvia para um  terceiro. Mas isto tem ocorrido num mesmo nível.

Na documentação do UP.SDK da Phone.com sobre WML este conceito de "atividade" mudou de nome para "contexto".

A Phone.com criou "extensões" da linguagem WML para poder implementar este conceito de "contexto". Até o momento não tenho conhecimento se os softwares de outras empresas também utilizam esta implementação ou a suportam.

As  "extensões" utilizadas na implementação dos "contextos" são : <spawn>, <send>, <receive>, <exit> <reset>, <catch> e  <throw> .

Neste início de página vamos comentar um pouco o elemento <spawn> antes de apresentar os programas que o utilizam.
O potencial do elemento <spawn> não pode ser bem avaliado em programas de estruturas simples. Num programa mais complexo, com vários níveis de tarefas ( "atividades" ou "contextos")  fica evidente seu poder de organizar o programa de uma forma estruturada. 
 Esta organização pode ser observada com muita paciência e atenção no registro histórico do processamento do programa encontrado na janela "Phone Information" que acompanha o UP Simulator. Este tipo de análise não cabe nesta página de estudos iniciais. Talvez mais adiante.
Numa aplicação simples, o elemento <spawn> pode ser entendido como um substituto do <go>, efetuando desvios programados. O <go> produz um desvio para o mesmo nível de processamento. O <spawn> produz um desvio para um nível inferior;  na verdade, ao utilizá-lo já estamos definindo a existência deste nível mais interno.
Imagine um programa principal que, de repente, executa um desvio para um programa secundário (ou sub-programa ) onde é executada alguma tarefa, que envia ou não dados de volta para o programa principal, que prossegue, então, em seu caminho normal.  
Leia mais sobre este assunto, na "fonte" : "Chapter 2: Doing more with WML" na documentação UP.SDK Developer's Guide"  que acompanha o download do produto ou on-line, no site da Phone.com.

Programa Phone23.wml 

Objetivo: Imaginemos  que há um card (secundário) que contém uma mensagem indicando um erro ocorrido (no momento não estamos preocupados como este card foi montado, quem sabe por uma aplicação dinâmica tipo ASP). Desejamos que um card principal faça um desvio para este card secundário (ou "sub-card") e traga esta mensagem para ser exibida em sua tela. Após esta exibição, deve ser possível efetuar um novo desvio para outro card secundário que retorne ao card principal uma mensagem em branco para funcionar como "apagador" ou "limpador" da mensagem já exibida. Eis a seqüência de telas:

----> 

--> -->

 

Phone23.wml (código):

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//PHONE.COM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="principal">
<do type="accept" label="Mensagem">
<spawn href="#msg_erro">
<receive name="codigo_erro"/>
<receive name="nome_erro"/>
</spawn>
</do>
<do type="options" label="Apagar">
<spawn href="#apaga_erro">
<receive name="codigo_erro"/>
<receive name="nome_erro"/>
</spawn>
</do>
<p align="center">
** helyoMOBILE **<br/>
(tela principal)<br/>
Foi encontrado o seguinte erro: 
</p><p align="left">
<b>Codigo: $(codigo_erro) <br/>
Nome: $(nome_erro)</b>
</p>
</card>

<card id="msg_erro">
<do type="accept">
<exit>
<send value="99"/>
<send value="Inv. Key"/>
</exit>
</do>
<p align="center">** helyoMOBILE **<br/>
Retornando mensagem de erro para tela principal...</p>
</card>

<card id="apaga_erro">
<do type="accept">
<exit>
<send value=""/> 
<send value=""/>
</exit>
</do>
<p align="center">** helyoMOBILE **<br/>
Retornando mensagem em branco para tela principal: apagando mensagem de erro...
</p>
</card>
</wml> 

(A listagem acima foi copiada/colada/gravada e testada no UP Simulator)

Comentários:
Este é um programa com um deck e três cards.
O elemento <spawn> define dois níveis de contexto, como na figura abaixo (estão representados os <card id="principal">, <card id="msg_erro> e <card id="apaga_erro>):


A operação do programa é a seguinte: exibida a tela inicial (produzida pelo <card id="principal">, pressiona-se a tecla "ACCEPT" cujo label é "Mensagem";   a programação desta tecla, a cargo agora da dupla "do" / "spawn" faz um desvio para o <card id="msg_erro">.  
O usuário poderia nem perceber a existência deste card se senão fosse a exibição da mensagem "Retornando mensagem de erro para tela principal..." , incluída aqui somente com este objetivo (este seria então um "no-display card, de utilização possível , mas perigosa , pelos erros também "ocultos" que podem surgir).
Pressionada a tecla com o label "OK" abre-se novamente a tela principal.
Os dados sobre o erro são enviados de volta para o <card id="principal"> e quem faz esta conexão é a dupla "send" / "receive"
A tela principal é exibida  agora com a mensagem de erro.  Vamos então pressionar a tecla "OPTIONS" cujo label é "Apagar". 
A dupla "do" / "spawn" desta tecla agora faz o desvio para outro card "secundário", o <card id="apaga_erro">
Este card é idêntico ao comentado acima, claro, mudando o que deve ser mudado, ou seja, há um aviso intermediário e vai ser enviada à tela principal uma mensagem em branco; mais precisamente, as variáveis que continham os dados de erro recebem um novo valor, um "branco" ou "vazio" ("empty string").
Os elementos "send" / "receive" fazem uma boa dupla, como já vimos, e bem descomplicada, por sinal : comunicam-se de acordo com a ordem em que aparecem no programa. Vejam a correspondência: "codigo_erro" --> "99"    e   "nome_erro" -->  "Inv.Key".
*************************************
<receive name="codigo_erro"/>
<receive name="nome_erro"/>
*************************************
<exit>
<send value="99"/>
<send value="Inv. Key"/>
</exit>
************************************
Dizemos que estes elementos são responsáveis pela comunicação entre um contexto externo (contexto-pai) - no caso o <card id="principal"> e o <card id="msg_erro"> (contexto-filho).
O elemento <exit> ( "saida") faz isto mesmo que você está imaginando ; encerra a tarefa no contexto-filho (interno) e  envia os dados para o contexto-pai (externo) . O contexto é eliminado, isto significando que suas varáveis e o próprio histórico são apagados.
Apesar de já ser assunto estudado, não custa chamar a atenção para as variáveis : seus nomes são "codigo_erro"  e "nome_erro" e seus conteúdos são referenciados como  $(codigo_erro) e $(nome_erro) .

WirelessBRASIL                 Portal helyoWAP                    Anterior                    Próxima