00001
00002 #ifndef _DATACLIENT_H_
00003 #define _DATACLIENT_H_
00004
00005 #include "remotesocket.h"
00006 #include "keyinfo.h"
00007 #include "misc.h"
00008 #include <string>
00009 #include "errcode.h"
00010
00011 class DataClient : private RemoteSocket
00012 {
00013 private:
00014 KeyTable *keytable;
00015 int portnum;
00016 char servername[100];
00017 bool connected;
00018 int SendClientName();
00019 bool SendKeyForDataSend(int handle);
00020 bool SendKeyForDataSend(char *keyword);
00021 bool SendKeyword(char *keyword);
00022 int QueryKeyword(char *keyword)
00023 { SendLine(keyword); return RecvVar<int>(); }
00024 int RecvDummyBytes(int size);
00025 int Release() { return SendKeyword("_q_private"); }
00026 bool isWritable(int handle);
00027 bool VerifyElementSize(int handle, int elem_size);
00028 bool isVariable(int handle);
00029 bool isStaticArray(int handle)
00030 { return keytable->isStaticArray(handle); }
00031 bool isStaticArray(char *keyword)
00032 { return keytable->isStaticArray(keyword); }
00033 bool isDynamicArray(int handle, int dim);
00034
00035 public:
00037 DataClient();
00038
00040 DataClient(char *host, int port = 4096);
00041
00043 ~DataClient();
00044
00047 int Connect(char *host, int port = 4096);
00048
00050 int Disconnect();
00051
00053 char *ServerName() { return (char *) servername; }
00054
00056 int Port() { return portnum; }
00057
00059 bool isBigEndian();
00060
00063 bool isValidKeyword(char *keyword, int *handle = NULL);
00064
00066 int SetPrintFlag(int flag) { return RemoteSocket::SetPrintFlag(flag); }
00067
00069 KeyTable *GetTable();
00070
00072 bool isWritable(char *keyword);
00073
00076 int RecvKeyTable(KeyTable *K = NULL);
00077
00080 VariableType VarType(char *keyword);
00081
00083 char *RecvValue(char *keyword);
00084
00086 int SendValue(char *keyword, char *value);
00087
00089 void ListKeywords();
00090
00092 void ListValues();
00093
00095 template <class Etype>
00096 int SendVariable(char *keyword, Etype a);
00097
00099 template <class Etype>
00100 int RecvVariable(char *keyword, Etype *a);
00101
00103 template <class Etype>
00104 Etype RecvVariable(char *keyword);
00105
00107 int SendArray(char *keyword, void *a);
00108
00110 int RecvArray(char *keyword, void *a);
00111
00114 int getArrayDim(char *keyword, int dim);
00115
00117 template <class Etype>
00118 int SendArray1D(char *keyword, Etype *a);
00119
00121 template <class Etype>
00122 int RecvArray1D(char *keyword, Etype *a);
00123
00128 template <class Etype>
00129 int RecvArray1D(char *keyword, Etype **ptr);
00130
00132 template <class Etype>
00133 int SendArray2D(char *keyword, Etype **a);
00134
00136 template <class Etype>
00137 int RecvArray2D(char *keyword, Etype **a);
00138
00143 template <class Etype>
00144 int RecvArray2D(char *keyword, Etype ***ptr);
00145
00147 template <class Etype>
00148 int SendArray3D(char *keyword, Etype ***a);
00149
00151 template <class Etype>
00152 int RecvArray3D(char *keyword, Etype ***a);
00153
00158 template <class Etype>
00159 int RecvArray3D(char *keyword, Etype ****ptr);
00160
00162 template <class Etype>
00163 int SendArray4D(char *keyword, Etype ****a);
00164
00166 template <class Etype>
00167 int RecvArray4D(char *keyword, Etype ****a);
00168
00173 template <class Etype>
00174 int RecvArray4D(char *keyword, Etype *****ptr);
00175
00178 template <class myStruct>
00179 int SendStruct(char *keyword, myStruct *S, Semaphore *sem=NULL);
00180
00183 template <class myStruct>
00184 double RecvStruct(char *keyword, myStruct *S, Semaphore *sem = NULL);
00185
00189 int SendFile(char *filename, char *destfile = NULL);
00190
00194 int RecvFile(char *filename, char *destfile = NULL);
00195
00197 double BytesSent() { return TCPSocket::BytesSent(); }
00198
00200 double BytesRecd() { return TCPSocket::BytesRecd(); }
00201
00203 int SendTime() { return TCPSocket::SendTime(); }
00204
00206 int RecvTime() { return TCPSocket::RecvTime(); }
00207
00209 double SendRate() { return 8.0*BytesSent()/(1000.0*SendTime()); }
00210
00212 double RecvRate() { return 8.0*BytesRecd()/(1000.0*RecvTime()); }
00213
00214 };
00215
00216 #include "dataclientsend.h"
00217 #include "dataclientrecv.h"
00218
00219 #endif // _DATACLIENT_H_
00220