TextViewer.java

/**
 * Copyright (c) 2012 Nokia Corporation. All rights reserved.
 * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation.
 * Oracle and Java are trademarks or registered trademarks of Oracle and/or its
 * affiliates. Other product and company names mentioned herein may be trademarks
 * or trade names of their respective owners.
 * See LICENSE.TXT for license information.
 */

package com.nokia.example.contenthandler.texthandler;

import java.io.InputStream;

import javax.microedition.content.Invocation;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.StringItem;

/**
 * Class display the text invocation. It uses a form to display the invocation
 * text. Basically, it makes HTTP Connection with the invocation URL and get the
 * content.
 *
 * @author gothadiy
 *
 */
public class TextViewer extends Form implements CommandListener {

    // Intial title of the text display form
    private static final String DEFAULT_TITLE = "Text Viewer";
    // Message saying.. No content to display
    private static final String NO_CONTENT = "no content to display";
    // Instance of TextHandler used to display form
    private TextHandler textHandler = null;
    // Instance of invocation. Get value from the constructor
    private Invocation invoc = null;
    Command detailCommand = new Command("Details", Command.ITEM, 1);
    // Go back to the choice list window
    Command backCommand = new Command("Back", Command.BACK, 2);

    /**
     * Constructor initialize gives instances of TextHandler and Invocation and
     * initalize the text contents.
     *
     * @param _invoc Text Invocation instance.
     * @param _textHandler Instance of TextHandler
     */
    TextViewer(Invocation _invoc, TextHandler _textHandler) {
        super(TextViewer.DEFAULT_TITLE);

        invoc = _invoc;
        textHandler = _textHandler;

        this.addCommand(detailCommand);
        this.addCommand(backCommand);
        setCommandListener(this);
        displayContent(invoc);
    }

    /**
     * It validates the invoc object and URL. It creates the HTTP connection and
     * get the text content. Append it to the form and display.
     *
     * @param invoc Text Invocation instance.
     */
    private void displayContent(Invocation invoc) {

        String url;
        if ((invoc == null)) {
            this.append(TextViewer.NO_CONTENT);
            return;
        }

        if ((url = invoc.getURL()) == null) {
            this.append(TextViewer.NO_CONTENT);
            return;
        }

        // Set file name as a form title
        String title = url.substring(url.lastIndexOf('/') + 1);
        this.setTitle(TextViewer.DEFAULT_TITLE + " - " + title);

        HttpConnection conn = null;
        InputStream input = null;
        StringBuffer txtContentBuff;

        try {
            //Open connection using invocation
            conn = (HttpConnection) invoc.open(false);
            conn.setRequestMethod(HttpConnection.GET);

            // If not successful, Display response code with response message.
            if (conn.getResponseCode() != HttpConnection.HTTP_OK) {
                this.append(conn.getResponseMessage() + " (" + conn.getResponseCode() + ")");
                return;
            }
            // 2,5 training 1 bf + meeting 3,5 CH updating
            // Create StringBuffer with the size of response length
            txtContentBuff = new StringBuffer((int) conn.getLength());

            // Max size supported is char 4096;
            int maxLen = 4096;
            input = conn.openInputStream();
            // Read char and store it to the StringBuffer
            int ch;
            while ((ch = input.read()) != -1) {
                txtContentBuff.append((char) ch);

                if (txtContentBuff.length() >= maxLen) {
                    break;
                }
            }

            // Process the buffer and append text to the form
            this.append(new StringItem(null, txtContentBuff.toString(), Item.PLAIN));

        }
        catch (Throwable th) {

            txtContentBuff = null;
            //th.printStackTrace();
        }
        finally {
            try {
                if (input != null) {
                    input.close();
                }
                if (conn != null) {
                    conn.close();
                }
            }
            catch (Exception e) {
            }
        }
    }

    public void commandAction(Command command, Displayable disp) {
        if (command == detailCommand) {
            try {
                String details = "Invocation Type: " + invoc.findType() + "\n";
                details += "Action: " + invoc.getAction() + "\n";
                details += "ID: " + invoc.getID() + "\n";
                details += "Invoking App Name: " + invoc.getInvokingAppName() + "\n";
                details += "Invoking Authority: " + invoc.getInvokingAuthority() + "\n";
                details += "Invoking ID: " + invoc.getInvokingID() + "\n";

                Alert alert = new Alert("Details", details, null, AlertType.INFO);
                alert.setTimeout(Alert.FOREVER);
                textHandler.display.setCurrent(alert);
            }
            catch (Exception e) {
                //e.printStackTrace();
            }
        }
        else if (command == backCommand) {

            textHandler.doFinish(Invocation.OK);
            textHandler.display.setCurrent(textHandler.choices);
        }

    }
}