109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly/*
209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Copyright (c) 2008-2009, Motorola, Inc.
309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * All rights reserved.
509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Redistribution and use in source and binary forms, with or without
709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * modification, are permitted provided that the following conditions are met:
809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * - Redistributions of source code must retain the above copyright notice,
1009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * this list of conditions and the following disclaimer.
1109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
1209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * - Redistributions in binary form must reproduce the above copyright notice,
1309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * this list of conditions and the following disclaimer in the documentation
1409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * and/or other materials provided with the distribution.
1509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
1609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * - Neither the name of the Motorola, Inc. nor the names of its contributors
1709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * may be used to endorse or promote products derived from this software
1809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * without specific prior written permission.
1909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
2009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
2409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * POSSIBILITY OF SUCH DAMAGE.
3109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */
3209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
3309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellypackage com.android.bluetooth.opp;
3409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
356769b59d715ea98bd72eafcfea9acd2714a887daTao Liejunimport com.android.bluetooth.R;
366769b59d715ea98bd72eafcfea9acd2714a887daTao Liejun
3709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.app.Activity;
3809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.ContentValues;
3909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.Context;
4009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.Intent;
4109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.database.Cursor;
4209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.net.Uri;
4309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.os.Bundle;
44888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport android.os.Handler;
45888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport android.os.Message;
4609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.util.Log;
4709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.widget.Button;
4809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.widget.EditText;
4909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.view.View;
5009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.view.View.OnClickListener;
5109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
52888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport java.io.DataInputStream;
53888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport java.io.DataOutputStream;
54888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport java.io.File;
55888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport java.io.FileOutputStream;
56888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport java.io.IOException;
57888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport java.io.InputStream;
58888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport java.io.OutputStream;
59888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport java.net.ServerSocket;
60888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport java.net.Socket;
61888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport java.net.SocketException;
62888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
63888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport javax.obex.Authenticator;
64888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport javax.obex.HeaderSet;
65888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport javax.obex.ObexTransport;
66888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport javax.obex.Operation;
67888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport javax.obex.ResponseCodes;
68888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport javax.obex.ServerRequestHandler;
69888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunimport javax.obex.ServerSession;
70888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
7109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellypublic class TestActivity extends Activity {
7209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
7309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public String currentInsert;
7409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
7509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public int mCurrentByte = 0;
7609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
7709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    EditText mUpdateView;
7809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
7909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    EditText mAckView;
8009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
8109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    EditText mDeleteView;
8209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
8309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    EditText mInsertView;
8409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
8509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    EditText mAddressView;
8609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
8709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    EditText mMediaView;
8809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
8909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    TestTcpServer server;
9009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
9109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    /** Called when the activity is first created. */
9209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    @Override
9309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public void onCreate(Bundle savedInstanceState) {
9409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        super.onCreate(savedInstanceState);
9509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
9609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        Intent intent = getIntent();
9709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
9809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        String action = intent.getAction();
9909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
10009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        Context c = getBaseContext();
10109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
10209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        if (Intent.ACTION_SEND.equals(action)) {
10309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            /*
10409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly             * Other application is trying to share a file via Bluetooth,
10509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly             * probably Pictures, or vCard. The Intent should contain an
10609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly             * EXTRA_STREAM with the data to attach.
10709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly             */
10809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
10909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            String type = intent.getType();
11009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            Uri stream = (Uri)intent.getParcelableExtra(Intent.EXTRA_STREAM);
11109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
11209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (stream != null && type != null) {
11309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                /*
11409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                 * if (MimeUtility.mimeTypeMatches(type,
11509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                 * Email.ACCEPTABLE_ATTACHMENT_SEND_TYPES)) {
11609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                 * addAttachment(stream);
11709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                 */
11809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                Log.v(Constants.TAG, " Get share intent with Uri " + stream + " mimetype is "
11909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                        + type);
12009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                // Log.v(Constants.TAG, " trying Uri function " +
12109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                // stream.getAuthority() + " " + Uri.parse(stream));
12209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                Cursor cursor = c.getContentResolver().query(stream, null, null, null, null);
12309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                cursor.close();
12409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
12509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
12609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            /* start insert a record */
12709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            /*
12809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly             * ContentValues values = new ContentValues();
12909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly             * values.put(BluetoothShare.URI, stream.toString());
13009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly             * values.put(BluetoothShare.DESTINATION, "FF:FF:FF:00:00:00");
13109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly             * values.put(BluetoothShare.DIRECTION,
13209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly             * BluetoothShare.DIRECTION_OUTBOUND); final Uri contentUri =
13309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly             * getContentResolver().insert(BluetoothShare.CONTENT_URI, values);
13409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly             * Log.v(Constants.TAG, "insert contentUri: " + contentUri);
13509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly             */
13609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
13709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        /*
13809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * Context c = getBaseContext(); c.startService(new Intent(c,
13909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * BluetoothOppService.class));
14009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         */
14109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
14209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        setContentView(R.layout.testactivity_main);
14309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
144af9af3c451fde7712e86c9430169c306b91836a4Jackson Fan        Button mInsertRecord = (Button)findViewById(R.id.insert_record);
145af9af3c451fde7712e86c9430169c306b91836a4Jackson Fan        Button mDeleteRecord = (Button)findViewById(R.id.delete_record);
146af9af3c451fde7712e86c9430169c306b91836a4Jackson Fan        Button mUpdateRecord = (Button)findViewById(R.id.update_record);
14709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
148af9af3c451fde7712e86c9430169c306b91836a4Jackson Fan        Button mAckRecord = (Button)findViewById(R.id.ack_record);
14909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
150af9af3c451fde7712e86c9430169c306b91836a4Jackson Fan        Button mDeleteAllRecord = (Button)findViewById(R.id.deleteAll_record);
151af9af3c451fde7712e86c9430169c306b91836a4Jackson Fan        mUpdateView = (EditText)findViewById(R.id.update_text);
152af9af3c451fde7712e86c9430169c306b91836a4Jackson Fan        mAckView = (EditText)findViewById(R.id.ack_text);
153af9af3c451fde7712e86c9430169c306b91836a4Jackson Fan        mDeleteView = (EditText)findViewById(R.id.delete_text);
154af9af3c451fde7712e86c9430169c306b91836a4Jackson Fan        mInsertView = (EditText)findViewById(R.id.insert_text);
15509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
156af9af3c451fde7712e86c9430169c306b91836a4Jackson Fan        mAddressView = (EditText)findViewById(R.id.address_text);
157af9af3c451fde7712e86c9430169c306b91836a4Jackson Fan        mMediaView = (EditText)findViewById(R.id.media_text);
15809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
15909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mInsertRecord.setOnClickListener(insertRecordListener);
16009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mDeleteRecord.setOnClickListener(deleteRecordListener);
16109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mUpdateRecord.setOnClickListener(updateRecordListener);
16209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mAckRecord.setOnClickListener(ackRecordListener);
16309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mDeleteAllRecord.setOnClickListener(deleteAllRecordListener);
16409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
165af9af3c451fde7712e86c9430169c306b91836a4Jackson Fan        Button mStartTcpServer = (Button)findViewById(R.id.start_server);
16609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mStartTcpServer.setOnClickListener(startTcpServerListener);
16709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
168af9af3c451fde7712e86c9430169c306b91836a4Jackson Fan        Button mNotifyTcpServer = (Button)findViewById(R.id.notify_server);
16909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mNotifyTcpServer.setOnClickListener(notifyTcpServerListener);
17009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        /* parse insert result Uri */
17109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        /*
17209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * String id = contentUri.getPathSegments().get(1); Log.v(Constants.TAG,
17309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * "insert record id is " + id); Uri contentUri1 =
17409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * Uri.parse(BluetoothShare.CONTENT_URI + "/" + id);
17509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         */
17609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        /* update a single column of a record */
17709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        /*
17809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * ContentValues updateValues = new ContentValues();
17909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * updateValues.put(BluetoothShare.TOTAL_BYTES, 120000);
18009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * getContentResolver().update(contentUri1,updateValues,null,null);
18109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         */
18209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        /* query a single column of a record */
18309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        /*
18409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * Cursor queryC = getContentResolver().query(contentUri1, null, null,
18509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * null, null); if (queryC != null) { if (queryC.moveToFirst()) { int
18609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * currentByteColumn =
18709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * queryC.getColumnIndexOrThrow(BluetoothShare.CURRENT_BYTES); int
18809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * currentByte = queryC.getInt(currentByteColumn);
18909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         */
19009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        /* update a column of a record */
19109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        /*
19209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * for(int i =0;i<100;i++){ currentByte ++;
19309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * updateValues.put(BluetoothShare.CURRENT_BYTES, currentByte);
19409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * getContentResolver().update(contentUri1,updateValues,null,null); } }
19509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * }
19609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         */
19709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        /* query whole data base */
19809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        /*
19909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * Cursor c = managedQuery(contentUri1, new String [] {"_id",
20009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * BluetoothShare.URI, BluetoothShare.STATUS,
20109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * BluetoothShare.TOTAL_BYTES, BluetoothShare.CURRENT_BYTES,
20209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * BluetoothShare._DATA, BluetoothShare.DIRECTION,
20309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * BluetoothShare.MIMETYPE, BluetoothShare.DESTINATION,
20409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * BluetoothShare.VISIBILITY, BluetoothShare.USER_CONFIRMATION,
20509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * BluetoothShare.TIMESTAMP}, null, null, null); Log.v(Constants.TAG,
20609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * "query " + contentUri1 +" get " + c.getCount()+" records");
20709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         */
20809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        /* delete a record */
20909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        /*
21009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * Uri contentUri2 = Uri.parse(BluetoothShare.CONTENT_URI + "/" + 1);
21109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         * getContentResolver().delete(contentUri2, null, null);
21209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly         */
21309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
21409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
21509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
21609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public OnClickListener insertRecordListener = new OnClickListener() {
21709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public void onClick(View view) {
21809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
21909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            String address = null;
22009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (mAddressView.getText().length() != 0) {
22109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                address = mAddressView.getText().toString();
22209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                Log.v(Constants.TAG, "Send to address  " + address);
22309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
22409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (address == null) {
22509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                address = "00:17:83:58:5D:CC";
22609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
22709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
22809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            Integer media = null;
22909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (mMediaView.getText().length() != 0) {
23009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                media = Integer.parseInt(mMediaView.getText().toString().trim());
23109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                Log.v(Constants.TAG, "Send media no.  " + media);
23209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
23309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (media == null) {
23409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                media = 1;
23509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
23609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            ContentValues values = new ContentValues();
23709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            values.put(BluetoothShare.URI, "content://media/external/images/media/" + media);
23809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // values.put(BluetoothShare.DESTINATION, "FF:FF:FF:00:00:00");
23909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // baibai Q9 test
24009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // values.put(BluetoothShare.DESTINATION, "12:34:56:78:9A:BC");
24109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // java's nokia
24209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // values.put(BluetoothShare.DESTINATION, "00:1B:33:F0:58:FB");
24309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // Assis phone
24409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // values.put(BluetoothShare.DESTINATION, "00:17:E5:5D:74:F3");
24509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // Jackson E6
24609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // values.put(BluetoothShare.DESTINATION, "00:1A:1B:7F:1E:F0");
24709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // Baibai V950
24809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // values.put(BluetoothShare.DESTINATION, "00:17:83:58:5D:CC");
24909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // Baibai NSC1173
25009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // values.put(BluetoothShare.DESTINATION, "00:16:41:49:5B:F3");
25109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
25209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            values.put(BluetoothShare.DESTINATION, address);
25309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
25409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            values.put(BluetoothShare.DIRECTION, BluetoothShare.DIRECTION_OUTBOUND);
25509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
25609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            Long ts = System.currentTimeMillis();
25709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            values.put(BluetoothShare.TIMESTAMP, ts);
25809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
25909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            Integer records = null;
26009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (mInsertView.getText().length() != 0) {
26109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                records = Integer.parseInt(mInsertView.getText().toString().trim());
26209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                Log.v(Constants.TAG, "parseInt  " + records);
26309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
26409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (records == null) {
26509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                records = 1;
26609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
26709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            for (int i = 0; i < records; i++) {
26809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                Uri contentUri = getContentResolver().insert(BluetoothShare.CONTENT_URI, values);
26909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                Log.v(Constants.TAG, "insert contentUri: " + contentUri);
27009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                currentInsert = contentUri.getPathSegments().get(1);
27109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                Log.v(Constants.TAG, "currentInsert = " + currentInsert);
27209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
27309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
27409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
27509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    };
27609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
27709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public OnClickListener deleteRecordListener = new OnClickListener() {
27809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public void onClick(View view) {
27909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            Uri contentUri = Uri.parse(BluetoothShare.CONTENT_URI + "/"
28009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                    + mDeleteView.getText().toString());
28109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            getContentResolver().delete(contentUri, null, null);
28209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
28309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    };
28409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
28509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public OnClickListener updateRecordListener = new OnClickListener() {
28609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public void onClick(View view) {
28709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            Uri contentUri = Uri.parse(BluetoothShare.CONTENT_URI + "/"
28809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                    + mUpdateView.getText().toString());
28909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            ContentValues updateValues = new ContentValues();
29009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // mCurrentByte ++;
29109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // updateValues.put(BluetoothShare.TOTAL_BYTES, "120000");
29209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // updateValues.put(BluetoothShare.CURRENT_BYTES, mCurrentByte);
29309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // updateValues.put(BluetoothShare.VISIBILITY,
29409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // BluetoothShare.VISIBILITY_HIDDEN);
29509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            updateValues.put(BluetoothShare.USER_CONFIRMATION,
29609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                    BluetoothShare.USER_CONFIRMATION_CONFIRMED);
29709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            getContentResolver().update(contentUri, updateValues, null, null);
29809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
29909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    };
30009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
30109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public OnClickListener ackRecordListener = new OnClickListener() {
30209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public void onClick(View view) {
30309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            Uri contentUri = Uri.parse(BluetoothShare.CONTENT_URI + "/"
30409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                    + mAckView.getText().toString());
30509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            ContentValues updateValues = new ContentValues();
30609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // mCurrentByte ++;
30709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // updateValues.put(BluetoothShare.TOTAL_BYTES, "120000");
30809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // updateValues.put(BluetoothShare.CURRENT_BYTES, mCurrentByte);
30909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            updateValues.put(BluetoothShare.VISIBILITY, BluetoothShare.VISIBILITY_HIDDEN);
31009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // updateValues.put(BluetoothShare.USER_CONFIRMATION,
31109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            // BluetoothShare.USER_CONFIRMATION_CONFIRMED);
31209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            getContentResolver().update(contentUri, updateValues, null, null);
31309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
31409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    };
31509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
31609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public OnClickListener deleteAllRecordListener = new OnClickListener() {
31709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public void onClick(View view) {
31809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            Uri contentUri = Uri.parse(BluetoothShare.CONTENT_URI + "");
31909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            getContentResolver().delete(contentUri, null, null);
32009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
32109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    };
32209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
32309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public OnClickListener startTcpServerListener = new OnClickListener() {
32409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public void onClick(View view) {
32509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            server = new TestTcpServer();
32609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            Thread server_thread = new Thread(server);
32709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            server_thread.start();
32809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
32909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
33009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    };
33109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
33209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public OnClickListener notifyTcpServerListener = new OnClickListener() {
33309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        public void onClick(View view) {
33409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            final Thread notifyThread = new Thread() {
33509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                public void run() {
33609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                    synchronized (server) {
33709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                        server.a = true;
33809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                        server.notify();
33909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                    }
34009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                }
34109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
34209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            };
34309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            notifyThread.start();
34409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
34509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
34609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    };
34709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly}
348888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
349888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun/**
350888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun * This class listens on OPUSH channel for incoming connection
351888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun */
352888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunclass TestTcpListener {
353888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
354888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    private static final String TAG = "BtOppRfcommListener";
355888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
356888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    private static final boolean D = Constants.DEBUG;
357888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
358888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    private static final boolean V = Constants.VERBOSE;
359888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
360888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    private volatile boolean mInterrupted;
361888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
362888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    private Thread mSocketAcceptThread;
363888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
364888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    private Handler mCallback;
365888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
366888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    private static final int ACCEPT_WAIT_TIMEOUT = 5000;
367888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
368888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public static final int DEFAULT_OPP_CHANNEL = 12;
369888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
370888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public static final int MSG_INCOMING_BTOPP_CONNECTION = 100;
371888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
372888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    private int mBtOppRfcommChannel = -1;
373888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
374888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public TestTcpListener() {
375888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        this(DEFAULT_OPP_CHANNEL);
376888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
377888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
378888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public TestTcpListener(int channel) {
379888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        mBtOppRfcommChannel = channel;
380888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
381888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
382888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public synchronized boolean start(Handler callback) {
383888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        if (mSocketAcceptThread == null) {
384888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            mCallback = callback;
385888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            mSocketAcceptThread = new Thread(TAG) {
386888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                ServerSocket mServerSocket;
387888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
388888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                public void run() {
389888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                    if (D) Log.d(TAG, "RfcommSocket listen thread starting");
390888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                    try {
391888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                        if (V)
392888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                            Log.v(TAG, "Create server RfcommSocket on channel"
393888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                                    + mBtOppRfcommChannel);
394888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                        mServerSocket = new ServerSocket(6500, 1);
395888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                    } catch (IOException e) {
396888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                        Log.e(TAG, "Error listing on channel" + mBtOppRfcommChannel);
397888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                        mInterrupted = true;
398888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                    }
399888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                    while (!mInterrupted) {
400888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                        try {
401888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                            mServerSocket.setSoTimeout(ACCEPT_WAIT_TIMEOUT);
402888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                            Socket clientSocket = mServerSocket.accept();
403888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                            if (clientSocket == null) {
404888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                                if (V) Log.v(TAG, "incomming connection time out");
405888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                            } else {
406888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                                if (D) Log.d(TAG, "RfcommSocket connected!");
407888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                                Log.d(TAG, "remote addr is "
408888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                                        + clientSocket.getRemoteSocketAddress());
409888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                                TestTcpTransport transport = new TestTcpTransport(clientSocket);
410888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                                Message msg = Message.obtain();
411888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                                msg.setTarget(mCallback);
412888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                                msg.what = MSG_INCOMING_BTOPP_CONNECTION;
413888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                                msg.obj = transport;
414888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                                msg.sendToTarget();
415888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                            }
416888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                        } catch (SocketException e) {
417888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                            Log.e(TAG, "Error accept connection " + e);
418888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                        } catch (IOException e) {
419888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                            Log.e(TAG, "Error accept connection " + e);
420888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                        }
421888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
422888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                        if (mInterrupted) {
423888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                            Log.e(TAG, "socketAcceptThread thread was interrupted (2), exiting");
424888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                        }
425888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                    }
426888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                    if (D) Log.d(TAG, "RfcommSocket listen thread finished");
427888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                }
428888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            };
429888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            mInterrupted = false;
430888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            mSocketAcceptThread.start();
431888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
432888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        }
433888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return true;
434888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
435888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
436888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
437888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public synchronized void stop() {
438888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        if (mSocketAcceptThread != null) {
439888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            if (D) Log.d(TAG, "stopping Connect Thread");
440888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            mInterrupted = true;
441888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            try {
442888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                mSocketAcceptThread.interrupt();
443888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                if (V) Log.v(TAG, "waiting for thread to terminate");
444888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                mSocketAcceptThread.join();
445888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                mSocketAcceptThread = null;
446888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                mCallback = null;
447888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            } catch (InterruptedException e) {
448888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                if (V) Log.v(TAG, "Interrupted waiting for Accept Thread to join");
449888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            }
450888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        }
451888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
452888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
453888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun}
454888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
455888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunclass TestTcpServer extends ServerRequestHandler implements Runnable {
456888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    private static final String TAG = "ServerRequestHandler";
457888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
458888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    private static final boolean V = Constants.VERBOSE;
459888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
460888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    static final int port = 6500;
461888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
462888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public boolean a = false;
463888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
464888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    // TextView serverStatus = null;
465888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public void run() {
466888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        try {
467888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            updateStatus("[server:] listen on port " + port);
468888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            TestTcpSessionNotifier rsn = new TestTcpSessionNotifier(port);
469888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
470888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            updateStatus("[server:] Now waiting for a client to connect");
471888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            rsn.acceptAndOpen(this);
472888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            updateStatus("[server:] A client is now connected");
473888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        } catch (Exception ex) {
474888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            updateStatus("[server:] Caught the error: " + ex);
475888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        }
476888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
477888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
478888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public TestTcpServer() {
479888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        updateStatus("enter construtor of TcpServer");
480888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
481888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
482888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public int onConnect(HeaderSet request, HeaderSet reply) {
483888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
484888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        updateStatus("[server:] The client has created an OBEX session");
485888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        /* sleep for 2000 ms to wait for the batch contains all ShareInfos */
486888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        synchronized (this) {
487888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            try {
488888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                while (!a) {
489888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                    wait(500);
490888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                }
491888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            } catch (InterruptedException e) {
492888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                if (V) Log.v(TAG, "Interrupted waiting for markBatchFailed");
493888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            }
494888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        }
495888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        updateStatus("[server:] we accpet the seesion");
496888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return ResponseCodes.OBEX_HTTP_OK;
497888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
498888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
499888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public int onPut(Operation op) {
500888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        FileOutputStream fos = null;
501888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        try {
502888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            java.io.InputStream is = op.openInputStream();
503888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
504888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            updateStatus("Got data bytes " + is.available() + " name "
505888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                    + op.getReceivedHeader().getHeader(HeaderSet.NAME) + " type " + op.getType());
506888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
507888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            File f = new File((String)op.getReceivedHeader().getHeader(HeaderSet.NAME));
508888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            fos = new FileOutputStream(f);
509888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            byte b[] = new byte[1000];
510888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            int len;
511888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
512888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            while (is.available() > 0 && (len = is.read(b)) > 0) {
513888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                fos.write(b, 0, len);
514888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            }
515888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
516888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            fos.close();
517888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            is.close();
518888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            updateStatus("[server:] Wrote data to " + f.getAbsolutePath());
519888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        } catch (Exception e) {
520888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            if (fos != null) {
521888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                try {
522888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                    fos.close();
523888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                } catch (IOException e1) {
524888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                    e1.printStackTrace();
525888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun                }
526888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            }
527888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            e.printStackTrace();
528888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        }
529888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return ResponseCodes.OBEX_HTTP_OK;
530888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
531888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
532888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public void onDisconnect(HeaderSet req, HeaderSet resp) {
533888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        updateStatus("[server:] The client has disconnected the OBEX session");
534888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
535888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
536888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public void updateStatus(String message) {
537888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        Log.v(TAG, "\n" + message);
538888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
539888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
540888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public void onAuthenticationFailure(byte[] userName) {
541888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
542888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
543888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public int onSetPath(HeaderSet request, HeaderSet reply, boolean backup, boolean create) {
544888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
545888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return ResponseCodes.OBEX_HTTP_NOT_IMPLEMENTED;
546888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
547888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
548888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public int onDelete(HeaderSet request, HeaderSet reply) {
549888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return ResponseCodes.OBEX_HTTP_NOT_IMPLEMENTED;
550888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
551888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
552888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public int onGet(Operation op) {
553888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return ResponseCodes.OBEX_HTTP_NOT_IMPLEMENTED;
554888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
555888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
556888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun}
557888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
558888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunclass TestTcpSessionNotifier {
559888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    /* implements SessionNotifier */
560888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
561888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    ServerSocket server = null;
562888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
563888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    Socket conn = null;
564888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
565888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    private static final String TAG = "TestTcpSessionNotifier";
566888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
567888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public TestTcpSessionNotifier(int port) throws IOException {
568888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        server = new ServerSocket(port);
569888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
570888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
571888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public ServerSession acceptAndOpen(ServerRequestHandler handler, Authenticator auth)
572888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            throws IOException {
573888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        try {
574888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            conn = server.accept();
575888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
576888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        } catch (Exception ex) {
577888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun            Log.v(TAG, "ex");
578888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        }
579888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
580888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        TestTcpTransport tt = new TestTcpTransport(conn);
581888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
582888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return new ServerSession((ObexTransport)tt, handler, auth);
583888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
584888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
585888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
586888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public ServerSession acceptAndOpen(ServerRequestHandler handler) throws IOException {
587888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
588888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return acceptAndOpen(handler, null);
589888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
590888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
591888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
592888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun}
593888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
594888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejunclass TestTcpTransport implements ObexTransport {
595888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
596888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    Socket s = null;
597888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
598888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public TestTcpTransport(Socket s) {
599888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        super();
600888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        this.s = s;
601888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
602888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
603888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public void close() throws IOException {
604888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        s.close();
605888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
606888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
607888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public DataInputStream openDataInputStream() throws IOException {
608888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return new DataInputStream(openInputStream());
609888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
610888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
611888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public DataOutputStream openDataOutputStream() throws IOException {
612888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return new DataOutputStream(openOutputStream());
613888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
614888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
615888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public InputStream openInputStream() throws IOException {
616888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return s.getInputStream();
617888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
618888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
619888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public OutputStream openOutputStream() throws IOException {
620888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return s.getOutputStream();
621888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
622888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
623888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public void connect() throws IOException {
624888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        // TODO Auto-generated method stub
625888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
626888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
627888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
628888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public void create() throws IOException {
629888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        // TODO Auto-generated method stub
630888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
631888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
632888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
633888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public void disconnect() throws IOException {
634888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        // TODO Auto-generated method stub
635888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
636888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
637888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
638888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public void listen() throws IOException {
639888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        // TODO Auto-generated method stub
640888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
641888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
642888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
643888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    public boolean isConnected() throws IOException {
644888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return s.isConnected();
645888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun    }
646888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun
647888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun}
648