import appuifw, e32, camera, thread, socket, json, graphics SERVER = ("192.168.0.2", 9000) def send_message(msg): global to_server try: to_server.write(json.write(msg)) to_server.flush() thread_handle_message({"note": u"Message sent!"}) except Exception, ex: print "Connection error", ex to_server = None def read_message(): global to_server try: msg = json.read_stream(to_server) thread_handle_message(msg) except Exception: print "Broken connection" to_server = None def connect(): global to_server, keep_talking, conn conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) conn.connect(SERVER) to_server = conn.makefile("rw", 8192) send_message({"!name": me}) ret = json.read_stream(to_server) if "err" in ret: thread_handle_message({"note": u"Login failed"}) thread_show_note(u"Login failed: %s" % ret["err"], "error") keep_talking = False raise "Login failed" else: thread_handle_message({"note": u"Login ok"}) def communicate(): global to_server, keep_talking, thread_send_message, app_lock thread_send_message = e32.ao_callgate(send_message) to_server = None while keep_talking: if to_server: read_message() else: try: connect() thread_handle_message(\ {"note": u"Waiting for messages..."}) except: print "Could not connect to server" to_server = None if keep_talking: e32.ao_sleep(10) if conn: conn.close() if to_server: to_server.close() def show_photo(jpeg_data): global img f = file("E:\\Images\\msg.jpg", "w") f.write(jpeg_data) f.close() img = graphics.Image.open("E:\\Images\\msg.jpg") def handle_message(msg): global text, note if "photo" in msg: show_photo(msg["photo"]) text = {"from": msg["from"], "txt": ""} elif "txt" in msg: text = msg elif "note" in msg: note = msg["note"] redraw(None) def send_photo(): handle_message({"note": u"Taking photo..."}) dst = appuifw.query(u"To", "text") img = camera.take_photo(size = (640, 480)) img = img.resize((320, 240)) img.save("E:\\Images\\temp.jpg") jpeg = file("E:\\Images\\temp.jpg").read() handle_message({"note": u"Sending photo..."}) thread_send_message({"!dst": dst, "photo": jpeg, "from": me}) def send_text(): resp = appuifw.multi_query(u"To", u"Message") if resp: dst, txt = resp thread_send_message({"!dst": dst, "txt": txt, "from": me}) def quit(): global keep_talking, to_server, conn keep_talking = False thread_send_message({"!close": True}) app_lock.signal() def redraw(rect): RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) canvas.clear((255, 255, 255)) if img: canvas.blit(img, scale = 1) if note: canvas.text((10, canvas.size[1] - 30), note,\ fill = RED, font = "title") if text: canvas.text((10, 80), u"From: %s" % text["from"],\ fill = GREEN, font = "title") canvas.text((10, 110), unicode(text["txt"]),\ fill = BLUE, font = "title") img = text = note = None keep_talking = True thread_handle_message = e32.ao_callgate(handle_message) appuifw.app.exit_key_handler = quit appuifw.app.title = u"Instant Messenger" appuifw.app.menu = [(u"Send Photo", send_photo),\ (u"Send Text", send_text)] canvas = appuifw.Canvas(redraw_callback = redraw) appuifw.app.body = canvas me = appuifw.query(u"Login name", "text") handle_message({"note": u"Contacting server..."}) if me: app_lock = e32.Ao_lock() thread.start_new_thread(communicate, ()) if keep_talking: app_lock.wait()