commit
5ca89c228b
|
|
@ -0,0 +1,20 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||||
|
# Visual Studio 2008
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "QAMQP", "QAMQP.vcproj", "{479207E5-BC66-4954-A7E9-AE8DA7F2D7B9}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{479207E5-BC66-4954-A7E9-AE8DA7F2D7B9}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{479207E5-BC66-4954-A7E9-AE8DA7F2D7B9}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{479207E5-BC66-4954-A7E9-AE8DA7F2D7B9}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{479207E5-BC66-4954-A7E9-AE8DA7F2D7B9}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
|
|
@ -0,0 +1,543 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9,00"
|
||||||
|
Name="QAMQP"
|
||||||
|
ProjectGUID="{479207E5-BC66-4954-A7E9-AE8DA7F2D7B9}"
|
||||||
|
RootNamespace="QAMQP"
|
||||||
|
Keyword="Qt4VSv1.0"
|
||||||
|
TargetFrameworkVersion="0"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalIncludeDirectories=""$(QTDIR)\include";".\GeneratedFiles\$(ConfigurationName)";"$(QTDIR)\include\qtmain";"$(QTDIR)\include\QtCore";"$(QTDIR)\include\QtNetwork""
|
||||||
|
PreprocessorDefinitions=",UNICODE,WIN32,QT_LARGEFILE_SUPPORT;QT_NO_DEBUG,NDEBUG;QT_CORE_LIB;QT_NETWORK_LIB"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
TreatWChar_tAsBuiltInType="false"
|
||||||
|
DebugInformationFormat="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="qtmain.lib QtCore4.lib QtNetwork4.lib"
|
||||||
|
OutputFile="$(OutDir)\$(ProjectName).exe"
|
||||||
|
AdditionalLibraryDirectories="$(QTDIR)\lib"
|
||||||
|
GenerateDebugInformation="false"
|
||||||
|
SubSystem="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories=""$(QTDIR)\include";".\GeneratedFiles\$(ConfigurationName)";"$(QTDIR)\include\qtmain";"$(QTDIR)\include\QtCore";"$(QTDIR)\include\QtNetwork""
|
||||||
|
PreprocessorDefinitions=",UNICODE,WIN32,QT_LARGEFILE_SUPPORT;QT_CORE_LIB;QT_NETWORK_LIB"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
TreatWChar_tAsBuiltInType="false"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="qtmaind.lib QtCored4.lib QtNetworkd4.lib"
|
||||||
|
OutputFile="$(OutDir)\$(ProjectName).exe"
|
||||||
|
AdditionalLibraryDirectories="$(QTDIR)\lib"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;cxx;c;def"
|
||||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_channel.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_connection.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_frame.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_network.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\main.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h"
|
||||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp.h"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
Description="Moc'ing $(InputFileName)..."
|
||||||
|
CommandLine=""$(QTDIR)\bin\moc.exe" "$(InputPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_NETWORK_LIB "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtNetwork"
"
|
||||||
|
AdditionalDependencies=""$(QTDIR)\bin\moc.exe";$(InputPath)"
|
||||||
|
Outputs="".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
Description="Moc'ing $(InputFileName)..."
|
||||||
|
CommandLine=""$(QTDIR)\bin\moc.exe" "$(InputPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_NETWORK_LIB "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtNetwork"
"
|
||||||
|
AdditionalDependencies=""$(QTDIR)\bin\moc.exe";$(InputPath)"
|
||||||
|
Outputs="".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_channel.h"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
Description="Moc'ing $(InputFileName)..."
|
||||||
|
CommandLine=""$(QTDIR)\bin\moc.exe" "$(InputPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_NETWORK_LIB "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtNetwork"
"
|
||||||
|
AdditionalDependencies=""$(QTDIR)\bin\moc.exe";$(InputPath)"
|
||||||
|
Outputs="".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
Description="Moc'ing $(InputFileName)..."
|
||||||
|
CommandLine=""$(QTDIR)\bin\moc.exe" "$(InputPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_NETWORK_LIB "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtNetwork"
"
|
||||||
|
AdditionalDependencies=""$(QTDIR)\bin\moc.exe";$(InputPath)"
|
||||||
|
Outputs="".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_channel_p.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_connection.h"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
Description="Moc'ing $(InputFileName)..."
|
||||||
|
CommandLine=""$(QTDIR)\bin\moc.exe" "$(InputPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_NETWORK_LIB "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtNetwork"
"
|
||||||
|
AdditionalDependencies=""$(QTDIR)\bin\moc.exe";$(InputPath)"
|
||||||
|
Outputs="".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
Description="Moc'ing $(InputFileName)..."
|
||||||
|
CommandLine=""$(QTDIR)\bin\moc.exe" "$(InputPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_NETWORK_LIB "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtNetwork"
"
|
||||||
|
AdditionalDependencies=""$(QTDIR)\bin\moc.exe";$(InputPath)"
|
||||||
|
Outputs="".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_connection_p.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_exchange.h"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
Description="Moc'ing $(InputFileName)..."
|
||||||
|
CommandLine=""$(QTDIR)\bin\moc.exe" "$(InputPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_NETWORK_LIB "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtNetwork"
"
|
||||||
|
AdditionalDependencies=""$(QTDIR)\bin\moc.exe";$(InputPath)"
|
||||||
|
Outputs="".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
Description="Moc'ing $(InputFileName)..."
|
||||||
|
CommandLine=""$(QTDIR)\bin\moc.exe" "$(InputPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_NETWORK_LIB "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtNetwork"
"
|
||||||
|
AdditionalDependencies=""$(QTDIR)\bin\moc.exe";$(InputPath)"
|
||||||
|
Outputs="".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_frame.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_message.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_network.h"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
Description="Moc'ing $(InputFileName)..."
|
||||||
|
CommandLine=""$(QTDIR)\bin\moc.exe" "$(InputPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_NETWORK_LIB "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtNetwork"
"
|
||||||
|
AdditionalDependencies=""$(QTDIR)\bin\moc.exe";$(InputPath)"
|
||||||
|
Outputs="".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
Description="Moc'ing $(InputFileName)..."
|
||||||
|
CommandLine=""$(QTDIR)\bin\moc.exe" "$(InputPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_NETWORK_LIB "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtNetwork"
"
|
||||||
|
AdditionalDependencies=""$(QTDIR)\bin\moc.exe";$(InputPath)"
|
||||||
|
Outputs="".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_p.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_private.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\amqp_queue.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\QAMQP.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\qamqp_global.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Resource Files"
|
||||||
|
Filter="qrc;*"
|
||||||
|
UniqueIdentifier="{D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E}"
|
||||||
|
ParseFiles="false"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Generated Files"
|
||||||
|
Filter="moc;h;cpp"
|
||||||
|
UniqueIdentifier="{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}"
|
||||||
|
SourceControlFiles="false"
|
||||||
|
>
|
||||||
|
<Filter
|
||||||
|
Name="Release"
|
||||||
|
Filter="cpp;moc"
|
||||||
|
SourceControlFiles="false"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\GeneratedFiles\Release\moc_amqp.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\GeneratedFiles\Release\moc_amqp_channel.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\GeneratedFiles\Release\moc_amqp_connection.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\GeneratedFiles\Release\moc_amqp_exchange.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\GeneratedFiles\Release\moc_amqp_network.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Debug"
|
||||||
|
Filter="cpp;moc"
|
||||||
|
SourceControlFiles="false"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\GeneratedFiles\Debug\moc_amqp.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\GeneratedFiles\Debug\moc_amqp_channel.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\GeneratedFiles\Debug\moc_amqp_connection.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\GeneratedFiles\Debug\moc_amqp_exchange.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\GeneratedFiles\Debug\moc_amqp_network.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
ExcludedFromBuild="true"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
<Global
|
||||||
|
Name="lreleaseOptions"
|
||||||
|
Value=""
|
||||||
|
/>
|
||||||
|
<Global
|
||||||
|
Name="lupdateOnBuild"
|
||||||
|
Value="0"
|
||||||
|
/>
|
||||||
|
<Global
|
||||||
|
Name="lupdateOptions"
|
||||||
|
Value=""
|
||||||
|
/>
|
||||||
|
<Global
|
||||||
|
Name="MocDir"
|
||||||
|
Value=".\GeneratedFiles\$(ConfigurationName)"
|
||||||
|
/>
|
||||||
|
<Global
|
||||||
|
Name="MocOptions"
|
||||||
|
Value=""
|
||||||
|
/>
|
||||||
|
<Global
|
||||||
|
Name="QtVersion Win32"
|
||||||
|
Value="4.7.1"
|
||||||
|
/>
|
||||||
|
<Global
|
||||||
|
Name="RccDir"
|
||||||
|
Value=".\GeneratedFiles"
|
||||||
|
/>
|
||||||
|
<Global
|
||||||
|
Name="UicDir"
|
||||||
|
Value=".\GeneratedFiles"
|
||||||
|
/>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
||||||
|
|
@ -0,0 +1,233 @@
|
||||||
|
/*
|
||||||
|
* QAMQP.h
|
||||||
|
* libqamqp
|
||||||
|
*
|
||||||
|
* Created by Alexey Shcherbakov on 28.01.2012.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef QAMQP_h__
|
||||||
|
#define QAMQP_h__
|
||||||
|
|
||||||
|
#define AMQPDEBUG ":5673"
|
||||||
|
|
||||||
|
#define AMQP_AUTODELETE 1
|
||||||
|
#define AMQP_DURABLE 2
|
||||||
|
#define AMQP_PASSIVE 4
|
||||||
|
#define AMQP_MANDATORY 8
|
||||||
|
#define AMQP_IMMIDIATE 16
|
||||||
|
#define AMQP_IFUNUSED 32
|
||||||
|
#define AMQP_EXCLUSIVE 64
|
||||||
|
#define AMQP_NOWAIT 128
|
||||||
|
#define AMQP_NOACK 256
|
||||||
|
#define AMQP_NOLOCAL 512
|
||||||
|
#define AMQP_MULTIPLE 1024
|
||||||
|
|
||||||
|
|
||||||
|
#define HEADER_FOOTER_SIZE 8 // 7 bytes up front, then payload, then 1 byte footer
|
||||||
|
// max lenght (size) of frame
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QVector>
|
||||||
|
#include <QMap>
|
||||||
|
|
||||||
|
|
||||||
|
//export AMQP;
|
||||||
|
namespace QAMQP
|
||||||
|
{
|
||||||
|
class AMQPQueue;
|
||||||
|
|
||||||
|
enum AMQPEvents_e {
|
||||||
|
AMQP_MESSAGE, AMQP_SIGUSR, AMQP_CANCEL, AMQP_CLOSE_CHANNEL
|
||||||
|
};
|
||||||
|
|
||||||
|
class AMQPException {
|
||||||
|
string message;
|
||||||
|
int code;
|
||||||
|
public:
|
||||||
|
AMQPException(string message);
|
||||||
|
AMQPException(amqp_rpc_reply_t * res);
|
||||||
|
|
||||||
|
string getMessage();
|
||||||
|
uint16_t getReplyCode();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class AMQPMessage {
|
||||||
|
|
||||||
|
char * data;
|
||||||
|
string exchange;
|
||||||
|
string routing_key;
|
||||||
|
uint32_t delivery_tag;
|
||||||
|
int message_count;
|
||||||
|
string consumer_tag;
|
||||||
|
AMQPQueue * queue;
|
||||||
|
map<string,string> headers;
|
||||||
|
|
||||||
|
public :
|
||||||
|
AMQPMessage(AMQPQueue * queue);
|
||||||
|
~AMQPMessage();
|
||||||
|
|
||||||
|
void setMessage(const char * data);
|
||||||
|
char * getMessage();
|
||||||
|
|
||||||
|
void addHeader(string name, amqp_bytes_t * value);
|
||||||
|
void addHeader(string name, uint64_t * value);
|
||||||
|
void addHeader(string name, uint8_t * value);
|
||||||
|
string getHeader(string name);
|
||||||
|
|
||||||
|
void setConsumerTag( amqp_bytes_t consumer_tag);
|
||||||
|
void setConsumerTag( string consumer_tag);
|
||||||
|
string getConsumerTag();
|
||||||
|
|
||||||
|
void setMessageCount(int count);
|
||||||
|
int getMessageCount();
|
||||||
|
|
||||||
|
void setExchange(amqp_bytes_t exchange);
|
||||||
|
void setExchange(string exchange);
|
||||||
|
string getExchange();
|
||||||
|
|
||||||
|
void setRoutingKey(amqp_bytes_t routing_key);
|
||||||
|
void setRoutingKey(string routing_key);
|
||||||
|
string getRoutingKey();
|
||||||
|
|
||||||
|
uint32_t getDeliveryTag();
|
||||||
|
void setDeliveryTag(uint32_t delivery_tag);
|
||||||
|
|
||||||
|
AMQPQueue * getQueue();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class AMQPBase {
|
||||||
|
protected:
|
||||||
|
string name;
|
||||||
|
short parms;
|
||||||
|
amqp_connection_state_t * cnn;
|
||||||
|
int channelNum;
|
||||||
|
AMQPMessage * pmessage;
|
||||||
|
|
||||||
|
short opened;
|
||||||
|
|
||||||
|
void checkReply(amqp_rpc_reply_t * res);
|
||||||
|
void checkClosed(amqp_rpc_reply_t * res);
|
||||||
|
void openChannel();
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
~AMQPBase();
|
||||||
|
int getChannelNum();
|
||||||
|
void setParam(short param);
|
||||||
|
string getName();
|
||||||
|
void closeChannel();
|
||||||
|
void reopen();
|
||||||
|
void setName(const char * name);
|
||||||
|
void setName(string name);
|
||||||
|
};
|
||||||
|
|
||||||
|
class AMQPQueue : public AMQPBase {
|
||||||
|
protected:
|
||||||
|
map< AMQPEvents_e, int(*)( AMQPMessage * ) > events;
|
||||||
|
amqp_bytes_t consumer_tag;
|
||||||
|
uint32_t delivery_tag;
|
||||||
|
uint32_t count;
|
||||||
|
public:
|
||||||
|
AMQPQueue(amqp_connection_state_t * cnn, int channelNum);
|
||||||
|
AMQPQueue(amqp_connection_state_t * cnn, int channelNum, string name);
|
||||||
|
|
||||||
|
void Declare();
|
||||||
|
void Declare(string name);
|
||||||
|
void Declare(string name, short parms);
|
||||||
|
|
||||||
|
void Delete();
|
||||||
|
void Delete(string name);
|
||||||
|
|
||||||
|
void Purge();
|
||||||
|
void Purge(string name);
|
||||||
|
|
||||||
|
void Bind(string exchangeName, string key);
|
||||||
|
|
||||||
|
void unBind(string exchangeName, string key);
|
||||||
|
|
||||||
|
void Get();
|
||||||
|
void Get(short param);
|
||||||
|
|
||||||
|
void Consume();
|
||||||
|
void Consume(short param);
|
||||||
|
|
||||||
|
void Cancel(amqp_bytes_t consumer_tag);
|
||||||
|
void Cancel(string consumer_tag);
|
||||||
|
|
||||||
|
void Ack();
|
||||||
|
void Ack(uint32_t delivery_tag);
|
||||||
|
|
||||||
|
AMQPMessage * getMessage() {
|
||||||
|
return pmessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t getCount() {
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setConsumerTag(string consumer_tag);
|
||||||
|
amqp_bytes_t getConsumerTag();
|
||||||
|
|
||||||
|
void addEvent( AMQPEvents_e eventType, int (*event)(AMQPMessage*) );
|
||||||
|
|
||||||
|
~AMQPQueue();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void sendDeclareCommand();
|
||||||
|
void sendDeleteCommand();
|
||||||
|
void sendPurgeCommand();
|
||||||
|
void sendBindCommand(const char * exchange, const char * key);
|
||||||
|
void sendUnBindCommand(const char * exchange, const char * key);
|
||||||
|
void sendGetCommand();
|
||||||
|
void sendConsumeCommand();
|
||||||
|
void sendCancelCommand();
|
||||||
|
void sendAckCommand();
|
||||||
|
void setHeaders(amqp_basic_properties_t * p);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class AMQPExchange : public AMQPBase {
|
||||||
|
string type;
|
||||||
|
map<string,string> sHeaders;
|
||||||
|
map<string, int> iHeaders;
|
||||||
|
|
||||||
|
public:
|
||||||
|
AMQPExchange(amqp_connection_state_t * cnn, int channelNum);
|
||||||
|
AMQPExchange(amqp_connection_state_t * cnn, int channelNum, string name);
|
||||||
|
|
||||||
|
void Declare();
|
||||||
|
void Declare(string name);
|
||||||
|
void Declare(string name, string type);
|
||||||
|
void Declare(string name, string type, short parms);
|
||||||
|
|
||||||
|
void Delete();
|
||||||
|
void Delete(string name);
|
||||||
|
|
||||||
|
void Bind(string queueName);
|
||||||
|
void Bind(string queueName, string key);
|
||||||
|
|
||||||
|
void Publish(string message, string key);
|
||||||
|
|
||||||
|
void setHeader(string name, int value);
|
||||||
|
void setHeader(string name, string value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
AMQPExchange();
|
||||||
|
void checkType();
|
||||||
|
void sendDeclareCommand();
|
||||||
|
void sendDeleteCommand();
|
||||||
|
void sendPublishCommand();
|
||||||
|
|
||||||
|
void sendBindCommand(const char * queueName, const char * key);
|
||||||
|
void sendPublishCommand(const char * message, const char * key);
|
||||||
|
void sendCommand();
|
||||||
|
void checkReply(amqp_rpc_reply_t * res);
|
||||||
|
void checkClosed(amqp_rpc_reply_t * res);
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif // QAMQP_h__
|
||||||
|
|
@ -0,0 +1,245 @@
|
||||||
|
#include "amqp.h"
|
||||||
|
#include "amqp_p.h"
|
||||||
|
|
||||||
|
#include <QTextStream>
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include "qamqp_global.h"
|
||||||
|
#include "amqp_exchange.h"
|
||||||
|
|
||||||
|
using namespace QAMQP;
|
||||||
|
|
||||||
|
struct QAMQP::ClientExceptionCleaner
|
||||||
|
{
|
||||||
|
/* this cleans up when the constructor throws an exception */
|
||||||
|
static inline void cleanup(Client *that, ClientPrivate *d)
|
||||||
|
{
|
||||||
|
#ifdef QT_NO_EXCEPTIONS
|
||||||
|
Q_UNUSED(that);
|
||||||
|
Q_UNUSED(d);
|
||||||
|
#else
|
||||||
|
Q_UNUSED(that);
|
||||||
|
Q_UNUSED(d);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
ClientPrivate::ClientPrivate(int version )
|
||||||
|
:QObjectPrivate(version)
|
||||||
|
, port(AMQPPORT)
|
||||||
|
, host(QString::fromLatin1(AMQPHOST))
|
||||||
|
, virtualHost(QString::fromLatin1(AMQPVHOST))
|
||||||
|
, user(QString::fromLatin1(AMQPLOGIN))
|
||||||
|
, password(QString::fromLatin1(AMQPPSWD))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ClientPrivate::~ClientPrivate()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientPrivate::init(QObject * parent)
|
||||||
|
{
|
||||||
|
q_func()->setParent(parent);
|
||||||
|
network_ = new QAMQP::Network(q_func());
|
||||||
|
connection_ = new QAMQP::Connection(q_func());
|
||||||
|
|
||||||
|
QObject::connect(network_, SIGNAL(method(const QAMQP::Frame::Method &)),
|
||||||
|
connection_, SLOT(_q_method(const QAMQP::Frame::Method &)));
|
||||||
|
|
||||||
|
ClientPrivate::connect();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientPrivate::init(QObject * parent, const QUrl & con)
|
||||||
|
{
|
||||||
|
Q_Q(QAMQP::Client);
|
||||||
|
if(con.scheme() == AMQPSCHEME )
|
||||||
|
{
|
||||||
|
q->setPassword(con.password());
|
||||||
|
q->setUser(con.userName());
|
||||||
|
q->setPort(con.port());
|
||||||
|
q->setHost(con.host());
|
||||||
|
q->setVirtualHost(con.path());
|
||||||
|
}
|
||||||
|
init(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientPrivate::printConnect() const
|
||||||
|
{
|
||||||
|
QTextStream stream(stdout);
|
||||||
|
stream << "port = " << port << endl;
|
||||||
|
stream << "host = " << host << endl;
|
||||||
|
stream << "vhost = " << virtualHost << endl;
|
||||||
|
stream << "user = " << user << endl;
|
||||||
|
stream << "passw = " << password << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientPrivate::connect()
|
||||||
|
{
|
||||||
|
ClientPrivate::sockConnect();
|
||||||
|
ClientPrivate::login();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientPrivate::parseCnnString( const QUrl & connectionString )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientPrivate::sockConnect()
|
||||||
|
{
|
||||||
|
network_->connectTo(host, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientPrivate::login()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Exchange * ClientPrivate::createExchange( const QString &name )
|
||||||
|
{
|
||||||
|
Exchange * exchange_ = new Exchange(q_func());
|
||||||
|
QObject::connect(network_, SIGNAL(method(const QAMQP::Frame::Method &)),
|
||||||
|
exchange_, SLOT(_q_method(const QAMQP::Frame::Method &)));
|
||||||
|
|
||||||
|
QObject::connect(connection_, SIGNAL(connected()), exchange_, SLOT(_q_open()));
|
||||||
|
return exchange_;
|
||||||
|
}
|
||||||
|
|
||||||
|
Queue * ClientPrivate::createQueue( const QString &name )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
QAMQP::Client::Client( QObject * parent /*= 0*/ )
|
||||||
|
: QObject(*new ClientPrivate, 0)
|
||||||
|
{
|
||||||
|
QT_TRY {
|
||||||
|
d_func()->init(parent);
|
||||||
|
} QT_CATCH(...) {
|
||||||
|
ClientExceptionCleaner::cleanup(this, d_func());
|
||||||
|
QT_RETHROW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QAMQP::Client::Client( const QUrl & connectionString, QObject * parent /*= 0*/ )
|
||||||
|
: QObject(*new ClientPrivate, 0)
|
||||||
|
{
|
||||||
|
QT_TRY {
|
||||||
|
d_func()->init(parent, connectionString);
|
||||||
|
} QT_CATCH(...) {
|
||||||
|
ClientExceptionCleaner::cleanup(this, d_func());
|
||||||
|
QT_RETHROW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QAMQP::Client::Client(ClientPrivate &dd, QObject* parent, const QUrl & connectionString)
|
||||||
|
: QObject(dd, 0)
|
||||||
|
{
|
||||||
|
Q_D(QAMQP::Client);
|
||||||
|
QT_TRY {
|
||||||
|
d->init(parent, connectionString);
|
||||||
|
} QT_CATCH(...) {
|
||||||
|
ClientExceptionCleaner::cleanup(this, d_func());
|
||||||
|
QT_RETHROW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QAMQP::Client::~Client()
|
||||||
|
{
|
||||||
|
QObjectPrivate::clearGuards(this);
|
||||||
|
QT_TRY {
|
||||||
|
QEvent e(QEvent::Destroy);
|
||||||
|
QCoreApplication::sendEvent(this, &e);
|
||||||
|
} QT_CATCH(const std::exception&) {
|
||||||
|
// if this fails we can't do anything about it but at least we are not allowed to throw.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
quint32 QAMQP::Client::port() const
|
||||||
|
{
|
||||||
|
return d_func()->port;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Client::setPort( quint32 port )
|
||||||
|
{
|
||||||
|
d_func()->port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString QAMQP::Client::host() const
|
||||||
|
{
|
||||||
|
return d_func()->host;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Client::setHost( const QString & host )
|
||||||
|
{
|
||||||
|
d_func()->host = host;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString QAMQP::Client::virtualHost() const
|
||||||
|
{
|
||||||
|
return d_func()->virtualHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Client::setVirtualHost( const QString & virtualHost )
|
||||||
|
{
|
||||||
|
d_func()->virtualHost = virtualHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString QAMQP::Client::user() const
|
||||||
|
{
|
||||||
|
return d_func()->user;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Client::setUser( const QString & user )
|
||||||
|
{
|
||||||
|
d_func()->user = user;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString QAMQP::Client::password() const
|
||||||
|
{
|
||||||
|
return d_func()->password;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Client::setPassword( const QString & password )
|
||||||
|
{
|
||||||
|
d_func()->password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Client::printConnect() const
|
||||||
|
{
|
||||||
|
#ifdef _DEBUG
|
||||||
|
d_func()->printConnect();
|
||||||
|
#endif // _DEBUG
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Client::closeChannel()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Exchange * QAMQP::Client::createExchange()
|
||||||
|
{
|
||||||
|
return d_func()->createExchange(QString());
|
||||||
|
}
|
||||||
|
|
||||||
|
Exchange * QAMQP::Client::createExchange( const QString &name )
|
||||||
|
{
|
||||||
|
return d_func()->createExchange(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
Queue * QAMQP::Client::createQueue()
|
||||||
|
{
|
||||||
|
return d_func()->createQueue(QString());
|
||||||
|
}
|
||||||
|
|
||||||
|
Queue * QAMQP::Client::createQueue( const QString &name )
|
||||||
|
{
|
||||||
|
return d_func()->createQueue(name);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
#ifndef qamqp_amqp_h__
|
||||||
|
#define qamqp_amqp_h__
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
|
namespace QAMQP
|
||||||
|
{
|
||||||
|
class Exchange;
|
||||||
|
class Queue;
|
||||||
|
class ClientPrivate;
|
||||||
|
class ConnectionPrivate;
|
||||||
|
class Client : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(quint32 port READ port WRITE setPort);
|
||||||
|
Q_PROPERTY(QString host READ host WRITE setHost);
|
||||||
|
Q_PROPERTY(QString virtualHost READ virtualHost WRITE setVirtualHost);
|
||||||
|
Q_PROPERTY(QString user READ user WRITE setUser);
|
||||||
|
Q_PROPERTY(QString password READ password WRITE setPassword);
|
||||||
|
|
||||||
|
Q_DECLARE_PRIVATE(QAMQP::Client)
|
||||||
|
Q_DISABLE_COPY(Client)
|
||||||
|
friend class ConnectionPrivate;
|
||||||
|
friend class ChannelPrivate;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Client(QObject * parent = 0);
|
||||||
|
Client(const QUrl & connectionString, QObject * parent = 0);
|
||||||
|
~Client();
|
||||||
|
|
||||||
|
void printConnect() const;
|
||||||
|
void closeChannel();
|
||||||
|
|
||||||
|
Exchange * createExchange();
|
||||||
|
Exchange * createExchange(const QString &name);
|
||||||
|
|
||||||
|
Queue * createQueue();
|
||||||
|
Queue * createQueue(const QString &name);
|
||||||
|
|
||||||
|
quint32 port() const;
|
||||||
|
void setPort(quint32 port);
|
||||||
|
|
||||||
|
QString host() const;
|
||||||
|
void setHost(const QString & host);
|
||||||
|
|
||||||
|
QString virtualHost() const;
|
||||||
|
void setVirtualHost(const QString & virtualHost);
|
||||||
|
|
||||||
|
QString user() const;
|
||||||
|
void setUser(const QString & user);
|
||||||
|
|
||||||
|
QString password() const;
|
||||||
|
void setPassword(const QString & password);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Client(ClientPrivate &d, QObject* parent, const QUrl & connectionString);
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend struct ClientExceptionCleaner;
|
||||||
|
//void chanalConnect();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // qamqp_amqp_h__
|
||||||
|
|
@ -0,0 +1,255 @@
|
||||||
|
#include "amqp_channel.h"
|
||||||
|
#include "amqp_channel_p.h"
|
||||||
|
|
||||||
|
#include "amqp.h"
|
||||||
|
#include "amqp_p.h"
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDataStream>
|
||||||
|
|
||||||
|
using namespace QAMQP;
|
||||||
|
|
||||||
|
namespace QAMQP
|
||||||
|
{
|
||||||
|
int ChannelPrivate::nextChannelNumber_ = 0;
|
||||||
|
struct ChannelExceptionCleaner
|
||||||
|
{
|
||||||
|
/* this cleans up when the constructor throws an exception */
|
||||||
|
static inline void cleanup(Channel *that, ChannelPrivate *d)
|
||||||
|
{
|
||||||
|
#ifdef QT_NO_EXCEPTIONS
|
||||||
|
Q_UNUSED(that);
|
||||||
|
Q_UNUSED(d);
|
||||||
|
#else
|
||||||
|
Q_UNUSED(that);
|
||||||
|
Q_UNUSED(d);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
QAMQP::Channel::Channel( Client * parent /*= 0*/ )
|
||||||
|
: QObject(*new ChannelPrivate, 0)
|
||||||
|
{
|
||||||
|
QT_TRY {
|
||||||
|
d_func()->init(parent);
|
||||||
|
} QT_CATCH(...) {
|
||||||
|
ChannelExceptionCleaner::cleanup(this, d_func());
|
||||||
|
QT_RETHROW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QAMQP::Channel::Channel( ChannelPrivate &dd, Client* parent )
|
||||||
|
: QObject(dd, 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
QAMQP::Channel::~Channel()
|
||||||
|
{
|
||||||
|
QObjectPrivate::clearGuards(this);
|
||||||
|
|
||||||
|
QT_TRY {
|
||||||
|
QEvent e(QEvent::Destroy);
|
||||||
|
QCoreApplication::sendEvent(this, &e);
|
||||||
|
} QT_CATCH(const std::exception&) {
|
||||||
|
// if this fails we can't do anything about it but at least we are not allowed to throw.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Channel::closeChannel()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Channel::reopen()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
QString QAMQP::Channel::name()
|
||||||
|
{
|
||||||
|
return d_func()->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
int QAMQP::Channel::channelNumber()
|
||||||
|
{
|
||||||
|
return d_func()->number;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Channel::setParam( int param )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Channel::setName( const QString &name )
|
||||||
|
{
|
||||||
|
d_func()->name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Channel::stateChanged( int state )
|
||||||
|
{
|
||||||
|
switch(ChannelPrivate::State(state))
|
||||||
|
{
|
||||||
|
case ChannelPrivate::csOpened:
|
||||||
|
emit opened();
|
||||||
|
break;
|
||||||
|
case ChannelPrivate::csClosed:
|
||||||
|
emit closed();
|
||||||
|
break;
|
||||||
|
case ChannelPrivate::csIdle:
|
||||||
|
emit flowChanged(false);
|
||||||
|
break;
|
||||||
|
case ChannelPrivate::csRunning:
|
||||||
|
emit flowChanged(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
ChannelPrivate::ChannelPrivate(int version /* = QObjectPrivateVersion */)
|
||||||
|
:QObjectPrivate(version), number(++nextChannelNumber_)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ChannelPrivate::~ChannelPrivate()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelPrivate::init(Client * parent)
|
||||||
|
{
|
||||||
|
q_func()->setParent(parent);
|
||||||
|
client_ = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ChannelPrivate::_q_method( const QAMQP::Frame::Method & frame )
|
||||||
|
{
|
||||||
|
if(frame.methodClass() != QAMQP::Frame::fcChannel
|
||||||
|
|| frame.channel() != number )
|
||||||
|
return;
|
||||||
|
|
||||||
|
qDebug("Channel#%d:", number);
|
||||||
|
|
||||||
|
switch(frame.id())
|
||||||
|
{
|
||||||
|
case miOpenOk:
|
||||||
|
openOk(frame);
|
||||||
|
break;
|
||||||
|
case miFlow:
|
||||||
|
flow(frame);
|
||||||
|
break;
|
||||||
|
case miFlowOk:
|
||||||
|
flowOk(frame);
|
||||||
|
break;
|
||||||
|
case miClose:
|
||||||
|
close(frame);
|
||||||
|
break;
|
||||||
|
case miCloseOk:
|
||||||
|
closeOk(frame);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelPrivate::_q_open()
|
||||||
|
{
|
||||||
|
qDebug("Open channel #%d", number);
|
||||||
|
open();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ChannelPrivate::sendFrame( const QAMQP::Frame::Base & frame )
|
||||||
|
{
|
||||||
|
client_->d_func()->network_->sendFrame(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ChannelPrivate::open()
|
||||||
|
{
|
||||||
|
QAMQP::Frame::Method frame(QAMQP::Frame::fcChannel, miOpen);
|
||||||
|
frame.setChannel(number);
|
||||||
|
QByteArray arguments_;
|
||||||
|
arguments_.resize(1);
|
||||||
|
arguments_[0] = 0;
|
||||||
|
frame.setArguments(arguments_);
|
||||||
|
sendFrame(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ChannelPrivate::flow()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelPrivate::flow( const QAMQP::Frame::Method & frame )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
void ChannelPrivate::flowOk()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelPrivate::flowOk( const QAMQP::Frame::Method & frame )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelPrivate::close(int code, const QString & text, int classId, int methodId)
|
||||||
|
{
|
||||||
|
QAMQP::Frame::Method frame(QAMQP::Frame::fcChannel, miClose);
|
||||||
|
QByteArray arguments_;
|
||||||
|
QDataStream stream(&arguments_, QIODevice::WriteOnly);
|
||||||
|
|
||||||
|
QAMQP::Frame::writeField('s',stream, client_->virtualHost());
|
||||||
|
|
||||||
|
stream << qint16(code);
|
||||||
|
QAMQP::Frame::writeField('s', stream, text);
|
||||||
|
stream << qint16(classId);
|
||||||
|
stream << qint16(methodId);
|
||||||
|
|
||||||
|
frame.setArguments(arguments_);
|
||||||
|
client_->d_func()->network_->sendFrame(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelPrivate::close( const QAMQP::Frame::Method & frame )
|
||||||
|
{
|
||||||
|
q_func()->stateChanged(csClosed);
|
||||||
|
|
||||||
|
qDebug(">> CLOSE");
|
||||||
|
QByteArray data = frame.arguments();
|
||||||
|
QDataStream stream(&data, QIODevice::ReadOnly);
|
||||||
|
qint16 code_ = 0, classId, methodId;
|
||||||
|
stream >> code_;
|
||||||
|
QString text(QAMQP::Frame::readField('s', stream).toString());
|
||||||
|
stream >> classId;
|
||||||
|
stream >> methodId;
|
||||||
|
|
||||||
|
qDebug(">> code: %d", code_);
|
||||||
|
qDebug(">> text: %s", qPrintable(text));
|
||||||
|
qDebug(">> class-id: %d", classId);
|
||||||
|
qDebug(">> method-id: %d", methodId);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelPrivate::closeOk()
|
||||||
|
{
|
||||||
|
QAMQP::Frame::Method frame(QAMQP::Frame::fcChannel, miCloseOk);
|
||||||
|
sendFrame(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelPrivate::closeOk( const QAMQP::Frame::Method & frame )
|
||||||
|
{
|
||||||
|
q_func()->stateChanged(csClosed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelPrivate::openOk( const QAMQP::Frame::Method & frame )
|
||||||
|
{
|
||||||
|
qDebug(">> OpenOK");
|
||||||
|
q_func()->stateChanged(csOpened);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
#ifndef amqp_channel_h__
|
||||||
|
#define amqp_channel_h__
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include "qamqp_global.h"
|
||||||
|
#include "amqp_frame.h"
|
||||||
|
|
||||||
|
namespace QAMQP
|
||||||
|
{
|
||||||
|
class ChannelPrivate;
|
||||||
|
class Client;
|
||||||
|
class Channel : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(int number READ channelNumber);
|
||||||
|
Q_PROPERTY(QString name READ name WRITE setName);
|
||||||
|
|
||||||
|
Q_DECLARE_PRIVATE(QAMQP::Channel)
|
||||||
|
Q_DISABLE_COPY(Channel)
|
||||||
|
public:
|
||||||
|
~Channel();
|
||||||
|
|
||||||
|
void closeChannel();
|
||||||
|
void reopen();
|
||||||
|
|
||||||
|
QString name();
|
||||||
|
int channelNumber();
|
||||||
|
|
||||||
|
void setParam(int param);
|
||||||
|
void setName(const QString &name);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void opened();
|
||||||
|
void closed();
|
||||||
|
void flowChanged(bool enabled);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Channel(Client * parent = 0);
|
||||||
|
Channel(ChannelPrivate &dd, Client* parent);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void stateChanged(int state);
|
||||||
|
friend class ClientPrivate;
|
||||||
|
Q_PRIVATE_SLOT(d_func(), void _q_open())
|
||||||
|
Q_PRIVATE_SLOT(d_func(), void _q_method(const QAMQP::Frame::Method & frame))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef QAMQP_P_INCLUDE
|
||||||
|
# include "amqp_channel_p.h"
|
||||||
|
#endif
|
||||||
|
#endif // amqp_channel_h__
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
#ifndef amqp_channel_p_h__
|
||||||
|
#define amqp_channel_p_h__
|
||||||
|
|
||||||
|
#include <QtCore/private/qobject_p.h>
|
||||||
|
|
||||||
|
#define METHOD_ID_ENUM(name, id) name = id, name ## Ok
|
||||||
|
|
||||||
|
namespace QAMQP
|
||||||
|
{
|
||||||
|
class Client;
|
||||||
|
class ClientPrivate;
|
||||||
|
class ChannelPrivate : public QObjectPrivate
|
||||||
|
{
|
||||||
|
Q_DECLARE_PUBLIC(QAMQP::Channel)
|
||||||
|
public:
|
||||||
|
enum MethodId
|
||||||
|
{
|
||||||
|
METHOD_ID_ENUM(miOpen, 10),
|
||||||
|
METHOD_ID_ENUM(miFlow, 20),
|
||||||
|
METHOD_ID_ENUM(miClose, 40)
|
||||||
|
};
|
||||||
|
|
||||||
|
enum State {
|
||||||
|
csOpened,
|
||||||
|
csClosed,
|
||||||
|
csIdle,
|
||||||
|
csRunning
|
||||||
|
};
|
||||||
|
|
||||||
|
ChannelPrivate(int version = QObjectPrivateVersion);
|
||||||
|
~ChannelPrivate();
|
||||||
|
|
||||||
|
void init(Client * parent);
|
||||||
|
|
||||||
|
void open();
|
||||||
|
void flow();
|
||||||
|
void flowOk();
|
||||||
|
void close(int code, const QString & text, int classId, int methodId);
|
||||||
|
void closeOk();
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void openOk(const QAMQP::Frame::Method & frame);
|
||||||
|
void flow(const QAMQP::Frame::Method & frame);
|
||||||
|
void flowOk(const QAMQP::Frame::Method & frame);
|
||||||
|
void close(const QAMQP::Frame::Method & frame);
|
||||||
|
void closeOk(const QAMQP::Frame::Method & frame);
|
||||||
|
|
||||||
|
void _q_method(const QAMQP::Frame::Method & frame);
|
||||||
|
void _q_open();
|
||||||
|
|
||||||
|
void sendFrame(const QAMQP::Frame::Base & frame);
|
||||||
|
|
||||||
|
QPointer<Client> client_;
|
||||||
|
|
||||||
|
QString name;
|
||||||
|
int number;
|
||||||
|
|
||||||
|
static int nextChannelNumber_;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif // amqp_channel_p_h__
|
||||||
|
|
@ -0,0 +1,327 @@
|
||||||
|
#include "amqp_connection.h"
|
||||||
|
#include "amqp_connection_p.h"
|
||||||
|
#include "amqp.h"
|
||||||
|
#include "amqp_p.h"
|
||||||
|
#include "amqp_frame.h"
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDataStream>
|
||||||
|
|
||||||
|
using namespace QAMQP;
|
||||||
|
|
||||||
|
namespace QAMQP
|
||||||
|
{
|
||||||
|
struct ConnectionExceptionCleaner
|
||||||
|
{
|
||||||
|
/* this cleans up when the constructor throws an exception */
|
||||||
|
static inline void cleanup(Connection *that, ConnectionPrivate *d)
|
||||||
|
{
|
||||||
|
#ifdef QT_NO_EXCEPTIONS
|
||||||
|
Q_UNUSED(that);
|
||||||
|
Q_UNUSED(d);
|
||||||
|
#else
|
||||||
|
Q_UNUSED(that);
|
||||||
|
Q_UNUSED(d);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
ConnectionPrivate::ConnectionPrivate( int version /*= QObjectPrivateVersion*/ )
|
||||||
|
:QObjectPrivate(version), closed_(false)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ConnectionPrivate::~ConnectionPrivate()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::init(Client * parent)
|
||||||
|
{
|
||||||
|
q_func()->setParent(parent);
|
||||||
|
client_ = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::startOk()
|
||||||
|
{
|
||||||
|
QAMQP::Frame::Method frame(QAMQP::Frame::fcConnection, miStartOk);
|
||||||
|
QByteArray arguments_;
|
||||||
|
QDataStream stream(&arguments_, QIODevice::WriteOnly);
|
||||||
|
|
||||||
|
QAMQP::Frame::TableField clientProperties;
|
||||||
|
clientProperties["version"] = "0.0.1";
|
||||||
|
clientProperties["platform"] = QString("Qt %1").arg(qVersion());
|
||||||
|
clientProperties["product"] = "QAMQP";
|
||||||
|
QAMQP::Frame::serialize(stream, clientProperties);
|
||||||
|
|
||||||
|
QAMQP::Frame::writeField('s', stream, "AMQPLAIN");
|
||||||
|
QAMQP::Frame::TableField response;
|
||||||
|
response["LOGIN"] = client_->user();
|
||||||
|
response["PASSWORD"] = client_->password();
|
||||||
|
QAMQP::Frame::serialize(stream, response);
|
||||||
|
QAMQP::Frame::writeField('s', stream, "en_US");
|
||||||
|
|
||||||
|
frame.setArguments(arguments_);
|
||||||
|
|
||||||
|
client_->d_func()->network_->sendFrame(frame);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::secureOk()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::tuneOk()
|
||||||
|
{
|
||||||
|
QAMQP::Frame::Method frame(QAMQP::Frame::fcConnection, miTuneOk);
|
||||||
|
QByteArray arguments_;
|
||||||
|
QDataStream stream(&arguments_, QIODevice::WriteOnly);
|
||||||
|
|
||||||
|
stream << qint16(0); //channel_max
|
||||||
|
stream << qint32(FRAME_MAX); //frame_max
|
||||||
|
stream << qint16(0); //heartbeat
|
||||||
|
|
||||||
|
frame.setArguments(arguments_);
|
||||||
|
client_->d_func()->network_->sendFrame(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::open()
|
||||||
|
{
|
||||||
|
QAMQP::Frame::Method frame(QAMQP::Frame::fcConnection, miOpen);
|
||||||
|
QByteArray arguments_;
|
||||||
|
QDataStream stream(&arguments_, QIODevice::WriteOnly);
|
||||||
|
|
||||||
|
QAMQP::Frame::writeField('s',stream, client_->virtualHost());
|
||||||
|
|
||||||
|
stream << qint8(0);
|
||||||
|
stream << qint8(0);
|
||||||
|
|
||||||
|
frame.setArguments(arguments_);
|
||||||
|
client_->d_func()->network_->sendFrame(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::start( const QAMQP::Frame::Method & frame )
|
||||||
|
{
|
||||||
|
qDebug(">> Start");
|
||||||
|
QByteArray data = frame.arguments();
|
||||||
|
QDataStream stream(&data, QIODevice::ReadOnly);
|
||||||
|
quint8 version_major = 0;
|
||||||
|
quint8 version_minor = 0;
|
||||||
|
|
||||||
|
stream >> version_major;
|
||||||
|
stream >> version_minor;
|
||||||
|
|
||||||
|
QAMQP::Frame::TableField table;
|
||||||
|
QAMQP::Frame::deserialize(stream, table);
|
||||||
|
|
||||||
|
QString mechanisms = QAMQP::Frame::readField('S', stream).toString();
|
||||||
|
QString locales = QAMQP::Frame::readField('S', stream).toString();
|
||||||
|
|
||||||
|
qDebug(">> version_major: %d", version_major);
|
||||||
|
qDebug(">> version_minor: %d", version_minor);
|
||||||
|
|
||||||
|
QAMQP::Frame::print(table);
|
||||||
|
|
||||||
|
qDebug(">> mechanisms: %s", qPrintable(mechanisms));
|
||||||
|
qDebug(">> locales: %s", qPrintable(locales));
|
||||||
|
|
||||||
|
startOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::secure( const QAMQP::Frame::Method & frame )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::tune( const QAMQP::Frame::Method & frame )
|
||||||
|
{
|
||||||
|
qDebug(">> Tune");
|
||||||
|
QByteArray data = frame.arguments();
|
||||||
|
QDataStream stream(&data, QIODevice::ReadOnly);
|
||||||
|
|
||||||
|
qint16 channel_max = 0,
|
||||||
|
heartbeat = 0;
|
||||||
|
qint32 frame_max = 0;
|
||||||
|
|
||||||
|
stream >> channel_max;
|
||||||
|
stream >> frame_max;
|
||||||
|
stream >> heartbeat;
|
||||||
|
qDebug(">> channel_max: %d", channel_max);
|
||||||
|
qDebug(">> frame_max: %d", frame_max);
|
||||||
|
qDebug(">> heartbeat: %d", heartbeat);
|
||||||
|
|
||||||
|
tuneOk();
|
||||||
|
open();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::openOk( const QAMQP::Frame::Method & frame )
|
||||||
|
{
|
||||||
|
qDebug(">> OpenOK");
|
||||||
|
q_func()->openOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::close( const QAMQP::Frame::Method & frame )
|
||||||
|
{
|
||||||
|
qDebug(">> CLOSE");
|
||||||
|
QByteArray data = frame.arguments();
|
||||||
|
QDataStream stream(&data, QIODevice::ReadOnly);
|
||||||
|
qint16 code_ = 0, classId, methodId;
|
||||||
|
stream >> code_;
|
||||||
|
QString text(QAMQP::Frame::readField('s', stream).toString());
|
||||||
|
stream >> classId;
|
||||||
|
stream >> methodId;
|
||||||
|
|
||||||
|
qDebug(">> code: %d", code_);
|
||||||
|
qDebug(">> text: %s", qPrintable(text));
|
||||||
|
qDebug(">> class-id: %d", classId);
|
||||||
|
qDebug(">> method-id: %d", methodId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::close(int code, const QString & text, int classId, int methodId)
|
||||||
|
{
|
||||||
|
QAMQP::Frame::Method frame(QAMQP::Frame::fcConnection, miClose);
|
||||||
|
QByteArray arguments_;
|
||||||
|
QDataStream stream(&arguments_, QIODevice::WriteOnly);
|
||||||
|
|
||||||
|
QAMQP::Frame::writeField('s',stream, client_->virtualHost());
|
||||||
|
|
||||||
|
stream << qint16(code);
|
||||||
|
QAMQP::Frame::writeField('s', stream, text);
|
||||||
|
stream << qint16(classId);
|
||||||
|
stream << qint16(methodId);
|
||||||
|
|
||||||
|
frame.setArguments(arguments_);
|
||||||
|
client_->d_func()->network_->sendFrame(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::closeOk()
|
||||||
|
{
|
||||||
|
QAMQP::Frame::Method frame(QAMQP::Frame::fcConnection, miCloseOk);
|
||||||
|
client_->d_func()->network_->sendFrame(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::closeOk( const QAMQP::Frame::Method & )
|
||||||
|
{
|
||||||
|
QMetaObject::invokeMethod(q_func(), "disconnected");
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionPrivate::_q_method( const QAMQP::Frame::Method & frame )
|
||||||
|
{
|
||||||
|
if(frame.methodClass() != QAMQP::Frame::fcConnection)
|
||||||
|
return;
|
||||||
|
|
||||||
|
qDebug() << "Connection:";
|
||||||
|
|
||||||
|
if (closed_)
|
||||||
|
{
|
||||||
|
if( frame.id() == miCloseOk)
|
||||||
|
closeOk(frame);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(MethodId(frame.id()))
|
||||||
|
{
|
||||||
|
case miStart:
|
||||||
|
start(frame);
|
||||||
|
break;
|
||||||
|
case miSecure:
|
||||||
|
secure(frame);
|
||||||
|
break;
|
||||||
|
case miTune:
|
||||||
|
tune(frame);
|
||||||
|
break;
|
||||||
|
case miOpenOk:
|
||||||
|
openOk(frame);
|
||||||
|
break;
|
||||||
|
case miClose:
|
||||||
|
close(frame);
|
||||||
|
break;
|
||||||
|
case miCloseOk:
|
||||||
|
closeOk(frame);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qWarning("Unknown method-id %d", frame.id());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Connection::Connection( Client * parent /*= 0*/ )
|
||||||
|
: QObject(*new ConnectionPrivate, 0)
|
||||||
|
{
|
||||||
|
QT_TRY {
|
||||||
|
d_func()->init(parent);
|
||||||
|
} QT_CATCH(...) {
|
||||||
|
ConnectionExceptionCleaner::cleanup(this, d_func());
|
||||||
|
QT_RETHROW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connection::Connection(ConnectionPrivate &dd, Client* parent)
|
||||||
|
: QObject(dd, 0)
|
||||||
|
{
|
||||||
|
Q_D(QAMQP::Connection);
|
||||||
|
QT_TRY {
|
||||||
|
d->init(parent);
|
||||||
|
} QT_CATCH(...) {
|
||||||
|
ConnectionExceptionCleaner::cleanup(this, d_func());
|
||||||
|
QT_RETHROW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connection::~Connection()
|
||||||
|
{
|
||||||
|
QObjectPrivate::clearGuards(this);
|
||||||
|
|
||||||
|
QT_TRY {
|
||||||
|
QEvent e(QEvent::Destroy);
|
||||||
|
QCoreApplication::sendEvent(this, &e);
|
||||||
|
} QT_CATCH(const std::exception&) {
|
||||||
|
// if this fails we can't do anything about it but at least we are not allowed to throw.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::startOk()
|
||||||
|
{
|
||||||
|
d_func()->startOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::secureOk()
|
||||||
|
{
|
||||||
|
d_func()->secureOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::tuneOk()
|
||||||
|
{
|
||||||
|
d_func()->tuneOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::open()
|
||||||
|
{
|
||||||
|
d_func()->open();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::close(int code, const QString & text, int classId , int methodId)
|
||||||
|
{
|
||||||
|
d_func()->close(code, text, classId, methodId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::closeOk()
|
||||||
|
{
|
||||||
|
d_func()->closeOk();
|
||||||
|
emit disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::openOk()
|
||||||
|
{
|
||||||
|
emit connected();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
#ifndef amqp_connection_h__
|
||||||
|
#define amqp_connection_h__
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include "amqp_frame.h"
|
||||||
|
#include "qamqp_global.h"
|
||||||
|
|
||||||
|
namespace QAMQP
|
||||||
|
{
|
||||||
|
class ConnectionPrivate;
|
||||||
|
class ClientPrivate;
|
||||||
|
class Client;
|
||||||
|
class Connection : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_DECLARE_PRIVATE(QAMQP::Connection)
|
||||||
|
Q_DISABLE_COPY(Connection)
|
||||||
|
Connection(Client * parent = 0);
|
||||||
|
public:
|
||||||
|
~Connection();
|
||||||
|
|
||||||
|
void startOk();
|
||||||
|
void secureOk();
|
||||||
|
void tuneOk();
|
||||||
|
void open();
|
||||||
|
void close(int code, const QString & text, int classId = 0, int methodId = 0);
|
||||||
|
void closeOk();
|
||||||
|
Q_SIGNALS:
|
||||||
|
void disconnected();
|
||||||
|
void connected();
|
||||||
|
protected:
|
||||||
|
Connection(ConnectionPrivate &dd, Client* parent);
|
||||||
|
private:
|
||||||
|
void openOk();
|
||||||
|
friend class ClientPrivate;
|
||||||
|
Q_PRIVATE_SLOT(d_func(), void _q_method(const QAMQP::Frame::Method & frame))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Include private header so MOC won't complain
|
||||||
|
#ifdef QAMQP_P_INCLUDE
|
||||||
|
# include "amqp_connection_p.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // amqp_connection_h__
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
#ifndef amqp_connection_p_h__
|
||||||
|
#define amqp_connection_p_h__
|
||||||
|
|
||||||
|
#include <QtCore/private/qobject_p.h>
|
||||||
|
|
||||||
|
#define METHOD_ID_ENUM(name, id) name = id, name ## Ok
|
||||||
|
|
||||||
|
namespace QAMQP
|
||||||
|
{
|
||||||
|
class Client;
|
||||||
|
class ClientPrivate;
|
||||||
|
class ConnectionPrivate : public QObjectPrivate
|
||||||
|
{
|
||||||
|
Q_DECLARE_PUBLIC(QAMQP::Connection)
|
||||||
|
public:
|
||||||
|
enum MethodId
|
||||||
|
{
|
||||||
|
METHOD_ID_ENUM(miStart, 10),
|
||||||
|
METHOD_ID_ENUM(miSecure, 20),
|
||||||
|
METHOD_ID_ENUM(miTune, 30),
|
||||||
|
METHOD_ID_ENUM(miOpen, 40),
|
||||||
|
METHOD_ID_ENUM(miClose, 50)
|
||||||
|
};
|
||||||
|
|
||||||
|
ConnectionPrivate(int version = QObjectPrivateVersion);
|
||||||
|
~ConnectionPrivate();
|
||||||
|
void init(Client * parent);
|
||||||
|
void startOk();
|
||||||
|
void secureOk();
|
||||||
|
void tuneOk();
|
||||||
|
void open();
|
||||||
|
void close(int code, const QString & text, int classId = 0, int methodId = 0);
|
||||||
|
void closeOk();
|
||||||
|
|
||||||
|
void start(const QAMQP::Frame::Method & frame);
|
||||||
|
void secure(const QAMQP::Frame::Method & frame);
|
||||||
|
void tune(const QAMQP::Frame::Method & frame);
|
||||||
|
void openOk(const QAMQP::Frame::Method & frame);
|
||||||
|
void close(const QAMQP::Frame::Method & frame);
|
||||||
|
void closeOk(const QAMQP::Frame::Method & frame);
|
||||||
|
void _q_method(const QAMQP::Frame::Method & frame);
|
||||||
|
QPointer<Client> client_;
|
||||||
|
bool closed_;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif // amqp_connection_p_h__
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef amqp_exchange_h__
|
||||||
|
#define amqp_exchange_h__
|
||||||
|
|
||||||
|
#include "amqp_channel.h"
|
||||||
|
namespace QAMQP
|
||||||
|
{
|
||||||
|
class Client;
|
||||||
|
class ClientPrivate;
|
||||||
|
class Exchange : public Channel
|
||||||
|
{
|
||||||
|
Q_OBJECT;
|
||||||
|
Exchange(Client * parent = 0) : Channel(parent) {}
|
||||||
|
public:
|
||||||
|
friend class ClientPrivate;
|
||||||
|
~Exchange(){}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif // amqp_exchange_h__
|
||||||
|
|
@ -0,0 +1,461 @@
|
||||||
|
#include "amqp_frame.h"
|
||||||
|
#define AMQP_FRAME_END 0xCE
|
||||||
|
|
||||||
|
#include <QDateTime>
|
||||||
|
#include <QList>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
|
using namespace QAMQP::Frame;
|
||||||
|
Base::Base( Type type ) :type_(type), channel_(0), size_(0) {}
|
||||||
|
|
||||||
|
Base::Base( QDataStream& raw ){
|
||||||
|
readHeader(raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
Type Base::type() const
|
||||||
|
{
|
||||||
|
return Type(type_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Base::setChannel( qint16 channel )
|
||||||
|
{
|
||||||
|
channel_ = channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
qint16 Base::channel() const
|
||||||
|
{
|
||||||
|
return channel_;
|
||||||
|
}
|
||||||
|
|
||||||
|
qint32 Base::size() const
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Frame::Base::writeHeader( QDataStream & stream ) const
|
||||||
|
{
|
||||||
|
stream << type_;
|
||||||
|
stream << channel_;
|
||||||
|
stream << qint32(size());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Frame::Base::writeEnd( QDataStream & stream ) const
|
||||||
|
{
|
||||||
|
stream << qint8(AMQP_FRAME_END);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Frame::Base::writePayload( QDataStream & stream ) const{}
|
||||||
|
|
||||||
|
void QAMQP::Frame::Base::readHeader( QDataStream & stream )
|
||||||
|
{
|
||||||
|
stream >> type_;
|
||||||
|
stream >> channel_;
|
||||||
|
stream >> size_;
|
||||||
|
|
||||||
|
/*
|
||||||
|
stream.readRawData(reinterpret_cast<char*>(&type_), sizeof(type_));
|
||||||
|
stream.readRawData(reinterpret_cast<char*>(&channel_), sizeof(channel_));
|
||||||
|
stream.readRawData(reinterpret_cast<char*>(&size_), sizeof(size_));*/
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Frame::Base::readEnd( QDataStream & stream )
|
||||||
|
{
|
||||||
|
char end_ = 0;
|
||||||
|
stream.readRawData(reinterpret_cast<char*>(&end_), sizeof(end_));
|
||||||
|
if(end_ != AMQP_FRAME_END )
|
||||||
|
{
|
||||||
|
qWarning("Wrong end of frame");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Frame::Base::readPayload( QDataStream & stream )
|
||||||
|
{
|
||||||
|
stream.skipRawData(size_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Frame::Base::toStream( QDataStream & stream ) const
|
||||||
|
{
|
||||||
|
writeHeader(stream);
|
||||||
|
writePayload(stream);
|
||||||
|
writeEnd(stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
QAMQP::Frame::Method::Method( MethodClass methodClass, qint16 id )
|
||||||
|
: Base(ftMethod), methodClass_(methodClass), id_(id)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
QAMQP::Frame::Method::Method( QDataStream& raw )
|
||||||
|
: Base(raw)
|
||||||
|
{
|
||||||
|
readPayload(raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
QAMQP::Frame::Method::Method(): Base(ftMethod)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
MethodClass QAMQP::Frame::Method::methodClass() const
|
||||||
|
{
|
||||||
|
return MethodClass(methodClass_);
|
||||||
|
}
|
||||||
|
|
||||||
|
qint16 QAMQP::Frame::Method::id() const
|
||||||
|
{
|
||||||
|
return id_;
|
||||||
|
}
|
||||||
|
|
||||||
|
qint32 QAMQP::Frame::Method::size() const
|
||||||
|
{
|
||||||
|
return sizeof(id_) + sizeof(methodClass_) + arguments_.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Frame::Method::setArguments( const QByteArray & data )
|
||||||
|
{
|
||||||
|
arguments_ = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray QAMQP::Frame::Method::arguments() const
|
||||||
|
{
|
||||||
|
return arguments_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Frame::Method::readPayload( QDataStream & stream )
|
||||||
|
{
|
||||||
|
stream >> methodClass_;
|
||||||
|
stream >> id_;
|
||||||
|
|
||||||
|
arguments_.resize(size_ - (sizeof(id_) + sizeof(methodClass_)));
|
||||||
|
stream.readRawData(arguments_.data(), arguments_.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Frame::Method::writePayload( QDataStream & stream ) const
|
||||||
|
{
|
||||||
|
stream << quint16(methodClass_);
|
||||||
|
stream << quint16(id_);
|
||||||
|
stream.writeRawData(arguments_.data(), arguments_.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
QVariant QAMQP::Frame::readField( qint8 valueType, QDataStream &s )
|
||||||
|
{
|
||||||
|
QVariant value;
|
||||||
|
QByteArray tmp;
|
||||||
|
qint8 nameSize_;
|
||||||
|
char octet[1] = {0}, octet2[2] = {0}, octet4[4] = {0}, octet8[8] = {0};
|
||||||
|
switch(valueType)
|
||||||
|
{
|
||||||
|
case 't':
|
||||||
|
s.readRawData(octet, sizeof(octet));
|
||||||
|
value = QVariant::fromValue<bool>(*octet > 0);
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
s.readRawData(octet, sizeof(octet));
|
||||||
|
value = QVariant::fromValue<int>(*octet);
|
||||||
|
break;
|
||||||
|
case 'B':
|
||||||
|
s.readRawData(octet, sizeof(octet));
|
||||||
|
value = QVariant::fromValue<uint>(*octet);
|
||||||
|
break;
|
||||||
|
case 'U':
|
||||||
|
s.readRawData(octet2, sizeof(octet2));
|
||||||
|
value = QVariant::fromValue<int>(*reinterpret_cast<qint16*>(octet2));
|
||||||
|
break;
|
||||||
|
case 'u':
|
||||||
|
s.readRawData(octet2, sizeof(octet2));
|
||||||
|
value = QVariant::fromValue<uint>(*reinterpret_cast<quint16*>(octet2));
|
||||||
|
break;
|
||||||
|
case 'I':
|
||||||
|
s.readRawData(octet4, sizeof(octet4));
|
||||||
|
value = QVariant::fromValue<int>(*reinterpret_cast<qint32*>(octet4));
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
s.readRawData(octet4, sizeof(octet4));
|
||||||
|
value = QVariant::fromValue<uint>(*reinterpret_cast<quint32*>(octet4));
|
||||||
|
break;
|
||||||
|
case 'L':
|
||||||
|
s.readRawData(octet8, sizeof(octet8));
|
||||||
|
value = QVariant::fromValue<qlonglong>(*reinterpret_cast<qlonglong*>(octet8));
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
s.readRawData(octet8, sizeof(octet8));
|
||||||
|
value = QVariant::fromValue<qulonglong>(*reinterpret_cast<qulonglong*>(octet8));
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
s.readRawData(octet4, sizeof(octet4));
|
||||||
|
value = QVariant::fromValue<float>(*reinterpret_cast<float*>(octet4));
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
s.readRawData(octet8, sizeof(octet8));
|
||||||
|
value = QVariant::fromValue<double>(*reinterpret_cast<double*>(octet8));
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
{
|
||||||
|
QAMQP::Frame::decimal v;
|
||||||
|
s >> v.scale;
|
||||||
|
s >> v.value;
|
||||||
|
value = QVariant::fromValue<QAMQP::Frame::decimal>(v);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
s >> nameSize_;
|
||||||
|
tmp.resize(nameSize_);
|
||||||
|
s.readRawData(tmp.data(), tmp.size());
|
||||||
|
value = QString::fromAscii(tmp.data(), nameSize_);
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
{
|
||||||
|
quint32 length_ = 0;
|
||||||
|
s >> length_;
|
||||||
|
tmp.resize(length_);
|
||||||
|
}
|
||||||
|
s.readRawData(tmp.data(), tmp.size());
|
||||||
|
value = QString::fromAscii(tmp.data(), tmp.size());
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
{
|
||||||
|
qint32 length_ = 0;
|
||||||
|
qint8 type = 0;
|
||||||
|
s >> length_;
|
||||||
|
QList<QVariant> array_;
|
||||||
|
for (int i =0; i < length_; ++i)
|
||||||
|
{
|
||||||
|
s >> type;
|
||||||
|
array_ << readField(type, s);
|
||||||
|
}
|
||||||
|
value = array_;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'T':
|
||||||
|
s.readRawData(octet8, sizeof(octet8));
|
||||||
|
value = QDateTime::fromMSecsSinceEpoch(*reinterpret_cast<qulonglong*>(octet8));
|
||||||
|
break;
|
||||||
|
case 'F':
|
||||||
|
{
|
||||||
|
TableField table_;
|
||||||
|
deserialize(s, table_);
|
||||||
|
value = table_;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'V':
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qWarning("Unknown field type");
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDataStream & QAMQP::Frame::deserialize( QDataStream & stream, QAMQP::Frame::TableField & f )
|
||||||
|
{
|
||||||
|
QByteArray data;
|
||||||
|
stream >> data;
|
||||||
|
QDataStream s(&data, QIODevice::ReadOnly);
|
||||||
|
|
||||||
|
while(!s.atEnd())
|
||||||
|
{
|
||||||
|
qint8 valueType = 0;
|
||||||
|
|
||||||
|
QString name = readField('s', s).toString();
|
||||||
|
s >> valueType;
|
||||||
|
f[name] = readField(valueType, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDataStream & QAMQP::Frame::serialize( QDataStream & stream, const TableField & f )
|
||||||
|
{
|
||||||
|
QByteArray data;
|
||||||
|
QDataStream s(&data, QIODevice::WriteOnly);
|
||||||
|
TableField::ConstIterator i;
|
||||||
|
for(i = f.begin(); i != f.end(); ++i)
|
||||||
|
{
|
||||||
|
writeField('s', s, i.key());
|
||||||
|
writeField(s, i.value());
|
||||||
|
}
|
||||||
|
stream << data;
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Frame::print( const TableField & f )
|
||||||
|
{
|
||||||
|
TableField::ConstIterator i;
|
||||||
|
for(i = f.begin(); i != f.end(); ++i)
|
||||||
|
{
|
||||||
|
switch(i.value().type())
|
||||||
|
{
|
||||||
|
case QVariant::Hash:
|
||||||
|
qDebug() << "\t" << qPrintable(i.key()) << ": FIELD_TABLE";
|
||||||
|
break;
|
||||||
|
case QVariant::List:
|
||||||
|
qDebug() << "\t" << qPrintable(i.key()) << ": ARRAY";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qDebug() << "\t" << qPrintable(i.key()) << ": " << i.value();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Frame::writeField( qint8 valueType, QDataStream &s, const QVariant & value, bool withType )
|
||||||
|
{
|
||||||
|
QByteArray tmp;
|
||||||
|
qint8 nameSize_;
|
||||||
|
if(withType)
|
||||||
|
s << valueType; // Çàïèøåì òèï ïîëÿ
|
||||||
|
|
||||||
|
switch(valueType)
|
||||||
|
{
|
||||||
|
case 't':
|
||||||
|
s << (value.toBool() ? qint8(1) : qint8(0));
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
s << qint8(value.toInt());
|
||||||
|
break;
|
||||||
|
case 'B':
|
||||||
|
s << quint8(value.toUInt());
|
||||||
|
break;
|
||||||
|
case 'U':
|
||||||
|
s << qint16(value.toInt());
|
||||||
|
break;
|
||||||
|
case 'u':
|
||||||
|
s << quint16(value.toUInt());
|
||||||
|
break;
|
||||||
|
case 'I':
|
||||||
|
s << qint32(value.toInt());
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
s << quint32(value.toUInt());
|
||||||
|
break;
|
||||||
|
case 'L':
|
||||||
|
s << qlonglong(value.toLongLong());
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
s << qulonglong(value.toULongLong());
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
s << value.toFloat();
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
s << value.toDouble();
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
{
|
||||||
|
QAMQP::Frame::decimal v(value.value<QAMQP::Frame::decimal>());
|
||||||
|
s << v.scale;
|
||||||
|
s << v.value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
{
|
||||||
|
QString str = value.toString();
|
||||||
|
s << quint8(str.length());
|
||||||
|
s.writeRawData(str.toAscii().data(), str.length());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
{
|
||||||
|
QString str = value.toString();
|
||||||
|
s << quint32(str.length());
|
||||||
|
s.writeRawData(str.toAscii().data(), str.length());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
{
|
||||||
|
QList<QVariant> array_(value.toList());
|
||||||
|
s << quint32(array_.count());
|
||||||
|
for (int i =0; i < array_.count(); ++i)
|
||||||
|
{
|
||||||
|
writeField(s, array_.at(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'T':
|
||||||
|
s << qulonglong(value.toDateTime().toMSecsSinceEpoch());
|
||||||
|
break;
|
||||||
|
case 'F':
|
||||||
|
{
|
||||||
|
TableField table_(value.toHash());
|
||||||
|
serialize(s, table_);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'V':
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qWarning("Unknown field type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Frame::writeField( QDataStream &s, const QVariant & value )
|
||||||
|
{
|
||||||
|
char type = 0;
|
||||||
|
switch(value.type())
|
||||||
|
{
|
||||||
|
case QVariant::Bool:
|
||||||
|
type = 't';
|
||||||
|
break;
|
||||||
|
case QVariant::Int:
|
||||||
|
{
|
||||||
|
int i = qAbs(value.toInt());
|
||||||
|
if(i <= qint8(0xFF)) {
|
||||||
|
type = 'b';
|
||||||
|
} else if(i <= qint16(0xFFFF)) {
|
||||||
|
type = 'U';
|
||||||
|
} else if(i <= qint16(0xFFFFFFFF)) {
|
||||||
|
type = 'I';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case QVariant::UInt:
|
||||||
|
{
|
||||||
|
int i = value.toInt();
|
||||||
|
if(i <= qint8(0xFF)) {
|
||||||
|
type = 'B';
|
||||||
|
} else if(i <= qint16(0xFFFF)) {
|
||||||
|
type = 'u';
|
||||||
|
} else if(i <= qint16(0xFFFFFFFF)) {
|
||||||
|
type = 'i';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case QVariant::LongLong:
|
||||||
|
type = 'L';
|
||||||
|
break;
|
||||||
|
case QVariant::ULongLong:
|
||||||
|
type = 'l';
|
||||||
|
break;
|
||||||
|
case QVariant::String:
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
QString str = value.toString();
|
||||||
|
type = str.length() > 255 ? 'S' : 's';
|
||||||
|
}*/
|
||||||
|
type = 'S';
|
||||||
|
break;
|
||||||
|
case QVariant::DateTime:
|
||||||
|
type = 'T';
|
||||||
|
break;
|
||||||
|
case QVariant::Double:
|
||||||
|
type = value.toDouble() > FLT_MAX ? 'd' : 'f';
|
||||||
|
break;
|
||||||
|
case QVariant::Hash:
|
||||||
|
type = 'F';
|
||||||
|
break;
|
||||||
|
case QVariant::List:
|
||||||
|
type = 'A';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(type)
|
||||||
|
writeField(type, s, value, true);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,97 @@
|
||||||
|
#ifndef amqp_frame_h__
|
||||||
|
#define amqp_frame_h__
|
||||||
|
|
||||||
|
#include <QDataStream>
|
||||||
|
#include <QHash>
|
||||||
|
#include <QVariant>
|
||||||
|
|
||||||
|
namespace QAMQP
|
||||||
|
{
|
||||||
|
namespace Frame
|
||||||
|
{
|
||||||
|
enum Type
|
||||||
|
{
|
||||||
|
ftMethod = 1,
|
||||||
|
ftHeader = 2,
|
||||||
|
ftBody = 3,
|
||||||
|
ftHeartbeat = 8
|
||||||
|
};
|
||||||
|
|
||||||
|
enum MethodClass
|
||||||
|
{
|
||||||
|
fcConnection = 10,
|
||||||
|
fcChannel = 20,
|
||||||
|
fcExchange = 40,
|
||||||
|
fcQueue = 50,
|
||||||
|
fcBasic = 60,
|
||||||
|
fcTx = 90,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct decimal
|
||||||
|
{
|
||||||
|
qint8 scale;
|
||||||
|
quint32 value;
|
||||||
|
|
||||||
|
};
|
||||||
|
Q_DECLARE_METATYPE(QAMQP::Frame::decimal);
|
||||||
|
|
||||||
|
typedef QHash<QString, QVariant> TableField;
|
||||||
|
Q_DECLARE_METATYPE(QAMQP::Frame::TableField);
|
||||||
|
|
||||||
|
QDataStream & serialize( QDataStream & stream, const QAMQP::Frame::TableField & f );
|
||||||
|
QDataStream & deserialize( QDataStream & stream, QAMQP::Frame::TableField & f );
|
||||||
|
QVariant readField( qint8 valueType, QDataStream &s );
|
||||||
|
void writeField( QDataStream &s, const QVariant & value );
|
||||||
|
void writeField( qint8 valueType, QDataStream &s, const QVariant & value, bool withType = false );
|
||||||
|
void print( const QAMQP::Frame::TableField & f );
|
||||||
|
|
||||||
|
class Base
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Base(Type type);
|
||||||
|
Base(QDataStream& raw);
|
||||||
|
Type type() const;
|
||||||
|
void setChannel(qint16 channel);
|
||||||
|
qint16 channel() const;
|
||||||
|
virtual qint32 size() const;
|
||||||
|
void toStream(QDataStream & stream) const;
|
||||||
|
protected:
|
||||||
|
void writeHeader(QDataStream & stream) const;
|
||||||
|
virtual void writePayload(QDataStream & stream) const;
|
||||||
|
void writeEnd(QDataStream & stream) const;
|
||||||
|
|
||||||
|
void readHeader(QDataStream & stream);
|
||||||
|
virtual void readPayload(QDataStream & stream);
|
||||||
|
void readEnd(QDataStream & stream);
|
||||||
|
|
||||||
|
qint32 size_;
|
||||||
|
private:
|
||||||
|
qint8 type_;
|
||||||
|
qint16 channel_;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class Method : public Base
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Method();
|
||||||
|
Method(MethodClass methodClass, qint16 id);
|
||||||
|
Method(QDataStream& raw);
|
||||||
|
|
||||||
|
MethodClass methodClass() const;
|
||||||
|
qint16 id() const;
|
||||||
|
qint32 size() const;
|
||||||
|
void setArguments(const QByteArray & data);
|
||||||
|
QByteArray arguments() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void writePayload(QDataStream & stream) const;
|
||||||
|
void readPayload(QDataStream & stream);
|
||||||
|
short methodClass_;
|
||||||
|
qint16 id_;
|
||||||
|
QByteArray arguments_;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // amqp_frame_h__
|
||||||
|
|
@ -0,0 +1,108 @@
|
||||||
|
#include "amqp_network.h"
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
QAMQP::Network::Network( QObject * parent /*= 0*/ )
|
||||||
|
{
|
||||||
|
qRegisterMetaType<QAMQP::Frame::Method>("QAMQP::Frame::Method");
|
||||||
|
|
||||||
|
socket_ = new QTcpSocket(this);
|
||||||
|
buffer_ = new QBuffer(this);
|
||||||
|
offsetBuf = 0;
|
||||||
|
leftSize = 0;
|
||||||
|
|
||||||
|
|
||||||
|
buffer_->open(QIODevice::ReadWrite);
|
||||||
|
connect(socket_, SIGNAL(connected()), this, SLOT(connected()));
|
||||||
|
connect(socket_, SIGNAL(disconnected()), this, SLOT(disconnected()));
|
||||||
|
connect(socket_, SIGNAL(readyRead()), this, SLOT(readyRead()));
|
||||||
|
connect(socket_, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error(QAbstractSocket::SocketError)));
|
||||||
|
}
|
||||||
|
|
||||||
|
QAMQP::Network::~Network()
|
||||||
|
{
|
||||||
|
disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Network::connectTo( const QString & host, quint32 port )
|
||||||
|
{
|
||||||
|
socket_->connectToHost(host, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Network::disconnect()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Network::connected()
|
||||||
|
{
|
||||||
|
char header_[8] = {'A', 'M', 'Q', 'P', 0,0,9,1};
|
||||||
|
socket_->write(header_, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Network::disconnected()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Network::error( QAbstractSocket::SocketError socketError )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Network::readyRead()
|
||||||
|
{
|
||||||
|
QDataStream streamA(socket_);
|
||||||
|
QDataStream streamB(buffer_);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Âû÷èòàòü çàãîëîâîê, ïîìåñòèòü â áóôåð
|
||||||
|
âû÷èòàòü âåñü ôðåéì, åñëè ôðåéì âû÷èòàí òî êèíóòü íà ðàçáîð åãî
|
||||||
|
*/
|
||||||
|
while(!socket_->atEnd())
|
||||||
|
{
|
||||||
|
if(leftSize == 0) // Åñëè ðàíåå ïðî÷èòàí áûë âåñü ôðåéì, òî ÷èòàåì çàãîëîâîê ôðåéìà
|
||||||
|
{
|
||||||
|
lastType_ = 0;
|
||||||
|
qint16 channel_ = 0;
|
||||||
|
leftSize = 0;
|
||||||
|
offsetBuf = 0;
|
||||||
|
|
||||||
|
streamA >> lastType_;
|
||||||
|
streamB << lastType_;
|
||||||
|
streamA >> channel_;
|
||||||
|
streamB << channel_;
|
||||||
|
streamA >> leftSize;
|
||||||
|
streamB << leftSize;
|
||||||
|
leftSize++; // óâåëè÷èì ðàçìåð íà 1, äëÿ çàõâàòà êîíöà ôðåéìà
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray data_;
|
||||||
|
data_.resize(leftSize);
|
||||||
|
offsetBuf = streamA.readRawData(data_.data(), data_.size());
|
||||||
|
leftSize -= offsetBuf;
|
||||||
|
streamB.writeRawData(data_.data(), offsetBuf);
|
||||||
|
if(leftSize == 0)
|
||||||
|
{
|
||||||
|
buffer_->reset();
|
||||||
|
switch(QAMQP::Frame::Type(lastType_))
|
||||||
|
{
|
||||||
|
case QAMQP::Frame::ftMethod:
|
||||||
|
{
|
||||||
|
QAMQP::Frame::Method frame(streamB);
|
||||||
|
emit method(frame);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qWarning("Unknown frame type");
|
||||||
|
}
|
||||||
|
buffer_->reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QAMQP::Network::sendFrame( const QAMQP::Frame::Base & frame )
|
||||||
|
{
|
||||||
|
QDataStream stream(socket_);
|
||||||
|
frame.toStream(stream);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
#ifndef amqp_network_h__
|
||||||
|
#define amqp_network_h__
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QTcpSocket>
|
||||||
|
#include <QPointer>
|
||||||
|
#include <QBuffer>
|
||||||
|
|
||||||
|
#include "amqp_frame.h"
|
||||||
|
|
||||||
|
namespace QAMQP
|
||||||
|
{
|
||||||
|
class Network : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_DISABLE_COPY(Network)
|
||||||
|
public:
|
||||||
|
Network(QObject * parent = 0);
|
||||||
|
~Network();
|
||||||
|
|
||||||
|
void connectTo(const QString & host, quint32 port);
|
||||||
|
void disconnect();
|
||||||
|
void sendFrame();
|
||||||
|
|
||||||
|
void sendFrame(const QAMQP::Frame::Base & frame);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void method(const QAMQP::Frame::Method & method);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void connected();
|
||||||
|
void disconnected();
|
||||||
|
void error( QAbstractSocket::SocketError socketError );
|
||||||
|
void readyRead();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QPointer<QTcpSocket> socket_;
|
||||||
|
QPointer<QBuffer> buffer_;
|
||||||
|
int offsetBuf;
|
||||||
|
int leftSize;
|
||||||
|
qint8 lastType_;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif // amqp_network_h__
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
#ifndef qamqp_amqp_p_h__
|
||||||
|
#define qamqp_amqp_p_h__
|
||||||
|
#include <QtCore/private/qobject_p.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "amqp_network.h"
|
||||||
|
#include "amqp_connection.h"
|
||||||
|
|
||||||
|
namespace QAMQP
|
||||||
|
{
|
||||||
|
class ClientPrivate : public QObjectPrivate
|
||||||
|
{
|
||||||
|
Q_DECLARE_PUBLIC(QAMQP::Client)
|
||||||
|
public:
|
||||||
|
ClientPrivate(int version = QObjectPrivateVersion);
|
||||||
|
~ClientPrivate();
|
||||||
|
|
||||||
|
void init(QObject * parent);
|
||||||
|
void init(QObject * parent, const QUrl & connectionString);
|
||||||
|
void printConnect() const;
|
||||||
|
void connect();
|
||||||
|
void parseCnnString( const QUrl & connectionString);
|
||||||
|
void sockConnect();
|
||||||
|
void login();
|
||||||
|
|
||||||
|
Exchange * createExchange(const QString &name);
|
||||||
|
Queue * createQueue(const QString &name);
|
||||||
|
|
||||||
|
quint32 port;
|
||||||
|
QString host;
|
||||||
|
QString virtualHost;
|
||||||
|
QString user;
|
||||||
|
QString password;
|
||||||
|
QPointer<QAMQP::Network> network_;
|
||||||
|
QPointer<QAMQP::Connection> connection_;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif // amqp_p_h__
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
#include <QBuffer>
|
||||||
|
|
||||||
|
namespace QAMQP
|
||||||
|
{
|
||||||
|
|
||||||
|
enum amqp_field_value_kind_t {
|
||||||
|
AMQP_FIELD_KIND_BOOLEAN = 't',
|
||||||
|
AMQP_FIELD_KIND_I8 = 'b',
|
||||||
|
AMQP_FIELD_KIND_U8 = 'B',
|
||||||
|
AMQP_FIELD_KIND_I16 = 's',
|
||||||
|
AMQP_FIELD_KIND_U16 = 'u',
|
||||||
|
AMQP_FIELD_KIND_I32 = 'I',
|
||||||
|
AMQP_FIELD_KIND_U32 = 'i',
|
||||||
|
AMQP_FIELD_KIND_I64 = 'l',
|
||||||
|
AMQP_FIELD_KIND_U64 = 'L',
|
||||||
|
AMQP_FIELD_KIND_F32 = 'f',
|
||||||
|
AMQP_FIELD_KIND_F64 = 'd',
|
||||||
|
AMQP_FIELD_KIND_DECIMAL = 'D',
|
||||||
|
AMQP_FIELD_KIND_UTF8 = 'S',
|
||||||
|
AMQP_FIELD_KIND_ARRAY = 'A',
|
||||||
|
AMQP_FIELD_KIND_TIMESTAMP = 'T',
|
||||||
|
AMQP_FIELD_KIND_TABLE = 'F',
|
||||||
|
AMQP_FIELD_KIND_VOID = 'V',
|
||||||
|
AMQP_FIELD_KIND_BYTES = 'x'
|
||||||
|
} ;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
|
||||||
|
#include <QtCore/QCoreApplication>
|
||||||
|
#include "amqp.h"
|
||||||
|
#include "amqp_exchange.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
QCoreApplication a(argc, argv);
|
||||||
|
|
||||||
|
QUrl con(QString("amqp://guest:16141614@main:5672/"));
|
||||||
|
QAMQP::Client client(con);
|
||||||
|
QAMQP::Exchange * exchange_ = client.createExchange(),
|
||||||
|
*exchange2_ = client.createExchange();
|
||||||
|
|
||||||
|
client.printConnect();
|
||||||
|
|
||||||
|
return a.exec();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef qamqp_global_h__
|
||||||
|
#define qamqp_global_h__
|
||||||
|
|
||||||
|
#include <QtCore/qglobal.h>
|
||||||
|
|
||||||
|
#define QAMQP_P_INCLUDE
|
||||||
|
#define AMQPSCHEME "amqp"
|
||||||
|
#define AMQPPORT 5672
|
||||||
|
#define AMQPHOST "localhost"
|
||||||
|
#define AMQPVHOST "/"
|
||||||
|
#define AMQPLOGIN "guest"
|
||||||
|
#define AMQPPSWD "guest"
|
||||||
|
#define FRAME_MAX 131072
|
||||||
|
|
||||||
|
#define AMQP_CONNECTION_FORCED 320
|
||||||
|
|
||||||
|
|
||||||
|
#endif // qamqp_global_h__
|
||||||
Loading…
Reference in New Issue