1 /*
2  * Copyright (C) 2009 Google Inc.  All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.polo.pairing;
18 
19 import com.google.polo.exception.PoloException;
20 import com.google.polo.pairing.message.ConfigurationAckMessage;
21 import com.google.polo.pairing.message.OptionsMessage;
22 import com.google.polo.pairing.message.PairingRequestAckMessage;
23 import com.google.polo.pairing.message.PairingRequestMessage;
24 import com.google.polo.pairing.message.PoloMessage.PoloMessageType;
25 import com.google.polo.wire.PoloWireInterface;
26 
27 import java.io.IOException;
28 
29 /**
30  * Pairing session implementation for a client.
31  */
32 public class ClientPairingSession extends PairingSession {
33 
34   /**
35    * Client name;
36    */
37   private final String mClientName;
38 
39   /**
40    * Constructor.
41    *
42    * @param protocol     the wire interface for the session
43    * @param context      the pairing context for the session
44    * @param serviceName  the string service name, used in the pairing request
45    */
ClientPairingSession(PoloWireInterface protocol, PairingContext context, String serviceName)46   public ClientPairingSession(PoloWireInterface protocol,
47       PairingContext context, String serviceName) {
48     this(protocol, context, serviceName, null);
49   }
50 
51   /**
52    * Constructor.
53    *
54    * @param protocol     the wire interface for the session
55    * @param context      the pairing context for the session
56    * @param serviceName  the string service name, used in the pairing request
57    * @param clientName   the string client name, used in the pairing request
58    */
ClientPairingSession(PoloWireInterface protocol, PairingContext context, String serviceName, String clientName)59   public ClientPairingSession(PoloWireInterface protocol,
60       PairingContext context, String serviceName, String clientName) {
61     super(protocol, context);
62     mServiceName = serviceName;
63     mClientName = clientName;
64   }
65 
66   @Override
doInitializationPhase()67   protected void doInitializationPhase()
68       throws PoloException, IOException {
69     logDebug("Sending PairingRequest... " + mServiceName + " " + mClientName);
70     PairingRequestMessage msg = new PairingRequestMessage(mServiceName, mClientName);
71     sendMessage(msg);
72 
73     logDebug("Waiting for PairingRequestAck ...");
74     PairingRequestAckMessage ack = (PairingRequestAckMessage) getNextMessage(
75         PoloMessageType.PAIRING_REQUEST_ACK);
76 
77     if (ack.hasServerName()) {
78       mPeerName = ack.getServerName();
79       logDebug("Got PairingRequestAck with server name = " + mPeerName);
80     } else {
81       mPeerName = null;
82     }
83 
84     logDebug("Sending Options ...");
85     sendMessage(mLocalOptions);
86 
87     logDebug("Waiting for Options...");
88     OptionsMessage serverOptions = (OptionsMessage) getNextMessage(
89         PoloMessageType.OPTIONS);
90 
91     // Compare compatibility with server options, and save config.
92     logDebug("Local config = " + mLocalOptions);
93     logDebug("Server options = " + serverOptions);
94     setConfiguration(mLocalOptions.getBestConfiguration(serverOptions));
95   }
96 
97   @Override
doConfigurationPhase()98   protected void doConfigurationPhase() throws PoloException, IOException {
99     logDebug("Sending Configuration...");
100     sendMessage(mSessionConfig);
101     logDebug("Waiting for ConfigurationAck...");
102     ConfigurationAckMessage ack = (ConfigurationAckMessage)
103         getNextMessage(PoloMessageType.CONFIGURATION_ACK);
104   }
105 
106   /**
107    * Returns {@code true} if client name is set.
108    */
hasClientName()109   public boolean hasClientName() {
110     return mClientName != null;
111   }
112 
113   /**
114    * Returns {@code true} if server name is set.
115    */
hasServerName()116   public boolean hasServerName() {
117     return hasPeerName();
118   }
119 
120   /**
121    * Returns client name, or {@code null} if not set.
122    */
getClientName()123   public String getClientName() {
124     return mClientName;
125   }
126 
127   /**
128    * Returns server name, or {@code null} if not set.
129    */
getServerName()130   public String getServerName() {
131     return getPeerName();
132   }
133 }
134