source: Daodan/MSVC/PortForwardWrapper.cpp@ 588

Last change on this file since 588 was 588, checked in by gumby, 14 years ago
File size: 2.2 KB
Line 
1#include <atlbase.h>
2#include "PortForwardWrapper.h"
3#include <Natupnp.h>
4#include <UPnP.h>
5#include <stdlib.h>
6#include "Daodan_Console.h"
7extern "C" int uPnP_Forward( PortMappingContainer_C* ptr )
8{
9 bool bContinue = true;
10 IUPnPNAT* piNAT = NULL;
11 IStaticPortMappingCollection* piPortMappingCollection = NULL;
12 CoInitialize(NULL);
13 HRESULT CoResult;
14
15 if ( !bContinue || !SUCCEEDED( CoResult = CoCreateInstance(
16 __uuidof(UPnPNAT),
17 NULL,
18 CLSCTX_ALL,
19 __uuidof(IUPnPNAT),
20 (void **)&piNAT)
21 ) )
22 bContinue = FALSE;
23
24 // Get the collection of forwarded ports
25
26 if ( !bContinue || !SUCCEEDED( CoResult = piNAT->get_StaticPortMappingCollection(&piPortMappingCollection)) || (piPortMappingCollection==NULL ) )
27 bContinue = FALSE;
28
29
30
31 // add the new mapping
32
33 IStaticPortMapping* piStaticPortMapping = NULL;
34 USES_CONVERSION; // for conversion from CString's
35
36 //VARIANT_BOOL vb = ( ( newMapping.Enabled == _T("Yes") ) ? VARIANT_TRUE : VARIANT_FALSE );
37 BSTR Protocol = SysAllocString( CT2W(ptr->Protocol) );
38 BSTR InternalClient = SysAllocString( CT2W(ptr->InternalClient) );
39 BSTR Description = SysAllocString( CT2W(ptr->Description) );
40
41 //Remove the old binding, just in case. Probably not the best option, but it shall do for now.
42 if ( !bContinue ) piPortMappingCollection->Remove( _ttol( ptr->ExternalPort), Protocol );
43
44 if ( !bContinue ||
45 !SUCCEEDED( CoResult =
46 piPortMappingCollection->Add(
47 _ttol( ptr->ExternalPort),
48 Protocol,
49 _ttol( ptr->InternalPort),
50 InternalClient,
51 -1,
52 Description,
53 &piStaticPortMapping ) ) || (piStaticPortMapping==NULL) )
54
55 bContinue = FALSE;
56
57 SysFreeString(Protocol);
58 SysFreeString(InternalClient);
59 SysFreeString(Description);
60
61
62 // clean up and de-initialize COM
63
64 if ( piStaticPortMapping != NULL )
65 {
66 piStaticPortMapping->Release();
67 piStaticPortMapping = NULL;
68 }
69
70
71 if ( piPortMappingCollection != NULL )
72 {
73 piPortMappingCollection->Release();
74 piPortMappingCollection = NULL;
75 }
76
77 if ( piNAT != NULL )
78 {
79 piNAT->Release();
80 piNAT = NULL;
81 }
82
83
84 CoUninitialize();
85 if(bContinue) return 0;
86 else return CoResult;
87}
Note: See TracBrowser for help on using the repository browser.