Hans Leidekker : netprofm: Improve the stub for INetworkCostManager:: GetDataPlanStatus.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jul 28 13:30:06 CDT 2015


Module: wine
Branch: master
Commit: be7373f76420f93e19a265cd268911a3628af704
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=be7373f76420f93e19a265cd268911a3628af704

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Jul 24 10:34:36 2015 +0200

netprofm: Improve the stub for INetworkCostManager::GetDataPlanStatus.

---

 dlls/netprofm/Makefile.in  |  1 +
 dlls/netprofm/list.c       | 63 +++++++++++++++++++++++++++++++++++++++++++++-
 dlls/netprofm/tests/list.c |  7 ++++++
 3 files changed, 70 insertions(+), 1 deletion(-)

diff --git a/dlls/netprofm/Makefile.in b/dlls/netprofm/Makefile.in
index 4dadfb0..def2614 100644
--- a/dlls/netprofm/Makefile.in
+++ b/dlls/netprofm/Makefile.in
@@ -1,4 +1,5 @@
 MODULE    = netprofm.dll
+IMPORTS   = iphlpapi
 
 C_SRCS = \
 	list.c \
diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c
index 842f335..1808178 100644
--- a/dlls/netprofm/list.c
+++ b/dlls/netprofm/list.c
@@ -23,6 +23,12 @@
 #include <stdarg.h>
 #include "windef.h"
 #include "winbase.h"
+#define USE_WS_PREFIX
+#include "winsock2.h"
+#include "ws2ipdef.h"
+#include "iphlpapi.h"
+#include "ifdef.h"
+#include "netioapi.h"
 #include "initguid.h"
 #include "objbase.h"
 #include "ocidl.h"
@@ -240,12 +246,67 @@ static HRESULT WINAPI cost_manager_GetCost(
     return S_OK;
 }
 
+static BOOL map_address_6to4( const SOCKADDR_IN6 *addr6, SOCKADDR_IN *addr4 )
+{
+    ULONG i;
+
+    if (addr6->sin6_family != WS_AF_INET6) return FALSE;
+
+    for (i = 0; i < 5; i++)
+        if (addr6->sin6_addr.u.Word[i]) return FALSE;
+
+    if (addr6->sin6_addr.u.Word[5] != 0xffff) return FALSE;
+
+    addr4->sin_family = WS_AF_INET;
+    addr4->sin_port   = addr6->sin6_port;
+    addr4->sin_addr.S_un.S_addr = addr6->sin6_addr.u.Word[6] << 16 | addr6->sin6_addr.u.Word[7];
+    memset( &addr4->sin_zero, 0, sizeof(addr4->sin_zero) );
+
+    return TRUE;
+}
+
 static HRESULT WINAPI cost_manager_GetDataPlanStatus(
     INetworkCostManager *iface, NLM_DATAPLAN_STATUS *pDataPlanStatus,
     NLM_SOCKADDR *pDestIPAddr)
 {
+    DWORD ret, index;
+    NET_LUID luid;
+    SOCKADDR *dst = (SOCKADDR *)pDestIPAddr;
+    SOCKADDR_IN addr4, *dst4;
+
     FIXME( "%p, %p, %p\n", iface, pDataPlanStatus, pDestIPAddr );
-    return E_NOTIMPL;
+
+    if (!pDataPlanStatus) return E_POINTER;
+
+    if (dst && ((dst->sa_family == WS_AF_INET && (dst4 = (SOCKADDR_IN *)dst)) ||
+               ((dst->sa_family == WS_AF_INET6 && map_address_6to4( (const SOCKADDR_IN6 *)dst, &addr4 )
+                && (dst4 = &addr4)))))
+    {
+        if ((ret = GetBestInterface( dst4->sin_addr.S_un.S_addr, &index )))
+            return HRESULT_FROM_WIN32( ret );
+
+        if ((ret = ConvertInterfaceIndexToLuid( index, &luid )))
+            return HRESULT_FROM_WIN32( ret );
+
+        if ((ret = ConvertInterfaceLuidToGuid( &luid, &pDataPlanStatus->InterfaceGuid )))
+            return HRESULT_FROM_WIN32( ret );
+    }
+    else
+    {
+        FIXME( "interface guid not found\n" );
+        memset( &pDataPlanStatus->InterfaceGuid, 0, sizeof(pDataPlanStatus->InterfaceGuid) );
+    }
+
+    pDataPlanStatus->UsageData.UsageInMegabytes = NLM_UNKNOWN_DATAPLAN_STATUS;
+    memset( &pDataPlanStatus->UsageData.LastSyncTime, 0, sizeof(pDataPlanStatus->UsageData.LastSyncTime) );
+    pDataPlanStatus->DataLimitInMegabytes       = NLM_UNKNOWN_DATAPLAN_STATUS;
+    pDataPlanStatus->InboundBandwidthInKbps     = NLM_UNKNOWN_DATAPLAN_STATUS;
+    pDataPlanStatus->OutboundBandwidthInKbps    = NLM_UNKNOWN_DATAPLAN_STATUS;
+    memset( &pDataPlanStatus->NextBillingCycle, 0, sizeof(pDataPlanStatus->NextBillingCycle) );
+    pDataPlanStatus->MaxTransferSizeInMegabytes = NLM_UNKNOWN_DATAPLAN_STATUS;
+    pDataPlanStatus->Reserved                   = 0;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI cost_manager_SetDestinationAddresses(
diff --git a/dlls/netprofm/tests/list.c b/dlls/netprofm/tests/list.c
index 7776f5c..7e885c3 100644
--- a/dlls/netprofm/tests/list.c
+++ b/dlls/netprofm/tests/list.c
@@ -67,6 +67,7 @@ static void test_INetworkListManager( void )
     if (hr == S_OK)
     {
         DWORD cost;
+        NLM_DATAPLAN_STATUS status;
 
         hr = INetworkCostManager_GetCost( cost_mgr, NULL, NULL );
         ok( hr == E_POINTER, "got %08x\n", hr );
@@ -76,6 +77,12 @@ static void test_INetworkListManager( void )
         ok( hr == S_OK, "got %08x\n", hr );
         ok( cost != 0xdeadbeef, "cost not set\n" );
 
+        hr = INetworkCostManager_GetDataPlanStatus( cost_mgr, NULL, NULL );
+        ok( hr == E_POINTER, "got %08x\n", hr );
+
+        hr = INetworkCostManager_GetDataPlanStatus( cost_mgr, &status, NULL );
+        ok( hr == S_OK, "got %08x\n", hr );
+
         INetworkCostManager_Release( cost_mgr );
     }
 




More information about the wine-cvs mailing list