BayGUI Web Toolkit?

IRCでうっちゃんと話していたときに出たネタ。Google Web Toolkit に対抗して、BayGUI とソース互換で CGI が作れたら面白いね、とひらめいた。ちなみに Google Web Toolkit を使うと

package jp.tuyano.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;

public class MyGwt implements EntryPoint {

  public void onModuleLoad() {
    final Button button = new Button("Click me");
    final Label label = new Label();

    button.addClickListener(new ClickListener() {
      public void onClick(Widget sender) {
        if (label.getText().equals(""))
          label.setText("Hello World!");
        else
          label.setText("");
        }
    });

    RootPanel.get("slot1").add(button);
    RootPanel.get("slot2").add(label);
  }
}

こんな感じで、Web アプリを作れます。なんか BayGUI のソースにそっくりですよね(笑)。Ajax + C++ で Web アプリなんて、Web2.0 と Binary2.0 の交点にいるみたいで、わくわくします!!イベント周りをどう Ajax で実現するかが肝になるでしょうね。

とりあえず CGI には全く見えない CGIC++ で作ってみました(笑)。

#include <stdio.h>
#include <stdlib.h>

class Graphics {
public:
    void drawString(char* text, int x, int y) {
        printf("%s", text);
    }
};

class Frame {
private:
    char* title;
    Graphics* g;
    
public:
    Frame(char* title) {
        this->title = title;
        this->g = new Graphics();
    }
    
    void paint(Graphics* g) {
        g->drawString("hogehoge", 0, 0);
    }
    
    void repaint() {
        printf("Content-Type: text/html;\n\n");
        printf("<html><title>%s</title><body>", title);
        paint(g);
        printf("</body></html>\n");
    }
};

int main(void) {
    Frame* app = new Frame("Hello,World");
    app->repaint();
    return 0;
}

コンパイルして実行します。上手く実行できたら、ブラウザからアクセスしてみましょう。

g++ -Wall -o index.cgi main.cpp && ./index.cgi