From 367e9aa7b082df51e30dc7591438de69d5552029 Mon Sep 17 00:00:00 2001
From: Alexander Lantsev <aunsane@gmail.com>
Date: Sun, 21 Apr 2013 11:00:19 +0000
Subject: added transfert progress changing

git-svn-id: http://svn.miranda-ng.org/main/trunk@4502 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
---
 protocols/Skype/src/skype_events.cpp | 154 +++++++++++++++++++----------------
 1 file changed, 84 insertions(+), 70 deletions(-)

(limited to 'protocols/Skype/src')

diff --git a/protocols/Skype/src/skype_events.cpp b/protocols/Skype/src/skype_events.cpp
index 7e9e37e72a..77c16a0be5 100644
--- a/protocols/Skype/src/skype_events.cpp
+++ b/protocols/Skype/src/skype_events.cpp
@@ -183,80 +183,94 @@ void CSkypeProto::OnMessageReceived(CConversation::Ref conversation, CMessage::R
 
 void CSkypeProto::OnTransferChanged(int prop, CTransfer::Ref transfer)
 {
-	// todo: add progress changing
-	if (prop == Transfer::P_STATUS)
+	switch (prop)
 	{
-		SEBinary guid;
-		transfer->GetPropChatmsgGuid(guid);
+	case Transfer::P_STATUS:
+		{
+			SEBinary guid;
+			transfer->GetPropChatmsgGuid(guid);
 
-		CMessage::Ref message;
-		this->skype->GetMessageByGuid(guid, message);
+			CMessage::Ref message;
+			this->skype->GetMessageByGuid(guid, message);
 
-		uint oid = message->getOID();
+			uint oid = message->getOID();
 
-		SEString data;
-		transfer->GetPropPartnerHandle(data);
-		HANDLE hContact = this->GetContactBySid(mir_ptr<wchar_t>(::mir_utf8decodeW(data)));
+			SEString data;
+			transfer->GetPropPartnerHandle(data);
+			HANDLE hContact = this->GetContactBySid(mir_ptr<wchar_t>(::mir_utf8decodeW(data)));
 
-		Transfer::STATUS status;
-		transfer->GetPropStatus(status);
-		switch(status)
-		{
-		/*case CTransfer::NEW:
-			break;*/
-		/*case CTransfer::WAITING_FOR_ACCEPT:
-			break;*/
-		case CTransfer::CONNECTING:
-			this->SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, (HANDLE)oid, 0);
-			break;
-		/*case CTransfer::TRANSFERRING:
-		case CTransfer::TRANSFERRING_OVER_RELAY:
-			this->SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, (HANDLE)oid, 0);
-			break;*/
-		case CTransfer::FAILED:
-			this->SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_FAILED, (HANDLE)oid, 0);
-			this->transferList.remove_val(transfer);
-			break;
-		case CTransfer::COMPLETED:
-			this->SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, (HANDLE)oid, 0);
-			this->transferList.remove_val(transfer);
-			break;
-		case CTransfer::CANCELLED:
-		case CTransfer::CANCELLED_BY_REMOTE:
-			this->SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_DENIED, (HANDLE)oid, 0);
-			this->transferList.remove_val(transfer);
-			break;
+			Transfer::STATUS status;
+			transfer->GetPropStatus(status);
+			switch(status)
+			{
+			/*case CTransfer::NEW:
+				break;*/
+			/*case CTransfer::WAITING_FOR_ACCEPT:
+				break;*/
+			case CTransfer::CONNECTING:
+				this->SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, (HANDLE)oid, 0);
+				break;
+			case CTransfer::TRANSFERRING:
+			case CTransfer::TRANSFERRING_OVER_RELAY:
+				this->SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, (HANDLE)oid, 0);
+				break;
+			case CTransfer::FAILED:
+				this->SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_FAILED, (HANDLE)oid, 0);
+				this->transferList.remove_val(transfer);
+				break;
+			case CTransfer::COMPLETED:
+				this->SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, (HANDLE)oid, 0);
+				this->transferList.remove_val(transfer);
+				break;
+			case CTransfer::CANCELLED:
+			case CTransfer::CANCELLED_BY_REMOTE:
+				this->SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_DENIED, (HANDLE)oid, 0);
+				this->transferList.remove_val(transfer);
+				break;
+			}
 		}
-	}
-	//if (prop == Transfer::P_BYTESTRANSFERRED)
-	//{
-		//PROTOFILETRANSFERSTATUS
-		//this->SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_FAILED, (HANDLE)ccid, 0);
-		//SEString transferProgressStr;
-		//transfer->GetPropBytestransferred(transferProgressStr);
-		//uint transferProgress = transferProgressStr.toUInt();
-
-		//SEString fileSizeStr;
-		//transfer->GetPropFilesize(fileSizeStr);
-
-		//// fileSize is float here, to avoid trouble with 
-		//// files lessthan 100 bytes in size.
-		//float fileSize = (float)fileSizeStr.toUInt();
-		//float progress = (100 * transferProgress) / fileSize;
+		break;
+
+	case Transfer::P_BYTESTRANSFERRED:
+		{
+			SEString data;
+
+			SEBinary guid;			
+			transfer->GetPropChatmsgGuid(guid);
+
+			CMessage::Ref message;
+			this->skype->GetMessageByGuid(guid, message);
+
+			uint oid = message->getOID();				
+
+			PROTOFILETRANSFERSTATUS pfts = {0};
+			pfts.cbSize = sizeof(PROTOFILETRANSFERSTATUS);
+			pfts.flags = PFTS_UTF | PFTS_RECEIVING;
+			pfts.totalFiles = 1;
+			pfts.currentFileNumber = 0;
+			
+			transfer->GetPropPartnerHandle(data);
+			HANDLE hContact = this->GetContactBySid(mir_ptr<wchar_t>(::mir_utf8decodeW(data)));
+			pfts.hContact = hContact;
+		
+			transfer->GetPropFilename(data);
+			pfts.szCurrentFile = ::mir_strdup(data);
+
+			pfts.pszFiles = &pfts.szCurrentFile;
 
+			transfer->GetPropFilesize(data);
+			pfts.totalBytes = pfts.currentFileSize = data.toUInt();
+
+			transfer->GetPropBytestransferred(data);
+			pfts.totalProgress = pfts.currentFileProgress = data.toUInt();
+
+			this->SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_DATA, (HANDLE)oid, (LPARAM)&pfts);
+		}
+		break;
 		//uint transferRate;
 		//transfer->GetPropBytespersecond(transferRate);
 		//float transferRateInKb = (float)transferRate / 1024;
-
-		//PROTOFILETRANSFERSTATUS pfts = {0};
-		//pfts.cbSize = sizeof(pfts);
-		////pfts.szCurrentFile
-		//pfts.currentFileProgress = progress;
-		//pfts.
-
-		//this->SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_DATA, (HANDLE)ccid, 0);
-  //  printf("Progress: %3.0f%% (%1.0f KB/s)\n", progress, transferRateInKb);
-	//}
+	}
 }
 
 void CSkypeProto::OnFile(CConversation::Ref conversation, CMessage::Ref message)
@@ -283,6 +297,12 @@ void CSkypeProto::OnFile(CConversation::Ref conversation, CMessage::Ref message)
 			transfer->GetPropType(transferType);
 			if (transferType == Transfer::INCOMING)
 			{
+				transfer.fetch();
+				transfer->SetOnTransferCallback(
+					(CTransfer::OnTransfer)&CSkypeProto::OnTransferChanged,
+					this);
+				this->transferList.append(transfer);
+
 				uint timestamp;
 				message->GetPropTimestamp(timestamp);
 
@@ -301,12 +321,6 @@ void CSkypeProto::OnFile(CConversation::Ref conversation, CMessage::Ref message)
 				pre.ptszFiles =  &path;
 				pre.lParam = (LPARAM)message->getOID();
 				::ProtoChainRecvFile(hContact, &pre);
-
-				transfer.fetch();
-				transfer->SetOnTransferCallback(
-					(CTransfer::OnTransfer)&CSkypeProto::OnTransferChanged,
-					this);
-				this->transferList.append(transfer);
 			}
 			/*else
 			{
-- 
cgit v1.2.3