A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Surgimento Qualcomm –Fundada em 1985 –San Diego, Califórnia USA –Localização por satélite – OmniTracs –CDMA: dispositivos e estações base –Eudora! Ano:

Apresentações semelhantes


Apresentação em tema: "Surgimento Qualcomm –Fundada em 1985 –San Diego, Califórnia USA –Localização por satélite – OmniTracs –CDMA: dispositivos e estações base –Eudora! Ano:"— Transcrição da apresentação:

1 Surgimento Qualcomm –Fundada em 1985 –San Diego, Califórnia USA –Localização por satélite – OmniTracs –CDMA: dispositivos e estações base –Eudora! Ano: 2000 Um olho na cadeia de valores do mercado... Outro no potencial da tecnologia móvel... App lica tion Dev elo per s Pub lish ers Con ten t Pro vid ers Devi ce Man ufac ture s Car rier s Cus tom ers

2 Surgimento Vasta experiência em desenvolvimento para celular Líder em desenvolvimento de aplicações CDMA Necessidade de uma plataforma uniforme de desenvolvimento para celular Binary Runtime Environment for Wireless Necessidade de conexão entre os links na cadeia de valores do mercado móvel Jan 2001 End-to-end business and technology solution

3 BREW: End-to-end business and technology solution Operadoras: –Virtual Marketplace Seleção de aplicação Negociação de preço com o desenvolvedor –BREW Delivery System (BDS) Secure over-the-air distribution Coordinates billing and payment Fabricantes: –BREW client software –Porting and testing tools –Consultoria na especificação do dispositivo Usuários: –BREW Mobile Shop –Transparência App lica tion Dev elo per s Pub lish ers Con ten t Pro vid ers Devi ce Man ufac ture s Car rier s Cus tom ers

4 Publishers, Desenvolvedores e Provedores de Conteúdo: –Modelo de negócio simples –Suporte Técnico –BREW SDK® –Ferramentas de Desenvolvimento –Assistência a testes –Near-real time application sales reporting –Sistema de pagamento –BREW Global Publisher (BGP) BREW: End-to-end business and technology solution App lica tion Dev elo per s Pub lish ers Con ten t Pro vid ers Devi ce Man ufac ture s Ope rat ors Cus tom ers

5 O que é BREW Solução completa para –Desenvolvimento de aplicações wireless –Configuração de dispositivos –Distribuição de aplicações –Cobrança e pagamento de aplicações BREW Solution Tecnologia + Modelo de negócio

6 A Solução BREW BREW SDK –Kit de desenvolvimento para desenvolvedores de aplicações Software cliente BREW e ferramentas de porting –Software base instalado no celular (+/- 150k) embutido pelos fabricantes BREW Distribution System (BDS) –Sistema que permite comercialização de aplicações através de operadoras

7 O Modelo de Negócios BREW Fonte: http://brew.qualcomm.com

8 Facilidades do Modelo Comercio virtual com BDS (BREW Distribution System) –Submissão de aplicações e testes –Negociação operadora x desenvolvedor Customização de ofertas de produtos para assinantes via catálogo da operadora –Funções de gerenciamento de catálogo –Download, execução e deleção de aplicações –Serviços de download extensíveis Serviços financeiros com BDS –Suporte a transações –Serviços de cobrança integrados

9 Tecnologia: BREW no Celular ASIC: Application Specific Integrated Circuit Fonte: http://brew.qualcomm.com

10 BREW no Celular 150K, situado entre os aplicativos e a camada ASIC Desenvolvimento independente de chipset dos dispositivos –Porte! Aplicativos podem ser escritos em JAVA, C ou C++ Suporte técnico Restrições de exclusividade Tecnologia própria Centralização Burocracia de instalação/ publicação –Assinatura digital –TRUE BREW $$

11 BREW x J2ME - Vantagens API mais bem suportada Tricks mais limpas –Acesso direto à tela Não há limite para tamanho da aplicação Pode-se utilizar OO sem medo Facilita a distribuição de aplicações independentemente de tecnologia – OTA –cdmaOne,CDMA2000,gsm/gprs,UMTS (3G), etc Distribuição, gerenciamento e vendas

12 BREW x J2ME - Desvantagens Solução de compressão deve ser escrita pelos desenvolvedores Inexistência de profilers Área de atuação restrita a Japão e EUA

13 BREW Hoje 28 países 51 operadoras No Brasil: 41 fabricantes BREW 1.0 BREW 2.1 BREW 1.1 BREW 3.0 BREW 2.0 BREW 3.1 3 a caminho 5 a caminho

14 BREW: Evolução (1/3) BREW 1.0 –Quase não existe aparelho Motorola V731 e Sharp800. BREW 1.1 –Minor upgrade to BREW –Brew Compressed Image format (BCI ) –T720 - 400k RAM - 4096 byte stack - 1500k de espaço de file system BREW 2.0 –Sprite nativo e suporte a tiles –Transformações em bitmaps, sprite e tile objects Rotated – 90 graus Scaled – potência de 2 Flipped –Suporte Bluethooth

15 BREW: Evolução (2/3) BREW 2.1 –Gráficos 3D –Câmera BREW 3.0 –Removable Storage media SD, MMC... –Interface Serial –BREW Simulator baseado em dados reais do dispositivo BREW 3.1 –Lançado este ano

16 BREW: Evolução (3/3) Demonstração da evolução de BREW http://brew.qualcomm.com/brew/en/operator/de mos/demos.htmlhttp://brew.qualcomm.com/brew/en/operator/de mos/demos.html

17 Overview do Curso 1.Conceitos Básicos –Termos técnicos –Estrutura de uma aplicação BREW 2.Desenvolvimento de aplicações –Análise de uma aplicação simples –Interfaces básicas da API –HelloWorld 3.Aplicações – 2ª parte Integração de código C++ –Compilação para o dispositivo 4.Interface com o usuário IDisplay, IGraphics, IImage, IDialog 5.Recursos de Rede INetMgr, ISocket, ISSL, IWeb 6.Som e I/O ISound, ISoundPlayer, IFileMgr, IFile 7.BREW MBA / TrueBREW

18 BREW Conceitos Básicos

19 O Modelo de Camadas

20 Elementos BREW Recursos BRI = ClassID Plataforma BREW Interface MI F BAR Applet Módulo BID

21 Módulos Englobam os componentes de uma aplicação Encapsulam um ou mais applets Desenvolvidos como DLLs Windows –Assumem outro formato quando compilados para o dispositivo (.mod) Sempre possuem um arquivo MIF associado

22 Applets Similares a “aplicações” Toda aplicação BREW deve possuir pelo menos um applet Classes que permitem ser gerenciadas pelo ambiente –Criação, destruição e troca de mensagens Implementam uma interface comum –IApplet

23 Interfaces Serviços na plataforma BREW são disponibilizados através de interfaces (APIs) Interfaces em BREW possuem um ID único e o acesso é gerenciado pela plataforma Cada interface encapsula um conjunto de serviços como –Acesso ao display –Controle de som –Serviços de rede –Etc...

24 ClassIDs Applets e interfaces públicas possuem identificadores únicos em BREW Identificadores possuem 32 bits e são chamados de ClassIDs São gerenciados pela Qualcomm para garantir sua unicidade São mantidos em arquivos de texto com extensão.bid

25 Arquivos MIF Cada módulo BREW possui um arquivo MIF (Module Information File) associado MIFs mantêm informações sobre o conteúdo do módulo –Applets –Privilégios –Títulos de applets e ícones –ClassIDs Plataforma lê as informações do aplicativo instalado do.mif –Similar ao.jad de J2ME São criados e editados pelo BREW MIF Editor Programas  BREW SDK 2.0  BREW MIF Editor São criados e editados pelo BREW MIF Editor Programas  BREW SDK 2.0  BREW MIF Editor

26 Arquivos de Recursos (.BAR) Mantêm os recursos usados pela aplicação –Textos –Imagens –Sons.BRI descreve o BAR.BRI editado por BREW Resource Editor –  BREW Resource Editor Recursos precisam ser compilados antes de serem utilizados pela aplicação!

27 Compilação do BRI Compilador embutido no Resource Editor –Build  Build QUALCOMM.BAR/.H Files

28 Relembrando Applets Módulos Interfaces ClassIDs MIFs Arquivos de recursos Recursos BRI = ClassID Plataforma BREW Interface MI F BAR Applet Módulo BID

29 Aplicações BREW 1ª parte 1. Criando aplicações no VS 2005 2. Interfaces básicas 3. Debugando no VS 2005

30 Analisando uma Aplicação Execute o emulador BREW –Iniciar  Programas  BREW SDK 2.0  BREW Emulator Selecione a aplicação “Hello World App”

31 Estrutura de Arquivos No Windows Explorer, abrir – \Examples Estrutura padrão MIF dll bar bid Componentes de uma aplicação –mif, bid, dll, bar (opcional)

32 Estrutura de arquivos - Meantime Projeto mba.mif, mba.bid mba.mif mba.dll, mba.bid, mba.bar mba.vcproj, pre_build.bat, post_build.dat mba.bri, *.png, *.bvg, *.mid, *.txt MainApplet.cpp....

33 VS - O Ambiente VS 2003 - A IDE oficial de desenvolvimento BREW é Microsoft Visual Studio VS 2003 - Quando instalado, o BREW SDK incorpora um novo wizard aos tipos de projeto do VS –File  New  Projects  BREW Application Wizard VS 2003 - O wizard configura o ambiente e adiciona automaticamente os arquivos base necessários ao projeto VS 2003 – Pago VS 2005 – Versão Express gratis VS 2005 – Roda sem wizard –Por nossa conta!

34 O Ambiente Microsoft Visual Studio C++ 2005 –Express Edition BREW SDK 2.0.1 BREW Tools 1.0

35 Visão Geral do Código No Visual Studio, abrir – \Examples\HelloWorld\helloworld.dsw Convert project Do not remove source control bindings from project! Arquivos que compõem a aplicação –AEEAppGen.c (gerado) –AEEModGen.c (gerado) –helloworld.c (implementação das funcionalidades) Funções principais –AEEClsCreateInstance() –HelloWorld_HandleEvent() AEE – Application Execution Environment

36 Criando uma aplicação É necessário –Arquivo MIF (MIF Editor) –Criar o projeto –Implementação das interfaces básicas IApplet, IModule –Fornecer os métodos para a plataforma: CreateInstance HandleEvent FreeAddData –Configurar as propriedades de projeto O VS 2003 resolve esses problemas com o App Wizard do Add-in Já o VS 2005 “É estudante...”

37 Passo a passo - Criando o mif 1.Abrir o BREW MIF Editor 2.Clique em New Applet e dê o nome “HelloWorld” 3.Marque a opção “Locally” e entre com o número “11111111” Por ser um ID local, pode ser qualquer ID diferente dos existentes 4.Nomeie o ClassID como HELLO_WORLD 5.Clique em Generate e confirme Lembrar da estrutura de diretórios! 6.Salve o arquivo.bid junto à raiz do seu projeto 7.Salve o arquivo. mif na pasta mais externa

38 Passo a passo - Criando o projeto 1.Abra o Visual Studio 2.File  New  Project 3.Selecione “emptyproj” 4.Nomear o projeto como “HelloWorld” Desmarque a opção “Create directory for solution”

39 Passo a passo - Implementando as interfaces básicas Essas interfaces já estão prontas, bastam ser adicionadas ao projeto Clique com o botão direito em ‘Source Files’ e selecione ‘Add existing Item’ Do caminho /src, adicione os arquivos: –AEEAppGen.c –AEEModGen.c

40 É o arquivo que fornece os métodos de entrada na aplicação Com o botão direito no ‘Source Files’, selecione ‘Add New Item’ Crie um MainApplet.cpp Copie o corpo do arquivo ‘Exemplo1.c’ Substitua as referências ao bid, ao classId e ao nome “Exemplo1” Passo a passo - Criando o arquivo principal

41 General do projeto –Dll! General em C/C++ –inc de –64bits -> NO Preprocessor em C/C++ –Adicione AEE_SIMULATOR Advanced em C/C++ –Compile as Default General em Linker –Output file: $(ProjectName)/$(ProjectName).dll Passo a passo - Configurando o projeto

42 Interação com a plataforma ‘Padrão’ de comportamento definido –É necessário um padrão uniforme para que o ambiente interaja com as aplicações ‘Diretos e deveres’ das aplicações Aplicações podem acessar os serviços das interfaces Plataforma controla o ciclo de vida das aplicações

43 Interação Ambiente  Aplicação Toda aplicação BREW precisa –Permitir sua criação e destruição pelo ambiente –Receber e tratar eventos Duas interfaces definem o padrão para módulos e applets –IModule –IApplet Definem os serviços básicos que devem ser fornecidos por toda aplicação BREW

44 IModule Mecanismo para controle de acesso a applets e classes Define funções para –Permitir ao BREW requisitar uma instância de classe específica do módulo IMODULE_CreateInstance() –Permitir ao BREW requisitar a liberação de recursos IMODULE_FreeResources() Raramente utilizada diretamente pelo desenvolvedor

45 IApplet Define o serviço para manipulação de eventos gerados pelo sistema ou outros applets Deriva de IBase e define a função HandleEvent Todo applet precisa implementar esta interface IAPPLET_HandleEvent() só pode ser chamada pelo shell! Para enviar eventos para outros applets deve-se chamar ISHELL_SendEvent() IAPPLET_HandleEvent() só pode ser chamada pelo shell! Para enviar eventos para outros applets deve-se chamar ISHELL_SendEvent()

46 Tratamento de eventos O modelo de aplicação BREW é baseado em um engenho dirigido a eventos –Todas as entradas do applet são recebidas como eventos –O applet precisa indicar ao ambiente se tratou ou não o evento recebido (retorno TRUE ou FALSE) –Eventos são recebidos pela função HandleEvent() implementada por todo applet Por questão de segurança, a demora na resposta a eventos causa a interrupção do applet pelo ambiente!

47 A Função HandleEvent Parâmetros –pIApp: ponteiro para o applet atual –eCode: código do evento recebido –wParam: parâmetro do evento (16 bits) –dwParam: parâmetro do evento (32 bits) Exemplos de possíveis eventos –EVT_APP_START, EVT_APP_STOP, EVT_KEY_PRESS –Lista completa disponível no BREW API Reference, seção Data Types  AEE Events boolean HandleEvent(IApplet * pIApp, AEEEvent eCode, uint16 wParam, uint32 dwParam) boolean HandleEvent(IApplet * pIApp, AEEEvent eCode, uint16 wParam, uint32 dwParam)

48 Interação Aplicação  Ambiente Toda aplicação precisa –Acessar o dispositivo Tela, som, teclas, etc. –Fazer uso de serviços pré-definidos Primitivas de desenho, tratamento de eventos, etc. Em BREW, duas interfaces provêem este tipo de suporte –IShell –IBase

49 IShell Dá acesso a todos os serviços externos Applets podem requisitar ponteiros para outras interfaces (passando o respectivo ID) –ISHELL_CreateInstance() Algumas características principais –Ativar e desativar o applet atual –Gerenciar timers –Carregar recursos utilizados em applets –Passar eventos para outros applets –Acessar o relógio e outros recursos do dispositivo

50 IBase Define a estrutura básica de todas as classes do ambiente Toda interface do AEE herda de IBase Define as funções principais para gerenciamento de objetos na memória –Alocação de objetos (função AddRef()) –Liberação de objetos (função Release())

51 Nosso Alô Mundo! 1.Abra o projeto HelloWorld criado anteriormente 2.Abra o arquivo MainApplet.cpp 3.Vamos analisar Estrutura _Exemplo1 Funcão AEEClsCreateInstance() Funcão Exemplo1_HandleEvent() Funcão Exemplo1_InitAppData() Funcão Exemplo1_FreeAppData() 4.No início da função Exemplo1_HandleEvent(), crie um string contendo a mensagem que será apresentada na tela Exemplo: AECHAR szText[] = {'A', 'l','o',' ', 'M', 'u', 'n', 'd', 'o', '!', '\0'};

52 Alô Mundo! 5.No case de tratamento do evento de inicialização do applet (EVT_APP_START), desenhe o texto na tela e atualize o display 6.Compile a aplicação – Crtl + Shift + B 7.Pronto! Agora basta disponibilizar no emulador... IDISPLAY_DrawText(pMe->pIDisplay, // ponteiro para o display AEE_FONT_BOLD, // fonte negrito szText, // texto -1, // -1 = a string toda 0, // posicao x – ignorada aqui 0, // posicao y – ignorada aqui NULL, // sem clipping IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE); IDISPLAY_Update (pMe->pIDisplay);

53 Alô Mundo! no Emulador 1.Copie o arquivo HelloWorld.mif para o diretório “ \BREW SDK v2.0.1\Examples” 2.Neste mesmo diretório crie uma pasta “HelloWorld” 3.Para esta pasta copie os arquivos HelloWorld.bid helloworld.dll 4.Abra o emulador e veja sua aplicação!

54 Debugging no Visual Studio: Configuração 1.Project  Properties 2.Debugging  Command Entre com “ \BREW SDK v2.0.1\Bin\BREW_Emulator.exe” 3.C/C++  General  Debug Information Format Selecione “Program Database for Edit & Continue” 4.C/C++  Optimization Disabled! 5.Linker  Debugging  Generate Debug Info Selecione “Yes (/DEBUG)” 6.Indique um ponto de parada no programa e teste Clique na barra do lado esquerdo de algum ponto do código Debug  Start

55 Aplicações BREW 2ª parte 1. Migrando de C para C++ 2. Compilando para o dispositivo

56 STDLIB em BREW BREW não suporta a biblioteca padrão de C As funções de STDLIB são substituídas por macros e funções específicas Existem funções para –Manipulação de strings –Arquivos e I/O –Alocação de memória –Etc. Estas funções são chamadas Helper Functions e estão documentadas no BREW API Reference, seção Helper Functions Seu código deve incluir a biblioteca “AEEStdLib.h”

57 Integrando Código C++ Além de código C, BREW suporta recursos de C++ –Classes –Herança –Interfaces Exceções não são suportadas! Threads não são suportadas! Objetos estáticos não são suportados! Classes podem ser incorporadas à aplicação normalmente, desde que as funções invocadas pelo ambiente sejam estáticas! A função AEEClsCreateInstance() deve ser utilizada para criar os objetos iniciais

58 Migrando para C++ : Acesso à plataforma Applet (IShell e IDisplay) + DeviceInfo fornecem acesso à plataforma Todo mundo precisa desses recursos.. O Acesso à plataforma deve então ser encapsulado numa estrutura typedef struct SBREWAccess : public AEEApplet { AEEDeviceInfo m_deviceInfo; } SBREWAccess;

59 Migrando para C++: O Applet Uma classe que herda da estrutura de acesso a BREW Métodos de controle de toda a aplicação –HandleEvent, –FreeAppData, –InitAppData, –StopApp, –StartApp, –PauseApp, –ResumeApp Criação da aplicação no.cpp do Applet –CreateInstance –Metodo isolado, fora do escopo da classe

60 class CMainApplet : public CBREWAccess { public: static boolean HandleEvent(CMainApplet * pCMainApplet, AEEEvent eCode, uint16 wParam, uint32 dwParam); static void FreeAppData(CMainApplet *pCMainApplet); void InitAppData(); void StopApp(); void StartApp(); void PauseApp(); void ResumeApp(); private: CScreenManager* m_pScreenManager; CDataManager* m_pDataManager; /* etc, etc, etc*/ }; Migrando para C++: O Applet

61 HandleEvent e FreeAppData são chamados pela plataforma –Métodos estáticos. –Ponteiros passados no CreateInstance –Assinatura fixa InitAppData, Start, Stop, Pause e Resume reagem a eventos enviados pela plataforma Migrando para C++: O Applet

62 int AEEClsCreateInstance(AEECLSID ClsId, IShell *pIShell, IModule *po, void **ppObj) { *ppObj = NULL; if( ClsId == AEECLSID_HELLOWORLD ) { // Create the applet and make room for the applet structure if( AEEApplet_New(sizeof(CMainApplet), ClsId, pIShell, po, (IApplet**)ppObj, (AEEHANDLER)CMainApplet::HandleEvent, (PFNFREEAPPDATA)CMainApplet::FreeAppData) == TRUE ) { ((CMainApplet *)*ppObj)->InitAppData(); return (AEE_SUCCESS); } return (EFAILED); } void CMainApplet::InitAppData() { // get device info ISHELL_GetDeviceInfo(m_pIShell, const_cast (&m_deviceInfo)); // initialize your managers... // etc, etc, etc } Migrando para C++: O Applet

63 HandleEvent –Chamado pela plataforma: tratar os eventos –Reenviá-los para o gerenciador de eventos InitAppData –Chamado dentro do createInstance –Inicializar os managers FreeAppData –Chamado pela plataforma após o envio do evento STOP –Deletar todos os recursos alocados StartApp –Acionado no recebimento de um evento de START –Coloca o aplicativo pronto pra realmente começar a executar StopApp –Acionado no recebimento de um evento de STOP –Coloca o aplicativo pronto pra ser destruído PauseApp –Acionado no recebimento de um evento de PAUSE –Desalocar recursos BREW –Mínimo de processamento possível ResumeApp –Acionado no recebimento de um evento de RESUME –Restaura o estado do aplicativo –Realiza as ações de processamento/exibição do estado de pause Migrando para C++: O Applet

64 Migrando para C++: Funções Globais extern void* operator new(size_t size); extern void* operator new[](size_t size); extern void operator delete(void *ptr); extern void operator delete[](void *ptr); void* operator new(size_t size) { return MALLOC(size); } void* operator new[](size_t size) { return MALLOC(size); } void operator delete(void *ptr) { FREE(ptr); } void operator delete[](void *ptr) { FREE(ptr); } New e delete precisam ser implementados com as macros MALLOC e FREE e não as funções free() e malloc() de ANSI

65 Migrando para C++: Simulando Exceções Definição do tipo que representa os erros –typedef int32 EUserError; –#define USERERROR_None AEE_SUCCESS // AEEError.h - 0 –#define USERERROR_General (ERROR_USER + 0x01) –#define USERERROR_NoHeapMemory (ERROR_USER + 0x02) Definição das macros de TRY e CATCH –#define TRY_ERROR(e) if((e) != USERERROR_None) {goto CATCH;} –#define TRY_OBJ(obj, e) if((obj) == NULL) {(e) = USERERROR_NoHeapMemory; goto CATCH;} –#define BEGIN_CATCH() CATCH: –#define END_CATCH()

66 Todos os métodos que levantariam exceções recebem como primeiro parâmetro a referência de um erro –void Init(EUserError& rError) {}; Init e Free e não Construtor e Destrutor! Como simular as exceções, utilizando essas macros? Migrando para C++: Simulando Exceções

67 void Init(EUserError& rError) { //... m_pScreenManager = new CScreenManager(); TRY_OBJ(m_pScreenManager, rError); m_pScreenManager->Init(rError); TRY_ERROR(rError); m_pDataManager = new CDataManager(); TRY_OBJ(m_pDataManager, rError); m_pDataManager->Init(rError); TRY_ERROR(rError); return; //... BEGIN_CATCH(); // delete all the resources previously loaded if ( m_pScreenManager ) { m_pScreenManager->Free(); SAFE_DELETE(m_pScreenManager); } if ( m_pDataManager ) { m_pDataManager->Free(); SAFE_DELETE(m_pIDataManager); }

68 Migrando para C++: Nosso HelloWorld Migrar nosso HelloWorld para C++ Dica: –Globals.h com as inclusões de: AEEStdLib.h AEEShell.h AEEModGen.h AEEAppGen.h AEEShell.h _res.h.bid

69 Compilação para o Dispositivo Antes de ser implantada no dispositivo, a aplicação BREW precisa ser compilada para o formato ARM Existem atualmente dois compiladores –RealView Compilation Tool for BREW Conjunto de ferramentas oficial (e pago) da ARM Bastante amigável e aplicações exemplo vêm com makefiles para este ambiente –GNU Cross Compiler Solução não oficial, porém o compilador é free Dependências –BREW SDK –GNU Cross Compiler for ARM –Cygwin

70 Implantação da Aplicação O arquivo compilado possui extensão.mod Este arquivo equivale à DLL usada no emulador Para implantar a aplicação no celular é necessário –Celular com suporte a BREW (destravado!) –Cabo de dados para conexão serial pc celular –Software para cópia de arquivos BREW AppLoader

71 BREW Interface com o usuário

72 Recursos de Interface em BREW BREW dispõe de vários recursos para desenvolvimento de interface com usuário Existem interfaces para –Desenho de primitivas gráficas –Apresentação de imagens –Componentes de entrada e saída Texto, lista de opções, menus Principais interfaces –IDisplay, IGraphics, IImage, IControl

73 IDisplay Desenha texto, BMPs e formas geométricas na tela É usada por todas as aplicações Operações realizadas só têm efeito após uma chamada à função de atualização da tela –Por questão de performance, recomenda-se atualizar a tela apenas após várias operações de desenho

74 IDisplay: Funções Principais void IDisplay_ClearScreen(IDisplay * pIDisplay) –Limpa a área de clipping ou a tela completa se não houver tal área definida void IDISPLAY_EraseRect(IDisplay * pIDisplay, AEERect * pRect) –Limpa um retângulo especificado int IDISPLAY_DrawText(IDisplay * pIDisplay, AEEFont Font, const AECHAR * pcText, int nChars, int x, int y, const AEERect * prcBackground, uint32 dwFlags) –Desenha um texto em uma determinada posição e ajusta ao retângulo de clipping

75 IDisplay: Mais Funções Principais void IDisplay_DrawRect(IDisplay * pIDisplay, const AEERect * pRect, RGBVAL clrFrame, RGBVAL clrFill, uint32 dwFlags) –Desenha um retângulo usando as flags e cores especificadas void IDISPLAY_Update(IDisplay * pIDisplay) –Realiza a atualização da tela IDISPLAY_Update() apenas coloca a operação na fila de mensagens! Para atualização imediata recomenda-se IDISPLAY_UpdateEx() Existem funções similares para desenho de linhas verticais, horizontais e frames

76 IDisplay: Utilização 1.Obtenha uma instância da interface IDisplay através da função ISHELL_CreateInstance() Ou utiliza-se o ponteiro m_pIDisplay da estrutura de dados do applet 2.Se necessário, limpe a região da tela IDisplay_EraseRect() ou IDisplay_EraseRgn() 3.Realize a operação desejada Desenho de texto, linha, retângulo ou bitmap 4.Atualize a tela IDISPLAY_Update() ou IDISPLAY_UpdateEx() 5.Libere a interface se não for mais necessária IDISPLAY_Release() A instância apontada por m_pIDisplay é liberada automaticamente!

77 IDisplay: Exemplo... IDisplay * display = pMe->m_pIDisplay; IDISPLAY_DrawText(display, AEE_FONT_BOLD, szText, -1, 0, 0, NULL, IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE); IDISPLAY_Update(pMe->m_pIDisplay);... Acesso à instância da estrutura Realização da operação Atualização da tela Neste caso não é preciso chamar IDISPLAY_Release()!!

78 Exercício 1 Alterar o código do Exemplo1 para que imprima na tela a tecla numérica pressionada pelo usuário –O código da tecla é recebido no parâmetro wParam –A lista de códigos das teclas está no BREW API Reference, seção Key Codes

79 IGraphics Interface para desenhos 2D mais complexos do que os suportados por IDisplay Suporta círculos e polígonos arbitrários Operações de viewport

80 IGraphics: Funções Principais RGBVAL IGRAPHICS_SetColor(IGraphics * pIGraphics, uint8 r, uint8 g, uint8 b,uint8 alpha) –Seta a cor (RGBA) atual dos objetos a serem desenhados RGBVAL IGRAPHICS_SetBackground( IGraphics * pIGraphics, uint8 r, uint8 g, uint8 b) –Seta a cor (RGBA) do background

81 IGraphics: Mais Funções Principais boolean IGRAPHICS_SetClip(IGraphics * pIGraphics, AEEClip * pShape, uint8 nFlag) –Determina a área de clipping. Os formatos de clipping suportados hoje são retângulo, círculo e elipse int IGRAPHICS_DrawLine(IGraphics * pIGraphics, AEELine * pLine) –Desenha um segmento de reta entre um ponto inicial e um ponto final Funções similares: DrawArc DrawCircle DrawEllipse DrawPoint DrawPie DrawPolygon DrawTriangle DrawRect

82 IGraphics: Ainda Funções Principais int IGRAPHICS_ClearRect(IGraphics * pIGraphics, AEERect * pRect) –Limpa uma área retangular da tela preenchendo com a cor do background void IGRAPHICS_Update(IGraphics * pIGraphics) –Indica que as operações de desenho já foram concluídas e a tela deve ser atualizada

83 IGraphics: Utilização 1.Obtenha uma instância da interface IGraphics através da função ISHELL_CreateInstance() 2.Identifique a área na tela a ser mostrada IGRAPHICS_SetViewport() 3.Ajuste a cor do background IGRAPHICS_SetBackground() 4.Limpe a área do viewport IGRAPHICS_ClearViewport() pinta com a cor do background 5.Especifique a janela do buffer que será mostrada IGRAPHICS_Translate()

84 IGraphics: Mais Utilização 6. Ajuste os parâmetros com funções de set Cor de preenchimento, região de clipping, modo de pintura, etc 7. Realize a operação de desenho desejada 8. Repita os passos 6 e 7 quantas vezes for necessário 9. Atualize a tela com o resultado das operações IGRAPHICS_Update() 10. Se não for mais utilizar a interface, libere-a IGRAPHICS_Release()

85 IGraphics: Exemplo IGraphics * m_pGraphics; AEERect rect; AEELine line;... ISHELL_CreateInstance( app->m_pIShell, AEECLSID_GRAPHICS, (void**)( &m_pGraphics )); IGRAPHICS_SetViewport( m_pGraphics, &rect, AEE_GRAPHICS_NONE ); IGRAPHICS_SetColor( m_pGraphics, 0, 0, 0, 0 ); IGRAPHICS_DrawLine( m_pGraphics, &line ); IGRAPHICS_Update( m_pGraphics ); Especifica tamanho e posição. x,y,dx,dy Recebe endereço do ponteiro para IGraphics Atualização da tela

86 IImage Permite mostrar imagens e animações na tela Cada instância é associada com uma única imagem BMP É possível exibir animações utilizando-se frames em um único BMP Frame 1Frame 2 Frame 3

87 IImage: Funções Principais void IIMAGE_Draw(IImage * pIImage, int x, int y) –Desenha uma imagem (bitmap) na posição especificada void IIMAGE_DrawFrame(IImage * pIImage, int nFrame, int x, int y) –Desenha um frame contido na imagem na posição especificada void IIMAGE_SetParm(pImage * pIImage, int nParm, int p1, int p2) –Seta os valores de vários parâmetros como Tamanho do bitmap (mostra apenas parte da img na tela) Número de frames Taxa de animação

88 IImage: Mais Funções Principais void IIMAGE_Start(IImage * pIImage, int x, int y) –Inicia a animação de uma imagem dividida em frames na posição indicada da tela –O número de frames e velocidade da animação é ajustada através da função IIMAGE_SetParm() void IIMAGE_Stop(IImage * pIImage) –Pára a animação iniciada por IIMAGE_Start()

89 IImage: Utilização 1.Obtenha uma instância da interface que contenha o BMP a ser mostrado ISHELL_LoadResImage(), caso a imagem esteja no arquivo de recursos ISHELL_LoadImage(), para ler diretamente do arquivo 2.Desenhe a imagem na tela IIMAGE_Draw(), sem animação IIMAGE_Start() e IIMAGE_Stop(), com animação 3.Libere a interface IIMAGE_Release()

90 IImage: Exemplo IImage * pImage; pImage = ISHELL_LoadResImage(.....); IIMAGE_Draw(pIMage,x,y); IImage * pImage; pImage = ISHELL_LoadResImage(.....); IIMAGE_SetParm( pImage,IPARM_CXFRAME,cxFrame,0 ); IIMAGE_Start(pImage,10,10); IIMAGE_Stop(pImage); Cria a interface e carrega a imagem do arquivo de recursos Desenha a imagem Imagem simples Com animação Separa a imagem em frames de largura “cxFrame” Inicia a animação Pára a animação

91 Inserindo Imagens no Arquivo de Recursos Prática...

92 Exercício 2 Altere o código do exercício 2 para que os números apresentados na tela sejam imagens –Utilize a função ISHELL_LoadResImage() para carregar a imagem –Não esqueça de liberar a imagem no final! IIMAGE_Release() –A função IIMAGE_SetParm() permite indicar o número de frames de uma imagem

93 Dialogs e Controls Controls são componentes de entrada e saída –Menus, text boxes, listas, controle de teclas, etc. Dialogs são frames que contêm controls Dialogs podem ser criados de duas formas –Via BREW Resource Editor (fazendo parte do BRI) –Construídos programaticamente no código da aplicação Interfaces: IDialog e IControl

94 IDialog Permite o acesso a controls Possui dois métodos principais –IDIALOG_GetControl() Obtém um ponteiro para componentes de menu, texto, data ou tempo pertencentes ao dialog –IDIALOG_SetFocus() Determina o control que receberá o foco para entrada do usuário

95 IControl Interface abstrata implementada por todos os controls BREW Exemplos de controls –IDateCtl: campo de data –IMenuCtl: componente de menu –ITextCtl: entrada de texto –ITimeCtl: campo de hora

96 Criando Dialogs e Controls com o Resource Editor O BREW Resource Editor suporta a criação e configuração de dialogs e diversos controls ID e nome do recurso Posição na tela e tamanho Flags que determinam a aparência do dialog ID do control que receberá o foco inicial Tipos de controls suportados

97 Tipos de Controls

98 Exercício 3 Crie um menu com dois itens no BREW Resource Editor e apresente na tela no início da aplicação –Dica 1: Para que o dialog seja reconhecido pelo ambiente é necessário tratar os eventos (pelo menos retornar TRUE) EVT_DIALOG_START EVT_DIALOG_INIT EVT_DIALOG_END –Dica 2: Para que o componente apareça inicialmente é preciso chamar IDIALOG_Redraw()

99 BREW Recursos de Som

100 ISound Fornece serviços básicos de som –Bips, ring tones, vibração Permite ajuste de volume Pode encapsular um conjunto de tones que podem ser tocados por um período contínuo Tones possuem formato WAV e são referenciados por IDs únicos

101 ISound: Funções Principais void ISOUND_RegisterNotify(ISound * pISound, PFNSOUNDSTATUS pfn, const void * pUser) –Registra a função de callback para notificações int ISOUND_Set(ISound * pISound, const AEESoundInfo * pSoundInfo) –Permite ajustar os atributos do dispositivo –Device, Method, Ear-piece Mute Control e Microphone Mute Control void ISOUND_SetVolume(ISound * pISound, uint16 wVolume) –Ajusta o volume a ser usado

102 ISound: Mais Funções Principais void ISOUND_PlayTone(ISound * pISound, AEESoundToneData toneData) –Toca um tone por um determinado período de tempo void ISOUND_StopTone(ISound * pISound) –Para a reprodução do tone corrente ou finaliza o playback de uma lista de tones void ISOUND_Vibrate(ISound * pISound, uint16 w6Duration) –Ativa a vibração do dispositivo –A chamada a esta função no emulador reproduz um som característico

103 ISound: Utilização 1.Crie uma instância de ISound ISHELL_CreateInstance() ClassID: AEECLSID_SOUND 2.Registre a função de callback ISOUND_RegisterNotify() Caso não queira notificações ISOUND_RegisterNotify(pISound, NULL, NULL) 3.Ajuste os parâmetros ISOUND_Set() 4.Reproduza sons ou vibrações ISOUND_Play() ou ISOUND_Vibrate()

104 ISound: Exemplo ISound * pISound; AEESoundInfo sInfo; AEESoundToneData tone; ISHELL_CreateInstance(pMe->pIShell, AEECLSID_SOUND, &pISound); ISOUND_RegisterNotify(pMe->pISound, NULL, NULL);... sInfo.eDevice = AEE_SOUND_DEVICE_CURRENT; sInfo.eMethod = AEE_SOUND_METHOD_RING; tone.eTone = AEE_TONE_1; tone.wDuration = 100; ISOUND_Set(pMe->pISound, &sInfo); ISOUND_PlayTone(pMe->pISound, tone);

105 ISoundPlayer Provê serviços de áudio multimídia –MIDI, MP3 e QCP (Qualcomm PureVoice) Possui controles de playback avançados –Pause, resume, rewind, forward Pode reproduzir sons carregados na memória ou diretamente de arquivos Playback só é possível para sons alocados em buffer na memória!

106 ISoundPlayer: Funções Principais void ISOUNDPLAYER_RegisterNotify( ISoundPlayer * pISoundPlayer, PFNSOUNDPLAYERSTATUS pfn, void * pUser) –Registra a função de callback para receber eventos de status int ISOUNDPLAYER_SetInfo(ISoundPlayer * pISoundPlayer, AEESoundPlayerInfo * pInfo) –Permite indicar a fonte de áudio (arquivo/buffer) void ISOUNDPLAYER_Play(ISoundPlayer * pISoundPlayer) –Reproduz um áudio MP3, MIDI ou QCP indicado por uma chamada a ISOUNDPLAYER_Set()

107 ISoundPlayer: Mais Funções Principais void ISOUNDPLAYER_Stop(ISoundPlayer * pISoundPlayer) –Envia um comando para parar o playback atual void ISOUNDPLAYER_Rewind(ISoundPlayer * pISoundPlayer, uint32 dwTime) –Realiza o retorno de um determinado período na trilha atual void ISOUNDPLAYER_Pause(ISoundPlayer * pISoundPlayer) –Faz uma pausa na reprodução void ISOUNDPLAYER_FastForward( ISoundPlayer * pISoundPlayer, uint32 dwTime) –Adianta a trilha atual em um determinado período de tempo

108 ISoundPlayer: Utilização 1.Crie uma instância de ISoundPlayer ISHELL_CreateInstance() ClassID: AEECLSID_SOUNDPLAYER 2.Registre a função de callback ISOUNDPLAYER_RegisterNotify() 3.Indique a fonte da mídia Se arquivo ou buffer ISOUNDPLAYER_SetInfo() 4.Utilize os controles de playback para reprodução 5.Ao final Remova o registro da função de callback ISOUNDPLAYER_RegisterNotify(pISoundPlayer, NULL, NULL) Pare a reprodução ativa com ISOUNDPLAYER_Stop()

109 ISoundPlayer: Exemplo ISoundPlayer *pISPlayer; AEESoundPlayerInfo pinfo; AEESoundPlayerInput input; ISHELL_CreateInstance(pMe->pIShell, AEECLSID_SOUNDPLAYER, &pISPlayer); ISOUND_RegisterNotify(pISPlayer, NULL, NULL); pinfo.eInput = SDT_FILE; pinfo.pData = "piano.mp3"; ISOUNDPLAYER_SetInfo(pMe->pISPlayer, &pinfo); ISOUNDPLAYER_Play(pMe->pISPlayer);... ISOUNDPLAYER_Stop(pMe->pISPlayer);

110 Exercício 4 Crie uma aplicação que, ao se pressionar as teclas numéricas, realize as seguintes operações TeclaOperação 1Tocar um tone qualquer por 200ms 2Iniciar a reprodução do mp3 “piano.mp3” 3Iniciar a reprodução do midi “canyon.mid” 4Parar a reprodução atual

111 IMedia (BREW 2.0) Interface abstrata que define os serviços básicos de todos os objetos multimídia em BREW –IMediaMIDI, IMediaMP3,... Objetos multimídia podem conter combinações de audio, vídeo e texto IMedia oferece suporte para playback e gravação como seek, stop, pause e resume

112 IMedia: Máquina de Estados Máquina de estados básica

113 IMedia Formats As seguintes interfaces derivam de IMedia –IMediaMIDI: toca o formato MIDI padrão –IMediaMIDIOutMsg: toca mensagens MIDI –IMediaMIDIOutQCP: toca arquivos QCP (PureVoice) usando o dispositivo MIDI –IMediaMP3: toca o formato MP3 –IMediaQCP: toca e grava o formato QCP –IMediaPMD: toca o formato PMD que inclui áudio e vídeo sincronizados

114 BREW Arquivos

115 Sistemas de Arquivos Dispositivos móveis não contêm sistemas de arquivos convencionais e sim EFSs Não existe o conceito de drive –Não se pode especificar o drive no path –Isto vale também para o emulador Arquivos são abertos a partir do diretório do módulo O número máximo de arquivos a serem criados e o espaço ocupado podem ser restringidos no MIF –“Max Files” e “Max Space”

116 IFile Permite ler e modificar o conteúdo de arquivos Instâncias de IFile são retornadas pela função IFILEMGR_OpenFile() Para modificação do conteúdo a aplicação precisa ter os privilégios “File” ou “All”

117 IFile: Funções Principais int IFILE_GetInfo(IFile * pIFile, FileInfo * pInfo) –Obtém informações como data de criação, tamanho, nome e atributos do arquivo int32 IFILE_Read(IFile * pIFile, void * pBuffer, uint32 dwCount) –Lê um determinado número de bytes de um arquivo aberto uint32 IFILE_Write (IFile * pIFile, PACKED const void * pBuffer, uint32 dwCount) –Escreve uma determinada quantidade de bytes em um arquivo

118 IFile: Utilização 1.Para criar instâncias de IFile IFILEMGR_OpenFile(), pode abrir ou criar um arquivo Retorna um ponteiro para IFile 2.Se necessário, posicione o cursor para leitura ou escrita IFILE_Seek() 3.Leia ou escreva IFILE_Read ou IFILE_Write() 4.Quando completar a operação feche o arquivo IFILE_Release()

119 IFileMgr Possibilita a criação, remoção e renomeação de arquivos e diretórios Lembrar que –Nomes de arquivos e diretórios em BREW não são case sensitive –O tamanho máximo do path no dispositivo é 64 No emulador é 256

120 IFileMgr: Funções Principais IFile * IFILEMGR_OpenFile(IFileMgr * pIFileMgr, const char * pszFile, OpenFile mode) –Abre arquivos em um determinado modo (leitura/escrita) int IFILEMGR_MkDir(IFileMgr * pIFileMgr, const char * pszDir) –Permite a criação de diretórios no sistema de arquivos int IFILEMGR_RmDir(IFileMgr * pIFileMgr, const char * pszDir) –Remove um determinao diretório

121 IFileMgr: Mais Funções Principais int IFILEMGR_Rename(IFileMgr * pIFileMgr, const char * pszSrc, const char * pszDest) –Renomeia um arquivo int IFILEMGR_Remove(IFileMgr * pIFileMgr, const char * pszName) –Remove um dado arquivo do sistema int IFILEMGR_Test(IFileMgr * pIFileMgr, const char * pszName) –Testa se o arquivo ou diretório existe

122 Arquivos: Exemplo IFileMgr * pIFileMgr; if (ISHELL_CreateInstance(pIShell, AEECLSID_FILEMGR, (void **)&pIFileMgr) == SUCCESS) { IFile * pIFile; if (IFILEMGR_Test(pIFileMgr, "arquivo.txt") != SUCCESS) { pIFile = IFILEMGR_OpenFile(pIFileMgr, "arquivo.txt", _OFM_CREATE); } else { pIFile = IFILEMGR_OpenFile(pIFileMgr, "arquivo.txt", _OFM_APPEND); }...

123 Arquivos: Exemplo... if (pIFile != NULL) { char timestamp[30]; SPRINTF(timestamp, “seu texto"); IFILE_Write(pIFile, timestamp, STRLEN(timestamp)); IFILE_Write(pIFile, "\r\n", 2); IFILE_Release(pIFile); } IFILEMGR_Release(pIFileMgr); }

124 Exercício 5 Escreva uma aplicação que registra um log das teclas numéricas e direcionais pressionadas pelo usuário durante sua utilização –Não esqueça de liberar o arquivo antes de sair da aplicação!

125 IDBMgr Possibilita a criação, abertura e remoção de bases de dados A aplicação precisa ter os privilégios “File” ou “All” para ter acesso às funcionalidades de Banco de Dados Após a abertura, usa-se as funções da interface IDatabase para criar e recuperar registros e IDBRecord para atualizar os campos individuais

126 IDBMgr: Funções Principais IDatabase * IDBMgr_OpenDatabase ( IDBMgr * pIDBMgr, const char * fileName,boolean bCreate) –Abre um banco de dados. –TRUE, indica que vai ser criada, caso não exista int IDBMgr_Remove(IDBMgr * pIDBMgr, const char * fileName) –Remove o banco especificado por fileName –O banco especificado deve ter sido liberado através de IDatabase_Release() antes de ser removido. –Retorna código de erro, caso o banco não seja encontrado

127 IDatabase Representa a base de dados. Possui métodos para adicionar e remover registros, bem como navegar pelos registros.

128 IDatabase: Funções Principais void IDATABASE_Reset(IDatabase * pIDatabase) –Traz o ponteiro da base para a primeira posição IDBRecord * IDATABASE_CreateRecord( IDatabase * pIDatabase, AEEDBField * fields, int nFields ) –Cria um registro na base, contendo os campos indicados por fields –nFields : Número de campos no registro IDBRecord * IDATABASE_GetNextRecord(IDatabase * pIDatabase) –Retorna o próximo registro da base

129 IDatabase: Mais funções IDBRecord * IDATABASE_GetRecordByID ( IDatabase * pIDatabase, uint16 id ) –Retorna o registro que contém o id especificado no parâmetro uint32 IDATABASE_GetRecordCount(IDatabase * pIDatabase) –Retorna a quantidade de registros presentes na tabela

130 IDatabase: Criando a base e adicionando registros IDBMgr pDBMgr; IDBMgr pDB; ISHELL_CreateInstance(m_pIShell, AEECLSID_DBMGR, &pDBMgr); pDB = IDBMGR_OpenDatabase(pMe->pDBMgr, "DBALUNO", TRUE); // adiciona os alunos addRecord(pDB, 3, "Marcos"); addRecord(pDB, 5, "Janaína"); // libera o banco IDATABASE_Release(pDB); // libera o DBMgr IDBMGR_Release(pDBMgr);

131 IDatabase: Adição de registros void addRecord(IDatabase* pDB, uint16 id, char* name) { AECHAR cName[512]; STRTOWSTR(name, cName, sizeof(cName)); AEEDBField fields[2]; fields[0].fName = AEEDBFIELD_PREF_ID; fields[0].fType = AEEDB_FT_WORD; fields[0].pBuffer = &id; fields[0].wDataLen = sizeof(uint16); fields[1].fName = AEEDBFIELD_FULLNAME; fields[1].fType = AEEDB_FT_STRING; fields[1].pBuffer = cName; fields[1].wDataLen = WSTRLEN(cName) * sizeof(AECHAR); // grava a entrada no banco IDATABASE_CreateRecord(pDB, fields, 2); }

132 IDatabase: Imprimindo todos void imprimirTodos() { IDBRecord* rec; AEEDBField field; pDB = IDBMGR_OpenDatabase(pMe->pDBMgr, "DBALUNO", FALSE); IDATABASE_Reset(pDB); rec = IDATABASE_GetNextRecord(pDB); while (rec) { // os dados do campo ficam registrados em field.pBuffer IDBRECORD_NextField(rec, &field.fName, &field.wDataLen); field.pBuffer = IDBRECORD_GetField(rec, &field.fName, &field.fType, &field.wDataLen); DBGPRINTF("Aluno (%s): ", field.pBuffer); rec = IDATABASE_GetNextRecord(pDB); }

133 IDatabase: Utilização 1.Obter uma instancia através de IDBMGR_OpenDataBase TRUE indica que a base irá ser criada 2.Traz o ponteiro para o primeiro registro IDATABASE_Reset() 3.Ler os registros através de IDATABASE_GetNextRecord 4.Escrever através de IDATABASE_CreateRecord Usar IDBRecord AEEDBField 5.Liberar a base de dados IDATABASE_Release

134 BREW Rede

135 Suporte a Rede em BREW O ambiente BREW fornece a infraestrutura básica para comunicação via rede –Conexão com Sockets –Segurança com SSL Interfaces –INetMgr: gerenciamento de rede –ISocket: manipulação de sockets –ISSL: segurança

136 INetMgr Fornece mecanismos acessar o subsistema de rede do dispositivo –Obtenção de IP remoto e local –Status da conexão PPP –Ajuste de parâmetros da conexão Dá suporte a criação de sockets para transmissão de pacotes TCP e UDP

137 ISocket Permite conectar, transmitir e receber dados através de conexões UDP e TCP A aplicação precisa de privilégio de “Network” ou “All” Lembre que BREW não tem suporte a threads! Chamadas de bloqueio são implementadas com um abordagem de notificação via callbacks

138 ISocket: Algumas Funções int ISOCKET_Connect(ISocket * pISocket, INAddr a, INPort wPort, PFNCONNECTCB pfn, void * pUser) –Tenta iniciar uma conexão TCP com o endereço especificado para sockets do tipo AEE_SOCK_STREAM –Para sockets do tipo AEE_SOCK_DGRAM o endereço é associado ao socket para escritas subseqüentes int32 ISOCKET_Read(ISocket * pISocket, byte * pbDest, uint16 wSize) –Lê dados de um socket para um buffer local int32 ISOCKET_Write(ISocket * pISocket, byte * pBuffer, uint16 wBytes) –Escreve dados em um socket conectado

139 ISocket: Mais Algumas Funções void ISOCKET_Writeable(ISocket * pISocket, PFNNOTIFY pfn, void * pUser) –Permite registrar uma função de callback quando uma operação de escrita não bloqueante estiver sendo realizada void ISOCKET_Readable(ISocket * pISocket, PFNNOTIFY pfn, void * pUser) –Permite registrar uma função de callback quando uma operação de leitura não bloqueante (Read, ReadV, RecvFrom) estiver sendo realizada

140 ISocket: Abrindo um socket struct _CSocketsApplet {... INetMgr * m_pINetMgr; ISocket * m_pISocket; AEECallback m_cb; // Callback para DNS AEEDNSResult m_dnsr; // Info do DNS } SocketsApplet;... static void StartConection(SocketsApplet * pApp) { pApp->m_pISocket = INETMGR_OpenSocket(pApp->m_pINetMgr, AEE_SOCK_STREAM); CALLBACK_Init(&pApp->m_cb, TCPDNSConnect, pApp); INETMGR_GetHostByName(pApp->m_pINetMgr,&pApp->m_dnsr, “www.host.com”,&pApp->m_cb); } Conectando um socket através de um DNS

141 ISocket: Conectando static void TCPDNSConnect(void * pApp) { int nErr = pApp ->m_dnsr.nResult; if (nErr > AEEDNSMAXADDRS) { // Falha no lookup ReleaseSocket(pApp); return; } nErr = ISOCKET_Connect(pApp->m_pISocket, //socket pApp->m_dnsr.addrs[0],//endereco 0x700, //porta TCPConnected, //callback pApp); if (nErr != AEE_NET_SUCCESS) { // Falha na conexao ReleaseSocket(pApp); } else { // conectando... }

142 ISocket: Conectado static void TCPConnected(void *pApp, int nErr) { if ((nErr == AEE_NET_SUCCESS) || (nErr == AEE_NET_EISCONN)) { //Socket conectado! //Pode escrever... } else { // Falha na conexao ReleaseSocket(pApp); }

143 ISocket: Exemplo: Escrevendo um array de bytes void WriteSocket(void *pApp) { char *psz = NULL; int cbWrite, rv;... // pszData e’ um ponteiro para os dados a serem escritos psz = pszData; cbWrite = STRLEN(pszData); while (cbWrite > 0) { rv = ISOCKET_Write(pApp ->m_pISocket, (byte *)psz, (uint16)cbWrite);...

144 ISocket: Exemplo: Escrevendo um array de bytes... // se nenhum byte foi escrito com sucesso if (rv == AEE_NET_WOULDBLOCK) { // regista a funcao de callback para tentar depois ISOCKET_Writeable( pApp ->m_pISocket, WriteSocket, (void*) pApp ); return; } else if (rv == AEE_NET_ERROR) {// erro de escrita ReleaseSocket( pApp ); return; } // se escreveu uma parte, continua o loop cbWrite -= rv; psz += rv; }

145 ISSL Fornece segurança SSL/TLS para conexões de rede Usada em conjunto com a interface ISocket Combinada com http, possibilita https na interface IWeb

146 BREW Extensão da API

147 API Extensível O ambiente BREW permite que a API seja estendida com novas funcionalidades Similar ao desenvolvimento de aplicações A extensão precisa expor a tabela de funções virtuais para classes externas É necessário –Declarar as interfaces –Definir as classes –Implementar as funções

148 Declarando Interfaces Vamos definir uma extensão “Hello” que define uma função para mostrar uma mensagem na tela Chamaremos nossa interface de IHelloCls Para declaração da interface utiliza-se a macro QINTERFACE() QINTERFACE(IHelloCls) { INHERIT_IBASE(IHelloCls) int (*DrawHello)(IHelloCls * po, AEEPoint ptXYOffset); };

149 Macros de Acesso As seguintes macros de acesso a tabela virtual são definidas Duas funções extras são expostas –AddRef() e Release() –Derivadas da interface IBase através da macro INHERIT_IBASE() Use INHERIT_XXX onde XXX é o nome da interface a ser estendida A macro GET_PVTBL é utilizada para acessar a tabela via ponteiros #define IHELLOCLS_AddRef(p) \ GET_PVTBL(p,IHelloCls)->AddRef(p) #define IHELLOCLS_Release(p) \ GET_PVTBL(p,IHelloCls)->Release(p) #define IHELLOCLS_DrawHello(p,ptC) \ GET_PVTBL(p,IHelloCls)->DrawHello(p,ptC)

150 Equivalente C++ O método anterior equivale a seguinte declaração C++ Por limitações no compilador ARM, não é possível declarações deste tipo class IHelloCls : public IBase { int DrawHello(IHelloCls * po, AEEPoint ptXYOffset); }

151 Definindo Classes Após a definição da interface, é necessária sua implementação typedef struct _HelloCls { DECLARE_VTBL(IHelloCls) // Variaveis da classe Uint32 m_nRefs;// Referencias pra mim IShell *m_pIShell;// copia do ponteiro para o shell IDisplay *m_pIDisplay;// ponteiro para o display IModule *m_pIModule;// ponteiro para o modulo } HelloCls; Declaração da tabela. Ponteiros para funções no início da estrutura

152 Implementando as Funções As funções são implementadas normalmente como funções C As funções AddRef() e Release() são responsáveis pela contagem de referências e limpeza da memória DrawHello() realiza a funcionalidade da extensão Uma função adicional é necessária em extensões da API –AEEClsCreateInstance()

153 AEEClsCreateInstance() Função responsável por criar uma instância da classe Precisa chamar uma operação new específica da classe a ser definida pelo programador Supondo que nossa operação new tem o nome HelloCls_New, ela deveria possuir a seguinte assinatura: int HelloCls_New(int16 nSize, IShell *pIShell, IModule* pIModule, IModule ** ppMod);

154 Operação New A função new deve realizar as seguintes operações –Alocação de memória –Inicialização da tabela virtual –Inicialização dos membros de classe –Incialização de outros códigos O retorno da função indica se a operação foi realizada com sucesso

155 Alocação de Memória A área de memória para a classe precisa ser alocada VTBL(IHelloCls) * modFuncs; //tabela virtual if(!ppMod || !pIShell || !pIModule) return EFAILED; *ppMod = NULL; if(nSize < sizeof(HelloCls)) nSize += sizeof(HelloCls); //alocacao de memoria para o objeto HelloCls if((pMe = (HelloCls *) MALLOC(nSize + sizeof(VTBL(IHellCls)))) == NULL ) return ENOMEMORY;

156 Inicialização da Tabela Após a alocação, a tabela precisa apontar para as funções corretas modFuncs = (IHelloClsVtbl *)((byte *)pMe + nSize); //inicializa as entradas individuais na VTBL modFuncs->AddRef = HelloCls_AddRef; modFuncs->Release = HelloCls_Release; modFuncs->DrawHello = HelloCls_DrawHello; // inicializa a tabela INIT_VTBL(pMe, IModule, *modFuncs);

157 Inicialização dos Membros de Classe Após a inicialização da tabela, realiza-se a inicialização dos membros de classe Note que o número de referências é iniciado com o valor 1 pMe->m_nRefs = 1; pMe->m_pIShell = pIShell; pMe->m_pIModule = pIModule;

158 Outras Inicializações Toda classe precisa incrementar o contador de referências para ISHELL e IMODULE ISHELL_AddRef(pIShell); IMODULE_AddRef(pIModule); //acesso a IDisplay if(ISHELL_CreateInstance(pIShell, AEECLSID_DISPLAY, (void **)&pMe->m_pIDisplay) = SUCCESS) return EFAILED; // coloca o ponteiro no parametro *ppMod = (IModule*)pMe; return AEE_SUCCESS;

159 Utilização da Extensão Após os passos anteriores, outras aplicações podem criar instâncias da extensão chamando ISHELL_CreateInstance() if((ISHELL_CreateInstance(pMe->m_pIShell, AEECLSID_HELLO_CLS, (void **)&pHelloCls))!=SUCCESS) return FALSE; IHELLOCLS_DrawHello(pHelloCls,ptHello); IDISPLAY_Update(pMe->m_pIDisplay); IHELLOCLS_Release(pHelloCls);

160 Acesso a Extensões Applet Macros IHELLOCLS_AddRef IHELLOCLS_Release IHELLOCLS_DrawHello IHelloCls VTBL AddRef Release DrawHello HelloCls_AddRef(){ } HelloCls_Release(){ } HelloCls_DrawHello() { }

161 Referências 1.BREW SDK TM User’s Guide 2.BREW SDK TM API Reference 3.BREW Online Help 4.http://brew.qualcomm.comhttp://brew.qualcomm.com 5.Murray Bonner. What is BREW? Disponível em http://www.developer.com/ws/brew/article.php/1454711 http://www.developer.com/ws/brew/article.php/1454711

162 Itens


Carregar ppt "Surgimento Qualcomm –Fundada em 1985 –San Diego, Califórnia USA –Localização por satélite – OmniTracs –CDMA: dispositivos e estações base –Eudora! Ano:"

Apresentações semelhantes


Anúncios Google