| // Copyright 2011 Google Inc. All Rights Reserved. | |
| package com.example.android.wifidirect; | |
| import android.app.IntentService; | |
| import android.content.ContentResolver; | |
| import android.content.Context; | |
| import android.content.Intent; | |
| import android.net.Uri; | |
| import android.util.Log; | |
| import java.io.FileNotFoundException; | |
| import java.io.IOException; | |
| import java.io.InputStream; | |
| import java.io.OutputStream; | |
| import java.net.InetSocketAddress; | |
| import java.net.Socket; | |
| /** | |
| * A service that process each file transfer request i.e Intent by opening a | |
| * socket connection with the WiFi Direct Group Owner and writing the file | |
| */ | |
| public class FileTransferService extends IntentService { | |
| private static final int SOCKET_TIMEOUT = 5000; | |
| public static final String ACTION_SEND_FILE = "com.example.android.wifidirect.SEND_FILE"; | |
| public static final String EXTRAS_FILE_PATH = "file_url"; | |
| public static final String EXTRAS_GROUP_OWNER_ADDRESS = "go_host"; | |
| public static final String EXTRAS_GROUP_OWNER_PORT = "go_port"; | |
| public FileTransferService(String name) { | |
| super(name); | |
| } | |
| public FileTransferService() { | |
| super("FileTransferService"); | |
| } | |
| /* | |
| * (non-Javadoc) | |
| * @see android.app.IntentService#onHandleIntent(android.content.Intent) | |
| */ | |
| @Override | |
| protected void onHandleIntent(Intent intent) { | |
| Context context = getApplicationContext(); | |
| if (intent.getAction().equals(ACTION_SEND_FILE)) { | |
| String fileUri = intent.getExtras().getString(EXTRAS_FILE_PATH); | |
| String host = intent.getExtras().getString(EXTRAS_GROUP_OWNER_ADDRESS); | |
| Socket socket = new Socket(); | |
| int port = intent.getExtras().getInt(EXTRAS_GROUP_OWNER_PORT); | |
| try { | |
| Log.d(WiFiDirectActivity.TAG, "Opening client socket - "); | |
| socket.bind(null); | |
| socket.connect((new InetSocketAddress(host, port)), SOCKET_TIMEOUT); | |
| Log.d(WiFiDirectActivity.TAG, "Client socket - " + socket.isConnected()); | |
| OutputStream stream = socket.getOutputStream(); | |
| ContentResolver cr = context.getContentResolver(); | |
| InputStream is = null; | |
| try { | |
| is = cr.openInputStream(Uri.parse(fileUri)); | |
| } catch (FileNotFoundException e) { | |
| Log.d(WiFiDirectActivity.TAG, e.toString()); | |
| } | |
| DeviceDetailFragment.copyFile(is, stream); | |
| Log.d(WiFiDirectActivity.TAG, "Client: Data written"); | |
| } catch (IOException e) { | |
| Log.e(WiFiDirectActivity.TAG, e.getMessage()); | |
| } finally { | |
| if (socket != null) { | |
| if (socket.isConnected()) { | |
| try { | |
| socket.close(); | |
| } catch (IOException e) { | |
| // Give up | |
| e.printStackTrace(); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } |