| OLD | NEW | 
|    1 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file |    1 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file | 
|    2 // for details. All rights reserved. Use of this source code is governed by a |    2 // for details. All rights reserved. Use of this source code is governed by a | 
|    3 // BSD-style license that can be found in the LICENSE file. |    3 // BSD-style license that can be found in the LICENSE file. | 
|    4  |    4  | 
|    5 library channel.byte_stream; |    5 library channel.byte_stream; | 
|    6  |    6  | 
|    7 import 'dart:async'; |    7 import 'dart:async'; | 
|    8 import 'dart:convert'; |    8 import 'dart:convert'; | 
|    9 import 'dart:io'; |    9 import 'dart:io'; | 
|   10  |   10  | 
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   81    * wait for it to complete before sending more data.  There may or may not be |   81    * wait for it to complete before sending more data.  There may or may not be | 
|   82    * outstanding data in [_pendingOutput]. |   82    * outstanding data in [_pendingOutput]. | 
|   83    */ |   83    */ | 
|   84   static const int _STATE_FLUSH_PENDING = 2; |   84   static const int _STATE_FLUSH_PENDING = 2; | 
|   85  |   85  | 
|   86   final Stream input; |   86   final Stream input; | 
|   87  |   87  | 
|   88   final IOSink _output; |   88   final IOSink _output; | 
|   89  |   89  | 
|   90   /** |   90   /** | 
|   91    * The instrumentation server that is to be used by this analysis server. |   91    * The instrumentation service that is to be used by this analysis server. | 
|   92    */ |   92    */ | 
|   93   final InstrumentationServer instrumentationServer; |   93   final InstrumentationService instrumentationService; | 
|   94  |   94  | 
|   95   /** |   95   /** | 
|   96    * Completer that will be signalled when the input stream is closed. |   96    * Completer that will be signalled when the input stream is closed. | 
|   97    */ |   97    */ | 
|   98   final Completer _closed = new Completer(); |   98   final Completer _closed = new Completer(); | 
|   99  |   99  | 
|  100   /** |  100   /** | 
|  101    * State of the output stream (see constants above). |  101    * State of the output stream (see constants above). | 
|  102    */ |  102    */ | 
|  103   int _outputState = _STATE_IDLE; |  103   int _outputState = _STATE_IDLE; | 
|  104  |  104  | 
|  105   /** |  105   /** | 
|  106    * List of strings that need to be sent to [_output] at the next available |  106    * List of strings that need to be sent to [_output] at the next available | 
|  107    * opportunity. |  107    * opportunity. | 
|  108    */ |  108    */ | 
|  109   List<String> _pendingOutput = <String>[]; |  109   List<String> _pendingOutput = <String>[]; | 
|  110  |  110  | 
|  111   /** |  111   /** | 
|  112    * True if [close] has been called. |  112    * True if [close] has been called. | 
|  113    */ |  113    */ | 
|  114   bool _closeRequested = false; |  114   bool _closeRequested = false; | 
|  115  |  115  | 
|  116   ByteStreamServerChannel(this.input, this._output, this.instrumentationServer); |  116   ByteStreamServerChannel(this.input, this._output, | 
 |  117       this.instrumentationService); | 
|  117  |  118  | 
|  118   /** |  119   /** | 
|  119    * Future that will be completed when the input stream is closed. |  120    * Future that will be completed when the input stream is closed. | 
|  120    */ |  121    */ | 
|  121   Future get closed { |  122   Future get closed { | 
|  122     return _closed.future; |  123     return _closed.future; | 
|  123   } |  124   } | 
|  124  |  125  | 
|  125   @override |  126   @override | 
|  126   void close() { |  127   void close() { | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
|  154   void sendNotification(Notification notification) { |  155   void sendNotification(Notification notification) { | 
|  155     // Don't send any further notifications after the communication channel is |  156     // Don't send any further notifications after the communication channel is | 
|  156     // closed. |  157     // closed. | 
|  157     if (_closeRequested) { |  158     if (_closeRequested) { | 
|  158       return; |  159       return; | 
|  159     } |  160     } | 
|  160     ServerCommunicationChannel.ToJson.start(); |  161     ServerCommunicationChannel.ToJson.start(); | 
|  161     String jsonEncoding = JSON.encode(notification.toJson()); |  162     String jsonEncoding = JSON.encode(notification.toJson()); | 
|  162     ServerCommunicationChannel.ToJson.stop(); |  163     ServerCommunicationChannel.ToJson.stop(); | 
|  163     _outputLine(jsonEncoding); |  164     _outputLine(jsonEncoding); | 
|  164     instrumentationServer.log(jsonEncoding); |  165     instrumentationService.logNotification(jsonEncoding); | 
|  165   } |  166   } | 
|  166  |  167  | 
|  167   @override |  168   @override | 
|  168   void sendResponse(Response response) { |  169   void sendResponse(Response response) { | 
|  169     // Don't send any further responses after the communication channel is |  170     // Don't send any further responses after the communication channel is | 
|  170     // closed. |  171     // closed. | 
|  171     if (_closeRequested) { |  172     if (_closeRequested) { | 
|  172       return; |  173       return; | 
|  173     } |  174     } | 
|  174     ServerCommunicationChannel.ToJson.start(); |  175     ServerCommunicationChannel.ToJson.start(); | 
|  175     String jsonEncoding = JSON.encode(response.toJson()); |  176     String jsonEncoding = JSON.encode(response.toJson()); | 
|  176     ServerCommunicationChannel.ToJson.stop(); |  177     ServerCommunicationChannel.ToJson.stop(); | 
|  177     _outputLine(jsonEncoding); |  178     _outputLine(jsonEncoding); | 
|  178     instrumentationServer.log(jsonEncoding); |  179     instrumentationService.logResponse(jsonEncoding); | 
|  179   } |  180   } | 
|  180  |  181  | 
|  181   /** |  182   /** | 
|  182    * Callback invoked after a flush of [_output] completes.  Closes the stream |  183    * Callback invoked after a flush of [_output] completes.  Closes the stream | 
|  183    * if necessary.  Otherwise schedules additional pending output. |  184    * if necessary.  Otherwise schedules additional pending output. | 
|  184    */ |  185    */ | 
|  185   void _flushCompleted(_) { |  186   void _flushCompleted(_) { | 
|  186     assert(_outputState == _STATE_FLUSH_PENDING); |  187     assert(_outputState == _STATE_FLUSH_PENDING); | 
|  187     if (_pendingOutput.isNotEmpty) { |  188     if (_pendingOutput.isNotEmpty) { | 
|  188       _output.write(_pendingOutput.join()); |  189       _output.write(_pendingOutput.join()); | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  226  |  227  | 
|  227   /** |  228   /** | 
|  228    * Read a request from the given [data] and use the given function to handle |  229    * Read a request from the given [data] and use the given function to handle | 
|  229    * the request. |  230    * the request. | 
|  230    */ |  231    */ | 
|  231   void _readRequest(Object data, void onRequest(Request request)) { |  232   void _readRequest(Object data, void onRequest(Request request)) { | 
|  232     // Ignore any further requests after the communication channel is closed. |  233     // Ignore any further requests after the communication channel is closed. | 
|  233     if (_closed.isCompleted) { |  234     if (_closed.isCompleted) { | 
|  234       return; |  235       return; | 
|  235     } |  236     } | 
|  236     instrumentationServer.log(data); |  237     instrumentationService.logRequest(data); | 
|  237     // Parse the string as a JSON descriptor and process the resulting |  238     // Parse the string as a JSON descriptor and process the resulting | 
|  238     // structure as a request. |  239     // structure as a request. | 
|  239     ServerCommunicationChannel.FromJson.start(); |  240     ServerCommunicationChannel.FromJson.start(); | 
|  240     Request request = new Request.fromString(data); |  241     Request request = new Request.fromString(data); | 
|  241     ServerCommunicationChannel.FromJson.stop(); |  242     ServerCommunicationChannel.FromJson.stop(); | 
|  242     if (request == null) { |  243     if (request == null) { | 
|  243       sendResponse(new Response.invalidRequestFormat()); |  244       sendResponse(new Response.invalidRequestFormat()); | 
|  244       return; |  245       return; | 
|  245     } |  246     } | 
|  246     onRequest(request); |  247     onRequest(request); | 
|  247   } |  248   } | 
|  248 } |  249 } | 
| OLD | NEW |