EmailScheduler Start.

This commit is contained in:
GRMrGecko 2014-09-13 17:13:32 -05:00
commit 3f0bc2ba58
242 changed files with 21071 additions and 0 deletions

View File

@ -0,0 +1,431 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXAggregateTarget section */
2A452C8119C476C30095EEF6 /* Build Directory */ = {
isa = PBXAggregateTarget;
buildConfigurationList = 2A452C8219C476C30095EEF6 /* Build configuration list for PBXAggregateTarget "Build Directory" */;
buildPhases = (
2A452C8519C476C60095EEF6 /* ShellScript */,
);
dependencies = (
);
name = "Build Directory";
productName = "Build Directory";
};
/* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */
2A452C7019C475790095EEF6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A452C6F19C475790095EEF6 /* Foundation.framework */; };
2A452C7319C475790095EEF6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A452C7219C475790095EEF6 /* main.m */; };
2A452C7719C475790095EEF6 /* EmailScheduler.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2A452C7619C475790095EEF6 /* EmailScheduler.1 */; };
2A452C7E19C476900095EEF6 /* MailCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A452C7D19C476900095EEF6 /* MailCore.framework */; };
2A452C8019C476A40095EEF6 /* MailCore.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2A452C7D19C476900095EEF6 /* MailCore.framework */; };
2A452C8A19C4776A0095EEF6 /* MGMController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A452C8919C4776A0095EEF6 /* MGMController.m */; };
2A452C9719C479030095EEF6 /* MGMHTTPAddons.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A452C8D19C479030095EEF6 /* MGMHTTPAddons.m */; };
2A452C9819C479030095EEF6 /* MGMHTTPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A452C8F19C479030095EEF6 /* MGMHTTPClient.m */; };
2A452C9A19C479030095EEF6 /* MGMHTTPResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A452C9419C479030095EEF6 /* MGMHTTPResponse.m */; };
2A452C9B19C479030095EEF6 /* MGMHTTPServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A452C9619C479030095EEF6 /* MGMHTTPServer.m */; };
2A452C9E19C47A160095EEF6 /* AsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A452C9D19C47A160095EEF6 /* AsyncSocket.m */; };
2A452CA119C47B7D0095EEF6 /* MGMHTTPClientClass.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A452CA019C47B7D0095EEF6 /* MGMHTTPClientClass.m */; };
2A452CA519C481C70095EEF6 /* MGMJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A452CA419C481C70095EEF6 /* MGMJSON.m */; };
2A452CA819C4850A0095EEF6 /* MGMEmail.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A452CA719C4850A0095EEF6 /* MGMEmail.m */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
2A452C8619C476D70095EEF6 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 2A452C6419C475790095EEF6 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 2A452C8119C476C30095EEF6;
remoteInfo = "Build Directory";
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
2A452C6A19C475790095EEF6 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
2A452C7719C475790095EEF6 /* EmailScheduler.1 in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 1;
};
2A452C7F19C4769D0095EEF6 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
2A452C8019C476A40095EEF6 /* MailCore.framework in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
2A452C6C19C475790095EEF6 /* EmailScheduler */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = EmailScheduler; sourceTree = BUILT_PRODUCTS_DIR; };
2A452C6F19C475790095EEF6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
2A452C7219C475790095EEF6 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
2A452C7519C475790095EEF6 /* EmailScheduler-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "EmailScheduler-Prefix.pch"; sourceTree = "<group>"; };
2A452C7619C475790095EEF6 /* EmailScheduler.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = EmailScheduler.1; sourceTree = "<group>"; };
2A452C7D19C476900095EEF6 /* MailCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = MailCore.framework; sourceTree = "<group>"; };
2A452C8819C4776A0095EEF6 /* MGMController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMController.h; sourceTree = "<group>"; };
2A452C8919C4776A0095EEF6 /* MGMController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMController.m; sourceTree = "<group>"; };
2A452C8C19C479030095EEF6 /* MGMHTTPAddons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMHTTPAddons.h; sourceTree = "<group>"; };
2A452C8D19C479030095EEF6 /* MGMHTTPAddons.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMHTTPAddons.m; sourceTree = "<group>"; };
2A452C8E19C479030095EEF6 /* MGMHTTPClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMHTTPClient.h; sourceTree = "<group>"; };
2A452C8F19C479030095EEF6 /* MGMHTTPClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMHTTPClient.m; sourceTree = "<group>"; };
2A452C9219C479030095EEF6 /* MGMHTTPDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMHTTPDefines.h; sourceTree = "<group>"; };
2A452C9319C479030095EEF6 /* MGMHTTPResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMHTTPResponse.h; sourceTree = "<group>"; };
2A452C9419C479030095EEF6 /* MGMHTTPResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMHTTPResponse.m; sourceTree = "<group>"; };
2A452C9519C479030095EEF6 /* MGMHTTPServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMHTTPServer.h; sourceTree = "<group>"; };
2A452C9619C479030095EEF6 /* MGMHTTPServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMHTTPServer.m; sourceTree = "<group>"; };
2A452C9C19C47A160095EEF6 /* AsyncSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncSocket.h; sourceTree = "<group>"; };
2A452C9D19C47A160095EEF6 /* AsyncSocket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AsyncSocket.m; sourceTree = "<group>"; };
2A452C9F19C47B7D0095EEF6 /* MGMHTTPClientClass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMHTTPClientClass.h; sourceTree = "<group>"; };
2A452CA019C47B7D0095EEF6 /* MGMHTTPClientClass.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMHTTPClientClass.m; sourceTree = "<group>"; };
2A452CA319C481C70095EEF6 /* MGMJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMJSON.h; sourceTree = "<group>"; };
2A452CA419C481C70095EEF6 /* MGMJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMJSON.m; sourceTree = "<group>"; };
2A452CA619C4850A0095EEF6 /* MGMEmail.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGMEmail.h; sourceTree = "<group>"; };
2A452CA719C4850A0095EEF6 /* MGMEmail.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGMEmail.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
2A452C6919C475790095EEF6 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
2A452C7E19C476900095EEF6 /* MailCore.framework in Frameworks */,
2A452C7019C475790095EEF6 /* Foundation.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
2A452C6319C475790095EEF6 = {
isa = PBXGroup;
children = (
2A452C7D19C476900095EEF6 /* MailCore.framework */,
2A452C7119C475790095EEF6 /* EmailScheduler */,
2A452C6E19C475790095EEF6 /* Frameworks */,
2A452C6D19C475790095EEF6 /* Products */,
);
sourceTree = "<group>";
};
2A452C6D19C475790095EEF6 /* Products */ = {
isa = PBXGroup;
children = (
2A452C6C19C475790095EEF6 /* EmailScheduler */,
);
name = Products;
sourceTree = "<group>";
};
2A452C6E19C475790095EEF6 /* Frameworks */ = {
isa = PBXGroup;
children = (
2A452C6F19C475790095EEF6 /* Foundation.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
2A452C7119C475790095EEF6 /* EmailScheduler */ = {
isa = PBXGroup;
children = (
2A452C7219C475790095EEF6 /* main.m */,
2A452C7619C475790095EEF6 /* EmailScheduler.1 */,
2A452C7419C475790095EEF6 /* Supporting Files */,
2A452CA219C481C70095EEF6 /* JSON */,
2A452C8B19C479030095EEF6 /* MGMHTTP */,
2A452C8819C4776A0095EEF6 /* MGMController.h */,
2A452C8919C4776A0095EEF6 /* MGMController.m */,
2A452C9F19C47B7D0095EEF6 /* MGMHTTPClientClass.h */,
2A452CA019C47B7D0095EEF6 /* MGMHTTPClientClass.m */,
2A452CA619C4850A0095EEF6 /* MGMEmail.h */,
2A452CA719C4850A0095EEF6 /* MGMEmail.m */,
);
path = EmailScheduler;
sourceTree = "<group>";
};
2A452C7419C475790095EEF6 /* Supporting Files */ = {
isa = PBXGroup;
children = (
2A452C7519C475790095EEF6 /* EmailScheduler-Prefix.pch */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
2A452C8B19C479030095EEF6 /* MGMHTTP */ = {
isa = PBXGroup;
children = (
2A452C9C19C47A160095EEF6 /* AsyncSocket.h */,
2A452C9D19C47A160095EEF6 /* AsyncSocket.m */,
2A452C8C19C479030095EEF6 /* MGMHTTPAddons.h */,
2A452C8D19C479030095EEF6 /* MGMHTTPAddons.m */,
2A452C8E19C479030095EEF6 /* MGMHTTPClient.h */,
2A452C8F19C479030095EEF6 /* MGMHTTPClient.m */,
2A452C9219C479030095EEF6 /* MGMHTTPDefines.h */,
2A452C9319C479030095EEF6 /* MGMHTTPResponse.h */,
2A452C9419C479030095EEF6 /* MGMHTTPResponse.m */,
2A452C9519C479030095EEF6 /* MGMHTTPServer.h */,
2A452C9619C479030095EEF6 /* MGMHTTPServer.m */,
);
path = MGMHTTP;
sourceTree = "<group>";
};
2A452CA219C481C70095EEF6 /* JSON */ = {
isa = PBXGroup;
children = (
2A452CA319C481C70095EEF6 /* MGMJSON.h */,
2A452CA419C481C70095EEF6 /* MGMJSON.m */,
);
path = JSON;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
2A452C6B19C475790095EEF6 /* EmailScheduler */ = {
isa = PBXNativeTarget;
buildConfigurationList = 2A452C7A19C475790095EEF6 /* Build configuration list for PBXNativeTarget "EmailScheduler" */;
buildPhases = (
2A452C6819C475790095EEF6 /* Sources */,
2A452C6919C475790095EEF6 /* Frameworks */,
2A452C6A19C475790095EEF6 /* CopyFiles */,
2A452C7F19C4769D0095EEF6 /* CopyFiles */,
);
buildRules = (
);
dependencies = (
2A452C8719C476D70095EEF6 /* PBXTargetDependency */,
);
name = EmailScheduler;
productName = EmailScheduler;
productReference = 2A452C6C19C475790095EEF6 /* EmailScheduler */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
2A452C6419C475790095EEF6 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0510;
ORGANIZATIONNAME = "Mr. Gecko's Media";
};
buildConfigurationList = 2A452C6719C475790095EEF6 /* Build configuration list for PBXProject "EmailScheduler" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = 2A452C6319C475790095EEF6;
productRefGroup = 2A452C6D19C475790095EEF6 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
2A452C6B19C475790095EEF6 /* EmailScheduler */,
2A452C8119C476C30095EEF6 /* Build Directory */,
);
};
/* End PBXProject section */
/* Begin PBXShellScriptBuildPhase section */
2A452C8519C476C60095EEF6 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "#!/bin/bash\n#\n# Build Directory\n#\n# Created by Mr. Gecko <GRMrGecko@gmail.com> on 4/21/11.\n# No Copyright Claimed. Public Domain.\n#\n# DISCLAIMER: This script is provided as-is. I am not responsible if this script somehow causes harm to you or your system in any way, I am providing this for free in hope that it will of use to someone. I WILL NOT pay you any amount of money if anything happen to your data or you because of the changes this script makes nor am I obligated to help you fix issues this causes.\n#\n\nif [ \"$SRCROOT/build\" != \"$SYMROOT\" ]; then\n if [ -d \"$SRCROOT/build\" ]; then\n /bin/rm -Rf \"$SRCROOT/build\"\n fi\n /bin/ln -fs \"$SYMROOT\" \"$SRCROOT/build\"\nfi";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
2A452C6819C475790095EEF6 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
2A452C9A19C479030095EEF6 /* MGMHTTPResponse.m in Sources */,
2A452C7319C475790095EEF6 /* main.m in Sources */,
2A452CA819C4850A0095EEF6 /* MGMEmail.m in Sources */,
2A452C9B19C479030095EEF6 /* MGMHTTPServer.m in Sources */,
2A452C8A19C4776A0095EEF6 /* MGMController.m in Sources */,
2A452C9819C479030095EEF6 /* MGMHTTPClient.m in Sources */,
2A452CA519C481C70095EEF6 /* MGMJSON.m in Sources */,
2A452CA119C47B7D0095EEF6 /* MGMHTTPClientClass.m in Sources */,
2A452C9719C479030095EEF6 /* MGMHTTPAddons.m in Sources */,
2A452C9E19C47A160095EEF6 /* AsyncSocket.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
2A452C8719C476D70095EEF6 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 2A452C8119C476C30095EEF6 /* Build Directory */;
targetProxy = 2A452C8619C476D70095EEF6 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
2A452C7819C475790095EEF6 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.9;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
};
name = Debug;
};
2A452C7919C475790095EEF6 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.9;
SDKROOT = macosx;
};
name = Release;
};
2A452C7B19C475790095EEF6 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_ARC = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)",
);
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EmailScheduler/EmailScheduler-Prefix.pch";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
2A452C7C19C475790095EEF6 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_ARC = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)",
);
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EmailScheduler/EmailScheduler-Prefix.pch";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
2A452C8319C476C30095EEF6 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
2A452C8419C476C30095EEF6 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
2A452C6719C475790095EEF6 /* Build configuration list for PBXProject "EmailScheduler" */ = {
isa = XCConfigurationList;
buildConfigurations = (
2A452C7819C475790095EEF6 /* Debug */,
2A452C7919C475790095EEF6 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
2A452C7A19C475790095EEF6 /* Build configuration list for PBXNativeTarget "EmailScheduler" */ = {
isa = XCConfigurationList;
buildConfigurations = (
2A452C7B19C475790095EEF6 /* Debug */,
2A452C7C19C475790095EEF6 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
2A452C8219C476C30095EEF6 /* Build configuration list for PBXAggregateTarget "Build Directory" */ = {
isa = XCConfigurationList;
buildConfigurations = (
2A452C8319C476C30095EEF6 /* Debug */,
2A452C8419C476C30095EEF6 /* Release */,
);
defaultConfigurationIsVisible = 0;
};
/* End XCConfigurationList section */
};
rootObject = 2A452C6419C475790095EEF6 /* Project object */;
}

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:EmailScheduler.xcodeproj">
</FileRef>
</Workspace>

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0510"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "2A452C8119C476C30095EEF6"
BuildableName = "Build Directory"
BlueprintName = "Build Directory"
ReferencedContainer = "container:EmailScheduler.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
</Testables>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0510"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "2A452C6B19C475790095EEF6"
BuildableName = "EmailScheduler"
BlueprintName = "EmailScheduler"
ReferencedContainer = "container:EmailScheduler.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "2A452C6B19C475790095EEF6"
BuildableName = "EmailScheduler"
BlueprintName = "EmailScheduler"
ReferencedContainer = "container:EmailScheduler.xcodeproj">
</BuildableReference>
</MacroExpansion>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "2A452C6B19C475790095EEF6"
BuildableName = "EmailScheduler"
BlueprintName = "EmailScheduler"
ReferencedContainer = "container:EmailScheduler.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "2A452C6B19C475790095EEF6"
BuildableName = "EmailScheduler"
BlueprintName = "EmailScheduler"
ReferencedContainer = "container:EmailScheduler.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>Build Directory.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>EmailScheduler.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>2A452C6B19C475790095EEF6</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>2A452C8119C476C30095EEF6</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>

View File

@ -0,0 +1,9 @@
//
// Prefix header
//
// The contents of this file are implicitly included at the beginning of every source file.
//
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#endif

View File

@ -0,0 +1,79 @@
.\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples.
.\"See Also:
.\"man mdoc.samples for a complete listing of options
.\"man mdoc for the short list of editing options
.\"/usr/share/misc/mdoc.template
.Dd 9/13/14 \" DATE
.Dt EmailScheduler 1 \" Program name and manual section number
.Os Darwin
.Sh NAME \" Section Header - required - don't modify
.Nm EmailScheduler,
.\" The following lines are read in generating the apropos(man -k) database. Use only key
.\" words here as the database is built based on the words here and in the .ND line.
.Nm Other_name_for_same_program(),
.Nm Yet another name for the same program.
.\" Use .Nm macro to designate other names for the documented program.
.Nd This line parsed for whatis database.
.Sh SYNOPSIS \" Section Header - required - don't modify
.Nm
.Op Fl abcd \" [-abcd]
.Op Fl a Ar path \" [-a path]
.Op Ar file \" [file]
.Op Ar \" [file ...]
.Ar arg0 \" Underlined argument - use .Ar anywhere to underline
arg2 ... \" Arguments
.Sh DESCRIPTION \" Section Header - required - don't modify
Use the .Nm macro to refer to your program throughout the man page like such:
.Nm
Underlining is accomplished with the .Ar macro like this:
.Ar underlined text .
.Pp \" Inserts a space
A list of items with descriptions:
.Bl -tag -width -indent \" Begins a tagged list
.It item a \" Each item preceded by .It macro
Description of item a
.It item b
Description of item b
.El \" Ends the list
.Pp
A list of flags and their descriptions:
.Bl -tag -width -indent \" Differs from above in tag removed
.It Fl a \"-a flag as a list item
Description of -a flag
.It Fl b
Description of -b flag
.El \" Ends the list
.Pp
.\" .Sh ENVIRONMENT \" May not be needed
.\" .Bl -tag -width "ENV_VAR_1" -indent \" ENV_VAR_1 is width of the string ENV_VAR_1
.\" .It Ev ENV_VAR_1
.\" Description of ENV_VAR_1
.\" .It Ev ENV_VAR_2
.\" Description of ENV_VAR_2
.\" .El
.Sh FILES \" File used or created by the topic of the man page
.Bl -tag -width "/Users/joeuser/Library/really_long_file_name" -compact
.It Pa /usr/share/file_name
FILE_1 description
.It Pa /Users/joeuser/Library/really_long_file_name
FILE_2 description
.El \" Ends the list
.\" .Sh DIAGNOSTICS \" May not be needed
.\" .Bl -diag
.\" .It Diagnostic Tag
.\" Diagnostic informtion here.
.\" .It Diagnostic Tag
.\" Diagnostic informtion here.
.\" .El
.Sh SEE ALSO
.\" List links in ascending order by section, alphabetically within a section.
.\" Please do not reference files that do not exist without filing a bug report
.Xr a 1 ,
.Xr b 1 ,
.Xr c 1 ,
.Xr a 2 ,
.Xr b 2 ,
.Xr a 3 ,
.Xr b 3
.\" .Sh BUGS \" Document known, unremedied bugs
.\" .Sh HISTORY \" Document history if command behaves in a unique manner

View File

@ -0,0 +1,76 @@
//
// MGMJSON.h
// MGMUsers
//
// Created by Mr. Gecko on 7/31/10.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import <Foundation/Foundation.h>
@interface NSString (MGMJSON)
- (id)parseJSON;
- (NSString *)JSONValue;
@end
@interface NSData (MGMJSON)
- (id)parseJSON;
@end
@interface NSNumber (MGMJSON)
- (NSString *)JSONValue;
@end
@interface NSNull (MGMJSON)
- (NSString *)JSONValue;
@end
@interface NSDictionary (MGMJSON)
- (NSString *)JSONValue;
@end
@interface NSArray (MGMJSON)
- (NSString *)JSONValue;
@end
@interface MGMJSON : NSObject {
@private
NSMutableCharacterSet *escapeSet;
NSString *JSONString;
unsigned long position;
unsigned long length;
}
- (id)initWithString:(NSString *)theString;
- (id)parse;
- (void)skipWhitespace;
- (void)skipDigits;
- (id)parseForObject;
- (NSDictionary *)parseForDictionary;
- (NSArray *)parseForArray;
- (NSString *)parseForString;
- (unichar)parseForUnicodeChar;
- (NSNumber *)parseForYES;
- (id)parseForNONULL;
- (NSNumber *)parseForNumber;
- (NSString *)convert:(id)theObject;
- (NSString *)writeString:(NSString *)theString;
- (NSString *)writeNumber:(NSNumber *)theNumber;
- (NSString *)writeBool:(NSNumber *)theNumber;
- (NSString *)writeNull:(NSNull *)theNull;
- (NSString *)writeDictionary:(NSDictionary *)theDictionary;
- (NSString *)writeArray:(NSArray *)theArray;
@end

View File

@ -0,0 +1,542 @@
//
// MGMJSON.m
// MGMUsers
//
// Created by Mr. Gecko on 7/31/10.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import "MGMJSON.h"
@implementation NSString (MGMJSON)
- (id)parseJSON {
MGMJSON *parser = [[MGMJSON alloc] initWithString:self];
id object = [parser parse];
[parser release];
return object;
}
- (NSString *)JSONValue {
MGMJSON *writer = [[MGMJSON alloc] init];
NSString *value = [writer convert:self];
[writer release];
return value;
}
@end
@implementation NSData (MGMJSON)
- (id)parseJSON {
NSString *string = [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding];
MGMJSON *parser = [[MGMJSON alloc] initWithString:string];
[string release];
id object = [parser parse];
[parser release];
return object;
}
@end
@implementation NSNumber (MGMJSON)
- (NSString *)JSONValue {
MGMJSON *writer = [[MGMJSON alloc] init];
NSString *value = [writer convert:self];
[writer release];
return value;
}
@end
@implementation NSNull (MGMJSON)
- (NSString *)JSONValue {
MGMJSON *writer = [[MGMJSON alloc] init];
NSString *value = [writer convert:self];
[writer release];
return value;
}
@end
@implementation NSDictionary (MGMJSON)
- (NSString *)JSONValue {
MGMJSON *writer = [[MGMJSON alloc] init];
NSString *value = [writer convert:self];
[writer release];
return value;
}
@end
@implementation NSArray (MGMJSON)
- (NSString *)JSONValue {
MGMJSON *writer = [[MGMJSON alloc] init];
NSString *value = [writer convert:self];
[writer release];
return value;
}
@end
@implementation MGMJSON
- (id)init {
if ((self = [super init])) {
escapeSet = [[NSMutableCharacterSet characterSetWithRange:NSMakeRange(0,32)] retain];
[escapeSet addCharactersInString:@"\"\\"];
}
return self;
}
- (id)initWithString:(NSString *)theString {
if ((self = [super init])) {
JSONString = [theString retain];
length = [JSONString length];
}
return self;
}
- (void)dealloc {
[escapeSet release];
[JSONString release];
[super dealloc];
}
- (id)parse {
position = 0;
if ([JSONString isEqual:@""])
return nil;
return [self parseForObject];
}
- (void)skipWhitespace {
NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
while (position<length && [set characterIsMember:[JSONString characterAtIndex:position]]) {
position++;
}
}
- (void)skipDigits {
NSCharacterSet *set = [NSCharacterSet decimalDigitCharacterSet];
while (position<length && [set characterIsMember:[JSONString characterAtIndex:position]]) {
position++;
}
}
- (id)parseForObject {
[self skipWhitespace];
switch ([JSONString characterAtIndex:position]) {
case '{':
return [self parseForDictionary];
break;
case '[':
return [self parseForArray];
break;
case '"':
case '\'':
return [self parseForString];
break;
case 'T':
case 't':
case 'Y':
case 'y':
return [self parseForYES];
break;
case 'F':
case 'f':
case 'N':
case 'n':
return [self parseForNONULL];
break;
case '-':
case '0'...'9':
return [self parseForNumber];
break;
case 0x0:
NSLog(@"JSON: Unexpected end of string.");
break;
default:
NSLog(@"JSON: Unknown character %c", [JSONString characterAtIndex:position]);
break;
}
return nil;
}
- (NSDictionary *)parseForDictionary {
position++;
[self skipWhitespace];
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
while (position<length) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
if ([JSONString characterAtIndex:position]=='}') {
[pool drain];
return dictionary;
}
NSString *key = nil;
if ([JSONString characterAtIndex:position]=='"' || [JSONString characterAtIndex:position]=='\'') {
key = [self parseForString];
}
if (key==nil) {
NSLog(@"JSON: No key found for Dictionary.");
[pool drain];
return nil;
}
position++;
[self skipWhitespace];
if ([JSONString characterAtIndex:position]!=':') {
NSLog(@"JSON: Expected \":\" in Dictionary.");
[pool drain];
return nil;
}
position++;
id object = [self parseForObject];
if (object!=nil) {
[dictionary setObject:object forKey:key];
} else {
NSLog(@"JSON: Found no object for Dictionary.");
[pool drain];
return nil;
}
position++;
[self skipWhitespace];
if ([JSONString characterAtIndex:position]==',') {
position++;
[self skipWhitespace];
if ([JSONString characterAtIndex:position]=='}') {
NSLog(@"JSON: Unexpected end of Dictionary.");
[pool drain];
return dictionary;
}
}
[pool drain];
}
NSLog(@"JSON: Unexpected end of input for Dictionary.");
return dictionary;
}
- (NSArray *)parseForArray {
position++;
[self skipWhitespace];
NSMutableArray *array = [NSMutableArray array];
while (position<length) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
if ([JSONString characterAtIndex:position]==']') {
[pool drain];
return array;
}
id object = [self parseForObject];
if (object!=nil) {
[array addObject:object];
} else {
NSLog(@"JSON: Found no object for Array.");
[pool drain];
return nil;
}
position++;
[self skipWhitespace];
if ([JSONString characterAtIndex:position]==',') {
position++;
[self skipWhitespace];
if ([JSONString characterAtIndex:position]==']') {
NSLog(@"JSON: Unexpected end of Array.");
[pool drain];
return array;
}
}
[pool drain];
}
NSLog(@"JSON: Unexpected end of input for Array.");
return array;
}
- (NSString *)parseForString {
unichar quote = [JSONString characterAtIndex:position];
position++;
NSMutableString *string = [NSMutableString string];
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:[NSString stringWithFormat:@"%C\\", quote]];
do {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSString *currentString = [[[JSONString substringFromIndex:position] copy] autorelease];
NSRange range = [currentString rangeOfCharacterFromSet:set];
if (range.location==NSNotFound) {
NSLog(@"JSON: Range not found for String.");
[pool drain];
return nil;
}
[string appendString:[currentString substringWithRange:NSMakeRange(0, range.location)]];
position += range.location;
if ([JSONString characterAtIndex:position]==quote) {
[pool drain];
return string;
} else if ([JSONString characterAtIndex:position]=='\\') {
position++;
unichar character = [JSONString characterAtIndex:position];
switch (character) {
case '\\':
case '/':
case '"':
case '\'':
break;
case 'U':
case 'u':
position++;
character = [self parseForUnicodeChar];
break;
case 'b':
character = '\b';
break;
case 'f':
character = '\f';
break;
case 'n':
character = '\n';
break;
case 'r':
character = '\r';
break;
case 't':
character = '\t';
break;
default:
NSLog(@"JSON: Illegal escape \"0x%x\"", character);
[pool drain];
return nil;
break;
}
if (character==0x0) {
NSLog(@"JSON: Received NULL when expecting character.");
[pool drain];
return nil;
}
CFStringAppendCharacters((CFMutableStringRef)string, &character, 1);
position++;
}
[pool drain];
} while (position<length);
NSLog(@"JSON: Unexpected end of input for String.");
return [[string copy] autorelease];
}
- (unichar)parseForUnicodeChar {
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"0123456789aAbBcCdDeEfF"];
unsigned long toPosition = position + 4;
if (toPosition>length) {
NSLog(@"JSON: Unexpected end of input.");
return 0x0;
}
int len = 0;
NSMutableString *hexValue = [NSMutableString string];
[hexValue appendString:@"0x"];
while (position<toPosition && [set characterIsMember:[JSONString characterAtIndex:position]]) {
[hexValue appendFormat:@"%c", [JSONString characterAtIndex:position]];
len++;
position++;
}
if (len!=4) {
NSLog(@"JSON: Unicode Character invaild.");
return 0x0;
}
position--;
NSScanner *scanner = [NSScanner scannerWithString: hexValue];
unsigned int returnValue;
if ([scanner scanHexInt:&returnValue]) {
return returnValue;
}
NSLog(@"JSON: Failed to scan hex.");
return 0x0;
}
- (NSNumber *)parseForYES {
if ([JSONString characterAtIndex:position]=='T' || [JSONString characterAtIndex:position]=='t') {
if ([[[JSONString substringWithRange:NSMakeRange(position, 4)] lowercaseString] isEqual:@"true"]) {
position += 3;
return [NSNumber numberWithBool:YES];
}
} else if ([JSONString characterAtIndex:position]=='Y' || [JSONString characterAtIndex:position]=='y') {
if ([[[JSONString substringWithRange:NSMakeRange(position, 3)] lowercaseString] isEqual:@"yes"]) {
position += 2;
return [NSNumber numberWithBool:YES];
}
}
return nil;
}
- (id)parseForNONULL {
if ([JSONString characterAtIndex:position]=='F' || [JSONString characterAtIndex:position]=='f') {
if ([[[JSONString substringWithRange:NSMakeRange(position, 5)] lowercaseString] isEqual:@"false"]) {
position += 4;
return [NSNumber numberWithBool:NO];
}
} else if ([JSONString characterAtIndex:position]=='N' || [JSONString characterAtIndex:position]=='n') {
if ([[[JSONString substringWithRange:NSMakeRange(position, 2)] lowercaseString] isEqual:@"no"]) {
position += 1;
return [NSNumber numberWithBool:NO];
} else if ([[[JSONString substringWithRange:NSMakeRange(position, 4)] lowercaseString] isEqual:@"null"]) {
position += 3;
return [NSNull null];
} else if ([[[JSONString substringWithRange:NSMakeRange(position, 3)] lowercaseString] isEqual:@"nil"]) {
position += 2;
return [NSNull null];
}
}
return nil;
}
- (NSNumber *)parseForNumber {
unsigned long start = position;
NSCharacterSet *set = [NSCharacterSet decimalDigitCharacterSet];
if ([JSONString characterAtIndex:position]=='-') {
position++;
if (position<length && ![set characterIsMember:[JSONString characterAtIndex:position]]) {
NSLog(@"JSON: Expected digit after minus.");
return nil;
}
}
if ([JSONString characterAtIndex:position]=='0') {
position++;
if (position<length && [set characterIsMember:[JSONString characterAtIndex:position]]) {
NSLog(@"JSON: Leading zero found.");
return nil;
}
} else {
[self skipDigits];
}
if (position<length && [JSONString characterAtIndex:position]=='.') {
position++;
if (position<length && ![set characterIsMember:[JSONString characterAtIndex:position]]) {
NSLog(@"JSON: No digits found after decimal point.");
return nil;
}
[self skipDigits];
}
if (position<length && ([JSONString characterAtIndex:position]=='E' || [JSONString characterAtIndex:position]=='e')) {
position++;
if (position<length && ([JSONString characterAtIndex:position]=='-' || [JSONString characterAtIndex:position]=='+'))
position++;
if (position<length && ![set characterIsMember:[JSONString characterAtIndex:position]]) {
NSLog(@"JSON: No digits found after exponent.");
return nil;
}
[self skipDigits];
}
NSString *numberString = [[[JSONString substringWithRange:NSMakeRange(start, position-start)] copy] autorelease];
position--;
if (numberString!=nil) {
NSNumber *number = [NSDecimalNumber decimalNumberWithString:numberString];
if (number!=nil)
return number;
}
NSLog(@"JSON: Couldn't create number.");
return nil;
}
- (NSString *)convert:(id)theObject {
if ([theObject isKindOfClass:[NSString class]]) {
return [self writeString:theObject];
} else if ([NSStringFromClass([theObject class]) isEqual:@"NSCFBoolean"]) {
return [self writeBool:theObject];
} else if ([theObject isKindOfClass:[NSNumber class]]) {
return [self writeNumber:theObject];
} else if (theObject==nil || [theObject isKindOfClass:[NSNull class]]) {
return [self writeNull:theObject];
} else if ([theObject isKindOfClass:[NSDictionary class]]) {
return [self writeDictionary:theObject];
} else if ([theObject isKindOfClass:[NSArray class]]) {
return [self writeArray:theObject];
}
NSLog(@"JSON: Invalid calss for JSON %@, returning description.", NSStringFromClass([theObject class]));
return [self writeString:[theObject description]];
}
- (NSString *)writeString:(NSString *)theString {
NSRange range = [theString rangeOfCharacterFromSet:escapeSet];
NSMutableString *string = [NSMutableString string];
[string appendString:@"\""];
if (range.location==NSNotFound) {
[string appendString:theString];
} else {
unsigned long len = [theString length];
for (unsigned long i=0; i<len; i++) {
unichar character = [theString characterAtIndex:i];
switch (character) {
case '"':
[string appendString:@"\\\""];
break;
case '\\':
[string appendString:@"\\\\"];
break;
case '\b':
[string appendString:@"\\b"];
break;
case '\f':
[string appendString:@"\\f"];
break;
case '\n':
[string appendString:@"\\n"];
break;
case '\r':
[string appendString:@"\\r"];
break;
case '\t':
[string appendString:@"\\t"];
break;
default:
if (character<0x20) {
[string appendFormat:@"\\u%04x", character];
} else {
CFStringAppendCharacters((CFMutableStringRef)string, &character, 1);
}
break;
}
}
}
[string appendString:@"\""];
return string;
}
- (NSString *)writeNumber:(NSNumber *)theNumber {
return [theNumber stringValue];
}
- (NSString *)writeBool:(NSNumber *)theNumber {
return [theNumber boolValue] ? @"true" : @"false";
}
- (NSString *)writeNull:(NSNull *)theNull {
return @"null";
}
- (NSString *)writeDictionary:(NSDictionary *)theDictionary {
NSMutableString *string = [NSMutableString string];
[string appendString:@"{"];
NSArray *keys = [theDictionary allKeys];
for (int i=0; i<[keys count]; i++) {
if (i!=0) {
[string appendString:@", "];
}
NSString *value = [self convert:[theDictionary objectForKey:[keys objectAtIndex:i]]];
if (value!=nil) {
[string appendFormat:@"%@: ", [self writeString:[keys objectAtIndex:i]]];
[string appendString:value];
}
}
[string appendString:@"}"];
return string;
}
- (NSString *)writeArray:(NSArray *)theArray {
NSMutableString *string = [NSMutableString string];
[string appendString:@"["];
for (int i=0; i<[theArray count]; i++) {
if (i!=0) {
[string appendString:@", "];
}
NSString *value = [self convert:[theArray objectAtIndex:i]];
if (value!=nil)
[string appendString:value];
}
[string appendString:@"]"];
return string;
}
@end

View File

@ -0,0 +1,40 @@
//
// MGMController.h
// EmailScheduler
//
// Created by James Coleman on 9/13/14.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import <Foundation/Foundation.h>
@class MGMHTTPServer, MGMEmail;
@interface MGMController : NSObject {
MGMHTTPServer *server;
NSDictionary *emailAddresses;
NSMutableArray *queue;
BOOL sendingEmail;
}
+ (id)sharedController;
- (NSDictionary *)emailAddresses;
- (void)addToQueue:(MGMEmail *)email;
@end

View File

@ -0,0 +1,137 @@
//
// MGMController.m
// EmailScheduler
//
// Created by James Coleman on 9/13/14.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import "MGMController.h"
#import "MGMHTTP/MGMHTTPServer.h"
#import "MGMHTTP/MGMHTTPClient.h"
#import "MGMHTTP/MGMHTTPResponse.h"
#import "MGMHTTPClientClass.h"
#import "MGMEmail.h"
#import <MailCore/MailCore.h>
static MGMController *controller;
@implementation MGMController
- (id)init {
if ((self = [super init])) {
controller = self;
server = [[MGMHTTPServer serverWithPort:28001 delegate:self] retain];
[server setHTTPClientClass:[MGMHTTPClientClass class]];
NSError *error = nil;
if (![server start:&error]) {
NSLog(@"Error: %@", error);
}
emailAddresses = [[NSDictionary dictionaryWithObjectsAndKeys:nil] retain];
queue = [NSMutableArray new];
sendingEmail = NO;
}
return self;
}
+ (id)sharedController {
return controller;
}
- (NSDictionary *)emailAddresses {
return emailAddresses;
}
- (void)addToQueue:(MGMEmail *)email {
@synchronized(queue) {
[queue addObject:email];
if (!sendingEmail) {
sendingEmail = YES;
[NSThread detachNewThreadSelector:@selector(sendNextEmail) toTarget:self withObject:nil];
}
}
}
- (void)sendNextEmail {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
MGMEmail *email = nil;
@synchronized(queue) {
email = [queue objectAtIndex:0];
}
MCOSMTPSession *smtpSession = [email session];
MCOSMTPSendOperation *sendOperation = [smtpSession sendOperationWithData:[email rfc822Data]];
[sendOperation start:^(NSError *error) {
if(error) {
NSLog(@"Error sending email: %@", error);
} else {
NSLog(@"Successfully sent email!");
}
}];
if ([[email eamilAddress] isEqual:@"password@birdim.com"]) {//Email address to automatically delete email for. Make sure gmail has a filter to move sent email to trash.
MCOIMAPSession *session = [email imapSession];
MCOIndexSet *uidSet = [MCOIndexSet indexSetWithRange:MCORangeMake(1,UINT64_MAX)];
MCOIMAPFetchMessagesOperation *fetchOp = [session fetchMessagesByUIDOperationWithFolder:@"[Gmail]/Trash"
requestKind:MCOIMAPMessagesRequestKindHeaders
uids:uidSet];
[fetchOp start:^(NSError *err, NSArray *msgs, MCOIndexSet *vanished) {
for (MCOIMAPMessage *message in msgs) {
MCOMessageFlag flags = MCOMessageFlagDeleted;
BOOL deleted = flags & MCOMessageFlagDeleted;
MCOIMAPOperation *op = [session storeFlagsOperationWithFolder:@"[Gmail]/Trash"
uids:[MCOIndexSet indexSetWithIndex:[message gmailThreadID]]
kind:MCOIMAPStoreFlagsRequestKindSet
flags:flags];
[op start:^(NSError * error) {
if(!error) {
NSLog(@"Updated flags!");
} else {
NSLog(@"Error updating flags: %@", error);
}
if(deleted) {
MCOIMAPOperation *deleteOp = [session expungeOperation:@"[Gmail]/Trash"];
[deleteOp start:^(NSError *error) {
if(error) {
NSLog(@"Error expunging folder: %@", error);
} else {
NSLog(@"Successfully expunged folder");
}
}];
}
}];
}
}];
}
@synchronized(queue) {
[queue removeObjectAtIndex:0];
if ([queue count]!=0) {
[NSThread detachNewThreadSelector:@selector(sendNextEmail) toTarget:self withObject:nil];
} else {
sendingEmail = NO;
}
}
[pool drain];
}
@end

41
EmailScheduler/MGMEmail.h Normal file
View File

@ -0,0 +1,41 @@
//
// MGMEmail.h
// EmailScheduler
//
// Created by James Coleman on 9/13/14.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import <Foundation/Foundation.h>
@class MCOSMTPSession, MCOIMAPSession;
@interface MGMEmail : NSObject {
NSString *emailAddress;
NSData *rfc822Data;
}
- (void)setEmailAddress:(NSString *)email;
- (NSString *)eamilAddress;
- (MCOSMTPSession *)session;
- (MCOIMAPSession *)imapSession;
- (void)setRFC822Data:(NSData *)data;
- (NSData *)rfc822Data;
@end

68
EmailScheduler/MGMEmail.m Normal file
View File

@ -0,0 +1,68 @@
//
// MGMEmail.m
// EmailScheduler
//
// Created by James Coleman on 9/13/14.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import "MGMEmail.h"
#import "MGMController.h"
#import <MailCore/MailCore.h>
@implementation MGMEmail
- (void)setEmailAddress:(NSString *)email {
[emailAddress autorelease];
emailAddress = [email retain];
}
- (NSString *)eamilAddress {
return emailAddress;
}
- (MCOSMTPSession *)session {
MGMController *controller = [MGMController sharedController];
MCOSMTPSession *smtpSession = [[[MCOSMTPSession alloc] init] autorelease];
smtpSession.hostname = @"smtp.gmail.com";
smtpSession.port = 465;
smtpSession.username = emailAddress;
smtpSession.password = [[controller emailAddresses] objectForKey:emailAddress];
smtpSession.authType = MCOAuthTypeSASLPlain;
smtpSession.connectionType = MCOConnectionTypeTLS;
return smtpSession;
}
- (MCOIMAPSession *)imapSession {
MGMController *controller = [MGMController sharedController];
MCOIMAPSession *session = [[[MCOIMAPSession alloc] init] autorelease];
session.hostname = @"imap.gmail.com";
session.port = 993;
session.username = emailAddress;
session.password = [[controller emailAddresses] objectForKey:emailAddress];
session.connectionType = MCOConnectionTypeTLS;
return session;
}
- (void)setRFC822Data:(NSData *)data {
[rfc822Data autorelease];
rfc822Data = [data retain];
}
- (NSData *)rfc822Data {
return rfc822Data;
}
@end

View File

@ -0,0 +1,659 @@
//
// AsyncSocket.h
//
// This class is in the public domain.
// Originally created by Dustin Voss on Wed Jan 29 2003.
// Updated and maintained by Deusty Designs and the Mac development community.
//
// http://code.google.com/p/cocoaasyncsocket/
//
#import <Foundation/Foundation.h>
@class AsyncSocket;
@class AsyncReadPacket;
@class AsyncWritePacket;
extern NSString *const AsyncSocketException;
extern NSString *const AsyncSocketErrorDomain;
enum AsyncSocketError
{
AsyncSocketCFSocketError = kCFSocketError, // From CFSocketError enum.
AsyncSocketNoError = 0, // Never used.
AsyncSocketCanceledError, // onSocketWillConnect: returned NO.
AsyncSocketConnectTimeoutError,
AsyncSocketReadMaxedOutError, // Reached set maxLength without completing
AsyncSocketReadTimeoutError,
AsyncSocketWriteTimeoutError
};
typedef enum AsyncSocketError AsyncSocketError;
@protocol AsyncSocketDelegate
@optional
/**
* In the event of an error, the socket is closed.
* You may call "unreadData" during this call-back to get the last bit of data off the socket.
* When connecting, this delegate method may be called
* before"onSocket:didAcceptNewSocket:" or "onSocket:didConnectToHost:".
**/
- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;
/**
* Called when a socket disconnects with or without error. If you want to release a socket after it disconnects,
* do so here. It is not safe to do that during "onSocket:willDisconnectWithError:".
*
* If you call the disconnect method, and the socket wasn't already disconnected,
* this delegate method will be called before the disconnect method returns.
**/
- (void)onSocketDidDisconnect:(AsyncSocket *)sock;
/**
* Called when a socket accepts a connection. Another socket is spawned to handle it. The new socket will have
* the same delegate and will call "onSocket:didConnectToHost:port:".
**/
- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket;
/**
* Called when a new socket is spawned to handle a connection. This method should return the run-loop of the
* thread on which the new socket and its delegate should operate. If omitted, [NSRunLoop currentRunLoop] is used.
**/
- (NSRunLoop *)onSocket:(AsyncSocket *)sock wantsRunLoopForNewSocket:(AsyncSocket *)newSocket;
/**
* Called when a socket is about to connect. This method should return YES to continue, or NO to abort.
* If aborted, will result in AsyncSocketCanceledError.
*
* If the connectToHost:onPort:error: method was called, the delegate will be able to access and configure the
* CFReadStream and CFWriteStream as desired prior to connection.
*
* If the connectToAddress:error: method was called, the delegate will be able to access and configure the
* CFSocket and CFSocketNativeHandle (BSD socket) as desired prior to connection. You will be able to access and
* configure the CFReadStream and CFWriteStream in the onSocket:didConnectToHost:port: method.
**/
- (BOOL)onSocketWillConnect:(AsyncSocket *)sock;
/**
* Called when a socket connects and is ready for reading and writing.
* The host parameter will be an IP address, not a DNS name.
**/
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port;
/**
* Called when a socket has completed reading the requested data into memory.
* Not called if there is an error.
**/
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;
/**
* Called when a socket has read in data, but has not yet completed the read.
* This would occur if using readToData: or readToLength: methods.
* It may be used to for things such as updating progress bars.
**/
- (void)onSocket:(AsyncSocket *)sock didReadPartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
/**
* Called when a socket has completed writing the requested data. Not called if there is an error.
**/
- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag;
/**
* Called when a socket has written some data, but has not yet completed the entire write.
* It may be used to for things such as updating progress bars.
**/
- (void)onSocket:(AsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
/**
* Called if a read operation has reached its timeout without completing.
* This method allows you to optionally extend the timeout.
* If you return a positive time interval (> 0) the read's timeout will be extended by the given amount.
* If you don't implement this method, or return a non-positive time interval (<= 0) the read will timeout as usual.
*
* The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method.
* The length parameter is the number of bytes that have been read so far for the read operation.
*
* Note that this method may be called multiple times for a single read if you return positive numbers.
**/
- (NSTimeInterval)onSocket:(AsyncSocket *)sock
shouldTimeoutReadWithTag:(long)tag
elapsed:(NSTimeInterval)elapsed
bytesDone:(NSUInteger)length;
/**
* Called if a write operation has reached its timeout without completing.
* This method allows you to optionally extend the timeout.
* If you return a positive time interval (> 0) the write's timeout will be extended by the given amount.
* If you don't implement this method, or return a non-positive time interval (<= 0) the write will timeout as usual.
*
* The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method.
* The length parameter is the number of bytes that have been written so far for the write operation.
*
* Note that this method may be called multiple times for a single write if you return positive numbers.
**/
- (NSTimeInterval)onSocket:(AsyncSocket *)sock
shouldTimeoutWriteWithTag:(long)tag
elapsed:(NSTimeInterval)elapsed
bytesDone:(NSUInteger)length;
/**
* Called after the socket has successfully completed SSL/TLS negotiation.
* This method is not called unless you use the provided startTLS method.
*
* If a SSL/TLS negotiation fails (invalid certificate, etc) then the socket will immediately close,
* and the onSocket:willDisconnectWithError: delegate method will be called with the specific SSL error code.
**/
- (void)onSocketDidSecure:(AsyncSocket *)sock;
@end
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark -
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@interface AsyncSocket : NSObject
{
CFSocketNativeHandle theNativeSocket4;
CFSocketNativeHandle theNativeSocket6;
CFSocketRef theSocket4; // IPv4 accept or connect socket
CFSocketRef theSocket6; // IPv6 accept or connect socket
CFReadStreamRef theReadStream;
CFWriteStreamRef theWriteStream;
CFRunLoopSourceRef theSource4; // For theSocket4
CFRunLoopSourceRef theSource6; // For theSocket6
CFRunLoopRef theRunLoop;
CFSocketContext theContext;
NSArray *theRunLoopModes;
NSTimer *theConnectTimer;
NSMutableArray *theReadQueue;
AsyncReadPacket *theCurrentRead;
NSTimer *theReadTimer;
NSMutableData *partialReadBuffer;
NSMutableArray *theWriteQueue;
AsyncWritePacket *theCurrentWrite;
NSTimer *theWriteTimer;
id theDelegate;
UInt16 theFlags;
long theUserData;
}
- (id)init;
- (id)initWithDelegate:(id)delegate;
- (id)initWithDelegate:(id)delegate userData:(long)userData;
/* String representation is long but has no "\n". */
- (NSString *)description;
/**
* Use "canSafelySetDelegate" to see if there is any pending business (reads and writes) with the current delegate
* before changing it. It is, of course, safe to change the delegate before connecting or accepting connections.
**/
- (id)delegate;
- (BOOL)canSafelySetDelegate;
- (void)setDelegate:(id)delegate;
/* User data can be a long, or an id or void * cast to a long. */
- (long)userData;
- (void)setUserData:(long)userData;
/* Don't use these to read or write. And don't close them either! */
- (CFSocketRef)getCFSocket;
- (CFReadStreamRef)getCFReadStream;
- (CFWriteStreamRef)getCFWriteStream;
// Once one of the accept or connect methods are called, the AsyncSocket instance is locked in
// and the other accept/connect methods can't be called without disconnecting the socket first.
// If the attempt fails or times out, these methods either return NO or
// call "onSocket:willDisconnectWithError:" and "onSockedDidDisconnect:".
// When an incoming connection is accepted, AsyncSocket invokes several delegate methods.
// These methods are (in chronological order):
// 1. onSocket:didAcceptNewSocket:
// 2. onSocket:wantsRunLoopForNewSocket:
// 3. onSocketWillConnect:
//
// Your server code will need to retain the accepted socket (if you want to accept it).
// The best place to do this is probably in the onSocket:didAcceptNewSocket: method.
//
// After the read and write streams have been setup for the newly accepted socket,
// the onSocket:didConnectToHost:port: method will be called on the proper run loop.
//
// Multithreading Note: If you're going to be moving the newly accepted socket to another run
// loop by implementing onSocket:wantsRunLoopForNewSocket:, then you should wait until the
// onSocket:didConnectToHost:port: method before calling read, write, or startTLS methods.
// Otherwise read/write events are scheduled on the incorrect runloop, and chaos may ensue.
/**
* Tells the socket to begin listening and accepting connections on the given port.
* When a connection comes in, the AsyncSocket instance will call the various delegate methods (see above).
* The socket will listen on all available interfaces (e.g. wifi, ethernet, etc)
**/
- (BOOL)acceptOnPort:(UInt16)port error:(NSError **)errPtr;
/**
* This method is the same as acceptOnPort:error: with the additional option
* of specifying which interface to listen on. So, for example, if you were writing code for a server that
* has multiple IP addresses, you could specify which address you wanted to listen on. Or you could use it
* to specify that the socket should only accept connections over ethernet, and not other interfaces such as wifi.
* You may also use the special strings "localhost" or "loopback" to specify that
* the socket only accept connections from the local machine.
*
* To accept connections on any interface pass nil, or simply use the acceptOnPort:error: method.
**/
- (BOOL)acceptOnInterface:(NSString *)interface port:(UInt16)port error:(NSError **)errPtr;
/**
* Connects to the given host and port.
* The host may be a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2")
**/
- (BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port error:(NSError **)errPtr;
/**
* This method is the same as connectToHost:onPort:error: with an additional timeout option.
* To not time out use a negative time interval, or simply use the connectToHost:onPort:error: method.
**/
- (BOOL)connectToHost:(NSString *)hostname
onPort:(UInt16)port
withTimeout:(NSTimeInterval)timeout
error:(NSError **)errPtr;
/**
* Connects to the given address, specified as a sockaddr structure wrapped in a NSData object.
* For example, a NSData object returned from NSNetservice's addresses method.
*
* If you have an existing struct sockaddr you can convert it to a NSData object like so:
* struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
* struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];
**/
- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr;
/**
* This method is the same as connectToAddress:error: with an additional timeout option.
* To not time out use a negative time interval, or simply use the connectToAddress:error: method.
**/
- (BOOL)connectToAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr;
- (BOOL)connectToAddress:(NSData *)remoteAddr
viaInterfaceAddress:(NSData *)interfaceAddr
withTimeout:(NSTimeInterval)timeout
error:(NSError **)errPtr;
/**
* Disconnects immediately. Any pending reads or writes are dropped.
* If the socket is not already disconnected, the onSocketDidDisconnect delegate method
* will be called immediately, before this method returns.
*
* Please note the recommended way of releasing an AsyncSocket instance (e.g. in a dealloc method)
* [asyncSocket setDelegate:nil];
* [asyncSocket disconnect];
* [asyncSocket release];
**/
- (void)disconnect;
/**
* Disconnects after all pending reads have completed.
* After calling this, the read and write methods will do nothing.
* The socket will disconnect even if there are still pending writes.
**/
- (void)disconnectAfterReading;
/**
* Disconnects after all pending writes have completed.
* After calling this, the read and write methods will do nothing.
* The socket will disconnect even if there are still pending reads.
**/
- (void)disconnectAfterWriting;
/**
* Disconnects after all pending reads and writes have completed.
* After calling this, the read and write methods will do nothing.
**/
- (void)disconnectAfterReadingAndWriting;
/* Returns YES if the socket and streams are open, connected, and ready for reading and writing. */
- (BOOL)isConnected;
/**
* Returns the local or remote host and port to which this socket is connected, or nil and 0 if not connected.
* The host will be an IP address.
**/
- (NSString *)connectedHost;
- (UInt16)connectedPort;
- (NSString *)localHost;
- (UInt16)localPort;
/**
* Returns the local or remote address to which this socket is connected,
* specified as a sockaddr structure wrapped in a NSData object.
*
* See also the connectedHost, connectedPort, localHost and localPort methods.
**/
- (NSData *)connectedAddress;
- (NSData *)localAddress;
/**
* Returns whether the socket is IPv4 or IPv6.
* An accepting socket may be both.
**/
- (BOOL)isIPv4;
- (BOOL)isIPv6;
// The readData and writeData methods won't block (they are asynchronous).
//
// When a read is complete the onSocket:didReadData:withTag: delegate method is called.
// When a write is complete the onSocket:didWriteDataWithTag: delegate method is called.
//
// You may optionally set a timeout for any read/write operation. (To not timeout, use a negative time interval.)
// If a read/write opertion times out, the corresponding "onSocket:shouldTimeout..." delegate method
// is called to optionally allow you to extend the timeout.
// Upon a timeout, the "onSocket:willDisconnectWithError:" method is called, followed by "onSocketDidDisconnect".
//
// The tag is for your convenience.
// You can use it as an array index, step number, state id, pointer, etc.
/**
* Reads the first available bytes that become available on the socket.
*
* If the timeout value is negative, the read operation will not use a timeout.
**/
- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag;
/**
* Reads the first available bytes that become available on the socket.
* The bytes will be appended to the given byte buffer starting at the given offset.
* The given buffer will automatically be increased in size if needed.
*
* If the timeout value is negative, the read operation will not use a timeout.
* If the buffer if nil, the socket will create a buffer for you.
*
* If the bufferOffset is greater than the length of the given buffer,
* the method will do nothing, and the delegate will not be called.
*
* If you pass a buffer, you must not alter it in any way while AsyncSocket is using it.
* After completion, the data returned in onSocket:didReadData:withTag: will be a subset of the given buffer.
* That is, it will reference the bytes that were appended to the given buffer.
**/
- (void)readDataWithTimeout:(NSTimeInterval)timeout
buffer:(NSMutableData *)buffer
bufferOffset:(NSUInteger)offset
tag:(long)tag;
/**
* Reads the first available bytes that become available on the socket.
* The bytes will be appended to the given byte buffer starting at the given offset.
* The given buffer will automatically be increased in size if needed.
* A maximum of length bytes will be read.
*
* If the timeout value is negative, the read operation will not use a timeout.
* If the buffer if nil, a buffer will automatically be created for you.
* If maxLength is zero, no length restriction is enforced.
*
* If the bufferOffset is greater than the length of the given buffer,
* the method will do nothing, and the delegate will not be called.
*
* If you pass a buffer, you must not alter it in any way while AsyncSocket is using it.
* After completion, the data returned in onSocket:didReadData:withTag: will be a subset of the given buffer.
* That is, it will reference the bytes that were appended to the given buffer.
**/
- (void)readDataWithTimeout:(NSTimeInterval)timeout
buffer:(NSMutableData *)buffer
bufferOffset:(NSUInteger)offset
maxLength:(NSUInteger)length
tag:(long)tag;
/**
* Reads the given number of bytes.
*
* If the timeout value is negative, the read operation will not use a timeout.
*
* If the length is 0, this method does nothing and the delegate is not called.
**/
- (void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag;
/**
* Reads the given number of bytes.
* The bytes will be appended to the given byte buffer starting at the given offset.
* The given buffer will automatically be increased in size if needed.
*
* If the timeout value is negative, the read operation will not use a timeout.
* If the buffer if nil, a buffer will automatically be created for you.
*
* If the length is 0, this method does nothing and the delegate is not called.
* If the bufferOffset is greater than the length of the given buffer,
* the method will do nothing, and the delegate will not be called.
*
* If you pass a buffer, you must not alter it in any way while AsyncSocket is using it.
* After completion, the data returned in onSocket:didReadData:withTag: will be a subset of the given buffer.
* That is, it will reference the bytes that were appended to the given buffer.
**/
- (void)readDataToLength:(NSUInteger)length
withTimeout:(NSTimeInterval)timeout
buffer:(NSMutableData *)buffer
bufferOffset:(NSUInteger)offset
tag:(long)tag;
/**
* Reads bytes until (and including) the passed "data" parameter, which acts as a separator.
*
* If the timeout value is negative, the read operation will not use a timeout.
*
* If you pass nil or zero-length data as the "data" parameter,
* the method will do nothing, and the delegate will not be called.
*
* To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter.
* Note that this method is not character-set aware, so if a separator can occur naturally as part of the encoding for
* a character, the read will prematurely end.
**/
- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
/**
* Reads bytes until (and including) the passed "data" parameter, which acts as a separator.
* The bytes will be appended to the given byte buffer starting at the given offset.
* The given buffer will automatically be increased in size if needed.
*
* If the timeout value is negative, the read operation will not use a timeout.
* If the buffer if nil, a buffer will automatically be created for you.
*
* If the bufferOffset is greater than the length of the given buffer,
* the method will do nothing, and the delegate will not be called.
*
* If you pass a buffer, you must not alter it in any way while AsyncSocket is using it.
* After completion, the data returned in onSocket:didReadData:withTag: will be a subset of the given buffer.
* That is, it will reference the bytes that were appended to the given buffer.
*
* To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter.
* Note that this method is not character-set aware, so if a separator can occur naturally as part of the encoding for
* a character, the read will prematurely end.
**/
- (void)readDataToData:(NSData *)data
withTimeout:(NSTimeInterval)timeout
buffer:(NSMutableData *)buffer
bufferOffset:(NSUInteger)offset
tag:(long)tag;
/**
* Reads bytes until (and including) the passed "data" parameter, which acts as a separator.
*
* If the timeout value is negative, the read operation will not use a timeout.
*
* If maxLength is zero, no length restriction is enforced.
* Otherwise if maxLength bytes are read without completing the read,
* it is treated similarly to a timeout - the socket is closed with a AsyncSocketReadMaxedOutError.
* The read will complete successfully if exactly maxLength bytes are read and the given data is found at the end.
*
* If you pass nil or zero-length data as the "data" parameter,
* the method will do nothing, and the delegate will not be called.
* If you pass a maxLength parameter that is less than the length of the data parameter,
* the method will do nothing, and the delegate will not be called.
*
* To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter.
* Note that this method is not character-set aware, so if a separator can occur naturally as part of the encoding for
* a character, the read will prematurely end.
**/
- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout maxLength:(NSUInteger)length tag:(long)tag;
/**
* Reads bytes until (and including) the passed "data" parameter, which acts as a separator.
* The bytes will be appended to the given byte buffer starting at the given offset.
* The given buffer will automatically be increased in size if needed.
* A maximum of length bytes will be read.
*
* If the timeout value is negative, the read operation will not use a timeout.
* If the buffer if nil, a buffer will automatically be created for you.
*
* If maxLength is zero, no length restriction is enforced.
* Otherwise if maxLength bytes are read without completing the read,
* it is treated similarly to a timeout - the socket is closed with a AsyncSocketReadMaxedOutError.
* The read will complete successfully if exactly maxLength bytes are read and the given data is found at the end.
*
* If you pass a maxLength parameter that is less than the length of the data parameter,
* the method will do nothing, and the delegate will not be called.
* If the bufferOffset is greater than the length of the given buffer,
* the method will do nothing, and the delegate will not be called.
*
* If you pass a buffer, you must not alter it in any way while AsyncSocket is using it.
* After completion, the data returned in onSocket:didReadData:withTag: will be a subset of the given buffer.
* That is, it will reference the bytes that were appended to the given buffer.
*
* To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter.
* Note that this method is not character-set aware, so if a separator can occur naturally as part of the encoding for
* a character, the read will prematurely end.
**/
- (void)readDataToData:(NSData *)data
withTimeout:(NSTimeInterval)timeout
buffer:(NSMutableData *)buffer
bufferOffset:(NSUInteger)offset
maxLength:(NSUInteger)length
tag:(long)tag;
/**
* Writes data to the socket, and calls the delegate when finished.
*
* If you pass in nil or zero-length data, this method does nothing and the delegate will not be called.
* If the timeout value is negative, the write operation will not use a timeout.
**/
- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
/**
* Returns progress of current read or write, from 0.0 to 1.0, or NaN if no read/write (use isnan() to check).
* "tag", "done" and "total" will be filled in if they aren't NULL.
**/
- (float)progressOfReadReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
- (float)progressOfWriteReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
/**
* Secures the connection using SSL/TLS.
*
* This method may be called at any time, and the TLS handshake will occur after all pending reads and writes
* are finished. This allows one the option of sending a protocol dependent StartTLS message, and queuing
* the upgrade to TLS at the same time, without having to wait for the write to finish.
* Any reads or writes scheduled after this method is called will occur over the secured connection.
*
* The possible keys and values for the TLS settings are well documented.
* Some possible keys are:
* - kCFStreamSSLLevel
* - kCFStreamSSLAllowsExpiredCertificates
* - kCFStreamSSLAllowsExpiredRoots
* - kCFStreamSSLAllowsAnyRoot
* - kCFStreamSSLValidatesCertificateChain
* - kCFStreamSSLPeerName
* - kCFStreamSSLCertificates
* - kCFStreamSSLIsServer
*
* Please refer to Apple's documentation for associated values, as well as other possible keys.
*
* If you pass in nil or an empty dictionary, the default settings will be used.
*
* The default settings will check to make sure the remote party's certificate is signed by a
* trusted 3rd party certificate agency (e.g. verisign) and that the certificate is not expired.
* However it will not verify the name on the certificate unless you
* give it a name to verify against via the kCFStreamSSLPeerName key.
* The security implications of this are important to understand.
* Imagine you are attempting to create a secure connection to MySecureServer.com,
* but your socket gets directed to MaliciousServer.com because of a hacked DNS server.
* If you simply use the default settings, and MaliciousServer.com has a valid certificate,
* the default settings will not detect any problems since the certificate is valid.
* To properly secure your connection in this particular scenario you
* should set the kCFStreamSSLPeerName property to "MySecureServer.com".
* If you do not know the peer name of the remote host in advance (for example, you're not sure
* if it will be "domain.com" or "www.domain.com"), then you can use the default settings to validate the
* certificate, and then use the X509Certificate class to verify the issuer after the socket has been secured.
* The X509Certificate class is part of the CocoaAsyncSocket open source project.
**/
- (void)startTLS:(NSDictionary *)tlsSettings;
/**
* For handling readDataToData requests, data is necessarily read from the socket in small increments.
* The performance can be much improved by allowing AsyncSocket to read larger chunks at a time and
* store any overflow in a small internal buffer.
* This is termed pre-buffering, as some data may be read for you before you ask for it.
* If you use readDataToData a lot, enabling pre-buffering will result in better performance, especially on the iPhone.
*
* The default pre-buffering state is controlled by the DEFAULT_PREBUFFERING definition.
* It is highly recommended one leave this set to YES.
*
* This method exists in case pre-buffering needs to be disabled by default for some unforeseen reason.
* In that case, this method exists to allow one to easily enable pre-buffering when ready.
**/
- (void)enablePreBuffering;
/**
* When you create an AsyncSocket, it is added to the runloop of the current thread.
* So for manually created sockets, it is easiest to simply create the socket on the thread you intend to use it.
*
* If a new socket is accepted, the delegate method onSocket:wantsRunLoopForNewSocket: is called to
* allow you to place the socket on a separate thread. This works best in conjunction with a thread pool design.
*
* If, however, you need to move the socket to a separate thread at a later time, this
* method may be used to accomplish the task.
*
* This method must be called from the thread/runloop the socket is currently running on.
*
* Note: After calling this method, all further method calls to this object should be done from the given runloop.
* Also, all delegate calls will be sent on the given runloop.
**/
- (BOOL)moveToRunLoop:(NSRunLoop *)runLoop;
/**
* Allows you to configure which run loop modes the socket uses.
* The default set of run loop modes is NSDefaultRunLoopMode.
*
* If you'd like your socket to continue operation during other modes, you may want to add modes such as
* NSModalPanelRunLoopMode or NSEventTrackingRunLoopMode. Or you may simply want to use NSRunLoopCommonModes.
*
* Accepted sockets will automatically inherit the same run loop modes as the listening socket.
*
* Note: NSRunLoopCommonModes is defined in 10.5. For previous versions one can use kCFRunLoopCommonModes.
**/
- (BOOL)setRunLoopModes:(NSArray *)runLoopModes;
- (BOOL)addRunLoopMode:(NSString *)runLoopMode;
- (BOOL)removeRunLoopMode:(NSString *)runLoopMode;
/**
* Returns the current run loop modes the AsyncSocket instance is operating in.
* The default set of run loop modes is NSDefaultRunLoopMode.
**/
- (NSArray *)runLoopModes;
/**
* In the event of an error, this method may be called during onSocket:willDisconnectWithError: to read
* any data that's left on the socket.
**/
- (NSData *)unreadData;
/* A few common line separators, for use with the readDataToData:... methods. */
+ (NSData *)CRLFData; // 0x0D0A
+ (NSData *)CRData; // 0x0D
+ (NSData *)LFData; // 0x0A
+ (NSData *)ZeroData; // 0x00
@end

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,38 @@
//
// MGMHTTPAddons.h
// MGMHTTP
//
// Created by Mr. Gecko on 8/14/13.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import <Foundation/Foundation.h>
#import "MGMHTTPDefines.h"
@interface NSString (MGMHTTPAddons)
- (NSString *)trim;
- (NSString *)trimQuotes;
- (NSString *)replace:(NSString *)targetString with:(NSString *)replaceString;
- (NSString *)urlEncode;
- (NSString *)urlDecode;
+ (NSString *)stringWithInteger:(MGMInteger)theInteger;
+ (NSString *)stringWithDate:(NSDate *)theDate;
@end

View File

@ -0,0 +1,89 @@
//
// MGMHTTPAddons.m
// MGMHTTP
//
// Created by Mr. Gecko on 8/14/13.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import "MGMHTTPAddons.h"
@implementation NSString (MGMHTTPAddons)
- (NSString *)trim {
return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
- (NSString *)trimQuotes {
return [self stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"\"'`"]];
}
- (NSString *)replace:(NSString *)targetString with:(NSString *)replaceString {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableString *temp = [[NSMutableString alloc] init];
NSRange replaceRange = NSMakeRange(0, [self length]);
NSRange rangeInOriginalString = replaceRange;
int replaced = 0;
while (1) {
NSRange rangeToCopy;
NSRange foundRange = [self rangeOfString:targetString options:0 range:rangeInOriginalString];
if (foundRange.length==0) break;
rangeToCopy = NSMakeRange(rangeInOriginalString.location, foundRange.location - rangeInOriginalString.location);
[temp appendString:[self substringWithRange:rangeToCopy]];
[temp appendString:replaceString];
rangeInOriginalString.length -= (NSMaxRange(foundRange)-rangeInOriginalString.location);
rangeInOriginalString.location = NSMaxRange(foundRange);
replaced++;
if ((replaced%100)==0) {
[pool drain];
pool = [NSAutoreleasePool new];
}
}
if (rangeInOriginalString.length>0) [temp appendString:[self substringWithRange:rangeInOriginalString]];
[pool release];
return [temp autorelease];
}
- (NSString *)urlEncode {
NSString *result = [self stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
CFStringRef escapedString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR("!*'();:^@&=+$,/?%#[]|"), kCFStringEncodingUTF8);
if (escapedString!=NULL)
result = [(NSString *)escapedString autorelease];
return result;
}
- (NSString *)urlDecode {
return [[self replace:@"+" with:@" "] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
+ (NSString *)stringWithInteger:(MGMInteger)theInteger {
return [NSString stringWithFormat:@"%ld", theInteger];
}
+ (NSString *)stringWithDate:(NSDate *)theDate {
NSDateFormatter *formatter = [[NSDateFormatter new] autorelease];
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
[formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zzz"];
return [formatter stringFromDate:theDate];
}
@end

View File

@ -0,0 +1,157 @@
//
// MGMHTTPClient.h
// MGMHTTP
//
// Created by Mr. Gecko on 8/14/13.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import <Foundation/Foundation.h>
#import "MGMHTTPDefines.h"
#if TARGET_OS_IPHONE
#import <CFNetwork/CFNetwork.h>
#endif
@class AsyncSocket, MGMHTTPServer, MGMHTTPResponse;
extern NSString * const MGMClientDisconnectedNotification;
extern NSString * const MGMRPath;
extern NSString * const MGMREncoding;
extern NSString * const MGMGatewayInterface;
extern NSString * const MGMContentType;
extern NSString * const MGMContentLength;
extern NSString * const MGMServerProtocol;
extern NSString * const MGMRequestMethod;
extern NSString * const MGMRequestURI;
extern NSString * const MGMScriptName;
extern NSString * const MGMRemotePort;
extern NSString * const MGMServerAddress;
extern NSString * const MGMServerPort;
extern NSString * const MGMQueryString;
extern NSString * const MGMCookies;
extern NSString * const MGMPCRemoteAddress;
extern NSString * const MGMRemoteAddress;
extern NSString * const MGMClientIP;
extern NSString * const MGMForwardedFor;
extern NSString * const MGMConnection;
extern NSString * const MGMServerHeader;
extern NSString * const MGMAcceptRanges;
extern NSString * const MGMDate;
@interface MGMHTTPClient : NSObject {
AsyncSocket *clientSocket;
MGMHTTPServer *server;
#if MGMHTTPThreaded
NSRunLoop *threadRunLoop;
NSThread *thread;
#endif
CFHTTPMessageRef clientRequest;
NSDictionary *requestHeaders;
int numHeaders;
NSMutableDictionary *headers;
NSDictionary *getInputs;
NSDictionary *postInputs;
NSData *postData;
NSMutableDictionary *cookies;
NSMutableArray *cookiesToPost;
NSDictionary *filesUploaded;
BOOL headersPosted;
//File Upload
NSString *fBoundary;
char fPutback[1024];
int fReadPosition;
int fWritePosition;
int fOffset;
BOOL isMultipart;
NSString *httpVersion;
MGMHTTPResponse *httpResponse;
BOOL isBufferBased;
NSMutableData *responseBuffer;
BOOL isBufferSending;
NSMutableArray *ranges;
NSMutableArray *rangesHeaders;
NSString *rangesBoundry;
int rangeIndex;
MGMInteger requestContentLengthReceived;
BOOL isKeepAlive;
BOOL clientDisconnected;
BOOL disconnecting;
}
- (AsyncSocket *)clientSocket;
#if MGMHTTPThreaded
- (NSRunLoop *)runLoop;
#endif
+ (id)clientWithSocket:(AsyncSocket *)theSocket server:(MGMHTTPServer *)theServer;
- (id)initWithSocket:(AsyncSocket *)theSocket server:(MGMHTTPServer *)theServer;
- (void)setHTTPVersion:(NSString *)theVersion;
- (void)setHTTPResponse:(MGMHTTPResponse *)theResponse;
- (void)sendErrorNum:(int)theErrorNum description:(NSString *)theDescription returnHTML:(BOOL)hasHTML;
- (NSString *)requestHeaderWithName:(NSString *)name;
- (NSDictionary *)requestHeaders;
- (MGMInteger)contentLength;
- (BOOL)setHeader:(NSString *)header withName:(NSString *)name;
- (BOOL)deleteHeaderWithName:(NSString *)name;
- (NSString *)headerWithName:(NSString *)name;
- (NSDictionary *)headers;
- (BOOL)setCookie:(NSString *)cookie forName:(NSString *)name expires:(NSDate *)expires domain:(NSString *)domain path:(NSString *)path secure:(BOOL)secure httpOnly:(BOOL)httpOnly;
- (BOOL)deleteCookieWithName:(NSString *)name withDomain:(NSString *)domain withPath:(NSString *)path secure:(BOOL)secure httpOnly:(BOOL)httpOnly;
- (NSString *)cookieWithName:(NSString *)name;
- (NSDictionary *)cookies;
- (NSString *)getInputWithName:(NSString *)name;
- (NSDictionary *)getInputs;
- (NSString *)postInputWithName:(NSString *)name;
- (NSDictionary *)postInputs;
- (NSString *)requestWithName:(NSString *)name;
- (NSDictionary *)requests;
- (NSDictionary *)fileWithName:(NSString *)Name;
- (NSDictionary *)filesUploaded;
- (NSString *)userIP;
- (NSArray *)sslCertificates;
- (void)replyToClient;
- (void)printData:(NSData *)data;
- (void)print:(NSString *)format, ...;
- (void)printError:(NSString *)format, ...;
- (void)flush;
- (void)disconnect;
@end

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,27 @@
//
// MGMHTTPDefines.h
// MGMHTTP copy
//
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
typedef long MGMInteger;
typedef unsigned long MGMUInteger;

View File

@ -0,0 +1,59 @@
//
// MGMHTTPResponse.h
// MGMHTTP
//
// Created by Mr. Gecko on 8/14/13.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import <Foundation/Foundation.h>
#import "MGMHTTPDefines.h"
@interface MGMHTTPResponse : NSObject {
MGMInteger offset;
NSData *data;
}
+ (id)responseWithData:(NSData *)theData;
- (id)initWithData:(NSData *)theData;
+ (id)responseWithString:(NSString *)theString;
- (id)initWithString:(NSString *)theString;
- (MGMInteger)contentLength;
- (MGMInteger)offset;
- (void)setOffset:(MGMInteger)theOffset;
- (NSData *)readDataOfLength:(MGMInteger)theLength;
@end
@interface MGMHTTPFileResponse : MGMHTTPResponse {
NSString *filePath;
NSFileHandle *fileHandle;
}
+ (id)responseWithFilePath:(NSString *)thePath;
- (id)initWithFilePath:(NSString *)thePath;
@end
@interface MGMHTTPMIME : NSObject {
}
+ (NSString *)mimeForExtension:(NSString *)theExtension;
@end

View File

@ -0,0 +1,131 @@
//
// MGMHTTPResponse.m
// MGMHTTP
//
// Created by Mr. Gecko on 8/14/13.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import "MGMHTTPResponse.h"
@implementation MGMHTTPResponse
+ (id)responseWithData:(NSData *)theData {
return [[[self alloc] initWithData:theData] autorelease];
}
- (id)initWithData:(NSData *)theData {
if (self = [super init]) {
data = [theData retain];
}
return self;
}
+ (id)responseWithString:(NSString *)theString {
return [[[self alloc] initWithString:theString] autorelease];
}
- (id)initWithString:(NSString *)theString {
if (self = [super init]) {
data = [[theString dataUsingEncoding:NSUTF8StringEncoding] retain];
}
return self;
}
- (void)dealloc {
[data release];
[super dealloc];
}
- (MGMInteger)contentLength {
return [data length];
}
- (MGMInteger)offset {
return offset;
}
- (void)setOffset:(MGMInteger)theOffset {
offset = theOffset;
}
- (NSData *)readDataOfLength:(MGMInteger)theLength {
MGMInteger remaining = [data length]-offset;
MGMInteger length = theLength<remaining ? theLength : remaining;
NSData *returnData = [data subdataWithRange:NSMakeRange(offset, length)];
offset = offset+length;
return returnData;
}
@end
@implementation MGMHTTPFileResponse
+ (id)responseWithFilePath:(NSString *)thePath {
return [[[self alloc] initWithFilePath:thePath] autorelease];
}
- (id)initWithFilePath:(NSString *)thePath {
if (self = [super init]) {
filePath = [thePath retain];
fileHandle = [[NSFileHandle fileHandleForReadingAtPath:filePath] retain];
}
return self;
}
- (void)dealloc {
[fileHandle release];
[filePath release];
[super dealloc];
}
- (MGMInteger)contentLength {
NSFileManager *manager = [NSFileManager defaultManager];
NSDictionary *fileAttributes = nil;
if ([manager respondsToSelector:@selector(fileAttributesAtPath:traverseLink:)]) {
fileAttributes = [manager fileAttributesAtPath:filePath traverseLink:YES];
} else {
fileAttributes = [manager attributesOfItemAtPath:filePath error:nil];
}
return [[fileAttributes objectForKey:NSFileSize] longValue];
}
- (MGMInteger)offset {
return (MGMInteger)[fileHandle offsetInFile];
}
- (void)setOffset:(MGMInteger)theOffset {
[fileHandle seekToFileOffset:theOffset];
}
- (NSData *)readDataOfLength:(MGMInteger)theLength {
return [fileHandle readDataOfLength:theLength];
}
@end
static NSArray *MGMHTTPMIMEMap = nil;
@implementation MGMHTTPMIME
+ (NSString *)mimeForExtension:(NSString *)theExtension {
if (MGMHTTPMIMEMap==nil) {
MGMHTTPMIMEMap = [[NSArray arrayWithContentsOfFile:[[[NSBundle bundleForClass:self] resourcePath] stringByAppendingPathComponent:@"mimeTypes.plist"]] retain];
}
for (unsigned int mimeIndex=0; mimeIndex<[MGMHTTPMIMEMap count]; mimeIndex++) {
NSDictionary *mime = [MGMHTTPMIMEMap objectAtIndex:mimeIndex];
NSArray *extensions = [mime objectForKey:@"extensions"];
for (unsigned int extensionIndex=0; extensionIndex<[extensions count]; extensionIndex++) {
if ([[extensions objectAtIndex:extensionIndex] isEqualToString:theExtension])
return [mime objectForKey:@"type"];
}
}
return @"text/plain";
}
@end

View File

@ -0,0 +1,88 @@
//
// MGMHTTPServer.h
// MGMHTTP
//
// Created by Mr. Gecko on 8/14/13.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import <Foundation/Foundation.h>
#define MGMHTTPDebug 0
#define MGMHTTPThreaded 0
@class AsyncSocket, MGMHTTPClient, MGMHTTPResponse;
@protocol MGMHTTPServerDelegate
- (Class)httpClientClass;
- (MGMHTTPResponse *)httpResponseForClient:(MGMHTTPClient *)theClient;
- (void)finnishedSendingResponse:(MGMHTTPClient *)theClient;
@end
@interface MGMHTTPServer : NSObject
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= 1060)
<NSNetServiceDelegate>
#endif
{
AsyncSocket *httpSocket;
NSObject<MGMHTTPServerDelegate> *delegate;
Class clientClass;
NSMutableArray *clientConnections;
int port;
NSNetService *bonjour;
NSString *bonjourDomain;
NSString *bonjourType;
NSString *bonjourName;
BOOL bonjourEnabled;
}
+ (id)serverWithPort:(int)thePort delegate:(id)theDelegate;
- (id)initServerWithPort:(int)thePort delegate:(id)theDelegate;
- (AsyncSocket *)httpSocket;
- (NSArray *)clientConnections;
- (id)delegate;
- (void)setDelegate:(id)theDelegate;
- (int)port;
- (void)setPort:(int)thePort;
- (NSString *)bonjourDomain;
- (void)setBonjourDomain:(NSString *)theDomain;
- (NSString *)bonjourType;
- (void)setBonjourType:(NSString *)theType;
- (NSString *)bonjourName;
- (NSString *)bonjourPublishedName;
- (void)setBonjourName:(NSString *)theName;
- (BOOL)isBonjourEnabled;
- (void)setBonjourEnabled:(BOOL)isEnabled;
- (Class)httpClientClass;
- (void)setHTTPClientClass:(Class)theClientClass;
- (BOOL)start:(NSError **)error;
- (void)stop;
@end

View File

@ -0,0 +1,207 @@
//
// MGMHTTPServer.m
// MGMHTTP
//
// Created by Mr. Gecko on 8/14/13.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import "MGMHTTPServer.h"
#import "MGMHTTPClient.h"
#import "AsyncSocket.h"
@implementation MGMHTTPServer
+ (id)serverWithPort:(int)thePort delegate:(id)theDelegate {
return [[[self alloc] initServerWithPort:thePort delegate:theDelegate] autorelease];
}
- (id)initServerWithPort:(int)thePort delegate:(id)theDelegate {
if (self = [super init]) {
httpSocket = [[AsyncSocket alloc] initWithDelegate:self];
port = thePort;
delegate = [theDelegate retain];
clientClass = [MGMHTTPClient class];
[self setBonjourDomain:@"local."];
[self setBonjourType:@"_http._tcp."];
[self setBonjourName:@""];
[self setBonjourEnabled:NO];
clientConnections = [NSMutableArray new];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clientDisconected:) name:MGMClientDisconnectedNotification object:nil];
}
return self;
}
- (void)dealloc {
[httpSocket disconnect];
[httpSocket release];
[clientConnections release];
[bonjour release];
[bonjourDomain release];
[bonjourType release];
[bonjourName release];
[super dealloc];
}
- (AsyncSocket *)httpSocket {
return httpSocket;
}
- (NSArray *)clientConnections {
return clientConnections;
}
- (id)delegate {
return delegate;
}
- (void)setDelegate:(id)theDelegate {
delegate = theDelegate;
}
- (int)port {
return port;
}
- (void)setPort:(int)thePort {
port = thePort;
}
- (NSString *)bonjourDomain {
return bonjourDomain;
}
- (void)setBonjourDomain:(NSString *)theDomain {
[bonjourDomain release];
bonjourDomain = [theDomain retain];
}
- (NSString *)bonjourType {
return bonjourType;
}
- (void)setBonjourType:(NSString *)theType {
[bonjourType release];
bonjourType = [theType retain];
}
- (NSString *)bonjourName {
return bonjourName;
}
- (NSString *)bonjourPublishedName {
return [bonjour name];
}
- (void)setBonjourName:(NSString *)theName {
[bonjourName release];
bonjourName = [theName retain];
}
- (BOOL)isBonjourEnabled {
return bonjourEnabled;
}
- (void)setBonjourEnabled:(BOOL)isEnabled {
bonjourEnabled = isEnabled;
if (bonjourEnabled) {
if (bonjour==nil && [httpSocket isConnected]) {
bonjour = [[NSNetService alloc] initWithDomain:bonjourDomain type:bonjourType name:bonjourName port:port];
[bonjour setDelegate:self];
[bonjour publish];
}
} else {
if (bonjour!=nil) {
[bonjour stop];
[bonjour release];
bonjour = nil;
}
}
}
- (Class)httpClientClass {
return clientClass;
}
- (void)setHTTPClientClass:(Class)theClientClass {
clientClass = theClientClass;
}
- (BOOL)start:(NSError **)error {
BOOL success = [httpSocket acceptOnPort:port error:error];
if (success) {
port = [httpSocket localPort];
#if MGMHTTPDebug
NSLog(@"Started server on port %d", port);
#endif
if (bonjourEnabled) {
bonjour = [[NSNetService alloc] initWithDomain:bonjourDomain type:bonjourType name:bonjourName port:port];
[bonjour setDelegate:self];
[bonjour publish];
}
} else {
NSLog(@"Failed to start Server: %@", *error);
}
return success;
}
- (void)stop {
if(bonjour!=nil) {
[bonjour stop];
[bonjour release];
bonjour = nil;
}
[httpSocket disconnect];
[clientConnections removeAllObjects];
}
- (void)netServiceDidPublish:(NSNetService *)sender {
#if MGMHTTPDebug
NSLog(@"Bonjour Published domain:%@ type:%@ name:%@", [sender domain], [sender type], [sender name]);
#endif
}
- (void)netService:(NSNetService *)sender didNotPublish:(NSDictionary *)errorDict {
NSLog(@"Failed to Publish Bonjour domain:%@ type:%@ name:%@ error:%@", [sender domain], [sender type], [sender name], errorDict);
}
- (int)clientConnectionCount {
int count;
@synchronized(clientConnections) {
count = (int)[clientConnections count];
}
return count;
}
#if MGMHTTPThreaded
- (NSRunLoop *)onSocket:(AsyncSocket *)sock wantsRunLoopForNewSocket:(AsyncSocket *)newSocket {
@synchronized(clientConnections) {
for (unsigned int i=0; i<[clientConnections count]; i++) {
if ([[[clientConnections objectAtIndex:i] clientSocket] isEqual:newSocket])
return [[clientConnections objectAtIndex:i] runLoop];
}
}
return [NSRunLoop currentRunLoop];
}
#endif
- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket {
if (clientClass==[MGMHTTPClient class]) {
if ([delegate respondsToSelector:@selector(httpClientClass)]) {
clientClass = [delegate httpClientClass];
}
}
MGMHTTPClient *theClient = [clientClass clientWithSocket:newSocket server:self];
@synchronized(clientConnections) {
[clientConnections addObject:theClient];
}
}
- (void)clientDisconected:(NSNotification *)theNotification {
@synchronized(clientConnections) {
[clientConnections removeObject:[theNotification object]];
}
}
@end

View File

@ -0,0 +1,34 @@
//
// MGMHTTPClientClass.h
// EmailScheduler
//
// Created by James Coleman on 9/13/14.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import <Foundation/Foundation.h>
#import "MGMHTTP/MGMHTTPClient.h"
@interface MGMHTTPClientClass : MGMHTTPClient {
}
@end

View File

@ -0,0 +1,87 @@
//
// MGMHTTPClientClass.m
// EmailScheduler
//
// Created by James Coleman on 9/13/14.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import "MGMHTTPClientClass.h"
#import "MGMController.h"
#import "MGMJSON.h"
#import "MGMEmail.h"
#import <MailCore/MailCore.h>
@implementation MGMHTTPClientClass
- (void)replyToClient {
MGMController *controller = [MGMController sharedController];
NSString *user = [self requestWithName:@"user"];
NSString *fromEmail = [self requestWithName:@"from"];
NSString *fromName = [self requestWithName:@"from-name"];
NSString *toEmail = [self requestWithName:@"to"];
NSString *toName = [self requestWithName:@"to-name"];
NSString *subject = [self requestWithName:@"subject"];
NSString *message = [self requestWithName:@"message"];
NSString *messageHTML = [self requestWithName:@"message-html"];
NSString *additionalHeadersString = [self requestWithName:@"headers"];
if (fromEmail!=nil && ![fromEmail isEqual:@""] && toEmail!=nil && ![toEmail isEqual:@""] && subject!=nil && ![subject isEqual:@""] && message!=nil && ![message isEqual:@""]) {
if ([[controller emailAddresses] objectForKey:(user!=nil && ![user isEqual:@""] ? user : fromEmail)]==nil) {
NSDictionary *response = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], @"success", [NSString stringWithFormat:@"No handler for email address %@", fromEmail], @"error", nil];
[self print:[response JSONValue]];
} else {
MCOMessageBuilder *builder = [[MCOMessageBuilder alloc] init];
MCOAddress *from = [MCOAddress addressWithDisplayName:fromName mailbox:fromEmail];
MCOAddress *to = [MCOAddress addressWithDisplayName:toName mailbox:toEmail];
[[builder header] setFrom:from];
[[builder header] setTo:@[to]];
[[builder header] setSubject:subject];
[[builder header] setUserAgent:@"MGMEmail/0.1"];
if (messageHTML!=nil && ![messageHTML isEqual:@""]) {
[builder setHTMLBody:messageHTML];
}
[builder setTextBody:message];
NSDictionary *additionalHeaders = (NSDictionary *)[additionalHeadersString parseJSON];
if (additionalHeaders!=nil && [additionalHeaders isKindOfClass:[NSDictionary class]]) {
NSArray *keys = [additionalHeaders allKeys];
for (unsigned int i=0; i<[keys count]; i++) {
[[builder header] setExtraHeaderValue:[additionalHeaders objectForKey:[keys objectAtIndex:i]] forName:[keys objectAtIndex:i]];
}
}
NSData *rfc822Data = [builder data];
MGMEmail *email = [[MGMEmail new] autorelease];
[email setEmailAddress:(user!=nil && ![user isEqual:@""] ? user : fromEmail)];
[email setRFC822Data:rfc822Data];
[controller addToQueue:email];
NSDictionary *response = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"success", nil];
[self print:[response JSONValue]];
}
} else {
NSDictionary *response = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], @"success", @"Invalid input", @"error", nil];
[self print:[response JSONValue]];
}
[super replyToClient];
}
@end

38
EmailScheduler/main.m Normal file
View File

@ -0,0 +1,38 @@
//
// main.m
// EmailScheduler
//
// Created by James Coleman on 9/13/14.
// Copyright (c) 2014 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#import <Foundation/Foundation.h>
#import "MGMController.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
MGMController *controller = [[MGMController alloc] init];
[[NSRunLoop currentRunLoop] run];
[controller release];
}
return 0;
}

1
MailCore.framework/Headers Symbolic link
View File

@ -0,0 +1 @@
Versions/Current/Headers

1
MailCore.framework/MailCore Symbolic link
View File

@ -0,0 +1 @@
Versions/Current/MailCore

View File

@ -0,0 +1 @@
Versions/Current/Resources

View File

@ -0,0 +1,13 @@
#ifndef MAILCORE_MCABSTRACT_H
#define MAILCORE_MCABSTRACT_H
#include <MailCore/MCAbstractMessage.h>
#include <MailCore/MCAbstractMessagePart.h>
#include <MailCore/MCAbstractMultipart.h>
#include <MailCore/MCAbstractPart.h>
#include <MailCore/MCAddress.h>
#include <MailCore/MCMessageConstants.h>
#include <MailCore/MCMessageHeader.h>
#endif

View File

@ -0,0 +1,46 @@
#ifndef MAILCORE_MCABSTRACTMESSAGE_H
#define MAILCORE_MCABSTRACTMESSAGE_H
#include <MailCore/MCBaseTypes.h>
#ifdef __cplusplus
namespace mailcore {
class AbstractPart;
class MessageHeader;
class AbstractMessage : public Object {
public:
AbstractMessage();
virtual ~AbstractMessage();
virtual MessageHeader * header();
virtual void setHeader(MessageHeader * header);
virtual AbstractPart * partForContentID(String * contentID);
virtual AbstractPart * partForUniqueID(String * uniqueID);
virtual Array * /* AbstractPart */ attachments();
virtual Array * /* AbstractPart */ htmlInlineAttachments();
virtual Array * /* AbstractPart */ requiredPartsForRendering();
public: //subclass behavior
AbstractMessage(AbstractMessage * other);
virtual String * description();
virtual Object * copy();
virtual HashMap * serializable();
virtual void importSerializable(HashMap * hashmap);
private:
MessageHeader * mHeader;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,45 @@
#ifndef MAILCORE_MCABSTRACTMESSAGEPART_H
#define MAILCORE_MCABSTRACTMESSAGEPART_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCAbstractPart.h>
#ifdef __cplusplus
namespace mailcore {
class MessageHeader;
class AbstractMessagePart : public AbstractPart {
public:
AbstractMessagePart();
virtual ~AbstractMessagePart();
virtual MessageHeader * header();
virtual void setHeader(MessageHeader * header);
virtual AbstractPart * mainPart();
virtual void setMainPart(AbstractPart * mainPart);
public: //subclass behavior
AbstractMessagePart(AbstractMessagePart * other);
virtual String * description();
virtual Object * copy();
virtual HashMap * serializable();
virtual void importSerializable(HashMap * serializable);
virtual AbstractPart * partForContentID(String * contentID);
virtual AbstractPart * partForUniqueID(String * uniqueID);
private:
AbstractPart * mMainPart;
MessageHeader * mHeader;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,39 @@
#ifndef MAILCORE_MCABSTRACTMULTIPART_H
#define MAILCORE_MCABSTRACTMULTIPART_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCAbstractPart.h>
#ifdef __cplusplus
namespace mailcore {
class AbstractMultipart : public AbstractPart {
public:
AbstractMultipart();
virtual ~AbstractMultipart();
virtual Array * parts();
virtual void setParts(Array * parts);
public: //subclass behavior
AbstractMultipart(AbstractMultipart * other);
virtual String * description();
virtual Object * copy();
virtual HashMap * serializable();
virtual void importSerializable(HashMap * serializable);
virtual AbstractPart * partForContentID(String * contentID);
virtual AbstractPart * partForUniqueID(String * uniqueID);
private:
Array * mParts;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,80 @@
#ifndef MAILCORE_MCABSTRACTPART_H
#define MAILCORE_MCABSTRACTPART_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCMessageConstants.h>
#ifdef __cplusplus
namespace mailcore {
class AbstractMessage;
class AbstractPart : public Object {
public:
AbstractPart();
virtual ~AbstractPart();
virtual PartType partType();
virtual void setPartType(PartType type);
virtual String * filename();
virtual void setFilename(String * filename);
virtual String * mimeType();
virtual void setMimeType(String * mimeType);
virtual String * charset();
virtual void setCharset(String * charset);
virtual String * uniqueID();
virtual void setUniqueID(String * uniqueID);
virtual String * contentID();
virtual void setContentID(String * contentID);
virtual String * contentLocation();
virtual void setContentLocation(String * contentLocation);
virtual String * contentDescription();
virtual void setContentDescription(String * contentDescription);
virtual bool isInlineAttachment();
virtual void setInlineAttachment(bool inlineAttachment);
virtual AbstractPart * partForContentID(String * contentID);
virtual AbstractPart * partForUniqueID(String * uniqueID);
virtual String * decodedStringForData(Data * data);
public: // subclass behavior
AbstractPart(AbstractPart * other);
virtual String * description();
virtual Object * copy();
virtual HashMap * serializable();
virtual void importSerializable(HashMap * serializable);
public: // private
virtual void importIMAPFields(struct mailimap_body_fields * fields,
struct mailimap_body_ext_1part * extension);
virtual void applyUniquePartID();
private:
String * mUniqueID;
String * mFilename;
String * mMimeType;
String * mCharset;
String * mContentID;
String * mContentLocation;
String * mContentDescription;
bool mInlineAttachment;
PartType mPartType;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,65 @@
#ifndef MAILCORE_MCADDRESS_H
#define MAILCORE_MCADDRESS_H
#include <MailCore/MCBaseTypes.h>
#ifdef __cplusplus
namespace mailcore {
class Address : public Object {
public:
Address();
virtual ~Address();
static Address * addressWithDisplayName(String * displayName, String * mailbox);
static Address * addressWithMailbox(String * mailbox);
static Address * addressWithRFC822String(String * RFC822String);
static Address * addressWithNonEncodedRFC822String(String * nonEncodedRFC822String);
static Array * addressesWithRFC822String(String * string);
static Array * addressesWithNonEncodedRFC822String(String * string);
static String * RFC822StringForAddresses(Array * addresses);
static String * nonEncodedRFC822StringForAddresses(Array * addresses);
virtual void setDisplayName(String * displayName);
virtual String * displayName();
virtual void setMailbox(String * address);
virtual String * mailbox();
virtual String * RFC822String();
virtual String * nonEncodedRFC822String();
public: // subclass behavior.
Address(Address * other);
virtual String * description();
virtual bool isEqual(Object * otherObject);
virtual unsigned int hash();
virtual Object * copy();
virtual HashMap * serializable();
virtual void importSerializable(HashMap * serializable);
public: // private
// Must be released
virtual struct mailimf_address * createIMFAddress();
virtual struct mailimf_mailbox * createIMFMailbox();
// Additions
static Address * addressWithIMFMailbox(struct mailimf_mailbox * mb);
static Address * addressWithNonEncodedIMFMailbox(struct mailimf_mailbox * mb);
static Address * addressWithIMAPAddress(struct mailimap_address * imap_addr);
private:
String * mDisplayName;
String * mMailbox;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,34 @@
//
// MCAddressDisplay.h
// testUI
//
// Created by DINH Viêt Hoà on 1/27/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCADDRESSDISPLAY_H
#define MAILCORE_MCADDRESSDISPLAY_H
#include <MailCore/MCAbstract.h>
#ifdef __cplusplus
namespace mailcore {
class AddressDisplay {
public:
static String * displayStringForAddress(Address * address);
static String * shortDisplayStringForAddress(Address * address);
static String * veryShortDisplayStringForAddress(Address * address);
static String * displayStringForAddresses(Array * /* Address */ addresses);
static String * shortDisplayStringForAddresses(Array * /* Address */ addresses);
static String * veryShortDisplayStringForAddresses(Array * /* Address */ addresses);
};
};
#endif
#endif

View File

@ -0,0 +1,58 @@
#ifndef MAILCORE_MCARRAY_H
#define MAILCORE_MCARRAY_H
#include <MailCore/MCObject.h>
#ifdef __cplusplus
typedef struct carray_s carray;
namespace mailcore {
class String;
class Array : public Object {
public:
Array();
virtual ~Array();
static Array * array();
static Array * arrayWithObject(Object * obj);
virtual unsigned int count();
virtual void addObject(Object * obj);
virtual void removeObjectAtIndex(unsigned int idx);
virtual void removeObject(Object * obj);
virtual int indexOfObject(Object * obj);
virtual Object * objectAtIndex(unsigned int idx);
virtual void replaceObject(unsigned int idx, Object * obj);
virtual void insertObject(unsigned int idx, Object * obj);
virtual void removeAllObjects();
virtual void addObjectsFromArray(Array * array);
virtual Object * lastObject();
virtual void removeLastObject();
virtual bool containsObject(Object * obj);
virtual Array * sortedArray(int (* compare)(void * a, void * b, void * context), void * context);
virtual void sortArray(int (* compare)(void * a, void * b, void * context), void * context);
virtual String * componentsJoinedByString(String * delimiter);
public: // subclass behavior
Array(Array * o);
virtual String * description();
virtual Object * copy();
virtual HashMap * serializable();
virtual void importSerializable(HashMap * serializable);
private:
carray * mArray;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,15 @@
#ifndef MAILCORE_MCASSERT_H
#define MAILCORE_MCASSERT_H
#define MCAssert(cond) MCAssertInternal(__FILE__, __LINE__, cond, #cond)
#ifdef __cplusplus
extern "C" {
#endif
void MCAssertInternal(const char * filename, unsigned int line, int cond, const char * condString);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,18 @@
//
// MCAsync.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/11/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCASYNC_H
#define MAILCORE_MCASYNC_H
#include <MailCore/MCAsyncSMTP.h>
#include <MailCore/MCAsyncIMAP.h>
#include <MailCore/MCAsyncPOP.h>
#include <MailCore/MCAsyncNNTP.h>
#endif

View File

@ -0,0 +1,35 @@
//
// MCAsyncIMAP.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/12/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCASYNCIMAP_H
#define MAILCORE_MCASYNCIMAP_H
#include <MailCore/MCIMAPAsyncSession.h>
#include <MailCore/MCIMAPOperation.h>
#include <MailCore/MCIMAPFetchFoldersOperation.h>
#include <MailCore/MCIMAPAppendMessageOperation.h>
#include <MailCore/MCIMAPCopyMessagesOperation.h>
#include <MailCore/MCIMAPFetchMessagesOperation.h>
#include <MailCore/MCIMAPFetchContentOperation.h>
#include <MailCore/MCIMAPIdleOperation.h>
#include <MailCore/MCIMAPFolderInfoOperation.h>
#include <MailCore/MCIMAPFolderStatusOperation.h>
#include <MailCore/MCIMAPSession.h>
#include <MailCore/MCIMAPNamespace.h>
#include <MailCore/MCIMAPIdentity.h>
#include <MailCore/MCIMAPSearchOperation.h>
#include <MailCore/MCIMAPSearchExpression.h>
#include <MailCore/MCIMAPFetchNamespaceOperation.h>
#include <MailCore/MCIMAPIdentityOperation.h>
#include <MailCore/MCIMAPCapabilityOperation.h>
#include <MailCore/MCIMAPQuotaOperation.h>
#include <MailCore/MCIMAPOperationCallback.h>
#include <MailCore/MCIMAPMessageRenderingOperation.h>
#endif

View File

@ -0,0 +1,21 @@
//
// MCAsyncNNTP.h
// mailcore2
//
// Created by Robert Widmann on 8/13/14.
// Copyright (c) 2014 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCASYNCNNTP_H
#define MAILCORE_MCASYNCNNTP_H
#include <MailCore/MCNNTPAsyncSession.h>
#include <MailCore/MCNNTPOperation.h>
#include <MailCore/MCNNTPFetchHeaderOperation.h>
#include <MailCore/MCNNTPFetchArticleOperation.h>
#include <MailCore/MCNNTPFetchArticlesOperation.h>
#include <MailCore/MCNNTPListNewsgroupsOperation.h>
#include <MailCore/MCNNTPOperationCallback.h>
#endif

View File

@ -0,0 +1,20 @@
//
// MCAsyncPOP.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/16/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCASYNCPOP_H
#define MAILCORE_MCASYNCPOP_H
#include <MailCore/MCPOPAsyncSession.h>
#include <MailCore/MCPOPOperation.h>
#include <MailCore/MCPOPFetchHeaderOperation.h>
#include <MailCore/MCPOPFetchMessageOperation.h>
#include <MailCore/MCPOPFetchMessagesOperation.h>
#include <MailCore/MCPOPOperationCallback.h>
#endif

View File

@ -0,0 +1,17 @@
//
// MCAsyncSMTP.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/11/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCASYNCSMTP_H
#define MAILCORE_MCASYNCSMTP_H
#include <MailCore/MCSMTPAsyncSession.h>
#include <MailCore/MCSMTPOperation.h>
#include <MailCore/MCSMTPOperationCallback.h>
#endif

View File

@ -0,0 +1,63 @@
#ifndef MAILCORE_MCATTACHMENT_H
#define MAILCORE_MCATTACHMENT_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCAbstractPart.h>
#include <MailCore/MCAbstractMultipart.h>
#include <MailCore/MCMessageConstants.h>
#ifdef __cplusplus
namespace mailcore {
class MessagePart;
class Attachment : public AbstractPart {
public:
static String * mimeTypeForFilename(String * filename);
static Attachment * attachmentWithContentsOfFile(String * filename);
static Attachment * attachmentWithData(String * filename, Data * data);
static Attachment * attachmentWithHTMLString(String * htmlString);
static Attachment * attachmentWithRFC822Message(Data * messageData);
static Attachment * attachmentWithText(String * text);
Attachment();
virtual ~Attachment();
virtual void setData(Data * data);
virtual Data * data();
virtual String * decodedString();
virtual void setContentTypeParameter(String * name, String * value);
virtual void removeContentTypeParameter(String * name);
virtual String * contentTypeParameterValueForName(String *name);
virtual Array * allContentTypeParametersNames();
public: // subclass behavior
Attachment(Attachment * other);
virtual String * description();
virtual Object * copy();
public: // private
static AbstractPart * attachmentsWithMIME(struct mailmime * mime);
private:
Data * mData;
HashMap * mContentTypeParameters;
HashMap * mlcContentTypeParameters;
void init();
static void fillMultipartSubAttachments(AbstractMultipart * multipart, struct mailmime * mime);
static AbstractPart * attachmentsWithMIMEWithMain(struct mailmime * mime, bool isMain);
static Attachment * attachmentWithSingleMIME(struct mailmime * mime);
static MessagePart * attachmentWithMessageMIME(struct mailmime * mime);
static Encoding encodingForMIMEEncoding(struct mailmime_mechanism * mechanism, int defaultMimeEncoding);
static HashMap * readMimeTypesFile(String * filename);
void setContentTypeParameters(HashMap * parameters);
};
}
#endif
#endif

View File

@ -0,0 +1,44 @@
#ifndef MAILCORE_MCAUTORELEASEPOOL_H
#define MAILCORE_MCAUTORELEASEPOOL_H
#include <MailCore/MCObject.h>
#include <pthread.h>
#ifdef __cplusplus
typedef struct carray_s carray;
namespace mailcore {
class AutoreleasePool : public Object {
public:
AutoreleasePool();
virtual ~AutoreleasePool();
static void autorelease(Object * obj);
public: // subclass behavior
virtual String * description();
private:
static void init();
static pthread_key_t autoreleasePoolStackKey;
carray * mPoolObjects;
static carray * createAutoreleasePoolStackIfNeeded();
static void destroyAutoreleasePoolStack(void *);
static void initAutoreleasePoolStackKey();
static AutoreleasePool * currentAutoreleasePool();
virtual void add(Object * obj);
#ifdef __APPLE__
void * mAppleAutoreleasePool;
static void * createAppleAutoreleasePool();
static void releaseAppleAutoreleasePool(void * appleAutoreleasePool);
#endif
};
}
#endif
#endif

View File

@ -0,0 +1,30 @@
#ifndef MAILCORE_MCBASETYPES_H
#define MAILCORE_MCBASETYPES_H
#include <MailCore/MCAutoreleasePool.h>
#include <MailCore/MCObject.h>
#include <MailCore/MCValue.h>
#include <MailCore/MCString.h>
#include <MailCore/MCData.h>
#include <MailCore/MCArray.h>
#include <MailCore/MCHashMap.h>
#include <MailCore/MCJSON.h>
#include <MailCore/MCMD5.h>
#include <MailCore/MCNull.h>
#include <MailCore/MCSet.h>
#include <MailCore/MCHash.h>
#include <MailCore/MCLog.h>
#include <MailCore/MCAssert.h>
#include <MailCore/MCUtils.h>
#include <MailCore/MCRange.h>
#include <MailCore/MCIndexSet.h>
#include <MailCore/MCOperation.h>
#include <MailCore/MCOperationQueue.h>
#include <MailCore/MCOperationCallback.h>
#include <MailCore/MCLibetpanTypes.h>
#include <MailCore/MCICUTypes.h>
#include <MailCore/MCIterator.h>
#include <MailCore/MCConnectionLogger.h>
#endif

View File

@ -0,0 +1,45 @@
//
// MCConnectionLogger.h
// mailcore2
//
// Created by DINH Viêt Hoà on 6/24/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_CONNECTION_LOGGER_H
#define MAILCORE_CONNECTION_LOGGER_H
#include <stdlib.h>
#ifdef __cplusplus
namespace mailcore {
class Data;
enum ConnectionLogType {
// Received data
ConnectionLogTypeReceived,
// Sent data
ConnectionLogTypeSent,
// Sent private data
ConnectionLogTypeSentPrivate,
// Parse error
ConnectionLogTypeErrorParse,
// Error while receiving data - log() is called with a NULL buffer.
ConnectionLogTypeErrorReceived,
// Error while sending data - log() is called with a NULL buffer.
ConnectionLogTypeErrorSent,
};
class ConnectionLogger {
public:
virtual void log(void * sender, ConnectionLogType logType, Data * buffer) {}
};
}
#endif
#endif

View File

@ -0,0 +1,23 @@
//
// Core.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/10/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCCORE_H
#define MAILCORE_MCCORE_H
#include <MailCore/MCAbstract.h>
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCIMAP.h>
#include <MailCore/MCPOP.h>
#include <MailCore/MCNNTP.h>
#include <MailCore/MCRFC822.h>
#include <MailCore/MCSMTP.h>
#include <MailCore/MCRenderer.h>
#include <MailCore/MCProvider.h>
#endif

View File

@ -0,0 +1,68 @@
#ifndef MAILCORE_MCDATA_H
#define MAILCORE_MCDATA_H
#include <MailCore/MCObject.h>
#include <MailCore/MCMessageConstants.h>
#ifdef __cplusplus
namespace mailcore {
class String;
class Data : public Object {
public:
Data();
Data(int capacity);
Data(const char * bytes, unsigned int length);
virtual ~Data();
static Data * data();
static Data * dataWithCapacity(int capacity);
static Data * dataWithContentsOfFile(String * filename);
static Data * dataWithBytes(const char * bytes, unsigned int length);
virtual char * bytes();
virtual unsigned int length();
virtual void appendData(Data * otherData);
virtual void appendBytes(const char * bytes, unsigned int length);
virtual void setBytes(const char * bytes, unsigned int length);
virtual void setData(Data * otherData);
// Helpers
virtual String * stringWithDetectedCharset();
virtual String * stringWithDetectedCharset(String * charset, bool isHTML);
virtual String * stringWithCharset(const char * charset);
virtual Data * decodedDataUsingEncoding(Encoding encoding);
virtual String * base64String();
public: // private
virtual String * charsetWithFilteredHTML(bool filterHTML, String * hintCharset = NULL);
public: // subclass behavior
Data(Data * otherData);
virtual String * description();
virtual Object * copy();
virtual bool isEqual(Object * otherObject);
virtual unsigned int hash();
virtual HashMap * serializable();
virtual void importSerializable(HashMap * serializable);
private:
char * mBytes;
unsigned int mLength;
unsigned int mAllocated;
void allocate(unsigned int length);
void reset();
String * charsetWithFilteredHTMLWithoutHint(bool filterHTML);
};
}
#endif
#endif

View File

@ -0,0 +1,75 @@
//
// MCDateFormatter.h
// testUI
//
// Created by DINH Viêt Hoà on 1/28/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCDATEFORMATTER_H
#define MAILCORE_MCDATEFORMATTER_H
#include <MailCore/MCBaseTypes.h>
// predeclare UDateFormat
// copied from <unicode/udat.h>
typedef void * UDateFormat;
#ifdef __cplusplus
namespace mailcore {
class String;
// Uses same values as UDateFormatStyle
enum DateFormatStyle {
DateFormatStyleFull = 0 /* UDAT_FULL*/,
DateFormatStyleLong = 1 /* UDAT_LONG */,
DateFormatStyleMedium = 2 /* UDAT_MEDIUM */,
DateFormatStyleShort = 3 /* UDAT_SHORT */,
DateFormatStyleNone = -1 /* UDAT_NONE */,
};
class DateFormatter : public Object {
public:
DateFormatter();
virtual ~DateFormatter();
static DateFormatter * dateFormatter();
virtual void setDateStyle(DateFormatStyle style);
virtual DateFormatStyle dateStyle();
virtual void setTimeStyle(DateFormatStyle style);
virtual DateFormatStyle timeStyle();
virtual void setLocale(String * locale);
virtual String * locale();
virtual void setTimezone(String * timezone);
virtual String * timezone();
virtual void setDateFormat(String * dateFormat);
virtual String * dateFormat();
virtual String * stringFromDate(time_t date);
virtual time_t dateFromString(String * dateString);
private:
UDateFormat * mDateFormatter;
DateFormatStyle mDateStyle;
DateFormatStyle mTimeStyle;
String * mDateFormat;
String * mTimezone;
String * mLocale;
void * mAppleDateFormatter;
void prepare();
};
}
#endif
#endif /* defined(__testUI__MCDateFormatter__) */

View File

@ -0,0 +1,61 @@
//
// MCHTMLRendererCallback.h
// mailcore2
//
// Created by DINH Viêt Hoà on 2/2/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCHTMLRENDERERCALLBACK_H
#define MAILCORE_MCHTMLRENDERERCALLBACK_H
#include <MailCore/MCAbstract.h>
#include <MailCore/MCIMAP.h>
#ifdef __cplusplus
namespace mailcore {
class MessageParser;
class HTMLRendererIMAPCallback {
public:
HTMLRendererIMAPCallback() {}
virtual ~HTMLRendererIMAPCallback() {}
virtual Data * dataForIMAPPart(String * folder, IMAPPart * part) { return NULL; }
virtual void prefetchAttachmentIMAPPart(String * folder, IMAPPart * part) {}
virtual void prefetchImageIMAPPart(String * folder, IMAPPart * part) {}
};
class HTMLRendererTemplateCallback {
public:
virtual bool canPreviewPart(AbstractPart * part);
virtual bool shouldShowPart(AbstractPart * part);
virtual HashMap * templateValuesForHeader(MessageHeader * header);
virtual HashMap * templateValuesForPart(AbstractPart * part);
virtual String * templateForMainHeader(MessageHeader * header);
virtual String * templateForImage(AbstractPart * part);
virtual String * templateForAttachment(AbstractPart * part);
virtual String * templateForMessage(AbstractMessage * message);
virtual String * templateForEmbeddedMessage(AbstractMessagePart * part);
virtual String * templateForEmbeddedMessageHeader(MessageHeader * header);
virtual String * templateForAttachmentSeparator();
virtual String * cleanHTMLForPart(String * html);
// Can be used to filter some HTML tags.
virtual String * filterHTMLForPart(String * html);
// Can be used to hide quoted text.
virtual String * filterHTMLForMessage(String * html);
};
}
#endif
#endif

View File

@ -0,0 +1,15 @@
#ifndef MAILCORE_MCHASH_H
#define MAILCORE_MCHASH_H
#ifdef __cplusplus
namespace mailcore {
unsigned int hashCompute(const char * key, unsigned int len);
}
#endif
#endif

View File

@ -0,0 +1,52 @@
#ifndef MAILCORE_MCHASHMAP_H
#define MAILCORE_MCHASHMAP_H
#include <MailCore/MCObject.h>
#ifdef __cplusplus
namespace mailcore {
class String;
class Array;
struct HashMapCell;
typedef HashMapCell HashMapIter;
class HashMap : public Object {
public:
HashMap();
virtual ~HashMap();
static HashMap * hashMap();
virtual unsigned int count();
virtual void setObjectForKey(Object * key, Object * value);
virtual void removeObjectForKey(Object * key);
virtual Object * objectForKey(Object * key);
virtual Array * allKeys();
virtual Array * allValues();
virtual void removeAllObjects();
public: // subclass behavior
HashMap(HashMap * o);
virtual String * description();
virtual Object * copy();
virtual HashMap * serializable();
virtual void importSerializable(HashMap * serializable);
private:
unsigned int mAllocated;
unsigned int mCount;
void ** mCells;
HashMapIter * iteratorBegin();
HashMapIter * iteratorNext(HashMapIter * iter);
void allocate(unsigned int size);
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,19 @@
//
// MCICUTypes.h
// mailcore2
//
// Created by DINH Viêt Hoà on 4/18/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCICUTYPES_H
#define MAILCORE_MCICUTYPES_H
#if defined(__CHAR16_TYPE__)
typedef __CHAR16_TYPE__ UChar;
#else
typedef uint16_t UChar;
#endif
#endif

View File

@ -0,0 +1,19 @@
#ifndef MAILCORE_MCIMAP_H
#define MAILCORE_MCIMAP_H
#include <MailCore/MCIMAPFolder.h>
#include <MailCore/MCIMAPMessage.h>
#include <MailCore/MCIMAPMessagePart.h>
#include <MailCore/MCIMAPMultipart.h>
#include <MailCore/MCIMAPNamespace.h>
#include <MailCore/MCIMAPNamespaceItem.h>
#include <MailCore/MCIMAPPart.h>
#include <MailCore/MCIMAPProgressCallback.h>
#include <MailCore/MCIMAPSearchExpression.h>
#include <MailCore/MCIMAPSession.h>
#include <MailCore/MCIMAPSyncResult.h>
#include <MailCore/MCIMAPFolderStatus.h>
#include <MailCore/MCIMAPIdentity.h>
#endif

View File

@ -0,0 +1,55 @@
//
// MCIMAPAppendMessageOperation.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/12/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPAPPENDMESSAGEOPERATION_H
#define MAILCORE_MCIMAPAPPENDMESSAGEOPERATION_H
#include <MailCore/MCIMAPOperation.h>
#include <MailCore/MCMessageConstants.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPAppendMessageOperation : public IMAPOperation {
public:
IMAPAppendMessageOperation();
virtual ~IMAPAppendMessageOperation();
virtual void setMessageData(Data * messageData);
virtual Data * messageData();
virtual void setFlags(MessageFlag flags);
virtual MessageFlag flags();
virtual void setCustomFlags(Array * customFlags);
virtual Array * customFlags();
virtual void setDate(time_t date);
virtual time_t date();
virtual uint32_t createdUID();
public: // subclass behavior
virtual void main();
private:
Data * mMessageData;
MessageFlag mFlags;
Array * mCustomFlags;
time_t mDate;
uint32_t mCreatedUID;
};
}
#endif
#endif

View File

@ -0,0 +1,206 @@
//
// MCIMAPAccount.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/17/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPACCOUNT_H
#define MAILCORE_MCIMAPACCOUNT_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCMessageConstants.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPOperation;
class IMAPFetchFoldersOperation;
class IMAPAppendMessageOperation;
class IMAPCopyMessagesOperation;
class IMAPFetchMessagesOperation;
class IMAPFetchContentOperation;
class IMAPIdleOperation;
class IMAPFolderInfoOperation;
class IMAPFolderStatusOperation;
class IMAPNamespace;
class IMAPSearchOperation;
class IMAPSearchExpression;
class IMAPFetchNamespaceOperation;
class IMAPIdentityOperation;
class IMAPAsyncConnection;
class IMAPCapabilityOperation;
class IMAPQuotaOperation;
class IMAPMessageRenderingOperation;
class IMAPMessage;
class IMAPSession;
class IMAPIdentity;
class OperationQueueCallback;
class IMAPAsyncSession : public Object {
public:
IMAPAsyncSession();
virtual ~IMAPAsyncSession();
virtual void setHostname(String * hostname);
virtual String * hostname();
virtual void setPort(unsigned int port);
virtual unsigned int port();
virtual void setUsername(String * username);
virtual String * username();
virtual void setPassword(String * password);
virtual String * password();
// To authenticate using OAuth2, username and oauth2token should be set.
// auth type to use is AuthTypeOAuth2.
virtual void setOAuth2Token(String * token);
virtual String * OAuth2Token();
virtual void setAuthType(AuthType authType);
virtual AuthType authType();
virtual void setConnectionType(ConnectionType connectionType);
virtual ConnectionType connectionType();
virtual void setTimeout(time_t timeout);
virtual time_t timeout();
virtual void setCheckCertificateEnabled(bool enabled);
virtual bool isCheckCertificateEnabled();
virtual void setVoIPEnabled(bool enabled);
virtual bool isVoIPEnabled();
virtual void setDefaultNamespace(IMAPNamespace * ns);
virtual IMAPNamespace * defaultNamespace();
virtual void setAllowsFolderConcurrentAccessEnabled(bool enabled);
virtual bool allowsFolderConcurrentAccessEnabled();
virtual void setMaximumConnections(unsigned int maxConnections);
virtual unsigned int maximumConnections();
virtual void setConnectionLogger(ConnectionLogger * logger);
virtual ConnectionLogger * connectionLogger();
#ifdef __APPLE__
virtual void setDispatchQueue(dispatch_queue_t dispatchQueue);
virtual dispatch_queue_t dispatchQueue();
#endif
virtual void setOperationQueueCallback(OperationQueueCallback * callback);
virtual OperationQueueCallback * operationQueueCallback();
virtual bool isOperationQueueRunning();
virtual void cancelAllOperations();
virtual IMAPIdentity * serverIdentity();
virtual IMAPIdentity * clientIdentity();
virtual String * gmailUserDisplayName();
virtual IMAPFolderInfoOperation * folderInfoOperation(String * folder);
virtual IMAPFolderStatusOperation * folderStatusOperation(String * folder);
virtual IMAPFetchFoldersOperation * fetchSubscribedFoldersOperation();
virtual IMAPFetchFoldersOperation * fetchAllFoldersOperation();
virtual IMAPOperation * renameFolderOperation(String * folder, String * otherName);
virtual IMAPOperation * deleteFolderOperation(String * folder);
virtual IMAPOperation * createFolderOperation(String * folder);
virtual IMAPOperation * subscribeFolderOperation(String * folder);
virtual IMAPOperation * unsubscribeFolderOperation(String * folder);
virtual IMAPAppendMessageOperation * appendMessageOperation(String * folder, Data * messageData, MessageFlag flags, Array * customFlags = NULL);
virtual IMAPCopyMessagesOperation * copyMessagesOperation(String * folder, IndexSet * uids, String * destFolder);
virtual IMAPOperation * expungeOperation(String * folder);
virtual IMAPFetchMessagesOperation * fetchMessagesByUIDOperation(String * folder, IMAPMessagesRequestKind requestKind,
IndexSet * indexes);
virtual IMAPFetchMessagesOperation * fetchMessagesByNumberOperation(String * folder, IMAPMessagesRequestKind requestKind,
IndexSet * indexes);
virtual IMAPFetchMessagesOperation * syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind,
IndexSet * indexes, uint64_t modSeq);
virtual IMAPFetchContentOperation * fetchMessageByUIDOperation(String * folder, uint32_t uid, bool urgent = false);
virtual IMAPFetchContentOperation * fetchMessageAttachmentByUIDOperation(String * folder, uint32_t uid, String * partID,
Encoding encoding, bool urgent = false);
virtual IMAPOperation * storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags = NULL);
virtual IMAPOperation * storeLabelsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels);
virtual IMAPSearchOperation * searchOperation(String * folder, IMAPSearchKind kind, String * searchString);
virtual IMAPSearchOperation * searchOperation(String * folder, IMAPSearchExpression * expression);
virtual IMAPIdleOperation * idleOperation(String * folder, uint32_t lastKnownUID);
virtual IMAPFetchNamespaceOperation * fetchNamespaceOperation();
virtual IMAPIdentityOperation * identityOperation(IMAPIdentity * identity);
virtual IMAPOperation * connectOperation();
virtual IMAPOperation * checkAccountOperation();
virtual IMAPOperation * disconnectOperation();
virtual IMAPCapabilityOperation * capabilityOperation();
virtual IMAPQuotaOperation * quotaOperation();
virtual IMAPOperation * noopOperation();
virtual IMAPMessageRenderingOperation * htmlRenderingOperation(IMAPMessage * message, String * folder);
virtual IMAPMessageRenderingOperation * htmlBodyRenderingOperation(IMAPMessage * message, String * folder);
virtual IMAPMessageRenderingOperation * plainTextRenderingOperation(IMAPMessage * message, String * folder);
virtual IMAPMessageRenderingOperation * plainTextBodyRenderingOperation(IMAPMessage * message, String * folder, bool stripWhitespace);
public: // private
virtual void automaticConfigurationDone(IMAPSession * session);
virtual void operationRunningStateChanged();
virtual IMAPAsyncConnection * sessionForFolder(String * folder, bool urgent = false);
private:
Array * mSessions;
String * mHostname;
unsigned int mPort;
String * mUsername;
String * mPassword;
String * mOAuth2Token;
AuthType mAuthType;
ConnectionType mConnectionType;
bool mCheckCertificateEnabled;
bool mVoIPEnabled;
IMAPNamespace * mDefaultNamespace;
time_t mTimeout;
bool mAllowsFolderConcurrentAccessEnabled;
unsigned int mMaximumConnections;
ConnectionLogger * mConnectionLogger;
bool mAutomaticConfigurationDone;
IMAPIdentity * mServerIdentity;
IMAPIdentity * mClientIdentity;
bool mQueueRunning;
OperationQueueCallback * mOperationQueueCallback;
#if __APPLE__
dispatch_queue_t mDispatchQueue;
#endif
String * mGmailUserDisplayName;
virtual IMAPAsyncConnection * session();
virtual IMAPAsyncConnection * matchingSessionForFolder(String * folder);
virtual IMAPAsyncConnection * availableSession();
virtual IMAPMessageRenderingOperation * renderingOperation(IMAPMessage * message,
String * folder,
IMAPMessageRenderingType type);
};
}
#endif
#endif

View File

@ -0,0 +1,38 @@
//
// MCIMAPCapabilityOperation.h
// mailcore2
//
// Created by DINH Viêt Hoà on 3/4/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPCAPABILITYOPERATION_H
#define MAILCORE_MCIMAPCAPABILITYOPERATION_H
#include <MailCore/MCIMAPOperation.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPCapabilityOperation : public IMAPOperation {
public:
IMAPCapabilityOperation();
virtual ~IMAPCapabilityOperation();
// Result.
virtual IndexSet * capabilities();
public: // subclass behavior
virtual void main();
private:
IndexSet * mCapabilities;
};
}
#endif
#endif

View File

@ -0,0 +1,28 @@
//
// MCIMAPConnectOperation.h
// mailcore2
//
// Created by Ryan Walklin on 6/09/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPCONNECTOPERATION_H
#define MAILCORE_MCIMAPCONNECTOPERATION_H
#include <MailCore/MCIMAPOperation.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPConnectOperation : public IMAPOperation {
public: // subclass behavior
virtual void main();
};
}
#endif
#endif /* defined(__MAILCORE_MCIMAPCONNECTOPERATION_H_) */

View File

@ -0,0 +1,46 @@
//
// MCIMAPCopyMessagesOperation.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/12/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPCOPYMESSAGESOPERATION_H
#define MAILCORE_MCIMAPCOPYMESSAGESOPERATION_H
#include <MailCore/MCIMAPOperation.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPCopyMessagesOperation : public IMAPOperation {
public:
IMAPCopyMessagesOperation();
virtual ~IMAPCopyMessagesOperation();
virtual void setDestFolder(String * destFolder);
virtual String * destFolder();
virtual void setUids(IndexSet * uids);
virtual IndexSet * uids();
// Result.
virtual HashMap * uidMapping();
public: // subclass behavior
virtual void main();
private:
IndexSet * mUids;
String * mDestFolder;
HashMap * mUidMapping;
};
}
#endif
#endif

View File

@ -0,0 +1,51 @@
//
// IMAPFetchContentOperation.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/12/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_IMAPFETCHCONTENTOPERATION_H
#define MAILCORE_IMAPFETCHCONTENTOPERATION_H
#include <MailCore/MCIMAPOperation.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPFetchContentOperation : public IMAPOperation {
public:
IMAPFetchContentOperation();
virtual ~IMAPFetchContentOperation();
virtual void setUid(uint32_t uid);
virtual uint32_t uid();
virtual void setPartID(String * partID);
virtual String * partID();
virtual void setEncoding(Encoding encoding);
virtual Encoding encoding();
// Result.
virtual Data * data();
public: // subclass behavior
virtual void main();
private:
uint32_t mUid;
String * mPartID;
Encoding mEncoding;
Data * mData;
};
}
#endif
#endif

View File

@ -0,0 +1,44 @@
//
// MCIMAPFetchFoldersOperation.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/12/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPFETCHFOLDERSOPERATION_H
#define MAILCORE_MCIMAPFETCHFOLDERSOPERATION_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCIMAPOperation.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPFetchFoldersOperation : public IMAPOperation {
public:
IMAPFetchFoldersOperation();
virtual ~IMAPFetchFoldersOperation();
virtual void setFetchSubscribedEnabled(bool enabled);
virtual bool isFetchSubscribedEnabled();
// Result.
virtual Array * /* IMAPFolder */ folders();
public: // subclass behavior
virtual void main();
private:
bool mFetchSubscribedEnabled;
Array * mFolders;
};
}
#endif
#endif

View File

@ -0,0 +1,61 @@
//
// IMAPFetchMessagesOperation.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/12/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPFETCHMESSAGESOPERATION_H
#define MAILCORE_MCIMAPFETCHMESSAGESOPERATION_H
#include <MailCore/MCIMAPOperation.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPFetchMessagesOperation : public IMAPOperation {
public:
IMAPFetchMessagesOperation();
virtual ~IMAPFetchMessagesOperation();
virtual void setFetchByUidEnabled(bool enabled);
virtual bool isFetchByUidEnabled();
virtual void setIndexes(IndexSet * indexes);
virtual IndexSet * indexes();
virtual void setModSequenceValue(uint64_t modseq);
virtual uint64_t modSequenceValue();
virtual void setKind(IMAPMessagesRequestKind kind);
virtual IMAPMessagesRequestKind kind();
virtual void setExtraHeaders(Array * extraHeaders);
virtual Array * extraHeaders();
// Result.
virtual Array * /* IMAPMessage */ messages();
virtual IndexSet * vanishedMessages();
public: // subclass behavior
virtual void main();
private:
bool mFetchByUidEnabled;
IndexSet * mIndexes;
IMAPMessagesRequestKind mKind;
Array * /* String */ mExtraHeaders;
Array * /* IMAPMessage */ mMessages;
IndexSet * mVanishedMessages;
uint64_t mModSequenceValue;
};
}
#endif
#endif

View File

@ -0,0 +1,39 @@
//
// IMAPFetchNamespaceOperation.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/12/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPFETCHNAMESPACEOPERATION_H
#define MAILCORE_MCIMAPFETCHNAMESPACEOPERATION_H
#include <MailCore/MCIMAPOperation.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPFetchNamespaceOperation : public IMAPOperation {
public:
IMAPFetchNamespaceOperation();
virtual ~IMAPFetchNamespaceOperation();
// Result.
virtual HashMap * namespaces();
public: // subclass behavior
virtual void main();
private:
HashMap * mNamespaces;
};
}
#endif
#endif

View File

@ -0,0 +1,42 @@
#ifndef MAILCORE_MCIMAPFOLDER_H
#define MAILCORE_MCIMAPFOLDER_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCMessageConstants.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPFolder : public Object {
public:
IMAPFolder();
virtual ~IMAPFolder();
virtual void setPath(String * path);
virtual String * path();
virtual void setDelimiter(char delimiter);
virtual char delimiter();
virtual void setFlags(IMAPFolderFlag flags);
virtual IMAPFolderFlag flags();
public: // subclass behavior
IMAPFolder(IMAPFolder * other);
virtual Object * copy();
virtual String * description();
private:
String * mPath;
char mDelimiter;
IMAPFolderFlag mFlags;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,49 @@
//
// MCIMAPFolderInfoOperation.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/13/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPFOLDERINFOOPERATION_H
#define MAILCORE_MCIMAPFOLDERINFOOPERATION_H
#include <MailCore/MCIMAPOperation.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPFolderInfoOperation : public IMAPOperation {
public:
IMAPFolderInfoOperation();
virtual ~IMAPFolderInfoOperation();
virtual uint32_t uidNext();
virtual uint32_t uidValidity();
virtual uint64_t modSequenceValue();
virtual int messageCount();
virtual uint32_t firstUnseenUid();
virtual bool allowsNewPermanentFlags();
public: // subclass behavior
virtual void main();
private:
uint32_t mUidNext;
uint32_t mUidValidity;
uint64_t mModSequenceValue;
int mMessageCount;
uint32_t mFirstUnseenUid;
bool mAllowsNewPermanentFlags;
};
}
#endif
#endif

View File

@ -0,0 +1,64 @@
//
// MCIMAPFolderStatus.h
// mailcore2
//
// Created by Sebastian on 6/11/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPFOLDERSTATUS_H
#define MAILCORE_MCIMAPFOLDERSTATUS_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCMessageConstants.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPFolderStatus : public Object {
public:
IMAPFolderStatus();
virtual ~IMAPFolderStatus();
virtual void setUnseenCount(uint32_t unseen);
virtual uint32_t unseenCount();
virtual void setMessageCount(uint32_t messages);
virtual uint32_t messageCount();
virtual void setRecentCount(uint32_t recent);
virtual uint32_t recentCount();
virtual void setUidNext(uint32_t uidNext);
virtual uint32_t uidNext();
virtual void setUidValidity(uint32_t uidValidity);
virtual uint32_t uidValidity();
virtual void setHighestModSeqValue(uint64_t highestModSeqValue);
virtual uint64_t highestModSeqValue();
public: // subclass behavior
IMAPFolderStatus(IMAPFolderStatus * other);
virtual Object * copy();
virtual String * description();
private:
uint32_t mUnseenCount;
uint32_t mMessageCount;
uint32_t mRecentCount;
uint32_t mUidNext;
uint32_t mUidValidity;
uint64_t mHighestModSeqValue;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,41 @@
//
// MCIMAPFolderStatusOperation.h
// mailcore2
//
// Created by Sebastian on 6/5/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPFOLDERSTATUSOPERATION_H
#define MAILCORE_MCIMAPFOLDERSTATUSOPERATION_H
#include <MailCore/MCIMAPOperation.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPFolderStatus;
class IMAPFolderStatusOperation : public IMAPOperation {
public:
IMAPFolderStatusOperation();
virtual ~IMAPFolderStatusOperation();
// Results.
virtual IMAPFolderStatus * status();
public: // subclass behavior
virtual void main();
private:
IMAPFolderStatus * mStatus;
};
}
#endif
#endif

View File

@ -0,0 +1,54 @@
//
// MCIMAPIdentity.h
// mailcore2
//
// Created by Hoa V. DINH on 8/24/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPIDENTITY_H
#define MAILCORE_MCIMAPIDENTITY_H
#include <MailCore/MCBaseTypes.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPIdentity : public Object {
public:
IMAPIdentity();
virtual ~IMAPIdentity();
virtual void setVendor(String * vendor);
virtual String * vendor();
virtual void setName(String * name);
virtual String * name();
virtual void setVersion(String * version);
virtual String * version();
virtual Array * allInfoKeys();
virtual String * infoForKey(String * key);
virtual void setInfoForKey(String * key, String * value);
public: // subclass behavior
IMAPIdentity(IMAPIdentity * identity);
virtual Object * copy();
virtual String * description();
private:
HashMap * mValues;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,45 @@
//
// IMAPIdentityOperation.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/12/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPIDENTITYOPERATION_H
#define MAILCORE_MCIMAPIDENTITYOPERATION_H
#include <MailCore/MCIMAPOperation.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPIdentity;
class IMAPIdentityOperation : public IMAPOperation {
public:
IMAPIdentityOperation();
virtual ~IMAPIdentityOperation();
virtual void setClientIdentity(IMAPIdentity * identity);
virtual IMAPIdentity * clientIdentity();
// Result.
virtual IMAPIdentity * serverIdentity();
public: // subclass behavior
virtual void main();
private:
IMAPIdentity * mClientIdentity;
IMAPIdentity * mServerIdentity;
};
}
#endif
#endif

View File

@ -0,0 +1,46 @@
//
// IMAPIdleOperation.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/12/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPIDLEOPERATION_H
#define MAILCORE_MCIMAPIDLEOPERATION_H
#include <MailCore/MCIMAPOperation.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPIdleOperation : public IMAPOperation {
public:
IMAPIdleOperation();
virtual ~IMAPIdleOperation();
virtual void setLastKnownUID(uint32_t uid);
virtual uint32_t lastKnownUID();
virtual void interruptIdle();
public: // subclass behavior
virtual void main();
private:
uint32_t mLastKnownUid;
bool mSetupSuccess;
bool mInterrupted;
pthread_mutex_t mLock;
void prepare();
void unprepare();
bool isInterrupted();
};
}
#endif
#endif

View File

@ -0,0 +1,88 @@
#ifndef MAILCORE_IMAP_MESSAGE_H
#define MAILCORE_IMAP_MESSAGE_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCAbstractMessage.h>
#include <MailCore/MCMessageConstants.h>
#include <MailCore/MCAbstractPart.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPPart;
class HTMLRendererIMAPCallback;
class HTMLRendererTemplateCallback;
class IMAPMessage : public AbstractMessage {
public:
IMAPMessage();
virtual ~IMAPMessage();
virtual uint32_t uid();
virtual void setUid(uint32_t uid);
virtual uint32_t size();
virtual void setSize(uint32_t size);
virtual void setFlags(MessageFlag flags);
virtual MessageFlag flags();
virtual void setOriginalFlags(MessageFlag flags);
virtual MessageFlag originalFlags();
virtual void setCustomFlags(Array * customFlags);
virtual Array * customFlags();
virtual uint64_t modSeqValue();
virtual void setModSeqValue(uint64_t uid);
virtual void setMainPart(AbstractPart * mainPart);
virtual AbstractPart * mainPart();
virtual void setGmailLabels(Array * /* String */ labels);
virtual Array * /* String */ gmailLabels();
virtual void setGmailMessageID(uint64_t msgID);
virtual uint64_t gmailMessageID();
virtual void setGmailThreadID(uint64_t threadID);
virtual uint64_t gmailThreadID();
virtual AbstractPart * partForPartID(String * partID);
virtual AbstractPart * partForContentID(String * contentID);
virtual AbstractPart * partForUniqueID(String * uniqueID);
virtual String * htmlRendering(String * folder,
HTMLRendererIMAPCallback * dataCallback,
HTMLRendererTemplateCallback * htmlCallback = NULL);
public: // subclass behavior
IMAPMessage(IMAPMessage * other);
virtual Object * copy();
virtual String * description();
virtual HashMap * serializable();
virtual void importSerializable(HashMap * serializable);
private:
uint64_t mModSeqValue;
uint32_t mUid;
uint32_t mSize;
MessageFlag mFlags;
MessageFlag mOriginalFlags;
Array * /* String */ mCustomFlags;
AbstractPart * mMainPart;
Array * /* String */ mGmailLabels;
uint64_t mGmailMessageID;
uint64_t mGmailThreadID;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,34 @@
#ifndef MAILCORE_IMAPMESSAGEPART_H
#define MAILCORE_IMAPMESSAGEPART_H
#include <MailCore/MCAbstractMessagePart.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPMessagePart : public AbstractMessagePart {
public:
IMAPMessagePart();
virtual ~IMAPMessagePart();
virtual void setPartID(String * partID);
virtual String * partID();
public: // subclass behavior
IMAPMessagePart(IMAPMessagePart * other);
virtual Object * copy();
virtual HashMap * serializable();
virtual void importSerializable(HashMap * serializable);
private:
String * mPartID;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,48 @@
//
// MCIMAPMessageRenderingOperation.h
// mailcore2
//
// Created by Paul Young on 27/06/2013.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPMessageRenderingOperation_H
#define MAILCORE_MCIMAPMessageRenderingOperation_H
#include <MailCore/MCIMAPOperation.h>
#include <MailCore/MCIMAPMessage.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPMessageRenderingOperation : public IMAPOperation {
public:
IMAPMessageRenderingOperation();
virtual ~IMAPMessageRenderingOperation();
virtual void setRenderingType(IMAPMessageRenderingType type);
virtual IMAPMessageRenderingType renderingType();
virtual void setMessage(IMAPMessage * message);
virtual IMAPMessage * message();
// Result.
virtual String * result();
public: // subclass behavior
virtual void main();
private:
IMAPMessageRenderingType mRenderingType;
String * mResult;
IMAPMessage * mMessage;
};
}
#endif
#endif

View File

@ -0,0 +1,34 @@
#ifndef MAILCORE_MCIMAPMULTIPART_H
#define MAILCORE_MCIMAPMULTIPART_H
#include <MailCore/MCAbstractMultipart.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPMultipart : public AbstractMultipart {
public:
IMAPMultipart();
virtual ~IMAPMultipart();
virtual void setPartID(String * partID);
virtual String * partID();
public: // subclass behavior
IMAPMultipart(IMAPMultipart * other);
virtual Object * copy();
virtual HashMap * serializable();
virtual void importSerializable(HashMap * serializable);
private:
String * mPartID;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,51 @@
#ifndef MAILCORE_MCIMAPNAMESPACE_H
#define MAILCORE_MCIMAPNAMESPACE_H
#include <MailCore/MCBaseTypes.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPNamespaceItem;
class IMAPNamespace : public Object {
public:
IMAPNamespace();
virtual ~IMAPNamespace();
virtual String * mainPrefix();
virtual char mainDelimiter();
virtual Array * /* String */ prefixes();
virtual String * pathForComponents(Array * components);
virtual String * pathForComponentsAndPrefix(Array * components, String * prefix);
virtual Array * /* String */ componentsFromPath(String * path);
virtual bool containsFolderPath(String * path);
static IMAPNamespace * namespaceWithPrefix(String * prefix, char delimiter);
public: // subclass behavior
IMAPNamespace(IMAPNamespace * other);
virtual String * description();
virtual Object * copy();
private:
Array * /* String */ mItems;
void init();
IMAPNamespaceItem * mainItem();
IMAPNamespaceItem * itemForPath(String * path);
public: // private
virtual void importIMAPNamespace(struct mailimap_namespace_item * item);
};
}
#endif
#endif

View File

@ -0,0 +1,46 @@
#ifndef MAILCORE_MCIMAPNAMESPACEITEM_H
#define MAILCORE_MCIMAPNAMESPACEITEM_H
#include <MailCore/MCBaseTypes.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPNamespaceItem : public Object {
public:
IMAPNamespaceItem();
virtual ~IMAPNamespaceItem();
virtual void setPrefix(String * prefix);
virtual String * prefix();
virtual void setDelimiter(char delimiter);
virtual char delimiter();
virtual String * pathForComponents(Array * components);
virtual Array * /* String */ componentsForPath(String * path);
virtual bool containsFolder(String * folder);
public: // subclass behavior
IMAPNamespaceItem(IMAPNamespaceItem * other);
virtual String * description();
virtual Object * copy();
private:
char mDelimiter;
String * mPrefix;
void init();
public: // private
virtual void importIMAPNamespaceInfo(struct mailimap_namespace_info * info);
};
}
#endif
#endif

View File

@ -0,0 +1,32 @@
//
// MCIMAPNoopOperation.h
// mailcore2
//
// Created by Robert Widmann on 9/24/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPNOOPOPERATION_H
#define MAILCORE_MCIMAPNOOPOPERATION_H
#include <MailCore/MCIMAPOperation.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPNoopOperation : public IMAPOperation {
public:
IMAPNoopOperation();
virtual ~IMAPNoopOperation();
public: // subclass behavior
virtual void main();
};
}
#endif
#endif

View File

@ -0,0 +1,73 @@
//
// MCIMAPOperation.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/12/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPOPERATION_H
#define MAILCORE_MCIMAPOPERATION_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCIMAPProgressCallback.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPAsyncConnection;
class IMAPAsyncSession;
class IMAPOperationCallback;
class IMAPOperation : public Operation, public IMAPProgressCallback {
public:
IMAPOperation();
virtual ~IMAPOperation();
virtual void setMainSession(IMAPAsyncSession * session);
virtual IMAPAsyncSession * mainSession();
virtual void setSession(IMAPAsyncConnection * session);
virtual IMAPAsyncConnection * session();
virtual void setFolder(String * folder);
virtual String * folder();
virtual void setUrgent(bool urgent);
virtual bool isUrgent();
virtual void setImapCallback(IMAPOperationCallback * callback);
virtual IMAPOperationCallback * imapCallback();
virtual void beforeMain();
virtual void afterMain();
virtual void start();
// Result.
virtual void setError(ErrorCode error);
virtual ErrorCode error();
private:
IMAPAsyncSession * mMainSession;
IMAPAsyncConnection * mSession;
String * mFolder;
IMAPOperationCallback * mImapCallback;
ErrorCode mError;
bool mUrgent;
private:
virtual void bodyProgress(IMAPSession * session, unsigned int current, unsigned int maximum);
virtual void bodyProgressOnMainThread(void * context);
virtual void itemsProgress(IMAPSession * session, unsigned int current, unsigned int maximum);
virtual void itemsProgressOnMainThread(void * context);
};
}
#endif
#endif

View File

@ -0,0 +1,29 @@
//
// MCIMAPOperationCallback.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/12/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPOPERATIONCALLBACK_H
#define MAILCORE_MCIMAPOPERATIONCALLBACK_H
#ifdef __cplusplus
namespace mailcore {
class IMAPOperation;
class IMAPOperationCallback {
public:
virtual void bodyProgress(IMAPOperation * session, unsigned int current, unsigned int maximum) {};
virtual void itemProgress(IMAPOperation * session, unsigned int current, unsigned int maximum) {};
};
}
#endif
#endif

View File

@ -0,0 +1,66 @@
#ifndef MAILCORE_MCIMAPPART_H
#define MAILCORE_MCIMAPPART_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCAbstractPart.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPMessagePart;
class IMAPMultipart;
class IMAPPart : public AbstractPart {
public:
IMAPPart();
virtual ~IMAPPart();
virtual void setPartID(String * partID);
virtual String * partID();
virtual void setSize(unsigned int size);
virtual unsigned int size();
virtual unsigned int decodedSize();
virtual void setEncoding(Encoding encoding);
virtual Encoding encoding();
public: // subclass behavior
IMAPPart(IMAPPart * other);
virtual Object * copy();
virtual HashMap * serializable();
virtual void importSerializable(HashMap * serializable);
public: // private
static AbstractPart * attachmentWithIMAPBody(struct mailimap_body * body);
virtual void importIMAPFields(struct mailimap_body_fields * fields,
struct mailimap_body_ext_1part * extension);
private:
String * mPartID;
Encoding mEncoding;
unsigned int mSize;
void init();
static AbstractPart * attachmentWithIMAPBodyInternal(struct mailimap_body * body, String * partID);
static AbstractPart * attachmentWithIMAPBody1Part(struct mailimap_body_type_1part * body_1part,
String * partID);
static IMAPMessagePart * attachmentWithIMAPBody1PartMessage(struct mailimap_body_type_msg * message,
struct mailimap_body_ext_1part * extension,
String * partID);
static IMAPPart * attachmentWithIMAPBody1PartBasic(struct mailimap_body_type_basic * basic,
struct mailimap_body_ext_1part * extension);
static IMAPPart * attachmentWithIMAPBody1PartText(struct mailimap_body_type_text * text,
struct mailimap_body_ext_1part * extension);
static IMAPMultipart * attachmentWithIMAPBodyMultipart(struct mailimap_body_type_mpart * body_mpart,
String * partID);
};
}
#endif
#endif

View File

@ -0,0 +1,21 @@
#ifndef MAILCORE_MCIMAPPROGRESSCALLBACK_H
#define MAILCORE_MCIMAPPROGRESSCALLBACK_H
#ifdef __cplusplus
namespace mailcore {
class IMAPSession;
class IMAPProgressCallback {
public:
virtual void bodyProgress(IMAPSession * session, unsigned int current, unsigned int maximum) {};
virtual void itemsProgress(IMAPSession * session, unsigned int current, unsigned int maximum) {};
};
}
#endif
#endif

View File

@ -0,0 +1,40 @@
//
// MCIMAPQuotaOperation.h
// mailcore2
//
// Created by Petro Korenev on 8/2/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPQuotaOperation_H
#define MAILCORE_MCIMAPQuotaOperation_H
#include "MCIMAPOperation.h"
#ifdef __cplusplus
namespace mailcore {
class IMAPQuotaOperation : public IMAPOperation {
public:
IMAPQuotaOperation();
virtual ~IMAPQuotaOperation();
// Result.
virtual uint32_t limit();
virtual uint32_t usage();
public: // subclass behavior
virtual void main();
private:
uint32_t mLimit;
uint32_t mUsage;
};
}
#endif
#endif

View File

@ -0,0 +1,85 @@
#ifndef MAILCORE_MCIMAPSEARCHEXPRESSION_H
#define MAILCORE_MCIMAPSEARCHEXPRESSION_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCMessageConstants.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPSearchExpression : public Object {
public:
IMAPSearchExpression();
virtual ~IMAPSearchExpression();
virtual IMAPSearchKind kind();
virtual String * header();
virtual String * value();
virtual uint64_t longNumber();
virtual time_t date();
virtual IndexSet * uids();
virtual IMAPSearchExpression * leftExpression();
virtual IMAPSearchExpression * rightExpression();
static IMAPSearchExpression * searchAll();
static IMAPSearchExpression * searchFrom(String * value);
static IMAPSearchExpression * searchTo(String *value);
static IMAPSearchExpression * searchCc(String *value);
static IMAPSearchExpression * searchBcc(String *value);
static IMAPSearchExpression * searchRecipient(String * value);
static IMAPSearchExpression * searchSubject(String * value);
static IMAPSearchExpression * searchContent(String * value);
static IMAPSearchExpression * searchBody(String * value);
static IMAPSearchExpression * searchHeader(String * header, String * value);
static IMAPSearchExpression * searchUIDs(IndexSet * uids);
static IMAPSearchExpression * searchRead();
static IMAPSearchExpression * searchUnread();
static IMAPSearchExpression * searchFlagged();
static IMAPSearchExpression * searchUnflagged();
static IMAPSearchExpression * searchAnswered();
static IMAPSearchExpression * searchUnanswered();
static IMAPSearchExpression * searchDraft();
static IMAPSearchExpression * searchUndraft();
static IMAPSearchExpression * searchDeleted();
static IMAPSearchExpression * searchSpam();
static IMAPSearchExpression * searchBeforeDate(time_t date);
static IMAPSearchExpression * searchOnDate(time_t date);
static IMAPSearchExpression * searchSinceDate(time_t date);
static IMAPSearchExpression * searchBeforeReceivedDate(time_t date);
static IMAPSearchExpression * searchOnReceivedDate(time_t date);
static IMAPSearchExpression * searchSinceReceivedDate(time_t date);
static IMAPSearchExpression * searchSizeLarger(uint32_t size);
static IMAPSearchExpression * searchSizeSmaller(uint32_t size);
static IMAPSearchExpression * searchGmailThreadID(uint64_t number);
static IMAPSearchExpression * searchGmailMessageID(uint64_t number);
static IMAPSearchExpression * searchGmailRaw(String * expr);
static IMAPSearchExpression * searchAnd(IMAPSearchExpression * left, IMAPSearchExpression * right);
static IMAPSearchExpression * searchOr(IMAPSearchExpression * left, IMAPSearchExpression * right);
static IMAPSearchExpression * searchNot(IMAPSearchExpression * notExpr);
public: // subclass behavior
IMAPSearchExpression(IMAPSearchExpression * other);
virtual String * description();
virtual Object * copy();
private:
IMAPSearchKind mKind;
String * mHeader;
String * mValue;
uint64_t mLongNumber;
IndexSet * mUids;
IMAPSearchExpression * mLeftExpression;
IMAPSearchExpression * mRightExpression;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,54 @@
//
// IMAPSearchOperation.h
// mailcore2
//
// Created by DINH Viêt Hoà on 1/12/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPSEARCHOPERATION_H
#define MAILCORE_MCIMAPSEARCHOPERATION_H
#include <MailCore/MCIMAPOperation.h>
#include <MailCore/MCMessageConstants.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPSearchExpression;
class IMAPSearchOperation : public IMAPOperation {
public:
IMAPSearchOperation();
virtual ~IMAPSearchOperation();
virtual void setSearchKind(IMAPSearchKind kind);
virtual IMAPSearchKind searchKind();
virtual void setSearchString(String * searchString);
virtual String * searchString();
virtual void setSearchExpression(IMAPSearchExpression * expression);
virtual IMAPSearchExpression * searchExpression();
// Result.
virtual IndexSet * uids();
public: // subclass behavior
virtual void main();
private:
IMAPSearchKind mKind;
String * mSearchString;
IMAPSearchExpression * mExpression;
IndexSet * mUids;
};
}
#endif
#endif

View File

@ -0,0 +1,279 @@
#ifndef MAILCORE_MCIMAPSESSION_H
#define MAILCORE_MCIMAPSESSION_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCMessageConstants.h>
#include <MailCore/MCIMAPMessage.h>
#ifdef __cplusplus
namespace mailcore {
extern String * IMAPNamespacePersonal;
extern String * IMAPNamespaceOther;
extern String * IMAPNamespaceShared;
class IMAPNamespace;
class IMAPSearchExpression;
class IMAPFolder;
class IMAPProgressCallback;
class IMAPSyncResult;
class IMAPFolderStatus;
class IMAPIdentity;
class IMAPSession : public Object {
public:
IMAPSession();
virtual ~IMAPSession();
virtual void setHostname(String * hostname);
virtual String * hostname();
virtual void setPort(unsigned int port);
virtual unsigned int port();
virtual void setUsername(String * username);
virtual String * username();
virtual void setPassword(String * password);
virtual String * password();
// To authenticate using OAuth2, username and oauth2token should be set.
// auth type to use is AuthTypeOAuth2.
virtual void setOAuth2Token(String * token);
virtual String * OAuth2Token();
virtual void setAuthType(AuthType authType);
virtual AuthType authType();
virtual void setConnectionType(ConnectionType connectionType);
virtual ConnectionType connectionType();
virtual void setTimeout(time_t timeout);
virtual time_t timeout();
virtual void setCheckCertificateEnabled(bool enabled);
virtual bool isCheckCertificateEnabled();
virtual void setVoIPEnabled(bool enabled);
virtual bool isVoIPEnabled();
// Needed for fetchSubscribedFolders() and fetchAllFolders().
virtual void setDefaultNamespace(IMAPNamespace * ns);
virtual IMAPNamespace * defaultNamespace();
virtual IMAPIdentity * serverIdentity();
virtual IMAPIdentity * clientIdentity();
virtual void select(String * folder, ErrorCode * pError);
virtual IMAPFolderStatus * folderStatus(String * folder, ErrorCode * pError);
virtual Array * /* IMAPFolder */ fetchSubscribedFolders(ErrorCode * pError);
virtual Array * /* IMAPFolder */ fetchAllFolders(ErrorCode * pError); // will use xlist if available
virtual void renameFolder(String * folder, String * otherName, ErrorCode * pError);
virtual void deleteFolder(String * folder, ErrorCode * pError);
virtual void createFolder(String * folder, ErrorCode * pError);
virtual void subscribeFolder(String * folder, ErrorCode * pError);
virtual void unsubscribeFolder(String * folder, ErrorCode * pError);
virtual void appendMessage(String * folder, Data * messageData, MessageFlag flags,
IMAPProgressCallback * progressCallback, uint32_t * createdUID, ErrorCode * pError);
virtual void appendMessageWithCustomFlags(String * folder, Data * messageData, MessageFlag flags, Array * customFlags,
IMAPProgressCallback * progressCallback, uint32_t * createdUID, ErrorCode * pError);
virtual void appendMessageWithCustomFlagsAndDate(String * folder, Data * messageData, MessageFlag flags, Array * customFlags, time_t date,
IMAPProgressCallback * progressCallback, uint32_t * createdUID, ErrorCode * pError);
void copyMessages(String * folder, IndexSet * uidSet, String * destFolder,
HashMap ** pUidMapping, ErrorCode * pError);
virtual void expunge(String * folder, ErrorCode * pError);
virtual Array * /* IMAPMessage */ fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind,
IndexSet * uids, IMAPProgressCallback * progressCallback,
ErrorCode * pError);
virtual Array * /* IMAPMessage */ fetchMessagesByUIDWithExtraHeaders(String * folder,
IMAPMessagesRequestKind requestKind,
IndexSet * uids,
IMAPProgressCallback * progressCallback,
Array * extraHeaders, ErrorCode * pError);
virtual Array * /* IMAPMessage */ fetchMessagesByNumber(String * folder, IMAPMessagesRequestKind requestKind,
IndexSet * numbers, IMAPProgressCallback * progressCallback,
ErrorCode * pError);
virtual Array * /* IMAPMessage */ fetchMessagesByNumberWithExtraHeaders(String * folder,
IMAPMessagesRequestKind requestKind,
IndexSet * numbers,
IMAPProgressCallback * progressCallback,
Array * extraHeaders, ErrorCode * pError);
virtual Data * fetchMessageByUID(String * folder, uint32_t uid,
IMAPProgressCallback * progressCallback, ErrorCode * pError);
virtual Data * fetchMessageAttachmentByUID(String * folder, uint32_t uid, String * partID,
Encoding encoding, IMAPProgressCallback * progressCallback, ErrorCode * pError);
virtual HashMap * fetchMessageNumberUIDMapping(String * folder, uint32_t fromUID, uint32_t toUID,
ErrorCode * pError);
/* When CONDSTORE or QRESYNC is available */
virtual IMAPSyncResult * syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind,
IndexSet * uids, uint64_t modseq,
IMAPProgressCallback * progressCallback, ErrorCode * pError);
/* Same as syncMessagesByUID, allows for extra headers */
virtual IMAPSyncResult * syncMessagesByUIDWithExtraHeaders(String * folder, IMAPMessagesRequestKind requestKind,
IndexSet * uids, uint64_t modseq,
IMAPProgressCallback * progressCallback,
Array * extraHeaders, ErrorCode * pError);
virtual void storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, ErrorCode * pError);
virtual void storeFlagsAndCustomFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags, ErrorCode * pError);
virtual void storeLabels(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels, ErrorCode * pError);
virtual IndexSet * search(String * folder, IMAPSearchKind kind, String * searchString, ErrorCode * pError);
virtual IndexSet * search(String * folder, IMAPSearchExpression * expression, ErrorCode * pError);
virtual void getQuota(uint32_t *usage, uint32_t *limit, ErrorCode * pError);
virtual bool setupIdle();
virtual void idle(String * folder, uint32_t lastKnownUID, ErrorCode * pError);
virtual void interruptIdle();
virtual void unsetupIdle();
virtual void connect(ErrorCode * pError);
virtual void disconnect();
virtual void noop(ErrorCode * pError);
virtual HashMap * fetchNamespace(ErrorCode * pError);
virtual void login(ErrorCode * pError);
IMAPIdentity * identity(IMAPIdentity * clientIdentity, ErrorCode * pError);
virtual IndexSet * capability(ErrorCode * pError);
virtual void enableCompression(ErrorCode * pError);
virtual uint32_t uidValidity();
virtual uint32_t uidNext();
virtual uint64_t modSequenceValue();
virtual unsigned int lastFolderMessageCount();
virtual uint32_t firstUnseenUid();
virtual bool isIdleEnabled();
virtual bool isXListEnabled();
virtual bool isCondstoreEnabled();
virtual bool isQResyncEnabled();
virtual bool isIdentityEnabled();
virtual bool isXOAuthEnabled();
virtual bool isNamespaceEnabled();
virtual bool isCompressionEnabled();
virtual bool allowsNewPermanentFlags();
virtual String * gmailUserDisplayName();
virtual void setConnectionLogger(ConnectionLogger * logger);
virtual ConnectionLogger * connectionLogger();
/** HTML rendering of the body of the message to be displayed in a web view.*/
virtual String * htmlRendering(IMAPMessage * message, String * folder, ErrorCode * pError);
/** HTML rendering of the body of the message.*/
virtual String * htmlBodyRendering(IMAPMessage * message, String * folder, ErrorCode * pError);
/** Text rendering of the message.*/
virtual String * plainTextRendering(IMAPMessage * message, String * folder, ErrorCode * pError);
/** Text rendering of the body of the message. All end of line will be removed and white spaces cleaned up if requested.
This method can be used to generate the summary of the message.*/
virtual String * plainTextBodyRendering(IMAPMessage * message, String * folder, bool stripWhitespace, ErrorCode * pError);
/** Enable automatic query of the capabilities of the IMAP server when set to true. */
virtual void setAutomaticConfigurationEnabled(bool enabled);
/** Check if the automatic query of the capabilities of the IMAP server is enabled. */
virtual bool isAutomaticConfigurationEnabled();
public: // private
virtual void loginIfNeeded(ErrorCode * pError);
virtual void connectIfNeeded(ErrorCode * pError);
virtual void selectIfNeeded(String * folder, ErrorCode * pError);
virtual bool isDisconnected();
virtual bool isAutomaticConfigurationDone();
virtual void resetAutomaticConfigurationDone();
virtual void applyCapabilities(IndexSet * capabilities);
private:
String * mHostname;
unsigned int mPort;
String * mUsername;
String * mPassword;
String * mOAuth2Token;
AuthType mAuthType;
ConnectionType mConnectionType;
bool mCheckCertificateEnabled;
bool mVoIPEnabled;
char mDelimiter;
IMAPNamespace * mDefaultNamespace;
IMAPIdentity * mServerIdentity;
IMAPIdentity * mClientIdentity;
time_t mTimeout;
bool mBodyProgressEnabled;
bool mIdleEnabled;
bool mXListEnabled;
bool mCondstoreEnabled;
bool mQResyncEnabled;
bool mIdentityEnabled;
bool mXOauth2Enabled;
bool mNamespaceEnabled;
bool mCompressionEnabled;
bool mIsGmail;
bool mAllowsNewPermanentFlags;
String * mWelcomeString;
bool mNeedsMboxMailWorkaround;
uint32_t mUIDValidity;
uint32_t mUIDNext;
uint64_t mModSequenceValue;
unsigned int mFolderMsgCount;
uint32_t mFirstUnseenUid;
bool mYahooServer;
unsigned int mLastFetchedSequenceNumber;
String * mCurrentFolder;
pthread_mutex_t mIdleLock;
bool mCanIdle;
int mState;
mailimap * mImap;
IMAPProgressCallback * mProgressCallback;
unsigned int mProgressItemsCount;
ConnectionLogger * mConnectionLogger;
bool mAutomaticConfigurationEnabled;
bool mAutomaticConfigurationDone;
bool mShouldDisconnect;
String * mLoginResponse;
String * mGmailUserDisplayName;
void init();
void bodyProgress(unsigned int current, unsigned int maximum);
void itemsProgress(unsigned int current, unsigned int maximum);
bool checkCertificate();
static void body_progress(size_t current, size_t maximum, void * context);
static void items_progress(size_t current, size_t maximum, void * context);
void setup();
void unsetup();
char fetchDelimiterIfNeeded(char defaultDelimiter, ErrorCode * pError);
IMAPSyncResult * fetchMessages(String * folder, IMAPMessagesRequestKind requestKind,
bool fetchByUID, struct mailimap_set * imapset, uint64_t modseq,
HashMap * mapping, uint32_t startUid, IMAPProgressCallback * progressCallback,
Array * extraHeaders, ErrorCode * pError);
void capabilitySetWithSessionState(IndexSet * capabilities);
bool enableFeature(String * feature);
void enableFeatures();
};
}
#endif
#endif

View File

@ -0,0 +1,39 @@
//
// MCIMAPSyncResult.h
// mailcore2
//
// Created by DINH Viêt Hoà on 3/3/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCIMAPSYNCRESULT_H
#define MAILCORE_MCIMAPSYNCRESULT_H
#include <MailCore/MCBaseTypes.h>
#ifdef __cplusplus
namespace mailcore {
class IMAPSyncResult : public Object {
public:
IMAPSyncResult();
virtual ~IMAPSyncResult();
virtual void setModifiedOrAddedMessages(Array * /* IMAPMessage */ messages);
virtual Array * /* IMAPMessage */ modifiedOrAddedMessages();
virtual void setVanishedMessages(IndexSet * vanishedMessages);
virtual IndexSet * vanishedMessages();
private:
Array * /* IMAPMessage */ mModifiedOrAddedMessages;
IndexSet * mVanishedMessages;
};
}
#endif
#endif

View File

@ -0,0 +1,75 @@
//
// MCIndexSet.h
// mailcore2
//
// Created by DINH Viêt Hoà on 3/4/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCINDEXSET_H
#define MAILCORE_MCINDEXSET_H
#include <MailCore/MCObject.h>
#include <MailCore/MCRange.h>
#include <inttypes.h>
#ifdef __cplusplus
namespace mailcore {
class IndexSet : public Object {
public:
IndexSet();
IndexSet(IndexSet * o);
static IndexSet * indexSet();
static IndexSet * indexSetWithRange(Range range);
static IndexSet * indexSetWithIndex(uint64_t idx);
virtual unsigned int count();
virtual void addIndex(uint64_t idx);
virtual void removeIndex(uint64_t idx);
virtual bool containsIndex(uint64_t idx);
virtual void addRange(Range range);
virtual void removeRange(Range range);
virtual void intersectsRange(Range range);
virtual void addIndexSet(IndexSet * indexSet);
virtual void removeIndexSet(IndexSet * indexSet);
virtual void intersectsIndexSet(IndexSet * indexSet);
virtual Range * allRanges();
virtual unsigned int rangesCount();
virtual void removeAllIndexes();
public: // subclass behavior
virtual ~IndexSet();
virtual String * description();
virtual Object * copy();
virtual HashMap * serializable();
virtual void importSerializable(HashMap * serializable);
private:
Range * mRanges;
unsigned int mCount;
unsigned int mAllocated;
void init();
int rangeIndexForIndex(uint64_t idx);
int rangeIndexForIndexWithBounds(uint64_t idx, unsigned int left, unsigned int right);
void addRangeIndex(unsigned int rangeIndex);
void removeRangeIndex(unsigned int rangeIndex, unsigned int count);
int rightRangeIndexForIndex(uint64_t idx);
int rightRangeIndexForIndexWithBounds(uint64_t idx, unsigned int left, unsigned int right);
int leftRangeIndexForIndex(uint64_t idx);
int leftRangeIndexForIndexWithBounds(uint64_t idx, unsigned int left, unsigned int right);
void mergeRanges(unsigned int rangeIndex);
void tryToMergeAdjacentRanges(unsigned int rangeIndex);
};
}
#endif
#endif

View File

@ -0,0 +1,186 @@
//
// MCIterator.h
// mailcore2
//
// Created by DINH Viêt Hoà on 4/18/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_ITERATOR_H
#define MAILCORE_ITERATOR_H
#include <MailCore/MCArray.h>
#include <MailCore/MCHashMap.h>
#include <MailCore/MCIndexSet.h>
#include <MailCore/MCAutoreleasePool.h>
#include <string.h>
#ifdef __cplusplus
#define mc_foreacharray(type, __variable, __array) \
type * __variable; \
mailcore::ArrayIterator __variable##__iterator = mailcore::ArrayIteratorInit(__array); \
for (; NULL != (__variable = (type *) mailcore::ArrayIteratorNext(&__variable##__iterator)); )
#define mc_foreacharrayIndex(__index, type, __variable, __array) \
type * __variable; \
mailcore::ArrayIterator __variable##__iterator = mailcore::ArrayIteratorInit(__array); \
for (unsigned int __index = 0; NULL != (__variable = (type *) mailcore::ArrayIteratorNext(&__variable##__iterator)); __index++)
#define mc_foreachhashmapKey(keyType, __key, __hashmap) \
keyType * __key; \
HashMapIterator __key##__iterator = HashMapIteratorInit(__hashmap, true, false); \
while (HashMapIteratorRun(&__key##__iterator)) \
while (HashMapIteratorNext(&__key##__iterator, &__key, NULL))
#define mc_foreachhashmapValue(valueType, __value, __hashmap) \
valueType * __value; \
HashMapIterator __value##__iterator = HashMapIteratorInit(__hashmap, false, true); \
while (HashMapIteratorRun(&__value##__iterator)) \
while (HashMapIteratorNext(&__value##__iterator, NULL, (Object **) &__value))
#define mc_foreachhashmapKeyAndValue(keyType, __key, valueType, __value, __hashmap) \
keyType * __key; \
valueType * __value; \
HashMapIterator __key##__value##__iterator = HashMapIteratorInit(__hashmap, true, true); \
while (HashMapIteratorRun(&__key##__value##__iterator)) \
while (HashMapIteratorNext(&__key##__value##__iterator, (Object **) &__key, (Object **) &__value))
#define mc_foreachindexset(__variable, __indexset) \
int64_t __variable; \
mailcore::IndexSetIterator __variable##__iterator = mailcore::IndexSetIteratorInit(__indexset); \
for (; (__variable = IndexSetIteratorValue(&__variable##__iterator)), IndexSetIteratorIsValid(&__variable##__iterator) ; mailcore::IndexSetIteratorNext(&__variable##__iterator))
namespace mailcore {
struct IndexSetIterator {
unsigned int rangeIndex;
unsigned int index;
Range * currentRange;
IndexSet * indexSet;
};
static inline IndexSetIterator IndexSetIteratorInit(IndexSet * indexSet)
{
IndexSetIterator iterator = { 0, 0, NULL, indexSet };
if (indexSet->rangesCount() >= 1) {
iterator.currentRange = &indexSet->allRanges()[0];
}
return iterator;
}
static inline bool IndexSetIteratorIsValid(IndexSetIterator * iterator)
{
return iterator->currentRange != NULL;
}
static inline int64_t IndexSetIteratorValue(IndexSetIterator * iterator)
{
return iterator->currentRange == NULL ? -1 : iterator->currentRange->location + iterator->index;
}
static inline bool IndexSetIteratorNext(IndexSetIterator * iterator)
{
iterator->index ++;
if (iterator->index > iterator->currentRange->length) {
// switch to an other range
iterator->index = 0;
iterator->rangeIndex ++;
if (iterator->rangeIndex >= iterator->indexSet->rangesCount()) {
iterator->currentRange = NULL;
return false;
}
else {
iterator->currentRange = &iterator->indexSet->allRanges()[iterator->rangeIndex];
return true;
}
}
else {
return true;
}
}
struct ArrayIterator {
unsigned index;
unsigned count;
Array * array;
};
static inline ArrayIterator ArrayIteratorInit(Array * array)
{
ArrayIterator iterator = { 0, array != NULL ? array->count() : 0, array };
return iterator;
}
static inline Object * ArrayIteratorNext(ArrayIterator * iterator)
{
if (iterator->index >= iterator->count) {
return NULL;
}
Object * result = iterator->array->objectAtIndex(iterator->index);
++ iterator->index;
return result;
}
struct HashMapIterator {
bool cleanup;
unsigned index;
unsigned count;
Array * keys;
Array * values;
};
static inline HashMapIterator HashMapIteratorInit(HashMap * hashmap, bool useKeys, bool useValues)
{
AutoreleasePool * pool = new AutoreleasePool();
Array * keys = useKeys ? (hashmap != NULL ? hashmap->allKeys() : NULL) : NULL;
Array * values = useValues ? (hashmap != NULL ? hashmap->allValues() : NULL) : NULL;
if (keys != NULL) {
keys->retain();
}
if (values != NULL) {
values->retain();
}
HashMapIterator iterator = { false, 0, hashmap != NULL ? hashmap->count() : 0, keys, values };
pool->release();
return iterator;
}
static inline bool HashMapIteratorNext(HashMapIterator * iterator, Object ** keyp, Object ** valuep)
{
if (iterator->index >= iterator->count) {
return false;
}
if (keyp != NULL) {
* keyp = iterator->keys->objectAtIndex(iterator->index);
}
if (valuep != NULL) {
* valuep = iterator->values->objectAtIndex(iterator->index);
}
iterator->index ++;
return true;
}
static inline bool HashMapIteratorRun(HashMapIterator * iterator)
{
if (!iterator->cleanup) {
iterator->cleanup = true;
return true;
} else {
MC_SAFE_RELEASE(iterator->keys);
MC_SAFE_RELEASE(iterator->values);
return false;
}
}
};
#endif
#endif

View File

@ -0,0 +1,38 @@
//
// MCJSON.h
// hermes
//
// Created by DINH Viêt Hoà on 4/8/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCJSON_H
#define MAILCORE_MCJSON_H
#include <MailCore/MCObject.h>
#include <MailCore/MCHashMap.h>
#include <MailCore/MCArray.h>
#include <MailCore/MCValue.h>
#include <MailCore/MCString.h>
#include <MailCore/MCData.h>
#ifdef __cplusplus
namespace mailcore {
class Null;
class JSON {
public:
static String * objectToJSONString(Object * object);
static Data * objectToJSONData(Object * object);
static Object * objectFromJSONString(String * json);
static Object * objectFromJSONData(Data * json);
};
}
#endif
#endif /* defined(__hermes__MCJSON__) */

View File

@ -0,0 +1,46 @@
//
// MCLibetpanTypes.h
// mailcore2
//
// Created by DINH Viêt Hoà on 4/7/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCLIBETPANTYPES_H
#define MAILCORE_MCLIBETPANTYPES_H
#ifdef __cplusplus
extern "C" {
#endif
struct mailimap_body_fields;
struct mailimap_body_ext_1part;
struct mailimf_address;
struct mailimf_mailbox;
struct mailimap_address;
struct mailmime;
struct mailmime_mechanism;
struct mailimap_namespace_item;
struct mailimap_namespace_info;
struct mailimap_body;
struct mailimap_body_fields;
struct mailimap_body_ext_1part;
struct mailimap_body_type_1part;
struct mailimap_body_type_basic;
struct mailimap_body_type_text;
struct mailimap_body_type_mpart;
struct mailimap_body_type_msg;
typedef struct mailimap mailimap;
struct mailimap_set;
struct mailimap_date_time;
struct mailimf_fields;
struct mailimap_envelope;
typedef struct mailpop3 mailpop3;
typedef struct mailsmtp mailsmtp;
typedef struct newsnntp newsnntp;
struct mailsem;
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,28 @@
#ifndef MAILCORE_MCLOG_H
#define MAILCORE_MCLOG_H
#include <stdio.h>
#define MCLog(...) MCLogInternal(NULL, __FILE__, __LINE__, 0, __VA_ARGS__)
#define MCLogStack(...) MCLogInternal(NULL, __FILE__, __LINE__, 1, __VA_ARGS__)
extern int MCLogEnabled;
#ifndef __printflike
#define __printflike(a,b)
#endif
#ifdef __cplusplus
extern "C" {
#endif
void MCLogInternal(const char * user,
const char * filename,
unsigned int line,
int dumpStack,
const char * format, ...) __printflike(5, 6);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,25 @@
//
// MCMD5.h
// hermes
//
// Created by DINH Viêt Hoà on 4/11/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCMD5_H
#define MAILCORE_MCMD5_H
#include <MailCore/MCData.h>
#include <MailCore/MCString.h>
#ifdef __cplusplus
namespace mailcore {
Data * md5Data(Data * data);
String * md5String(Data * data);
}
#endif
#endif

View File

@ -0,0 +1,75 @@
//
// MCMailProvider.h
// mailcore2
//
// Created by Robert Widmann on 4/28/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCMAILPROVIDER_H
#define MAILCORE_MCMAILPROVIDER_H
#include <MailCore/MCBaseTypes.h>
#ifdef __cplusplus
namespace mailcore {
class NetService;
class MailProvider : public Object {
public:
static MailProvider * providerWithInfo(HashMap * info);
MailProvider();
virtual ~MailProvider();
virtual String * identifier();
virtual Array * /* NetService */ imapServices();
virtual Array * /* NetService */ smtpServices();
virtual Array * /* NetService */ popServices();
virtual bool matchEmail(String * email);
virtual bool matchMX(String * hostname);
virtual String * sentMailFolderPath();
virtual String * starredFolderPath();
virtual String * allMailFolderPath();
virtual String * trashFolderPath();
virtual String * draftsFolderPath();
virtual String * spamFolderPath();
virtual String * importantFolderPath();
// Returns true if one of the folders above matches the given one.
virtual bool isMainFolder(String * folderPath, String * prefix);
public: // subclass behavior
MailProvider(MailProvider * other);
virtual String * description();
virtual Object * copy();
public: // private
virtual void setIdentifier(String * identifier);
virtual void fillWithInfo(HashMap * info);
private:
String * mIdentifier;
Array * /* String */ mDomainMatch;
Array * /* String */ mDomainExclude;
Array * /* String */ mMxMatch;
Array * /* NetService */ mImapServices;
Array * /* NetService */ mSmtpServices;
Array * /* NetService */ mPopServices;
HashMap * mMailboxPaths;
virtual bool matchDomain(String * match, String * domain);
void init();
};
};
#endif
#endif

View File

@ -0,0 +1,43 @@
//
// MCMailProvidersManager.h
// mailcore2
//
// Created by Robert Widmann on 4/28/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//
#ifndef MAILCORE_MCMAILPROVIDERSMANAGER_H
#define MAILCORE_MCMAILPROVIDERSMANAGER_H
#include <MailCore/MCBaseTypes.h>
#ifdef __cplusplus
namespace mailcore {
class MailProvider;
class MailProvidersManager : public Object {
public:
static MailProvidersManager * sharedManager();
virtual MailProvider * providerForEmail(String * email);
virtual MailProvider * providerForMX(String * hostname);
virtual MailProvider * providerForIdentifier(String * identifier);
virtual void registerProvidersWithFilename(String * filename);
private:
MailProvidersManager();
void registerProviders(HashMap * providers);
HashMap * mProviders;
void init();
};
}
#endif
#endif

View File

@ -0,0 +1,20 @@
#ifndef MAILCORE_MCMAINTHREAD_H
#define MAILCORE_MCMAINTHREAD_H
#ifdef __cplusplus
namespace mailcore {
void callOnMainThread(void (*)(void *), void * context);
void callOnMainThreadAndWait(void (*)(void *), void * context);
// Returns a "call" object.
void * callAfterDelay(void (*)(void *), void * context, double time);
// Pass the pointer returns by callAfterDelay() to cancel a delayed call.
void cancelDelayedCall(void * call);
}
#endif
#endif

View File

@ -0,0 +1,68 @@
#ifndef MAILCORE_MCMESSAGEBUILDER_H
#define MAILCORE_MCMESSAGEBUILDER_H
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCAbstractMessage.h>
#ifdef __cplusplus
namespace mailcore {
class Attachment;
class HTMLRendererTemplateCallback;
class MessageBuilder : public AbstractMessage {
public:
MessageBuilder();
virtual ~MessageBuilder();
virtual void setHTMLBody(String * htmlBody);
virtual String * htmlBody();
virtual void setTextBody(String * textBody);
virtual String * textBody();
virtual void setAttachments(Array * /* Attachment */ attachments);
virtual Array * /* Attachment */ attachments();
virtual void addAttachment(Attachment * attachment);
// attachments (usually images) that are included in HTML.
// a Content-ID should be assigned to these part to be able to reference
// them in the HTML using a cid: URL.
virtual void setRelatedAttachments(Array * /* Attachment */ attachments);
virtual Array * /* Attachment */ relatedAttachments();
virtual void addRelatedAttachment(Attachment * attachment);
// When boundary needs to be prefixed (to go through spam filters).
virtual void setBoundaryPrefix(String * boundaryPrefix);
virtual String * boundaryPrefix();
virtual Data * data();
virtual String * htmlRendering(HTMLRendererTemplateCallback * htmlCallback = NULL);
virtual String * htmlBodyRendering();
virtual String * plainTextRendering();
virtual String * plainTextBodyRendering(bool stripWhitespace);
public: // subclass behavior
MessageBuilder(MessageBuilder * other);
virtual String * description();
virtual Object * copy();
private:
String * mHTMLBody;
String * mTextBody;
Array * /* Attachment */ mAttachments;
Array * /* Attachment */ mRelatedAttachments;
String * mBoundaryPrefix;
void init();
Data * dataAndFilterBcc(bool filterBcc);
};
};
#endif
#endif

View File

@ -0,0 +1,275 @@
#ifndef MAILCORE_MCMESSAGECONSTANTS_H
#define MAILCORE_MCMESSAGECONSTANTS_H
#ifdef __cplusplus
namespace mailcore {
enum ConnectionType {
ConnectionTypeClear = 1 << 0,
ConnectionTypeStartTLS = 1 << 1,
ConnectionTypeTLS = 1 << 2,
};
enum AuthType {
AuthTypeSASLNone = 0,
AuthTypeSASLCRAMMD5 = 1 << 0,
AuthTypeSASLPlain = 1 << 1,
AuthTypeSASLGSSAPI = 1 << 2,
AuthTypeSASLDIGESTMD5 = 1 << 3,
AuthTypeSASLLogin = 1 << 4,
AuthTypeSASLSRP = 1 << 5,
AuthTypeSASLNTLM = 1 << 6,
AuthTypeSASLKerberosV4 = 1 << 7,
AuthTypeXOAuth2 = 1 << 8,
AuthTypeXOAuth2Outlook = 1 << 9,
};
enum IMAPFolderFlag {
IMAPFolderFlagNone = 0,
IMAPFolderFlagMarked = 1 << 0,
IMAPFolderFlagUnmarked = 1 << 1,
IMAPFolderFlagNoSelect = 1 << 2,
IMAPFolderFlagNoInferiors = 1 << 3,
IMAPFolderFlagInbox = 1 << 4,
IMAPFolderFlagSentMail = 1 << 5,
IMAPFolderFlagStarred = 1 << 6,
IMAPFolderFlagAllMail = 1 << 7,
IMAPFolderFlagTrash = 1 << 8,
IMAPFolderFlagDrafts = 1 << 9,
IMAPFolderFlagSpam = 1 << 10,
IMAPFolderFlagImportant = 1 << 11,
IMAPFolderFlagArchive = 1 << 12,
IMAPFolderFlagAll = IMAPFolderFlagAllMail,
IMAPFolderFlagJunk = IMAPFolderFlagSpam,
IMAPFolderFlagFlagged = IMAPFolderFlagStarred,
IMAPFolderFlagFolderTypeMask = IMAPFolderFlagInbox | IMAPFolderFlagSentMail | IMAPFolderFlagStarred | IMAPFolderFlagAllMail |
IMAPFolderFlagTrash| IMAPFolderFlagDrafts | IMAPFolderFlagSpam | IMAPFolderFlagImportant | IMAPFolderFlagArchive,
};
enum MessageFlag {
MessageFlagNone = 0,
MessageFlagSeen = 1 << 0,
MessageFlagAnswered = 1 << 1,
MessageFlagFlagged = 1 << 2,
MessageFlagDeleted = 1 << 3,
MessageFlagDraft = 1 << 4,
MessageFlagMDNSent = 1 << 5,
MessageFlagForwarded = 1 << 6,
MessageFlagSubmitPending = 1 << 7,
MessageFlagSubmitted = 1 << 8,
MessageFlagMaskAll = MessageFlagSeen | MessageFlagAnswered | MessageFlagFlagged |
MessageFlagDeleted | MessageFlagDraft | MessageFlagMDNSent | MessageFlagForwarded |
MessageFlagSubmitPending | MessageFlagSubmitted,
} ;
enum IMAPMessagesRequestKind {
IMAPMessagesRequestKindUid = 0, // This is the default and it's always fetched
IMAPMessagesRequestKindFlags = 1 << 0,
IMAPMessagesRequestKindHeaders = 1 << 1,
IMAPMessagesRequestKindStructure = 1 << 2,
IMAPMessagesRequestKindInternalDate = 1 << 3,
IMAPMessagesRequestKindFullHeaders = 1 << 4,
IMAPMessagesRequestKindHeaderSubject = 1 << 5,
IMAPMessagesRequestKindGmailLabels = 1 << 6,
IMAPMessagesRequestKindGmailMessageID = 1 << 7,
IMAPMessagesRequestKindGmailThreadID = 1 << 8,
IMAPMessagesRequestKindExtraHeaders = 1 << 9,
IMAPMessagesRequestKindSize = 1 << 10,
};
enum IMAPFetchRequestType {
IMAPFetchRequestTypeUID = 0,
IMAPFetchRequestTypeSequence = 1
};
enum IMAPStoreFlagsRequestKind {
IMAPStoreFlagsRequestKindAdd,
IMAPStoreFlagsRequestKindRemove,
IMAPStoreFlagsRequestKindSet,
};
enum IMAPWorkaround {
IMAPWorkaroundGmail = 1 << 0,
IMAPWorkaroundYahoo = 1 << 1,
IMAPWorkaroundExchange2003 = 1 << 2,
};
enum IMAPCapability {
IMAPCapabilityACL,
IMAPCapabilityBinary,
IMAPCapabilityCatenate,
IMAPCapabilityChildren,
IMAPCapabilityCompressDeflate,
IMAPCapabilityCondstore,
IMAPCapabilityEnable,
IMAPCapabilityIdle,
IMAPCapabilityId,
IMAPCapabilityLiteralPlus,
IMAPCapabilityMultiAppend,
IMAPCapabilityNamespace,
IMAPCapabilityQResync,
IMAPCapabilityQuota,
IMAPCapabilitySort,
IMAPCapabilityStartTLS,
IMAPCapabilityThreadOrderedSubject,
IMAPCapabilityThreadReferences,
IMAPCapabilityUIDPlus,
IMAPCapabilityUnselect,
IMAPCapabilityXList,
IMAPCapabilityAuthAnonymous,
IMAPCapabilityAuthCRAMMD5,
IMAPCapabilityAuthDigestMD5,
IMAPCapabilityAuthExternal,
IMAPCapabilityAuthGSSAPI,
IMAPCapabilityAuthKerberosV4,
IMAPCapabilityAuthLogin,
IMAPCapabilityAuthNTLM,
IMAPCapabilityAuthOTP,
IMAPCapabilityAuthPlain,
IMAPCapabilityAuthSKey,
IMAPCapabilityAuthSRP,
IMAPCapabilityXOAuth2,
IMAPCapabilityGmail,
};
enum POPCapability {
POPCapabilityNone,
POPCapabilityStartTLS,
POPCapabilityTop,
POPCapabilityUser,
POPCapabilityRespCodes,
POPCapabilityPipelining,
POPCapabilityUIDL,
POPCapabilitySASL,
POPCapabilityAuthAnonymous,
POPCapabilityAuthCRAMMD5,
POPCapabilityAuthDigestMD5,
POPCapabilityAuthExternal,
POPCapabilityAuthGSSAPI,
POPCapabilityAuthKerberosV4,
POPCapabilityAuthLogin,
POPCapabilityAuthNTLM,
POPCapabilityAuthOTP,
POPCapabilityAuthPlain,
POPCapabilityAuthSKey,
POPCapabilityAuthSRP,
};
enum Encoding {
Encoding7Bit = 0, // should match MAILIMAP_BODY_FLD_ENC_7BIT
Encoding8Bit = 1, // should match MAILIMAP_BODY_FLD_ENC_8BIT
EncodingBinary = 2, // should match MAILIMAP_BODY_FLD_ENC_BINARY
EncodingBase64 = 3, // should match MAILIMAP_BODY_FLD_ENC_BASE64
EncodingQuotedPrintable = 4, // should match MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE
EncodingOther = 5, // should match MAILIMAP_BODY_FLD_ENC_OTHER
// negative values should be used for other encoding
EncodingUUEncode = -1
};
enum IMAPSearchKind {
IMAPSearchKindAll,
IMAPSearchKindNone,
IMAPSearchKindFrom,
IMAPSearchKindTo,
IMAPSearchKindCc,
IMAPSearchKindBcc,
IMAPSearchKindRecipient, // Recipient is the combination of To, Cc and Bcc
IMAPSearchKindSubject,
IMAPSearchKindContent,
IMAPSearchKindBody,
IMAPSearchKindUIDs,
IMAPSearchKindHeader,
IMAPSearchKindRead,
IMAPSearchKindUnread,
IMAPSearchKindFlagged,
IMAPSearchKindUnflagged,
IMAPSearchKindAnswered,
IMAPSearchKindUnanswered,
IMAPSearchKindDraft,
IMAPSearchKindUndraft,
IMAPSearchKindDeleted,
IMAPSearchKindSpam,
IMAPSearchKindBeforeDate,
IMAPSearchKindOnDate,
IMAPSearchKindSinceDate,
IMAPSearchKindBeforeReceivedDate,
IMAPSearchKindOnReceivedDate,
IMAPSearchKindSinceReceivedDate,
IMAPSearchKindSizeLarger,
IMAPSearchKindSizeSmaller,
IMAPSearchKindGmailThreadID,
IMAPSearchKindGmailMessageID,
IMAPSearchKindGmailRaw,
IMAPSearchKindOr,
IMAPSearchKindAnd,
IMAPSearchKindNot,
};
enum ErrorCode {
ErrorNone,
ErrorConnection,
ErrorTLSNotAvailable,
ErrorParse,
ErrorCertificate,
ErrorAuthentication,
ErrorGmailIMAPNotEnabled,
ErrorGmailExceededBandwidthLimit,
ErrorGmailTooManySimultaneousConnections,
ErrorMobileMeMoved,
ErrorYahooUnavailable,
ErrorNonExistantFolder,
ErrorRename,
ErrorDelete,
ErrorCreate,
ErrorSubscribe,
ErrorAppend,
ErrorCopy,
ErrorExpunge,
ErrorFetch,
ErrorIdle,
ErrorIdentity,
ErrorNamespace,
ErrorStore,
ErrorCapability,
ErrorStartTLSNotAvailable,
ErrorSendMessageIllegalAttachment,
ErrorStorageLimit,
ErrorSendMessageNotAllowed,
ErrorNeedsConnectToWebmail,
ErrorSendMessage,
ErrorAuthenticationRequired,
ErrorFetchMessageList,
ErrorDeleteMessage,
ErrorInvalidAccount,
ErrorFile,
ErrorCompression,
ErrorNoSender,
ErrorNoRecipient,
ErrorNoop,
};
enum PartType {
PartTypeSingle,
PartTypeMessage,
PartTypeMultipartMixed,
PartTypeMultipartRelated,
PartTypeMultipartAlternative,
PartTypeMultipartSigned,
};
// Private type - It should not be used directly.
enum IMAPMessageRenderingType {
IMAPMessageRenderingTypeHTML,
IMAPMessageRenderingTypeHTMLBody,
IMAPMessageRenderingTypePlainText,
IMAPMessageRenderingTypePlainTextBody,
IMAPMessageRenderingTypePlainTextBodyAndStripWhitespace,
};
}
#endif
#endif

Some files were not shown because too many files have changed in this diff Show More