aboutsummaryrefslogtreecommitdiff
path: root/src/SockIOwriter.cc
blob: c68c5578b931724a733911521049ee1682df1742 (plain)
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
#include <iostream.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "SockIOwriter.hh"

SockIOwriter::SockIOwriter(CONST char *hostname,int port):IObase(hostname,IObase::Write),
  clientsock(0),ndatasets(0),datasetnumber(-1){
    //RawTCPclient *clientsock = new RawTCPclient(hostname,port);
    clientsock = new RawTCPclient(hostname,port); // One Megabyte window
    fprintf(stderr,"ClientSock=%lu\n",(long)clientsock);
    // this will block until it connects
}

SockIOwriter::SockIOwriter(CONST char *hostname,int port,int windowsize):IObase(hostname,IObase::Write),
    clientsock(0),ndatasets(0),datasetnumber(-1){ 
      clientsock = new FastTCPclient(hostname,port,windowsize); // open bigwindow socket
      fprintf(stderr,"Open ClientSock=%lu with %u windowsize\n",(long)clientsock,windowsize);
}

SockIOwriter::~SockIOwriter(){
  delete clientsock;
}

int SockIOwriter::isValid(){
  if(clientsock && clientsock->isAlive())
    return 1;
  else 
    return 0;
}

// could use overloading to differentiate type here... (but I'm going simple)
int SockIOwriter::write(IObase::DataType typeID,int rank,CONST int *dims,void *data){
  register int i;
  Int sdims[5];
  for (i = 0; i < rank ; i++)
    sdims[i] = dims[i];
  RecordHdr rec;
  DataRecordHdr hdr;
  if(!isValid()){
    puts("no valid connection");
    return 0;
  }
  for(i=0,hdr.datasize=1;i<rank;i++) hdr.datasize*=dims[i];
  hdr.datasize*=sizeOf(typeID);
  hdr.numbertype=typeID;
  hdr.rank=rank;
  rec.recordtype = DataRecord;
  rec.recordsize = hdr.datasize + 
    sizeof(DataRecordHdr) + 
    sizeof(int) * rank;
  rec.sequenceID = datasetnumber = ndatasets++;
  current_rec=rec;
  fprintf(stderr,"Current clientsock=%lu\n",(unsigned long)clientsock);
  fprintf(stderr,"Portnumber=%u\n",clientsock->getPortNum());
  fprintf(stderr,"Socket validity=%u\n",clientsock->isAlive());
  int sz = RecordHdr::write(rec, clientsock);
  sz = DataRecordHdr::write(hdr, clientsock);
  
  //clientsock->write((char*)(&rec),sizeof(rec));
  //clientsock->write((char*)(&hdr),sizeof(hdr));
  clientsock->write((char*)sdims,rank*sizeof(Int));
  return clientsock->write((char*)data,hdr.datasize);
}

int SockIOwriter::writeAnnotation(CONST char *annotation){
  RecordHdr rec;
  int stringlen=strlen(annotation)+1;
  rec.recordtype=AnnotationRecord;
  rec.recordsize=stringlen;
  if(datasetnumber>=0) rec.sequenceID=datasetnumber;
  else rec.sequenceID=current_rec.sequenceID;
  clientsock->write((char*)(&rec),sizeof(RecordHdr));
  return clientsock->write((char*)annotation,stringlen);
}

// Write a NetCDF attribute across the socket connection
int SockIOwriter::writeAttribute(CONST char *name,IObase::DataType typeID,Long length,void *data){
  int i;
  AttributeRecordHdr attrib;
  RecordHdr rec;
  int stringlen=strlen(name)+1;

  attrib.datasize=length*sizeOf(typeID);
  attrib.namesize=stringlen;
  attrib.numbertype=typeID;
  rec.recordtype=AttributeRecord;
  rec.recordsize=attrib.datasize+attrib.namesize+AttributeRecordHdr::size();
  if(datasetnumber>=0) rec.sequenceID=datasetnumber;
  else rec.sequenceID=current_rec.sequenceID; // a kludge for error immunity

//  clientsock->write((char*)(&rec),sizeof(RecordHdr));
// clientsock->write((char*)(&attrib),sizeof(AttributeRecordHdr));

  RecordHdr::write(rec, clientsock);
   attrib.write(clientsock);

  clientsock->write((char*)name,stringlen);
  return clientsock->write((char*)(data),length*sizeOf(typeID));
}