1 #include "multirat_libapi.h"
2 #include "multirat_file_stream.h"
3 #include "multirat_file_manager.h"
4 #include "multirat_file_buffer.h"
5 #include "multirat_range_request_thread.h"
6 #include "multirat_file_thread.h"
7 #include "multirat_process.h"
8 #include "multirat_watch_dog_thread.h"
9 #include "multirat_watchthread.h"
11 void file_stream_init(SmartBondingData *SBData)
13 fileStream *fStream = malloc(sizeof(fileStream));
14 fileManager *fileMgr = NULL;
18 TIZEN_LOGD("Error malloc fileStream failed");
22 memset(fStream, 0, sizeof(fileStream));
24 SBData->fStream = fStream;
25 fStream->SBData = SBData;
27 fStream->mainSockExpBytes = &(SBData->expectedbytes);
28 fStream->totalLen = (SBData->resp.cLen);
29 fStream->mainSockRead = &(SBData->response_body_read);
30 fStream->strtOffset = SBData->req.rangeStart;
32 fileMgr = (fileManager *)malloc(sizeof(fileManager));
35 TIZEN_LOGD("fileManager Allocation Error");
38 memset(fileMgr, 0, sizeof(fileManager));
40 fStream->fileMgr = fileMgr;
41 file_manager_init(fStream, fileMgr);
42 fileMgr->SBData = SBData;
43 fileMgr->interface[MAIN_THREAD] = SBData->interface_index;
44 fileMgr->interface[FILE_THREAD] = (SBData->interface_index + 1) % 2;
46 fStream->fThread = NULL;
47 fStream->compRspRcvdFlag = 1;
50 uint32 file_stream_start(SmartBondingData *SBData)
52 TIZEN_D_LOGD("File Stream _start");
53 fileStream *fStream = SBData->fStream;
54 fileThread *fThread = malloc(sizeof (fileThread));
57 memset(fThread, 0, sizeof (fileThread));
58 fStream->fThread = fThread;
59 file_thread_init(fThread, SBData, fStream);
60 return file_thread_start(fThread);
63 int32 file_stream_read_from_socket(int32 socket, int8 *buff, uint64 toBeRead, int32 *tempLen, SmartBondingData *SBData, uint32 index)
65 SBData->sStat.prev_read = MAIN_THREAD ;
67 if((index == 1) && (socket == -1))
69 SBData->node_exception = SOCKET_NODE_FORCE_EXCEPTION;
70 TIZEN_LOGD("Socket is Negative, Go for Main Socket Exception");
71 SBData->fStreamFileBufferReady = B_FALSE;
72 SBData->fileThreadStarted = B_FALSE;
73 SBData->enableMultiRat = B_FALSE;
76 *tempLen = recv(socket, buff, toBeRead, 0);
83 if((errno == EAGAIN) || (errno == EWOULDBLOCK))
86 return SB_WOULD_BLOCK;
90 retval = read_conn_poll(socket, SBData);
93 TIZEN_LOGD("Error !!! Main socket time out");
98 *tempLen = recv(socket, buff, toBeRead, 0);
101 TIZEN_LOGD("Error !!! Main socket error in recv [%s] ",strerror (errno));
114 TIZEN_LOGD("Normal Socket Exception");
115 SBData->node_exception = SOCKET_NORMAL_EXCEPTION;
118 SBData->node_exception = SOCKET_NODE_NORMAL_EXCEPTION;
119 TIZEN_LOGD("Reading from socket node failed [%s] erro No [%d]", strerror(errno), errno);
120 TIZEN_LOGD("Go for Main Socket Exception");
121 SBData->fStreamFileBufferReady = B_FALSE;
122 SBData->fileThreadStarted = B_FALSE;
123 SBData->enableMultiRat = B_FALSE;
129 int32 file_stream_read(int8 *buff, int32 maxAppLen, SmartBondingData *SBData, int32 *my_nread)
131 int32 retval = SB_ERR;
134 fileBuffer *fbuff = NULL;
136 fileManager *fMgr = SBData->fStream->fileMgr;
137 fileBuffer *fileBuff = SBData->fStream->fileBuff;
140 fbuff = file_manager_getReadingNode(fMgr);
146 while(tempLen <= maxAppLen)
148 TIZEN_D_LOGD("Reading File Buffer ... [%x] total length ... [%llu] read length ... [%llu]", fbuff, file_buffer_getTotalLen(fbuff), file_buffer_getReadRspLen(fbuff));
149 if(file_buffer_getTotalLen(fbuff) == file_buffer_getReadRspLen(fbuff))
151 TIZEN_D_LOGD("completed reading from node [%p] len [%llu]", fbuff, file_buffer_getTotalLen(fbuff));
152 if(file_buffer_getNodeType(fbuff) == SOCKET_NODE)
153 SBData->status = MAIN_COMPLETE;
155 fbuff = file_manager_getReadingNode(fMgr);
168 /* already read some bytes */
172 if(file_buffer_getNodeType(fbuff) == SOCKET_NODE)
174 TIZEN_D_LOGD("completed reading from socket node [%x] total lenght [%llu] read length [%llu]", fbuff, file_buffer_getTotalLen(fbuff), file_buffer_getReadRspLen(fbuff));
175 toBeRead = MIN(maxAppLen,(file_buffer_getTotalLen(fbuff) - file_buffer_getReadRspLen(fbuff)));
176 retval = file_stream_read_from_socket(file_buffer_getSocketId(fbuff), buff, toBeRead, &tempLen, SBData, 1);
179 file_buffer_read_from_socket(fbuff, tempLen);
181 TIZEN_D_LOGD("completed reading from socket node [%x] total lenght [%llu] read length [%llu] ...", fbuff, file_buffer_getTotalLen(fbuff), file_buffer_getReadRspLen(fbuff));
182 if(file_buffer_getTotalLen(fbuff) == file_buffer_getReadRspLen(fbuff))
184 TIZEN_LOGD("completed reading from Socket node [%x]", fbuff);
185 SBData->status = MAIN_COMPLETE;
192 TIZEN_LOGD("SBData[%p] Sending Error", SBData);
196 TIZEN_D_LOGD("Reading File Buffer [%x] total length [%llu] read length [%llu]", fbuff, file_buffer_getTotalLen(fbuff), file_buffer_getReadRspLen(fbuff));
197 if(file_buffer_noOfRspBytes(fbuff)== 0)
199 if(fbuff->state == NODE_STATE_BLOCKED)
201 TIZEN_LOGD("Looks like File Node is Blocked");
202 if(!file_manager_file_node_block_handle(SBData))
205 return SB_WOULD_BLOCK;
207 toBeRead = MIN((maxAppLen-tempLen),file_buffer_noOfRspBytes(fbuff));
209 file_buffer_read_from_file(fbuff, buff+tempLen, &toBeRead);
210 tempLen = tempLen + toBeRead;
211 TIZEN_D_LOGD("Completed Reading File Buffer [%x] total length [%llu] read length [%llu] ... ", fbuff, file_buffer_getTotalLen(fbuff), file_buffer_getReadRspLen(fbuff));
216 TIZEN_LOGD("File buffer not created failed");
223 void is_file_stream_read(SmartBondingData *SBData)
225 fileThread *fThread = SBData->fStream->fThread;
226 if (SBData->response_body_read >= SBData->expectedbytes)
228 TIZEN_LOGD("Expected Bytes more");
229 if(fThread->firstRngStatus == FIRST_RSP_STATUS_SUCCESS)
231 TIZEN_LOGD("Read Expected Bytes from Main thread");
232 SBData->status = MAIN_COMPLETE;
233 SBData->fStreamFileBufferReady = B_TRUE;
234 CLOSE_SOCKET(SBData->socket_fd);
235 SBData->socket_fd = -1;
236 TIZEN_LOGD("FirstRangeRequest Success is_multirat_read");
240 SBData->fStreamFileBufferReady = B_FALSE;
241 SBData->fileThreadStarted = B_FALSE;
242 SBData->enableMultiRat = B_FALSE;
243 TIZEN_LOGD("FirstRangeRequest FAILED");
244 file_stream_exit(SBData->fStream);
245 SBData->fStream = NULL;
250 void submit_ratio_history(SmartBondingData *SBData)
252 FILE *fp = fopen("/opt/usr/media/Ratiostat", "w");
255 TIZEN_LOGD("Opening File /opt/usr/media/Ratiostat Failed");
258 fprintf(fp,"%u %u",SBData->speed[1],SBData->speed[0]);
259 TIZEN_LOGD("Ratiostat Write Success spd[1] [%u] spd[0] [%u]", SBData->speed[1],SBData->speed[0]);
263 void file_stream_exit(fileStream *fStream)
265 fileBuffer *fileBuff = NULL;
266 fileBuffer *tempBuff = NULL;
267 TIZEN_LOGD("file stream exit [%p]", fStream);
268 fStream->compRspRcvdFlag = 0;
269 submit_ratio_history(fStream->SBData);
271 if(fStream->SBData->cthread != NULL)
273 cthread_exit(fStream->SBData->cthread);
274 fStream->SBData->cthread = NULL;
277 file_thread_exit(fStream->fThread);
278 fStream->fThread = NULL;
280 TIZEN_LOGD("file stream exit file Mgr [%p]", fStream->fileMgr);
281 if(NULL != fStream->fileMgr)
283 file_manager_exit(fStream->fileMgr);
284 free(fStream->fileMgr);
285 TIZEN_LOGD("File Manager Freed");
287 fStream->fileMgr = NULL;
289 fileBuff = fStream->fileBuff ;
291 while(fileBuff != NULL)
294 fileBuff = tempBuff->next;
295 file_buffer_exit(tempBuff);
301 TIZEN_LOGD("File Stream _exit finished");
304 void PollThread_poll_buffer(SmartBondingData *SBData)
306 fileManager *fMgr = SBData->fStream->fileMgr;
307 fileBuffer *fileBuff = SBData->fStream->fileBuff;
308 fileBuffer *fbuff = NULL;
309 uint64 startTime = 0;
313 fbuff = file_manager_getReadingNode(fMgr);
318 if(file_buffer_getTotalLen(fbuff) == file_buffer_getReadRspLen(fbuff))
322 if(file_buffer_getNodeType(fbuff) == SOCKET_NODE)
324 TIZEN_D_LOGD("Socket Node ... [%x]", fbuff);
325 if(fbuff->socketId == -1)
327 TIZEN_LOGD("SBData[%p] Socket Node Socket -1", SBData);
330 PollThread_poll(fbuff->socketId, SBData, 10);
335 startTime = get_time_in_sec();
336 while(SBData->PollThrd->threadStatus != THREAD_FINISH)
338 fbuff = file_manager_getReadingNode(fMgr);
339 TIZEN_D_LOGD("SBData[%p] File Node ... [%x]", SBData, fbuff);
344 if(file_buffer_getTotalLen(fbuff) == file_buffer_getReadRspLen(fbuff))
346 TIZEN_LOGD("Node Completed");
349 if(file_buffer_getNodeType(fbuff) != FILE_NODE)
353 if(file_buffer_noOfRspBytes(fbuff)== 0)
355 if(fbuff->fThread_read != 0)
357 TIZEN_LOGD("Making File Thread Exit");
358 SBData->status = MAIN_COMPLETE;
360 if(((fbuff->state == NODE_STATE_BLOCKED) && ((get_time_in_sec() - startTime) >= 2)))
362 TIZEN_LOGD("SBData[%p] Node State is BLOCK ...", SBData);
367 TIZEN_D_LOGD("SBData[%p] Node State BLOCK sleep", SBData);