00001
00002
00003 #include "../include/command.h"
00004 #include <cstdlib>
00005 #include <cstring>
00006
00007
00008
00009
00010 command::command() {
00011 id = 0;
00012 file_name = "";
00013 max_clients = 0;
00014 port = 0;
00015 }
00016
00017 command::command(int id, const char* file_name, int max_clients, int port) {
00018 this->id = id;
00019 if(file_name != NULL)
00020 this->file_name = file_name;
00021 else this->file_name = "";
00022 this->max_clients = max_clients;
00023 this->port = port;
00024 }
00025
00026 char* command::to_string() {
00027
00028 char id_s[INT_AS_STRING_BYTES];
00029 char max_clients_s[INT_AS_STRING_BYTES];
00030 char port_s[INT_AS_STRING_BYTES];
00031 sprintf(id_s, "%i", id);
00032 sprintf(max_clients_s, "%i", max_clients);
00033 sprintf(port_s, "%i", port);
00034
00035 char* s = new char[strlen(id_s)+
00036 strlen(max_clients_s)+
00037 strlen(port_s)+
00038 file_name.length()+
00039 4];
00040 *s = '\0';
00041 strcat(s, id_s);
00042 strcat(s, "|");
00043 strcat(s, max_clients_s);
00044 strcat(s, "|");
00045 strcat(s, port_s);
00046 strcat(s, "|");
00047 strcat(s, file_name.c_str());
00048 return s;
00049 }
00050
00051 int command::fill_from_string(const char* s) {
00052 char* s_cpy = new char[strlen(s)+1];
00053 strcpy(s_cpy , s);
00054 char* a = s_cpy;
00055 char* b;
00056 int len;
00057
00058 b = strtok(a, "|");
00059 id = atoi(b);
00060 if(id == 0) {
00061 delete(s_cpy);
00062 return -1;
00063 }
00064 len = strlen(b);
00065 if(s[len] != '|') {
00066 delete(s_cpy);
00067 return -1;
00068 }
00069 s += len+1;
00070 a += len+1;
00071
00072 b = strtok(a, "|");
00073 max_clients = atoi(b);
00074 if(max_clients < 0) {
00075 delete(s_cpy);
00076 return -1;
00077 }
00078 len = strlen(b);
00079 if(s[len] != '|') {
00080 delete(s_cpy);
00081 return -1;
00082 }
00083 s += len+1;
00084 a += len+1;
00085
00086 b = strtok(a, "|");
00087 port = atoi(b);
00088 if(port < 0 || port > 65535) {
00089 delete(s_cpy);
00090 return -1;
00091 }
00092 len = strlen(b);
00093 if(s[len] != '|') {
00094 delete(s_cpy);
00095 return -1;
00096 }
00097 s += len+1;
00098 a += len+1;
00099
00100 file_name = a;
00101 if(file_name == "") {
00102 delete(s_cpy);
00103 return -1;
00104 }
00105 delete(s_cpy);
00106 return -0;
00107
00108 }
00109
00110
00111
00112 int send_command(int sock, command com, int* rep_data_size, char** rep_data) {
00113
00114 char* comstr = com.to_string();
00115 int cont = strlen(comstr)+1, ret;
00116 char* i = comstr;
00117 *rep_data = new char[1];
00118 while(cont>0) {
00119 ret = write(sock, (void*)i, cont);
00120 if(ret == -1) {
00121 delete(comstr);
00122 return ERR_UNKNOWN;
00123 }
00124 cont -= ret;
00125 i += ret;
00126 }
00127 delete(comstr);
00128
00129
00130 char c;
00131 int j = 0;
00132 string s[2] = {"",""};
00133 while (j < 2) {
00134 ret = read(sock, &c, 1);
00135 if(ret == -1 || ret == 0) return ERR_UNKNOWN;
00136 do {
00137 s[j] += c;
00138 ret = read(sock, &c, 1);
00139
00140 if(ret == -1 || ret == 0) return ERR_UNKNOWN;
00141 } while(c != '|');
00142 j++;
00143 }
00144 cont = atoi(s[1].c_str());
00145 *rep_data_size = cont;
00146 delete(*rep_data);
00147 *rep_data = new char[cont];
00148 char* data = *rep_data;
00149 while(cont>0) {
00150 ret = read(sock, (void*)data, cont);
00151 if(ret == -1 || ret == 0) {
00152 *rep_data_size = 0;
00153 return ERR_UNKNOWN;
00154 }
00155 cont -= ret;
00156 data += ret;
00157 }
00158 return atoi(s[0].c_str());
00159 }
00160
00161 int receive_command(int sock, command* com) {
00162 string dyn_buf = "";
00163 int ret;
00164 char c;
00165 while(1) {
00166 ret = read(sock,(void*)&c, 1);
00167 if(ret == -1 || ret == 0) return -1;
00168 if(c == '\0') break;
00169 dyn_buf = dyn_buf + c;
00170 }
00171 ret = com->fill_from_string(dyn_buf.c_str());
00172 if(ret == -1) {
00173 return -1;
00174 }
00175 return 0;
00176 }
00177
00178 int reply_command(int sock, int status, int add_bytes, const char* add_data) {
00179
00180 char st[INT_AS_STRING_BYTES];
00181 char ab[INT_AS_STRING_BYTES];
00182 sprintf(st, "%i", status);
00183 sprintf(ab, "%i", add_bytes);
00184 int cont = strlen(st)+strlen(ab)+2+add_bytes;
00185 int mem_size = cont;
00186 if(add_bytes == 0) mem_size++;
00187 char* m = new char[mem_size];
00188 *m = '\0';
00189 strcat(m, st);
00190 strcat(m, "|");
00191 strcat(m, ab);
00192 strcat(m, "|");
00193 char* a = m + strlen(m);
00194 for (int i = 0; i < add_bytes; i++)
00195 a[i] = add_data[i];
00196
00197
00198 a = m;
00199 int ret;
00200 while(cont > 0) {
00201 ret = write(sock, (void*)a, cont);
00202 if(ret == -1) {
00203 delete(m);
00204 return -1;
00205 }
00206 cont -= ret;
00207 a += ret;
00208 }
00209 delete(m);
00210 return 0;
00211 }
00212
00213 int receive_sft_reply(int sock, int* rep_data_size, char** rep_data) {
00214 char c;
00215 int j = 0, ret, cont;
00216 string s[2] = {"",""};
00217 while (j < 2) {
00218 ret = read(sock, &c, 1);
00219 if(ret == -1 || ret == 0) return ERR_UNKNOWN;
00220 do {
00221 s[j] += c;
00222 ret = read(sock, &c, 1);
00223
00224 if(ret == -1 || ret == 0) return ERR_UNKNOWN;
00225 } while(c != '|');
00226 j++;
00227 }
00228 cont = atoi(s[1].c_str());
00229 *rep_data_size = cont;
00230 *rep_data = new char[cont];
00231 char* data = *rep_data;
00232 while(cont>0) {
00233 ret = read(sock, (void*)data, cont);
00234 if(ret == -1 || ret == 0) {
00235 *rep_data_size = 0;
00236 delete(*rep_data);
00237 return ERR_UNKNOWN;
00238 }
00239 cont -= ret;
00240 data += ret;
00241 }
00242 return atoi(s[0].c_str());
00243 }