00001 #ifndef __J2K__Data_Factory_CPP__
00002 #define __J2K__Data_Factory_CPP__
00003
00004 #include <j2k/Net/TFTP/DataFactory.hpp>
00005
00006
00007 DataFactory::DataFactory()
00008 : buffer( NULL ), packet( NULL ), blocksize( 0 ),
00009 totalSize( 0 ), dummySended( FALSE ),
00010 data( NULL ), blockNo( 0 ), sz( 0 ), neof( 1 ),
00011 initialized( FALSE ),
00012 Basic_PThread()
00013 {
00014 option.rwlock5_data_queue.write();
00015 option.data_queue = new DList_pPacket();
00016 option.rwlock5_data_queue.releaseWrite();
00017 blocksize = option.getBlockSizeValue();
00018 printf( "DataFactory Created.\n");
00019 fflush( stdout );
00020 }
00021
00022 void DataFactory::init()
00023 {
00024 if ( initialized == TRUE ) return;
00025
00026 initialized = TRUE;
00027 blocksize = option.getBlockSizeValue();
00028 sz = blocksize;
00029 neof = 1;
00030
00031 option.rwlock2_file.read();
00032 option.myFile->setBegin();
00033 option.rwlock2_file.releaseRead();
00034
00035 buffer = new char[ blocksize + 1 ];
00036 }
00037
00038 void DataFactory::run()
00039 {
00040 init();
00041
00042 while( sz >= blocksize && neof > -1 )
00043 {
00044 createDataPacket();
00045 if ( blockNo % 2 == 0 ) sched_yield();
00046 }
00047
00048
00049 option.LastData = blockNo;
00050 option.Done = FALSE;
00051
00052 option.rwlock5_data_queue.write();
00053 #ifdef DEBUG
00054 option.data_queue->display();
00055 #endif
00056 option.rwlock5_data_queue.releaseWrite();
00057
00058 printf( "DataFactory Finished.Should send %d bytes\n",totalSize);
00059
00060 fflush( stdout );
00061 }
00062
00063 void DataFactory::createDataPacket()
00064 {
00065 blockNo++;
00066
00067
00068 option.rwlock2_file.read();
00069 sz = option.myFile->getData( buffer, blocksize );
00070
00071 if ( sz < 0 ) {
00072 neof = -1;
00073 sz *= -1;
00074 }
00075
00076 if ( sz > 0 && buffer[sz-1] == '\0' ) sz--;
00077 totalSize += sz;
00078 #ifdef DEBUG
00079 printf("DataFact:[%d|%d|%s|%d]", neof, sz, buffer+4, blocksize );
00080 #endif
00081 option.rwlock2_file.releaseRead();
00082
00083 printf( "enqueuing data\n" );
00084 fflush( stdout );
00085
00086 packet = new TFTP_Packet();
00087 packet->createData( blockNo, buffer, sz );
00088
00089 option.rwlock5_data_queue.write();
00090 option.data_queue->enqueue( packet );
00091 option.rwlock5_data_queue.releaseWrite();
00092
00093 if ( (neof < 0) && (( totalSize % blocksize ) == 0) )
00094 {
00095 dummyPacket();
00096 }
00097
00098 }
00099
00100 void DataFactory::dummyPacket()
00101 {
00102 if ( dummySended ) return;
00103 dummySended = TRUE;
00104
00105 packet = new TFTP_Packet();
00106 memset( buffer, 0 , sz );
00107
00108 blockNo++;
00109 packet->createData( blockNo, buffer, 0 );
00110
00111 option.rwlock5_data_queue.write();
00112 option.data_queue->enqueue( packet );
00113 option.rwlock5_data_queue.releaseWrite();
00114 }
00115
00116 #endif