1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.libreoffice.impressremote.communication;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Random;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.support.v4.content.LocalBroadcastManager;
/**
* Standard Network client. Connects to a server using Sockets.
*
* @author Andrzej J.R. Hunt
*/
public class NetworkClient extends Client {
private static final int PORT = 1599;
private Socket mSocket;
public NetworkClient(Server aServer,
CommunicationService aCommunicationService,
Receiver aReceiver) {
super(aServer, aCommunicationService, aReceiver);
try {
mName = aServer.getName();
mSocket = new Socket(aServer.getAddress(), PORT);
mInputStream = mSocket.getInputStream();
mReader = new BufferedReader(new InputStreamReader(mInputStream,
CHARSET));
mOutputStream = mSocket.getOutputStream();
// Pairing.
String aPin = setupPin(aServer);
Intent aIntent = new Intent(
CommunicationService.MSG_PAIRING_STARTED);
aIntent.putExtra("PIN", aPin);
mPin = aPin;
LocalBroadcastManager.getInstance(mCommunicationService)
.sendBroadcast(aIntent);
// Send out
String aName = CommunicationService.getDeviceName(); // TODO: get the proper name
sendCommand("LO_SERVER_CLIENT_PAIR\n" + aName + "\n" + aPin
+ "\n\n");
// Wait until we get the appropriate string back...
System.out.println("SF:waiting");
String aTemp = mReader.readLine();
System.out.println("SF:waited");
if (!aTemp.equals("LO_SERVER_SERVER_PAIRED")) {
return;
} else {
aIntent = new Intent(
CommunicationService.MSG_PAIRING_SUCCESSFUL);
LocalBroadcastManager.getInstance(mCommunicationService)
.sendBroadcast(aIntent);
}
while (mReader.readLine().length() != 0) {
// Get rid of extra lines
System.out.println("SF: empty line");
}
System.out.println("SD: empty");
startListening();
} catch (UnknownHostException e) {
// TODO Tell the user we have a problem
e.printStackTrace();
} catch (IOException e) {
// TODO As above
e.printStackTrace();
}
}
private String setupPin(Server aServer) {
// Get settings
SharedPreferences aPreferences = mCommunicationService
.getSharedPreferences("sdremote_authorisedremotes",
android.content.Context.MODE_PRIVATE);
if (aPreferences.contains(aServer.getName())) {
return aPreferences.getString(aServer.getName(), "");
} else {
String aPin = generatePin();
Editor aEdit = aPreferences.edit();
aEdit.putString(aServer.getName(), aPin);
aEdit.commit();
return aPin;
}
}
private String generatePin() {
Random aRandom = new Random();
String aPin = "" + (aRandom.nextInt(9000) + 1000);
while (aPin.length() < 4) {
aPin = "0" + aPin; // Add leading zeros if necessary
}
return aPin;
}
@Override
public void closeConnection() {
try {
if (mSocket != null)
mSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|