RZ

001: // DataRemoteController.cc # the actual synthesize algorithm
002:
003: #include <string>
004: #include <vector>
005: #include <iostream>
006:
007: #include "RZError.hh"
008: #include "ControlRemote.hh"
009:
010: #include "GetoptVerbose.hh"
011:
012: #include "DemandWrapper.hh"
013: #include "DataLocalScanner.hh"
014: #include "DataRemoteController.hh"
015: #include "DataRemoteRetriever.hh"
016: #include "DemandMediator.hh"
017: #include "DemandReconstituter.hh"
018:
019: namespace DataRemoteController {
020:     unsigned int first_packet_from = 25000;
021:     bool first_packet_need = false;
022:
023:     struct RZ::Piper RANGE;
024: }
025:
026: // ######## ######## ######## ######## ######## ######## ######## ########
027:
028: namespace DataRemoteController {
029:     static RZ::ControlRemote *controller;
030:     static std::vector< char > whither;
031:     static unsigned int wend = 0;
032:
033:     // ######## ######## ######## ######## ######## ######## ########
034:
035:     void require(char const volatile * const l, char volatile * const r)
036:     {
037:         controller = new RZ::ControlRemote(
038:             RZ::rz_wrapper, l ,r, first_packet_from);
039:
040:         try {
041:             controller->initial_mark();
042:         }
043:         catch (RZ::Finished finished) {
044:             need_close();
045:         }
046:     }
047:
048:     void need_more(void)
049:     {
050:         if (!RANGE) return;
051:
052:         if (wend < whither.size()) throw RZ::AssertionError("You greedy pig!");
053:
054:         try {
055:             std::string bytes;
056:             controller->resolve(bytes);
057:             whither.clear();
058:             wend = 0;
059:             whither.insert(whither.end(), bytes.begin(), bytes.end());
060:         }
061:         catch (RZ::Finished finished) {
062:             need_close();
063:         }
064:     };
065:
066:     void need_close(void)
067:     {
068:         if (!RANGE) return;
069:
070:         RANGE.close(); // std::cerr << "Warning $!"; // may be openned "|-"
071:         whither.clear();
072:         wend = 0;
073:
074:         delete controller;
075:     }
076:
077:     // ######## ######## ######## ######## ######## ######## ########
078:
079:     bool is_pending(void)
080:     {
081:         return !!RANGE && wend != whither.size();
082:     }
083:
084:     void select_processing(void)
085:     {
086:         if (!RANGE) return;
087:
088:         int w = write(RANGE.file_no, &whither[0] + wend, whither.size() - wend);
089:         if (w == -1 && errno == EINTR) return;
090:         RZ::IOError::what_if("Can't write control!");
091:         wend += w;
092:
093:         if (wend == whither.size()) {
094:             try {
095:                 controller->mark();
096:             }
097:             catch (RZ::Finished finished) {
098:                 need_close();
099:             }
100:         }
101:     }
102: }
103:
104: // DataRemoteController.cc # the actual synthesize algorithm