From 44d35b8e666285c9a181be2b17e927a9684b8882 Mon Sep 17 00:00:00 2001 From: "R. Tyler Ballance" Date: Fri, 9 Feb 2007 08:52:56 +0000 Subject: [PATCH] - Finish implementing the little GUI app git-svn-id: svn://svn.geekisp.com/bleep/trunk/PmpMyApp@54 a256dd88-e320-0410-9161-d397f098afaa --- English.lproj/MainMenu.nib/classes.nib | 17 +- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 13477 -> 20372 bytes PmpMyApp.xcodeproj/project.pbxproj | 8 + PmpMyApp.xcodeproj/tyler.mode1 | 43 ++-- PmpMyApp.xcodeproj/tyler.pbxuser | 208 ++++++++++++++------ source/XzibitController.h | 23 +++ source/XzibitController.m | 44 +++++ source/pmpmapper.c | 18 +- source/pmpmapper.h | 8 +- 9 files changed, 278 insertions(+), 91 deletions(-) create mode 100644 source/XzibitController.h create mode 100644 source/XzibitController.m diff --git a/English.lproj/MainMenu.nib/classes.nib b/English.lproj/MainMenu.nib/classes.nib index b9b4b09..f949b9b 100644 --- a/English.lproj/MainMenu.nib/classes.nib +++ b/English.lproj/MainMenu.nib/classes.nib @@ -1,4 +1,19 @@ { - IBClasses = ({CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }); + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = {createMapping = id; destroyMapping = id; }; + CLASS = XzibitController; + LANGUAGE = ObjC; + OUTLETS = { + localCreatePort = NSTextField; + localDestroyPort = NSTextField; + mappingDuration = NSTextField; + natCreatePort = NSTextField; + statusField = NSTextField; + }; + SUPERCLASS = NSObject; + } + ); IBVersion = 1; } \ No newline at end of file diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index 28d30f22e67e86dd5daa7d1de1e7de333ae1367b..f2369abe8e29b4b3a6b90ccb534f76c70c168627 100644 GIT binary patch literal 20372 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 literal 13477 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 diff --git a/PmpMyApp.xcodeproj/project.pbxproj b/PmpMyApp.xcodeproj/project.pbxproj index b214e3a..28306df 100644 --- a/PmpMyApp.xcodeproj/project.pbxproj +++ b/PmpMyApp.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 2F18D6740B7C6AF400149D44 /* XzibitController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F18D6730B7C6AF400149D44 /* XzibitController.m */; }; 2F5A48720B75598F0052B0C1 /* pmpmapper.c in Sources */ = {isa = PBXBuildFile; fileRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; }; 2F5A48900B75658F0052B0C1 /* pmpmapper.c in Sources */ = {isa = PBXBuildFile; fileRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; }; 2F901ED00B7AEDB5004FF42C /* route.c in Sources */ = {isa = PBXBuildFile; fileRef = 2F901ECF0B7AEDB5004FF42C /* route.c */; }; @@ -27,6 +28,8 @@ 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 2F18D56B0B7C516D00149D44 /* draft-cheshire-nat-pmp.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = "draft-cheshire-nat-pmp.rtf"; path = "doc/draft-cheshire-nat-pmp.rtf"; sourceTree = ""; }; 2F18D56C0B7C516D00149D44 /* draft-cheshire-nat-pmp.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = "draft-cheshire-nat-pmp.txt"; path = "doc/draft-cheshire-nat-pmp.txt"; sourceTree = ""; }; + 2F18D6720B7C6AF400149D44 /* XzibitController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XzibitController.h; path = source/XzibitController.h; sourceTree = ""; }; + 2F18D6730B7C6AF400149D44 /* XzibitController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XzibitController.m; path = source/XzibitController.m; sourceTree = ""; }; 2F5A48700B75598F0052B0C1 /* pmpmapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pmpmapper.h; path = source/pmpmapper.h; sourceTree = ""; }; 2F5A48710B75598F0052B0C1 /* pmpmapper.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pmpmapper.c; path = source/pmpmapper.c; sourceTree = ""; }; 2F5A488A0B7565810052B0C1 /* PMPMapper */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = PMPMapper; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,6 +63,8 @@ isa = PBXGroup; children = ( 2F5A486C0B7559600052B0C1 /* NAT-PMP */, + 2F18D6720B7C6AF400149D44 /* XzibitController.h */, + 2F18D6730B7C6AF400149D44 /* XzibitController.m */, ); name = Classes; sourceTree = ""; @@ -234,6 +239,7 @@ 8D11072D0486CEB800E47090 /* main.m in Sources */, 2F5A48720B75598F0052B0C1 /* pmpmapper.c in Sources */, 2F901ED00B7AEDB5004FF42C /* route.c in Sources */, + 2F18D6740B7C6AF400149D44 /* XzibitController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -269,6 +275,7 @@ GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; INSTALL_PATH = "$(HOME)/bin"; + OTHER_CFLAGS = "-DPMP_DEBUG"; PREBINDING = NO; PRODUCT_NAME = PMPMapper; ZERO_LINK = YES; @@ -287,6 +294,7 @@ GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G5; INSTALL_PATH = "$(HOME)/bin"; + OTHER_CFLAGS = "-DPMP_DEBUG"; PREBINDING = NO; PRODUCT_NAME = PMPMapper; ZERO_LINK = NO; diff --git a/PmpMyApp.xcodeproj/tyler.mode1 b/PmpMyApp.xcodeproj/tyler.mode1 index b5c9b02..6b03099 100644 --- a/PmpMyApp.xcodeproj/tyler.mode1 +++ b/PmpMyApp.xcodeproj/tyler.mode1 @@ -265,8 +265,7 @@ PBXSmartGroupTreeModuleOutlineStateSelectionKey - 6 - 2 + 8 1 0 @@ -309,7 +308,7 @@ PBXProjectModuleGUID 1CE0B20306471E060097A5F4 PBXProjectModuleLabel - pmpmapper.c + XzibitController.m PBXSplitModuleInNavigatorKey Split0 @@ -317,11 +316,11 @@ PBXProjectModuleGUID 1CE0B20406471E060097A5F4 PBXProjectModuleLabel - pmpmapper.c + XzibitController.m _historyCapacity 0 bookmark - 2F18D65A0B7C688B00149D44 + 2F18D69D0B7C6D9900149D44 history 2F5A489C0B7565AE0052B0C1 @@ -330,8 +329,10 @@ 2F901EF70B7AEED5004FF42C 2F9021510B7BE0FB004FF42C 2F18D5750B7C51B000149D44 - 2F18D62D0B7C661600149D44 - 2F18D62E0B7C661600149D44 + 2F18D6800B7C6CA900149D44 + 2F18D6950B7C6D8000149D44 + 2F18D6960B7C6D8000149D44 + 2F18D6970B7C6D8000149D44 prevStack @@ -343,8 +344,13 @@ 2F901ED80B7AEDBC004FF42C 2F901EE10B7AEE09004FF42C 2F18D5770B7C51B000149D44 - 2F18D60F0B7C60BE00149D44 - 2F18D62F0B7C661600149D44 + 2F18D66A0B7C68EB00149D44 + 2F18D6840B7C6CA900149D44 + 2F18D6850B7C6CA900149D44 + 2F18D6860B7C6CA900149D44 + 2F18D6870B7C6CA900149D44 + 2F18D6980B7C6D8000149D44 + 2F18D6990B7C6D8000149D44 SplitCount @@ -376,7 +382,7 @@ GeometryConfiguration Frame - {{0, 883}, {951, 0}} + {{0, 884}, {951, 0}} RubberWindowFrame 1 104 1159 924 0 0 1680 1028 @@ -402,9 +408,9 @@ TableOfContents - 2F18D5540B7C4C1900149D44 + 2F18D66C0B7C68EB00149D44 1CE0B1FE06471DED0097A5F4 - 2F18D5550B7C4C1900149D44 + 2F18D66D0B7C68EB00149D44 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -538,11 +544,6 @@ 5 WindowOrderList - 2F18D5FC0B7C5F9400149D44 - 2F18D5FD0B7C5F9400149D44 - 2F5A48CE0B756D650052B0C1 - 1CD10A99069EF8BA00B06720 - 2F18D5FA0B7C5F9400149D44 2F5A48970B7565A60052B0C1 1C0AD2B3069F1EA900FABCE6 /Software/Subversion/trunk/PmpMyApp/PmpMyApp.xcodeproj @@ -591,7 +592,7 @@ ContentConfiguration PBXBuildLogShowsTranscriptDefaultKey - {{0, 209}, {620, 261}} + {{0, 149}, {620, 321}} PBXProjectModuleGUID XCMainBuildResultsModuleGUID PBXProjectModuleLabel @@ -629,7 +630,7 @@ TableOfContents 2F5A48970B7565A60052B0C1 - 2F18D55F0B7C4E5500149D44 + 2F18D66E0B7C68EB00149D44 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -999,9 +1000,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 2F18D5560B7C4C1900149D44 + 2F18D66F0B7C68EB00149D44 1CD0528B0623707200166675 - 2F18D5570B7C4C1900149D44 + 2F18D6700B7C68EB00149D44 ToolbarConfiguration xcode.toolbar.config.run diff --git a/PmpMyApp.xcodeproj/tyler.pbxuser b/PmpMyApp.xcodeproj/tyler.pbxuser index 82a8099..935aabc 100644 --- a/PmpMyApp.xcodeproj/tyler.pbxuser +++ b/PmpMyApp.xcodeproj/tyler.pbxuser @@ -9,8 +9,8 @@ }; 29B97313FDCFA39411CA2CEA /* Project object */ = { activeBuildConfigurationName = Debug; - activeExecutable = 2F5A488B0B7565810052B0C1 /* PMPMapper */; - activeTarget = 2F5A48890B7565810052B0C1 /* PMPMapper */; + activeExecutable = 2F5A484B0B7558670052B0C1 /* PmpMyApp */; + activeTarget = 8D1107260486CEB800E47090 /* PmpMyApp */; addToTargets = ( 8D1107260486CEB800E47090 /* PmpMyApp */, ); @@ -67,17 +67,24 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 192695317; - PBXWorkspaceStateSaveDate = 192695317; + PBXPerProjectTemplateStateSaveDate = 192702654; + PBXWorkspaceStateSaveDate = 192702654; }; perUserProjectItems = { 2F18D5750B7C51B000149D44 /* PBXTextBookmark */ = 2F18D5750B7C51B000149D44 /* PBXTextBookmark */; 2F18D5770B7C51B000149D44 /* PBXTextBookmark */ = 2F18D5770B7C51B000149D44 /* PBXTextBookmark */; - 2F18D60F0B7C60BE00149D44 /* PBXTextBookmark */ = 2F18D60F0B7C60BE00149D44 /* PBXTextBookmark */; - 2F18D62D0B7C661600149D44 /* PBXTextBookmark */ = 2F18D62D0B7C661600149D44 /* PBXTextBookmark */; - 2F18D62E0B7C661600149D44 /* PBXTextBookmark */ = 2F18D62E0B7C661600149D44 /* PBXTextBookmark */; - 2F18D62F0B7C661600149D44 /* PBXTextBookmark */ = 2F18D62F0B7C661600149D44 /* PBXTextBookmark */; - 2F18D65A0B7C688B00149D44 /* PBXTextBookmark */ = 2F18D65A0B7C688B00149D44 /* PBXTextBookmark */; + 2F18D66A0B7C68EB00149D44 /* PBXTextBookmark */ = 2F18D66A0B7C68EB00149D44 /* PBXTextBookmark */; + 2F18D6800B7C6CA900149D44 /* PBXTextBookmark */ = 2F18D6800B7C6CA900149D44 /* PBXTextBookmark */; + 2F18D6840B7C6CA900149D44 /* PBXTextBookmark */ = 2F18D6840B7C6CA900149D44 /* PBXTextBookmark */; + 2F18D6850B7C6CA900149D44 /* PBXTextBookmark */ = 2F18D6850B7C6CA900149D44 /* PBXTextBookmark */; + 2F18D6860B7C6CA900149D44 /* PBXTextBookmark */ = 2F18D6860B7C6CA900149D44 /* PBXTextBookmark */; + 2F18D6870B7C6CA900149D44 /* PBXTextBookmark */ = 2F18D6870B7C6CA900149D44 /* PBXTextBookmark */; + 2F18D6950B7C6D8000149D44 /* PBXTextBookmark */ = 2F18D6950B7C6D8000149D44 /* PBXTextBookmark */; + 2F18D6960B7C6D8000149D44 /* PBXTextBookmark */ = 2F18D6960B7C6D8000149D44 /* PBXTextBookmark */; + 2F18D6970B7C6D8000149D44 /* PBXTextBookmark */ = 2F18D6970B7C6D8000149D44 /* PBXTextBookmark */; + 2F18D6980B7C6D8000149D44 /* PBXTextBookmark */ = 2F18D6980B7C6D8000149D44 /* PBXTextBookmark */; + 2F18D6990B7C6D8000149D44 /* PBXTextBookmark */ = 2F18D6990B7C6D8000149D44 /* PBXTextBookmark */; + 2F18D69D0B7C6D9900149D44 /* PBXTextBookmark */ = 2F18D69D0B7C6D9900149D44 /* PBXTextBookmark */; 2F5A489C0B7565AE0052B0C1 /* PBXTextBookmark */ = 2F5A489C0B7565AE0052B0C1 /* PBXTextBookmark */; 2F5A489D0B7565AE0052B0C1 /* PBXTextBookmark */ = 2F5A489D0B7565AE0052B0C1 /* PBXTextBookmark */; 2F5A48A00B7565AE0052B0C1 /* PBXTextBookmark */ = 2F5A48A00B7565AE0052B0C1 /* PBXTextBookmark */; @@ -122,56 +129,140 @@ vrLen = 1930; vrLoc = 0; }; - 2F18D60F0B7C60BE00149D44 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; - name = "pmpmapper.c: 151"; - rLen = 0; - rLoc = 4269; - rType = 0; - vrLen = 754; - vrLoc = 3859; - }; - 2F18D62D0B7C661600149D44 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F5A48700B75598F0052B0C1 /* pmpmapper.h */; - name = "pmpmapper.h: "; - rLen = 0; - rLoc = 1128; - rType = 0; - vrLen = 1117; - vrLoc = 201; - }; - 2F18D62E0B7C661600149D44 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; - name = "pmpmapper.c: 151"; - rLen = 0; - rLoc = 4269; - rType = 0; - vrLen = 1951; - vrLoc = 3397; - }; - 2F18D62F0B7C661600149D44 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F5A48700B75598F0052B0C1 /* pmpmapper.h */; - name = "pmpmapper.h: "; - rLen = 0; - rLoc = 1128; - rType = 0; - vrLen = 1117; - vrLoc = 201; - }; - 2F18D65A0B7C688B00149D44 /* PBXTextBookmark */ = { + 2F18D66A0B7C68EB00149D44 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; name = "pmpmapper.c: 279"; rLen = 0; - rLoc = 8097; + rLoc = 8035; rType = 0; vrLen = 1588; vrLoc = 0; }; + 2F18D6720B7C6AF400149D44 /* XzibitController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {904, 847}}"; + sepNavSelRange = "{406, 77}"; + sepNavVisRect = "{{0, 0}, {904, 847}}"; + }; + }; + 2F18D6730B7C6AF400149D44 /* XzibitController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {904, 847}}"; + sepNavSelRange = "{824, 0}"; + sepNavVisRect = "{{0, 0}, {904, 847}}"; + }; + }; + 2F18D6800B7C6CA900149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F18D6720B7C6AF400149D44 /* XzibitController.h */; + name = "XzibitController.h: 19"; + rLen = 77; + rLoc = 406; + rType = 0; + vrLen = 490; + vrLoc = 0; + }; + 2F18D6840B7C6CA900149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F5A48700B75598F0052B0C1 /* pmpmapper.h */; + name = "pmpmapper.h: 26"; + rLen = 0; + rLoc = 439; + rType = 0; + vrLen = 808; + vrLoc = 35; + }; + 2F18D6850B7C6CA900149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F18D6720B7C6AF400149D44 /* XzibitController.h */; + name = "XzibitController.h: 19"; + rLen = 77; + rLoc = 406; + rType = 0; + vrLen = 490; + vrLoc = 0; + }; + 2F18D6860B7C6CA900149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F18D6730B7C6AF400149D44 /* XzibitController.m */; + name = "XzibitController.m: 19"; + rLen = 0; + rLoc = 714; + rType = 0; + vrLen = 456; + vrLoc = 0; + }; + 2F18D6870B7C6CA900149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; + name = "pmpmapper.c: 237"; + rLen = 0; + rLoc = 6828; + rType = 0; + vrLen = 1486; + vrLoc = 6002; + }; + 2F18D6950B7C6D8000149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F5A48700B75598F0052B0C1 /* pmpmapper.h */; + name = "pmpmapper.h: pmp_destroy_map"; + rLen = 0; + rLoc = 1499; + rType = 0; + vrLen = 1260; + vrLoc = 284; + }; + 2F18D6960B7C6D8000149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; + name = "pmpmapper.c: 244"; + rLen = 0; + rLoc = 7071; + rType = 0; + vrLen = 1533; + vrLoc = 6038; + }; + 2F18D6970B7C6D8000149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F18D6730B7C6AF400149D44 /* XzibitController.m */; + name = "XzibitController.m: 19"; + rLen = 0; + rLoc = 714; + rType = 0; + vrLen = 456; + vrLoc = 0; + }; + 2F18D6980B7C6D8000149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F5A48700B75598F0052B0C1 /* pmpmapper.h */; + name = "pmpmapper.h: pmp_destroy_map"; + rLen = 0; + rLoc = 1499; + rType = 0; + vrLen = 1260; + vrLoc = 284; + }; + 2F18D6990B7C6D8000149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; + name = "pmpmapper.c: 244"; + rLen = 0; + rLoc = 7071; + rType = 0; + vrLen = 1533; + vrLoc = 6038; + }; + 2F18D69D0B7C6D9900149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F18D6730B7C6AF400149D44 /* XzibitController.m */; + name = "XzibitController.m: 34"; + rLen = 0; + rLoc = 824; + rType = 0; + vrLen = 1069; + vrLoc = 0; + }; 2F5A484B0B7558670052B0C1 /* PmpMyApp */ = { isa = PBXExecutable; activeArgIndex = 2147483647; @@ -185,6 +276,7 @@ customDataFormattersEnabled = 1; debuggerPlugin = GDBDebugging; disassemblyDisplayState = 0; + dylibVariantSuffix = ""; enableDebugStr = 1; environmentEntries = ( ); @@ -209,17 +301,17 @@ }; 2F5A48700B75598F0052B0C1 /* pmpmapper.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {904, 1036}}"; - sepNavSelRange = "{1128, 0}"; - sepNavVisRect = "{{0, 190}, {904, 846}}"; + sepNavIntBoundsRect = "{{0, 0}, {904, 1092}}"; + sepNavSelRange = "{1499, 0}"; + sepNavVisRect = "{{0, 245}, {904, 847}}"; sepNavWindowFrame = "{{1954, -14}, {939, 979}}"; }; }; 2F5A48710B75598F0052B0C1 /* pmpmapper.c */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {904, 4102}}"; - sepNavSelRange = "{8097, 0}"; - sepNavVisRect = "{{0, 0}, {904, 847}}"; + sepNavIntBoundsRect = "{{0, 0}, {904, 4158}}"; + sepNavSelRange = "{7071, 0}"; + sepNavVisRect = "{{0, 2888}, {904, 847}}"; }; }; 2F5A48890B7565810052B0C1 /* PMPMapper */ = { @@ -317,7 +409,7 @@ fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; name = "PMPMapper.c: 29"; rLen = 0; - rLoc = 7302; + rLoc = 7240; rType = 0; vrLen = 951; vrLoc = 0; diff --git a/source/XzibitController.h b/source/XzibitController.h new file mode 100644 index 0000000..0112d1a --- /dev/null +++ b/source/XzibitController.h @@ -0,0 +1,23 @@ +// +// XzibitController.h +// PmpMyApp +// +// Created by R. Tyler Ballance on 2/9/07. +// Copyright 2007 bleep. LLC. All rights reserved. +// + +#import + + +@interface XzibitController : NSObject { + IBOutlet NSTextField *localCreatePort; + IBOutlet NSTextField *natCreatePort; + IBOutlet NSTextField *mappingDuration; + IBOutlet NSTextField *localDestroyPort; + IBOutlet NSTextField *statusField; +} + +- (IBAction)createMapping:(id)sender; +- (IBAction)destroyMapping:(id)sender; + +@end diff --git a/source/XzibitController.m b/source/XzibitController.m new file mode 100644 index 0000000..d8f917e --- /dev/null +++ b/source/XzibitController.m @@ -0,0 +1,44 @@ +// +// XzibitController.m +// PmpMyApp +// +// Created by R. Tyler Ballance on 2/9/07. +// Copyright 2007 bleep. LLC. All rights reserved. +// + +#import "XzibitController.h" +#include "pmpmapper.h" + +@implementation XzibitController + +- (IBAction)createMapping:(id)sender +{ + int privateport = [localCreatePort intValue]; + int publicport = [natCreatePort intValue]; + int duration = [mappingDuration intValue]; + + if (pmp_create_map(PMP_MAP_TCP,privateport,publicport,(duration * 60)) != NULL) + { + [statusField setStringValue:[NSString stringWithFormat:@"Mapping for port %d created with external port %d", privateport, publicport]]; + } + else + { + [statusField setStringValue:@"Failed to properly create the mapping"]; + } +} + +- (IBAction)destroyMapping:(id)sender +{ + int privateport = [localDestroyPort intValue]; + + if (pmp_destroy_map(PMP_MAP_TCP,privateport) != NULL) + { + [statusField setStringValue:[NSString stringWithFormat:@"Mapping for port %d destroyed", privateport]]; + } + else + { + [statusField setStringValue:@"Failed to properly destroy the mapping"]; + } +} + +@end diff --git a/source/pmpmapper.c b/source/pmpmapper.c index 4cf57e3..cedd60b 100644 --- a/source/pmpmapper.c +++ b/source/pmpmapper.c @@ -27,14 +27,16 @@ static void double_timeout(struct timeval *to) } /*! - * pmp_get_public(struct sockaddr_in *) will return a sockaddr_in + * pmp_get_public() will return a sockaddr_in * structure representing the publicly facing IP address of the * default NAT gateway. The function will return NULL if: * - The gateway doesn't support NAT-PMP * - The gateway errors in some other spectacular fashion */ -struct sockaddr_in *pmp_get_public(struct sockaddr_in *gateway) +struct sockaddr_in *pmp_get_public() { + struct sockaddr_in *gateway = default_gw(); + if (gateway == NULL) { fprintf(stderr, "Cannot request public IP from a NULL gateway!\n"); @@ -134,11 +136,13 @@ iterate: } /*! - * pmp_create_map(struct sockaddr_in *,uint8_t,uint16_t,uint16_t,uint32_t) + * pmp_create_map(uint8_t,uint16_t,uint16_t,uint32_t) * will return NULL on error, or a pointer to the pmp_map_response_t type */ -pmp_map_response_t *pmp_create_map(struct sockaddr_in *gateway, uint8_t type, uint16_t privateport, uint16_t publicport, uint32_t lifetime) +pmp_map_response_t *pmp_create_map(uint8_t type, uint16_t privateport, uint16_t publicport, uint32_t lifetime) { + struct sockaddr_in *gateway = default_gw(); + if (gateway == NULL) { fprintf(stderr, "Cannot create mapping on a NULL gateway!\n"); @@ -230,14 +234,14 @@ iterate: } /*! - * pmp_destroy_map(struct sockaddr_in *,uint8_t,uint16_t) + * pmp_destroy_map(uint8_t,uint16_t) * will return NULL on error, or a pointer to the pmp_map_response_t type */ -pmp_map_response_t *pmp_destroy_map(struct sockaddr_in *gateway, uint8_t type, uint16_t privateport) +pmp_map_response_t *pmp_destroy_map(uint8_t type, uint16_t privateport) { pmp_map_response_t *response = NULL; - if ((response = pmp_create_map(gateway, type, privateport, 0, 0)) == NULL) + if ((response = pmp_create_map(type, privateport, 0, 0)) == NULL) { fprintf(stderr, "Failed to properly destroy mapping for %d!\n", privateport); return NULL; diff --git a/source/pmpmapper.h b/source/pmpmapper.h index 7eb79f6..47adf68 100644 --- a/source/pmpmapper.h +++ b/source/pmpmapper.h @@ -23,7 +23,7 @@ #include "route.h" // Comment out to disable building main() -#define PMP_DEBUG +//#define PMP_DEBUG #define PMP_VERSION 0 #define PMP_PORT 5351 @@ -71,8 +71,8 @@ typedef struct { uint32_t lifetime; } pmp_map_response_t; -struct sockaddr_in *pmp_get_public(struct sockaddr_in *gateway); -pmp_map_response_t *pmp_create_map(struct sockaddr_in *gateway, uint8_t type, uint16_t privateport, uint16_t publicport, uint32_t lifetime); -pmp_map_response_t *pmp_destroy_map(struct sockaddr_in *gateway, uint8_t type, uint16_t privateport); +struct sockaddr_in *pmp_get_public(); +pmp_map_response_t *pmp_create_map(uint8_t type, uint16_t privateport, uint16_t publicport, uint32_t lifetime); +pmp_map_response_t *pmp_destroy_map(uint8_t type, uint16_t privateport); #endif \ No newline at end of file