static fz_error *
writeobject(fz_stream *out, pdf_xref *xref, pdf_crypt *encrypt, int oid, int gen)
{
	pdf_xrefentry *x = xref->table + oid;
	fz_error *error;

	error = pdf_cacheobject(xref, oid, gen);
	if (error)
		return error;

	if (encrypt)
		pdf_cryptobj(encrypt, x->obj, oid, gen);

	fz_print(out, "%d %d obj\n", oid, gen);
	fz_printobj(out, x->obj, TIGHT);
	fz_print(out, "\n");

	if (encrypt)
		pdf_cryptobj(encrypt, x->obj, oid, gen);

	if (pdf_isstream(xref, oid, gen))
	{
		error = writestream(out, xref, encrypt, oid, gen);
		if (error)
			return error;
	}

	fz_print(out, "endobj\n\n");

	return nil;
}
TVerdict CSmsCapsSmsIoctlDeleteSms::doTestStepL()
	{

	RSocket socket;
	TRequestStatus status;
	TInt ret=socket.Open(iSocketServer,KSMSAddrFamily,KSockDatagram,KSMSDatagramProtocol);
	if(ret!=KErrNone)
		User::Leave(ret);
	CleanupClosePushL(socket);

	TSmsAddr smsaddr;
	smsaddr.SetSmsAddrFamily(ESmsAddrRecvAny);
	ret=socket.Bind(smsaddr);

	if(RProcess().HasCapability(ECapabilityWriteUserData, ECapabilityNetworkServices) && RProcess().HasCapability(ECapabilityReadUserData))
		{
		TESTL(ret != KErrPermissionDenied);
		}
	else
		{
		// skip this one
		CleanupStack::PopAndDestroy(&socket);
		return TestStepResult() ;
		}



	// Create message with SRR
	_LIT(KText,"This is a simple SMS!");
	CSmsMessage* msg=CreateSmsMessageL(KText,TSmsDataCodingScheme::ESmsAlphabet7Bit);
	CleanupStack::PushL(msg);

	RSmsSocketWriteStream writestream(socket);
	writestream << *msg;
	writestream.CommitL();
	CleanupStack::PopAndDestroy(msg);

	socket.Ioctl(KIoctlDeleteSmsMessage, status, NULL, KSolSmsProv);
	User::WaitForRequest(status);

	if(RProcess().HasCapability(ECapabilityWriteUserData))
		{
		TEST(status.Int() != KErrPermissionDenied);
		}
	else
		{
		TEST(status.Int() == KErrPermissionDenied);
		}

	CleanupStack::PopAndDestroy(&socket);

	return TestStepResult();
	}
Exemple #3
0
//
// Called by the obex-layer when some event occurs.
//
void obexsrv_event(obex_t *handle, obex_object_t *object, int mode, int event, int obex_cmd, int obex_rsp)
{
	obexsrv_t	*srv = OBEX_GetUserData(handle);

	//DBPRT("event: %d, cmd: %x, rsp: %x\n", event, obex_cmd, obex_rsp);
	switch (event) {
		case OBEX_EV_PROGRESS:
			//DBPRT("Made some progress...");
			break;
		case OBEX_EV_ABORT:
			BTERROR("Request aborted!");
			break;
		case OBEX_EV_REQDONE:
			obexsrv_reqdone(handle, object, obex_cmd, obex_rsp);
			break;
		case OBEX_EV_REQHINT:
			obexsrv_reqhint(handle, object, obex_cmd);
			break;
		case OBEX_EV_REQ:
			obexsrv_req(handle, object, obex_cmd);
			break;
		case OBEX_EV_LINKERR:
			if (srv->state != SRVSTATE_CLOSED) {
				BTERROR("Link broken!");
				srv->state = SRVSTATE_CLOSED;
				srv->disconnect(srv);
			}
			srv->serverdone = TRUE;
			break;
		case OBEX_EV_PARSEERR:
			BTERROR("Parse error!");
			break;
		case OBEX_EV_STREAMEMPTY:
			writestream(handle, object);
			break;
		case OBEX_EV_STREAMAVAIL:
			readstream(handle, object);
			break;
		default:
			BTERROR("Unknown event %02x!", event);
			break;
	}
}
Exemple #4
0
void CScriptEdit::OnSaveasGeneral(int type) 
{
  char BASED_CODE *szFilter;
  CString tmpstr;
  CString newname;
  int fhandle;
  int res;

  if(readonly)
  {
    MessageBox("You opened it read only!","Warning",MB_ICONEXCLAMATION|MB_OK);
    return;
  }
  res=OFN_HIDEREADONLY|OFN_ENABLESIZING|OFN_EXPLORER;

  if(type!=-1) m_bcs=type;
  szFilter=szFilterb;
  if(m_bcs)
  {
    //szFilter=szFiltera;
    tmpstr=bgfolder+"override\\"+itemname;
  }
  else
  {
    //szFilter=szFilterb;    
    tmpstr=makeitemname(".baf",1);
  }
  CMyFileDialog m_getfiledlg(FALSE, m_bcs?"bcs":"baf", tmpstr, res, szFilter);
  m_getfiledlg.m_ofn.nFilterIndex = m_bcs+1;

restart:  
  if( m_getfiledlg.DoModal() == IDOK )
  {
    filepath=m_getfiledlg.GetPathName();
    filepath.MakeLower();
    if(filepath.Right(4)==".baf") m_bcs=0;
    else if(filepath.Right(4)==".bcs") m_bcs=1; //this is the default
    if(m_bcs)
    {
      if(filepath.Right(4)!=".bcs")  filepath+=".bcs";
      lastopenedoverride=filepath.Left(filepath.ReverseFind('\\'));
    }
    else
    {
      if(filepath.Right(4)!=".baf")  filepath+=".baf";
      lastopenedscript=filepath.Left(filepath.ReverseFind('\\'));
    }
    newname=m_getfiledlg.GetFileName();
    newname.MakeUpper();
    if(newname.Right(4)==".BCS") newname=newname.Left(newname.GetLength()-4);
    else if(newname.Right(4)==".BAF") newname=newname.Left(newname.GetLength()-4);
    if(newname.GetLength()>8 || newname.GetLength()<1 || newname.Find(" ",0)!=-1)
    {
      tmpstr.Format("The resource name '%s' is wrong, it should be 8 characters long and without spaces.",newname);
      MessageBox(tmpstr,"Warning",MB_ICONEXCLAMATION|MB_OK);
      goto restart;
    }
    if(newname!=itemname && file_exists(filepath) )
    {
      res=MessageBox("Do you want to overwrite "+newname+"?","Warning",MB_ICONQUESTION|MB_YESNO);
      if(res==IDNO) goto restart;
    }
    
    itemname=newname;
    res=0;
    if(filepath.Right(4)==".bcs")
    {
      chdir(bgfolder);
      tmpstr=bgfolder+weidudecompiled;
      assure_dir_exists(tmpstr);
      if(!dir_exists(tmpstr) )
      {
        res=-3;
      }
      else tmpstr+="\\"+newname+".baf";
    }
    if(!res)
    {
      fhandle=creat(tmpstr,S_IWRITE);
      if(fhandle>0)
      {
        //this is the intended way of extracting info from a richedit control
        res=writestream(fhandle,m_text_control);
        close(fhandle);
      }
      else res=-2;
      if(m_bcs)
      {
        if(!res) res=compile(tmpstr);
      }
    }
    switch(res)
    {
    case -3:
      newname.Format("Cannot create output path:%s",tmpstr);
      MessageBox(tmpstr,"Script editor",MB_ICONSTOP|MB_OK);
      break;
    case -2:
      newname.Format("Cannot create  file:%s",tmpstr);
      MessageBox(tmpstr,"Script editor",MB_ICONSTOP|MB_OK);
      break;
    case 0:
      if(m_bcs) MessageBox("Script saved and compiled...","Script editor",MB_ICONINFORMATION|MB_OK);
      else MessageBox("Script saved...","Script editor",MB_ICONINFORMATION|MB_OK);
      break;
    default:
      MessageBox("Error during save.","Script editor",MB_ICONSTOP|MB_OK);
    }
  }
  UpdateData(UD_DISPLAY);
  the_script.m_changed=false;
  CheckScript(0);
  RefreshDialog();
}
TVerdict CteststreamingStep::doTestStepL()
/**
 *  @return - TVerdict code
 *  Override of base class pure virtual
 *  Our implementation only gets called if the base class doTestStepPreambleL() did
 *  not leave. That being the case, the current test result value will be EPass.
 */
	{
	_LIT(KTestEmsMsg8Bit1,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;

	CSmsMessage* smsMessage=CreateSmsMessageL(KTestEmsMsg8Bit1,alphabet);
	CleanupStack::PushL(smsMessage);
	// format
		CEmsFormatIE* object = CEmsFormatIE::NewL();
		object->SetStartPosition(10);
		object->SetFormatLength(1200);
		object->SetBold(ETrue);
		CleanupStack::PushL(object);
		smsMessage->AddEMSInformationElementL(*object);
		CleanupStack::PopAndDestroy(object);
	// sounds
		CEmsSoundIE* object2 = CEmsSoundIE::NewL(KOasisMelody());
		object2->SetStartPosition(52);
		CleanupStack::PushL(object2);
		smsMessage->AddEMSInformationElementL(*object2);
		CleanupStack::PopAndDestroy(object2);

		CEmsSoundIE* object2a = CEmsSoundIE::NewL(KBarbieMelody());
		object2a->SetStartPosition(52);
		CleanupStack::PushL(object2a);
		smsMessage->AddEMSInformationElementL(*object2a);
		CleanupStack::PopAndDestroy(object2a);
		// user prompt
		CEmsUserPrompt* prompt = CEmsUserPrompt::NewL(2);
		prompt->SetStartPosition(52);
		CleanupStack::PushL(prompt);
		smsMessage->AddEMSInformationElementL(*prompt);
		CleanupStack::PopAndDestroy(prompt);

		CEmsPreDefSoundIE* object3 = CEmsPreDefSoundIE::NewL( CEmsPreDefSoundIE::EChordLow);
		object3->SetStartPosition(5);
		CleanupStack::PushL(object3);
		smsMessage->AddEMSInformationElementL(*object3);
		CleanupStack::PopAndDestroy(object3);

		// object distribution
		CEmsObjectDistribution* odi = CEmsObjectDistribution::NewL(3, CEmsObjectDistribution::ENoForward);
		odi->SetStartPosition(52);
		CleanupStack::PushL(odi);
		smsMessage->AddEMSInformationElementL(*odi);
		CleanupStack::PopAndDestroy(odi);

	// pictures
		CFbsBitmap* bitmap=NULL;
		CEmsPictureIE* pic=NULL;
		FbsStartup();
		User::LeaveIfError(RFbsSession::Connect());

		bitmap = new (ELeave) CFbsBitmap();
		CleanupStack::PushL(bitmap);

		TESTL(!LoadBitmap(*bitmap,KPicsMBM,0));

		pic = CEmsPictureIE::NewL(*bitmap);
		pic->SetStartPosition(5);
		CleanupStack::PushL(pic);
		smsMessage->AddEMSInformationElementL(*pic);
		CleanupStack::PopAndDestroy(pic);
		CleanupStack::PopAndDestroy(bitmap);

		bitmap = new (ELeave) CFbsBitmap();
		CleanupStack::PushL(bitmap);

		TESTL(!LoadBitmap(*bitmap,KPicsMBM,1));

		pic = CEmsPictureIE::NewL(*bitmap);
		pic->SetStartPosition(5);
		CleanupStack::PushL(pic);
		smsMessage->AddEMSInformationElementL(*pic);
		CleanupStack::PopAndDestroy(pic);
		CleanupStack::PopAndDestroy(bitmap);

		bitmap = new (ELeave) CFbsBitmap();
		CleanupStack::PushL(bitmap);

		TESTL(!LoadBitmap(*bitmap,KPicsMBM,2));

		pic = CEmsPictureIE::NewL(*bitmap);
		pic->SetStartPosition(5);
		CleanupStack::PushL(pic);
		smsMessage->AddEMSInformationElementL(*pic);
		CleanupStack::PopAndDestroy(pic);
		CleanupStack::PopAndDestroy(bitmap);

		RFbsSession::Disconnect();
	// animations
		CEmsAnimationIE* anim=NULL;
		CEmsPreDefAnimationIE* predefanim=NULL;

		FbsStartup();
		User::LeaveIfError(RFbsSession::Connect());

		bitmap = new (ELeave) CFbsBitmap();
		CleanupStack::PushL(bitmap);

		TESTL(!LoadBitmap(*bitmap,KAnimsMBM,0));

		anim = CEmsAnimationIE::NewL(*bitmap);
		anim->SetStartPosition(5);
		CleanupStack::PushL(anim);
		smsMessage->AddEMSInformationElementL(*anim);
		CleanupStack::PopAndDestroy(anim);
		CleanupStack::PopAndDestroy(bitmap);

		bitmap = new (ELeave) CFbsBitmap();
		CleanupStack::PushL(bitmap);

		TESTL(!LoadBitmap(*bitmap,KAnimsMBM,1));

		anim = CEmsAnimationIE::NewL(*bitmap);
		anim->SetStartPosition(5);
		CleanupStack::PushL(anim);
		smsMessage->AddEMSInformationElementL(*anim);
		CleanupStack::PopAndDestroy(anim);
		CleanupStack::PopAndDestroy(bitmap);

		predefanim = CEmsPreDefAnimationIE::NewL(CEmsPreDefAnimationIE::EWinking);
		predefanim->SetStartPosition(5);
		CleanupStack::PushL(predefanim);
		smsMessage->AddEMSInformationElementL(*predefanim);
		CleanupStack::PopAndDestroy(predefanim);

		RFbsSession::Disconnect();


	CSmsMessage* smsMessage2=CreateSmsMessageL(KTestEmsMsg8Bit1,alphabet);
	CleanupStack::PushL(smsMessage2);

	CBufSeg* aReadBufSeg = CBufSeg::NewL(KSmsMaxEMSLength);
	CleanupStack::PushL(aReadBufSeg);

	RBufReadStream readstream(*aReadBufSeg);
	readstream.Open(*aReadBufSeg,0);
	CleanupClosePushL(readstream);

	RBufWriteStream writestream(*aReadBufSeg);
	writestream.Open(*aReadBufSeg,0);
	CleanupClosePushL(writestream);
	writestream << *smsMessage;
	readstream  >> *smsMessage2;
	CleanupStack::PopAndDestroy();  //  writesream
	CleanupStack::PopAndDestroy();  //  readsream
	//
	CleanupStack::PopAndDestroy(aReadBufSeg);

	CompareEmsElementsL(*smsMessage,*smsMessage2);

	CSmsMessage* smsMessage3=CreateSmsMessageL(KTestEmsMsg8Bit1,alphabet);
	CleanupStack::PushL(smsMessage3);

	smsMessage2->CopyEmsElementsL(*smsMessage3);
	CompareEmsElementsL(*smsMessage3,*smsMessage2);

	CleanupStack::PopAndDestroy(smsMessage3);
	CleanupStack::PopAndDestroy(smsMessage2);
	CleanupStack::PopAndDestroy(smsMessage);

	return TestStepResult();
	}
Exemple #6
0
void SRamSPI::write(unsigned int address, uint8_t c)
{
  writestream(address);
  RWdata(c);
  closeRWstream();
}
TVerdict CSmsCapsSmsIoctlWriteParamsSms::doTestStepL()
	{

	RSocket socket;
	TRequestStatus status;
	TInt ret=socket.Open(iSocketServer,KSMSAddrFamily,KSockDatagram,KSMSDatagramProtocol);
	if(ret!=KErrNone)
		User::Leave(ret);
	CleanupClosePushL(socket);

	TSmsAddr smsaddr;
	smsaddr.SetSmsAddrFamily(ESmsAddrLocalOperation);
	ret=socket.Bind(smsaddr);
	if(RProcess().HasCapability(ECapabilityWriteUserData, ECapabilityNetworkServices) && RProcess().HasCapability(ECapabilityReadUserData))
		{
		TESTL(ret != KErrPermissionDenied);
		}
	else
		{
		// skip this one
		CleanupStack::PopAndDestroy(&socket);
		return TestStepResult();
		}



	CMobilePhoneSmspList* smspList=CMobilePhoneSmspList::NewL();
	CleanupStack::PushL(smspList);

	RMobileSmsMessaging::TMobileSmspEntryV1 entryToTsy;

	entryToTsy.iText = SMSCAPS_STORE_TEXT1;
	entryToTsy.iValidParams = SMSCAPS_STORE_VALID_PARAMS1;
    entryToTsy.iDestination.iTypeOfNumber = SMSCAPS_MESSAGE_DESTINATION_TON_0;
    entryToTsy.iDestination.iNumberPlan = SMSCAPS_MESSAGE_DESTINATION_NP_0;
	entryToTsy.iDestination.iTelNumber = SMSCAPS_MESSAGE_DESTINATION_TEL_NUMBER_0;
	entryToTsy.iValidityPeriod = SMSCAPS_STORE_VALIDITY1;
    entryToTsy.iServiceCentre.iTypeOfNumber = SMSCAPS_MESSAGE_GSMSERVICECENTRE_TON_1;
    entryToTsy.iServiceCentre.iNumberPlan = SMSCAPS_MESSAGE_GSMSERVICECENTRE_NP_1;
	entryToTsy.iServiceCentre.iTelNumber = SMSCAPS_MESSAGE_GSMSERVICECENTRE_TEL_NUMBER_1;
	entryToTsy.iProtocolId = SMSCAPS_STORE_PID1;
	entryToTsy.iDcs = SMSCAPS_STORE_DCS1;

	entryToTsy.iIndex = 0;
	smspList->AddEntryL(entryToTsy);

	RSmsSocketWriteStream writestream(socket);
	TRAP(ret,writestream << *smspList);
	User::LeaveIfError(ret);
	TRAP(ret,writestream.CommitL());
	User::LeaveIfError(ret);

	socket.Ioctl(KIoctlWriteSmsParams,status,NULL, KSolSmsProv);
 	User::WaitForRequest(status);

	if(RProcess().HasCapability(ECapabilityWriteDeviceData))
			{
			TEST(status.Int() != KErrPermissionDenied);
			}
		else
			{
			TEST(status.Int() == KErrPermissionDenied);
			}

	CleanupStack::PopAndDestroy(smspList);
	CleanupStack::PopAndDestroy(&socket);

	return	TestStepResult() ;
	}
TVerdict CSmsCapsSmsIoctlWriteSms::doTestStepL()
	{

	TInt ret;
	//
	// Set TSY to the test case
	//
	//
	TInt testNo=13;

	RProperty testNumberProperty;
	User::LeaveIfError(testNumberProperty.Attach(KUidPSSimTsyCategory, KPSSimTsyTestNumber));
	CleanupClosePushL(testNumberProperty);

	TRequestStatus status;
	testNumberProperty.Subscribe(status);
	User::LeaveIfError(testNumberProperty.Set(KUidPSSimTsyCategory,KPSSimTsyTestNumber,testNo));
	User::WaitForRequest(status);
	TEST(status.Int() == KErrNone);
	TInt testNumberCheck;
	User::LeaveIfError(testNumberProperty.Get(testNumberCheck));
	if (testNo != testNumberCheck)
		User::Leave(KErrNotFound);

	CleanupStack::PopAndDestroy(&testNumberProperty);
	//

	RSocket socket;
	ret=socket.Open(iSocketServer,KSMSAddrFamily,KSockDatagram,KSMSDatagramProtocol);
	if(ret!=KErrNone)
		User::Leave(ret);
	CleanupClosePushL(socket);

	TSmsAddr smsaddr;
	smsaddr.SetSmsAddrFamily(ESmsAddrRecvAny);
	ret=socket.Bind(smsaddr);

	if(RProcess().HasCapability(ECapabilityWriteUserData, ECapabilityNetworkServices) && RProcess().HasCapability(ECapabilityReadUserData))
		{
		TESTL(ret != KErrPermissionDenied);
		}
	else
		{
		// skip this one
		CleanupStack::PopAndDestroy(&socket);
		return TestStepResult() ;
		}


	// Create message with SRR
	_LIT(KText,"This is a simple SMS!");
	CSmsMessage* msg=CreateSmsMessageL(KText,TSmsDataCodingScheme::ESmsAlphabet7Bit);
	CleanupStack::PushL(msg);


	// Send message
	RSmsSocketWriteStream writestream(socket);
	TRAP(ret,writestream << *msg);
	User::LeaveIfError(ret);
	TRAP(ret,writestream.CommitL());
	User::LeaveIfError(ret);

	socket.Ioctl(KIoctlWriteSmsMessage,status,NULL, KSolSmsProv);
	User::WaitForRequest(status);

	if(RProcess().HasCapability(ECapabilityWriteUserData))
			{
			TEST(status.Int() != KErrPermissionDenied);
			}
		else
			{
			TEST(status.Int() == KErrPermissionDenied);
			}

	CleanupStack::PopAndDestroy(msg);
	CleanupStack::PopAndDestroy(&socket);

	return	TestStepResult() ;
	}
int
main(int argc, char* argv[])
{
	if (argc != 3) {
		std::cerr << "Usage: " + std::string(argv[0]) + " SERVER-HOST-OR-IP PORT-NUMBER" << std::endl;
		exit(EXIT_FAILURE);
	}

	/*Create a socket*/
	int sockfd;
	if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
		std::cerr << "Error: could not bind to socket" << std::endl;
		exit(EXIT_FAILURE);
	}

	/*Resolve a host name*/
	struct hostent *hp;
	hp = gethostbyname(argv[1]);
	if (!hp) {
		std::cerr << "Error: could not obtain address of host " + std::string(argv[1]) << std::endl;
		exit(EXIT_FAILURE);
	}

	/*Set up parameters of the serverAddress*/
	struct sockaddr_in serverAddress;
	socklen_t addressLength = sizeof(serverAddress);
	memset((char *)&serverAddress, 0, sizeof(serverAddress));
	serverAddress.sin_family = AF_INET;
	serverAddress.sin_port = htons(std::atoi(argv[2]));
	memcpy((void *)&serverAddress.sin_addr, hp->h_addr_list[0], hp->h_length);

	/*Open file for writing*/
	std::ofstream writestream("received.data", std::ios::in | std::ios::trunc | std::ios::binary);

	/*Basic initializations*/
	char buf[BUFSIZE]; //initiailize temporary buffer for storing data
	uint16_t currSeqNum = rand() % MAXSEQNUM; //initialize random sequence number
	uint16_t currAckNum = 0;

	uint16_t expectedSeqNum = 0;

	int bytesReceived;
	fsmstate curr_state = HANDSHAKE;

	Packet syn_packet;
	int syn_tries = 0;
	bool syn_acked = false;

	Packet fin_packet;

	while(1) {

		if(curr_state == HANDSHAKE) {
			/*Set initial SYN TCPHeader*/

			syn_packet.setHeaderFields(currSeqNum, currAckNum, RECEIVEWINSIZE, false, true, false);
			clock_gettime(CLOCK_MONOTONIC, &syn_packet.m_time);

			sendto(sockfd, (void *)&syn_packet.m_header, sizeof(struct TCPHeader), 0, (struct sockaddr *)&serverAddress, addressLength);
			syn_packet.printSYNSend(false);

			syn_tries++;

			curr_state = TRANSFER;
			continue;
		}

		//check for syn-packet expiration
		if (syn_acked == false) {
			struct timespec now;
			clock_gettime(CLOCK_MONOTONIC, &now);
			if (syn_packet.hasExpired(now, TIMEOUT)) {
				// if (syn_tries > 2) {
				// 	fprintf(stderr, "Could not connect to server in 3 tries. Exiting.\n");
				// 	break;
				// }
				sendto(sockfd, (void *)&syn_packet.m_header, sizeof(struct TCPHeader), 0, (struct sockaddr *)&serverAddress, addressLength);
				syn_packet.printSYNSend(true);
				clock_gettime(CLOCK_MONOTONIC, &syn_packet.m_time);
				syn_tries++;
			}
		}

		//check for fin-ack packet expiration
		if (curr_state == TEARDOWN) {
			struct timespec now;
			clock_gettime(CLOCK_MONOTONIC, &now);
			if(fin_packet.hasExpired(now, TIMEOUT)) {
				clock_gettime(CLOCK_MONOTONIC, &fin_packet.m_time);

				sendto(sockfd, (void *)&fin_packet.m_header, sizeof(struct TCPHeader), 0, (struct sockaddr *)&serverAddress, addressLength);
				fin_packet.printAckSend(true, false, true);
			}
		}


		bytesReceived = recvfrom(sockfd, buf, BUFSIZE, MSG_DONTWAIT, (struct sockaddr *)&serverAddress, &addressLength);

		if (bytesReceived < (int) sizeof(struct TCPHeader)) {
			//std::cerr << "Problem with received packet or didn't receive anything yet." << std::endl;
			continue;
		}

		Packet received_packet(buf, bytesReceived);

		if (curr_state == TRANSFER) {
			/*if SYN-ACK packet was received*/

			if (received_packet.isSYNACK()) {
				received_packet.printSeqReceive();

				//fprintf(stderr, "Received a SYN-ACK.\n");
				currSeqNum = received_packet.getAckNumber();
				currAckNum = received_packet.getSeqNumber() + 1; //consume the SYN-ACK

				expectedSeqNum = currAckNum;

				/*Send ACK back to begin the process of transfer*/

				Packet ack_packet;
				ack_packet.setHeaderFields(currSeqNum, currAckNum, RECEIVEWINSIZE, true, false, false);
				sendto(sockfd, (void *)&ack_packet.m_header, sizeof(struct TCPHeader), 0, (struct sockaddr *)&serverAddress, addressLength);
				ack_packet.printAckSend(false, false, false);

				syn_acked = true;
			}
			
			/*if data packet, i.e. ASF = 000, send ACK back*/
			else if (received_packet.isDATA()) {
				received_packet.printSeqReceive();

				if (received_packet.getSeqNumber() == expectedSeqNum) {
					int payloadSize = bytesReceived - sizeof(struct TCPHeader);
					//fprintf(stderr, "Payload Size = %d\n", payloadSize);

					// for (int i = 0; i < payloadSize; i++) {
					// 	fprintf(stderr, "%c",received_packet.data[i]);
					// }
					// fprintf(stderr, "\n");

					writestream.write(received_packet.data, payloadSize);
					writestream.flush();
					currAckNum = received_packet.getSeqNumber() + payloadSize;
					if(currAckNum > MAXSEQNUM) {
						currAckNum -= MAXSEQNUM;
						//fprintf(stderr, "set it to %u\n", currAckNum);
					}
					expectedSeqNum = currAckNum;
				}

				/* currAckNum will still be our expected AckNumber */
				Packet delivery_packet;
				delivery_packet.setHeaderFields(currSeqNum, currAckNum, RECEIVEWINSIZE, true, false, false);

				sendto(sockfd, (void *)&delivery_packet.m_header, sizeof(struct TCPHeader), 0, (struct sockaddr *)&serverAddress, addressLength);
				delivery_packet.printAckSend(false, false, false);
			}

			/*if FIN packet from server, send FIN-ACK back and transition to teardown phase*/
			else if (received_packet.isFIN()) {
				received_packet.printSeqReceive();
				//fprintf(stderr, "Received FIN.\n");

				currAckNum++;
				fin_packet.setHeaderFields(currSeqNum, currAckNum, RECEIVEWINSIZE, true, false, true);
				clock_gettime(CLOCK_MONOTONIC, &fin_packet.m_time);

				sendto(sockfd, (void *)&fin_packet.m_header, sizeof(struct TCPHeader), 0, (struct sockaddr *)&serverAddress, addressLength);
				fin_packet.printAckSend(false, false, true);

				curr_state = TEARDOWN;



				continue;
			}

		}

		if (curr_state == TEARDOWN) {

			/*if ACK from server, we are done*/
			if (received_packet.isACK()) {
				//received_packet.printSeqReceive();
				//std::cerr << "Received ACK, terminating client." << std::endl;
				break;
			}
		}
	}

	writestream.close();
	close(sockfd);
}