V1.0
This commit is contained in:
parent
95b12bd1a4
commit
a60367caa0
1
.idea/.name
Normal file
1
.idea/.name
Normal file
@ -0,0 +1 @@
|
||||
IPBS_Station
|
||||
495
.idea/editor.xml
Normal file
495
.idea/editor.xml
Normal file
@ -0,0 +1,495 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="BackendCodeEditorSettings">
|
||||
<option name="/Default/CodeInspection/GeneratedCode/GeneratedCodeRegions/=Windows_0020Form_0020Designer_0020generated_0020code/@EntryIndexedValue" value="Windows Form Designer generated code" type="string" />
|
||||
<option name="/Default/CodeInspection/GeneratedCode/GeneratedCodeRegions/=Windows_0020Form_0020Designer_0020generated_0020code/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/GeneratedCode/GeneratedCodeRegions/=Component_0020Designer_0020generated_0020code/@EntryIndexedValue" value="Component Designer generated code" type="string" />
|
||||
<option name="/Default/CodeInspection/GeneratedCode/GeneratedCodeRegions/=Component_0020Designer_0020generated_0020code/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/GeneratedCode/GeneratedCodeRegions/=Designer_0020generated_0020code/@EntryIndexedValue" value="Designer generated code" type="string" />
|
||||
<option name="/Default/CodeInspection/GeneratedCode/GeneratedCodeRegions/=Designer_0020generated_0020code/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/GeneratedCode/GeneratedCodeRegions/=Web_0020Form_0020Designer_0020generated_0020code/@EntryIndexedValue" value="Web Form Designer generated code" type="string" />
|
||||
<option name="/Default/CodeInspection/GeneratedCode/GeneratedCodeRegions/=Web_0020Form_0020Designer_0020generated_0020code/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSmartPointerVsMakeFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionalStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReinterpretCastFromVoidPtr/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConvertingConstructor/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConversionOperator/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDiscardedPostfixOperatorResult/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstValueFunctionReturnType/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeConst/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeStatic/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVariableCanBeMadeConstexpr/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConstPtrOrRef/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPassValueParameterByConstReference/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppThrowExpressionCanBeReplacedWithRethrow/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroConstantCanBeReplacedWithNullptr/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCompileTimeConstantCanBeReplacedWithBooleanConstant/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIfCanBeReplacedByConstexprIf/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IfStdIsConstantEvaluatedCanBeReplaced/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StdIsConstantEvaluatedWillAlwaysEvaluateToConstant/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConstevalIfIsAlwaysConstant/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassCanBeFinal/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStructuredBinding/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseTypeTraitAlias/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAlgorithmWithCount/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseRangeAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseElementsView/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStdSize/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForLoopCanBeReplacedWithWhile/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppJoinDeclarationAndAssignment/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceTieWithStructuredBinding/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceMemsetWithZeroInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAssociativeContains/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseEraseAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseFamiliarTemplateSyntaxForGenericLambdas/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScope/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScopeInitStatement/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantNamespaceDefinition/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineFunctionDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineVariableDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrivateSpecialMemberFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHiddenFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHidingFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPolymorphicClassWithNonVirtualPublicDestructor/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractClassWithoutSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompleteSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultCaseNotHandledInSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyErroneousEmptyStatements/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExpressionWithoutSideEffects/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNoDiscardExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionResultShouldBeUsed/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingKeywordThrow/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTypeWithoutTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTemplateWithoutTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppImplicitDefaultConstructorNotAvailable/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeedsConstructorBecauseOfUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedNonStaticDataMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRangeBasedForIncompatibleReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroValuedExpressionUsedAsNullPointer/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUnintendedObjectSlicing/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorDisambiguatedAsFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionInFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMustBePublicVirtualToImplementInterface/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationSpecifierWithoutDeclarators/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEmptyDeclaration/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesLocal/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesUncapturedLocal/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMismatchedClassTags/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUsingResultOfAssignmentAsCondition/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIntegralToPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerToIntegralConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompatiblePointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerConversionDropsQualifiers/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStringLiteralToCharPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExceptionSafeResourceAcquisition/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionCallInsideCtor/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractVirtualFunctionCallInCtor/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInvalidLineContinuation/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfBadFormat/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfRiskyFormat/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfMissedArg/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfExtraArg/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatBadCode/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatLegacyCode/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatMixedArgs/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooFewArgs/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooManyArgs/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedEntity/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingIncludeGuard/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenSyntaxError/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUnresolvedReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUndocumentedParameter/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeletingVoidPointer/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBooleanIncrementExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedRegisterStorageClassSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIdenticalOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEqualOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedefinitionOfDefaultArgumentInOverrideFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnamedNamespaceInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNamesMismatch/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultedSpecialMemberFunctionIsImplicitlyDeleted/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNodiscardFunctionWithoutReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantComplexityInComparison/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSpecialFunctionWithoutNoexceptSpecification/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnsignedZeroComparison/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterLiteral/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterWideLiteral/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAccessSpecifierWithNoDeclarations/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeyword/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeywordInsideCompoundStatement/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantControlFlowJump/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyStatement/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyDeclaration/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantParentheses/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantLambdaParameterList/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantCastExpression/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHeaderHasBeenAlreadyIncluded/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateArgumentsCanBeDeduced/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateArguments/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticSpecifierOnAnonymousNamespaceMember/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnMemberAllocationFunction/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnThreadLocalLocalVariable/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantInlineSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConstSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBooleanExpressionArgument/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantVoidArgumentList/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantMemberInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVolatileParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalFunctionInFinalClass/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalNonOverridingVirtualFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElaboratedTypeSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantDereferencingAndTakingAddress/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConditionalExpression/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConditionalExpressionCanBeSimplified/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantExportKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantZeroInitializerInAggregateInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUserDefinedLiteralSuffixDoesNotStartWithUnderscore/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassIsIncomplete/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterShadowing/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMutableSpecifierOnReferenceMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultInitializationWithNoUserConstructor/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExplicitSpecializationInNonNamespaceScope/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnionMemberOfReferenceType/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedDependentBaseClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderIsNotIncluded/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderNotFound/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCoroutineCallResolveError/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAwaiterTypeIsNotClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppOutParameterMustBeWritten/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWarningDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticAssertFailure/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEvaluationFailure/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTypeAliasNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConceptNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnumeratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLambdaCaptureNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableWithNonTrivialDtorIsNeverUsed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityAssignedButNoRead/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityUsedOnlyInUnevaluatedContext/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppObjectMemberMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSomeObjectMembersMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorUsedBeforeInitialization/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnusedIncludeDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNotAllPathsReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CDeclarationWithImplicitIntType/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionDoesntReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReturnNoValueInNonVoidFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCVQualifierCanNotBeAppliedToReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDereferenceOperatorLimitExceeded/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForwardEnumDeclarationWithoutUnderlyingType/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaEndRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticDataMemberInUnnamedStruct/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultIsUsedAsIdentifier/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLongFloat/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtReinterpretCastFromNullptr/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtBindingRValueToLvalueReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtAddressOfClassRValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtDoubleUserConversionInCopyInit/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtCopyElisionInCopyInitDeclarator/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtNotInitializedStaticConstLocalVar/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRemoveRedundantBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceIfStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceForStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceWhileStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceDoStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongIncludesOrder/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongSlashesInIncludeDirective/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceNestedNamespacesStyle/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceTypeAliasCodeStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceFunctionDeclarationStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberInitializersOrder/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingFunctionStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingDestructorStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAuto/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAutoForNumeric/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersPlacement/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersOrder/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnecessaryWhitespace/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTabsAreDisallowed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantConditions/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANullDereference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANotInitializedField/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALoopConditionNotUpdated/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFADeletedPointer/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAMemoryLeak/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInvalidatedMemory/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesScope/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantParameter/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantFunctionResult/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAArrayIndexOutOfBounds/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableCode/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableFunctionCall/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAEndlessLoop/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInfiniteRecursion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnusedValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreadVariable/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFATimeOver/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInconsistentNaming/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StringLiteralTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CommentTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IdentifierTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INVOCABLE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/OTHER_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CASE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSmartPointerVsMakeFunction/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCStyleCast/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionalStyleCast/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReinterpretCastFromVoidPtr/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConvertingConstructor/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConversionOperator/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDiscardedPostfixOperatorResult/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstValueFunctionReturnType/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeConst/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeStatic/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMayBeConst/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConst/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVariableCanBeMadeConstexpr/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConstPtrOrRef/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPassValueParameterByConstReference/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppThrowExpressionCanBeReplacedWithRethrow/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroConstantCanBeReplacedWithNullptr/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCompileTimeConstantCanBeReplacedWithBooleanConstant/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIfCanBeReplacedByConstexprIf/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IfStdIsConstantEvaluatedCanBeReplaced/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StdIsConstantEvaluatedWillAlwaysEvaluateToConstant/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConstevalIfIsAlwaysConstant/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassCanBeFinal/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStructuredBinding/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseTypeTraitAlias/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAlgorithmWithCount/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseRangeAlgorithm/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseElementsView/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStdSize/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForLoopCanBeReplacedWithWhile/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppJoinDeclarationAndAssignment/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceTieWithStructuredBinding/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceMemsetWithZeroInitialization/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAssociativeContains/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseEraseAlgorithm/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseFamiliarTemplateSyntaxForGenericLambdas/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScope/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScopeInitStatement/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantNamespaceDefinition/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineFunctionDefinitionInHeaderFile/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineVariableDefinitionInHeaderFile/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionIsNotImplemented/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrivateSpecialMemberFunctionIsNotImplemented/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHiddenFunction/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHidingFunction/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPolymorphicClassWithNonVirtualPublicDestructor/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractClassWithoutSpecifier/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompleteSwitchStatement/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultCaseNotHandledInSwitchStatement/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyErroneousEmptyStatements/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExpressionWithoutSideEffects/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNoDiscardExpression/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionResultShouldBeUsed/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingKeywordThrow/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTypeWithoutTypenameKeyword/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTemplateWithoutTemplateKeyword/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppImplicitDefaultConstructorNotAvailable/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeedsConstructorBecauseOfUninitializedMember/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedNonStaticDataMember/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRangeBasedForIncompatibleReference/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroValuedExpressionUsedAsNullPointer/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUnintendedObjectSlicing/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUninitializedMember/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorDisambiguatedAsFunction/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionInFinalClass/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMustBePublicVirtualToImplementInterface/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationSpecifierWithoutDeclarators/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEmptyDeclaration/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesLocal/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesUncapturedLocal/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMismatchedClassTags/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUsingResultOfAssignmentAsCondition/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIntegralToPointerConversion/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerToIntegralConversion/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompatiblePointerConversion/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerConversionDropsQualifiers/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStringLiteralToCharPointerConversion/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExceptionSafeResourceAcquisition/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionCallInsideCtor/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractVirtualFunctionCallInCtor/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInvalidLineContinuation/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfBadFormat/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfRiskyFormat/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfMissedArg/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfExtraArg/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatBadCode/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatLegacyCode/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatMixedArgs/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooFewArgs/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooManyArgs/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedEntity/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingIncludeGuard/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenSyntaxError/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUnresolvedReference/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUndocumentedParameter/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeletingVoidPointer/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBooleanIncrementExpression/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedRegisterStorageClassSpecifier/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIdenticalOperandsInBinaryExpression/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEqualOperandsInBinaryExpression/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedefinitionOfDefaultArgumentInOverrideFunction/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnamedNamespaceInHeaderFile/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNamesMismatch/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultedSpecialMemberFunctionIsImplicitlyDeleted/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNodiscardFunctionWithoutReturnValue/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantComplexityInComparison/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractFinalClass/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSpecialFunctionWithoutNoexceptSpecification/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnsignedZeroComparison/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterLiteral/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterWideLiteral/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifier/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantAccessSpecifier/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAccessSpecifierWithNoDeclarations/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTypenameKeyword/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateKeyword/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeyword/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeywordInsideCompoundStatement/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantControlFlowJump/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyStatement/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyDeclaration/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantParentheses/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantLambdaParameterList/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantCastExpression/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHeaderHasBeenAlreadyIncluded/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateArgumentsCanBeDeduced/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateArguments/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticSpecifierOnAnonymousNamespaceMember/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnMemberAllocationFunction/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnThreadLocalLocalVariable/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassAccessSpecifier/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantInlineSpecifier/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConstSpecifier/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBooleanExpressionArgument/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantVoidArgumentList/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantMemberInitializer/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassInitializer/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstParameterInDeclaration/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVolatileParameterInDeclaration/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalFunctionInFinalClass/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalNonOverridingVirtualFunction/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElaboratedTypeSpecifier/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantDereferencingAndTakingAddress/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConditionalExpression/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConditionalExpressionCanBeSimplified/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantExportKeyword/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantZeroInitializerInAggregateInitialization/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUserDefinedLiteralSuffixDoesNotStartWithUnderscore/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassIsIncomplete/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterShadowing/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMutableSpecifierOnReferenceMember/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultInitializationWithNoUserConstructor/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExplicitSpecializationInNonNamespaceScope/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnionMemberOfReferenceType/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedDependentBaseClass/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderIsNotIncluded/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderNotFound/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCoroutineCallResolveError/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAwaiterTypeIsNotClass/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppOutParameterMustBeWritten/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWarningDirective/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticAssertFailure/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEvaluationFailure/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorNeverUsed/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTypeAliasNeverUsed/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConceptNeverUsed/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeverUsed/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnumeratorNeverUsed/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLambdaCaptureNeverUsed/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableWithNonTrivialDtorIsNeverUsed/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNeverUsed/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterNeverUsed/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityAssignedButNoRead/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityUsedOnlyInUnevaluatedContext/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMightNotBeInitialized/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppObjectMemberMightNotBeInitialized/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSomeObjectMembersMightNotBeInitialized/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorUsedBeforeInitialization/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnusedIncludeDirective/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNotAllPathsReturnValue/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CDeclarationWithImplicitIntType/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionDoesntReturnValue/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReturnNoValueInNonVoidFunction/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCVQualifierCanNotBeAppliedToReference/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDereferenceOperatorLimitExceeded/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForwardEnumDeclarationWithoutUnderlyingType/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaRegionDirective/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaEndRegionDirective/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticDataMemberInUnnamedStruct/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultIsUsedAsIdentifier/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLongFloat/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtReinterpretCastFromNullptr/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtBindingRValueToLvalueReference/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtAddressOfClassRValue/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtDoubleUserConversionInCopyInit/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtCopyElisionInCopyInitDeclarator/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtNotInitializedStaticConstLocalVar/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRemoveRedundantBraces/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceIfStatementBraces/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceForStatementBraces/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceWhileStatementBraces/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceDoStatementBraces/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongIncludesOrder/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongSlashesInIncludeDirective/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceNestedNamespacesStyle/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceTypeAliasCodeStyle/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceFunctionDeclarationStyle/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberInitializersOrder/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingFunctionStyle/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingDestructorStyle/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAuto/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAutoForNumeric/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersPlacement/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersOrder/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnecessaryWhitespace/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTabsAreDisallowed/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantConditions/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANullDereference/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANotInitializedField/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALoopConditionNotUpdated/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFADeletedPointer/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAMemoryLeak/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInvalidatedMemory/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesScope/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesFunction/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantParameter/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantFunctionResult/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAArrayIndexOutOfBounds/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableCode/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableFunctionCall/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAEndlessLoop/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInfiniteRecursion/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnusedValue/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreadVariable/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFATimeOver/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInconsistentNaming/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StringLiteralTypo/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CommentTypo/@EntryIndexRemoved" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IdentifierTypo/@EntryIndexRemoved" />
|
||||
</component>
|
||||
</project>
|
||||
@ -1,4 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="BackendCodeEditorMiscSettings">
|
||||
<option name="/Default/RiderDebugger/RiderRestoreDecompile/RestoreDecompileSetting/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/Housekeeping/GlobalSettingsUpgraded/IsUpgraded/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/Housekeeping/FeatureSuggestion/FeatureSuggestionManager/DisabledSuggesters/=SwitchToGoToActionSuggester/@EntryIndexedValue" value="true" type="bool" />
|
||||
<option name="/Default/Environment/Hierarchy/GeneratedFilesCacheKey/Timestamp/@EntryValue" value="5" type="long" />
|
||||
<option name="/Default/Housekeeping/OptionsDialog/SelectedPageId/@EntryValue" value="CppFormatterOtherPage" type="string" />
|
||||
<option name="/Default/Housekeeping/FeatureSuggestion/FeatureSuggestionManager/DisabledSuggesters/=SwitchToGoToActionSuggester/@EntryIndexRemoved" />
|
||||
</component>
|
||||
<component name="CMakePythonSetting">
|
||||
<option name="pythonIntegrationState" value="YES" />
|
||||
</component>
|
||||
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
|
||||
<component name="WestSettings">{}</component>
|
||||
</project>
|
||||
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
@ -1,10 +1,10 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
cmake_minimum_required(VERSION 3.27)
|
||||
|
||||
project(IPBS_Station LANGUAGES CXX)
|
||||
|
||||
#set(Qt5_DIR "I:\\QT\\5.14.2\\mingw73_64\\lib\\cmake")
|
||||
add_subdirectory(SDK)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
|
||||
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
|
||||
set(CMAKE_AUTOUIC ON)
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
@ -28,21 +28,34 @@ find_package(Qt5 COMPONENTS Network Widgets REQUIRED)
|
||||
|
||||
if(ANDROID)
|
||||
add_library(IPBS_Station SHARED
|
||||
main.cpp
|
||||
widget.cpp
|
||||
widget.h
|
||||
widget.ui
|
||||
main.cpp
|
||||
UI/W1/widget.cpp
|
||||
UI/W1/widget.h
|
||||
UI/W1/widget.ui
|
||||
)
|
||||
else()
|
||||
add_executable(IPBS_Station
|
||||
# WIN32
|
||||
# WIN32
|
||||
main.cpp
|
||||
widget.cpp
|
||||
widget.h
|
||||
widget.ui
|
||||
UI/W1/widget.cpp
|
||||
UI/W1/widget.h
|
||||
UI/W1/widget.ui
|
||||
Res/icons.rc
|
||||
Tools/CText.h
|
||||
UI/W2/widgetyz.cpp
|
||||
UI/W2/widgetyz.h
|
||||
UI/W2/widgetyz.ui
|
||||
UI/W3/widget3.cpp
|
||||
UI/W3/widget3.h
|
||||
UI/W3/widget3.ui
|
||||
ObjectVariable/Configuration.h
|
||||
UI/W4/csinfow4.cpp
|
||||
UI/W4/csinfow4.h
|
||||
UI/W4/csinfow4.ui
|
||||
UI/W5/sub_ipui.cpp
|
||||
UI/W5/sub_ipui.h
|
||||
UI/W5/sub_ipui.ui
|
||||
)
|
||||
endif()
|
||||
target_include_directories(IPBS_Station PUBLIC SDK)
|
||||
target_include_directories(IPBS_Station PUBLIC SDK ObjectVariable UI/W1 UI UI/W2 UI/W3 UI/W4 UI/W5)
|
||||
target_link_libraries(IPBS_Station PRIVATE Qt5::Widgets CC_API Qt5::Network)
|
||||
|
||||
373
ObjectVariable/Configuration.h
Normal file
373
ObjectVariable/Configuration.h
Normal file
@ -0,0 +1,373 @@
|
||||
#ifndef CONFIGURATION_H
|
||||
#define CONFIGURATION_H
|
||||
#include <CApplication.h>
|
||||
#include <CCFile.h>
|
||||
#include <CCHttpClient.h>
|
||||
#include <CCString.h>
|
||||
#include <QNetworkInterface>
|
||||
#include <CCThread.h>
|
||||
#include <QApplication>
|
||||
#include <QMessageBox>
|
||||
#include <QProcess>
|
||||
|
||||
#include "Tools/CText.h"
|
||||
#include "CCSocket.h"
|
||||
#include "CCProcess.h"
|
||||
|
||||
#define SubControl_Jar "SubControl/WebSub/SpringWeb.jar"
|
||||
#define SubControl_Back_Cfg "SubControl/src/main/resources/ServerSettings/ServerSettings.CText"
|
||||
#define SubControl_Web_Cfg "SubControl/conf/nginx.conf"
|
||||
#define Sub_Logo "SubControl/html/assets/logo-CuXNbvLG.png"
|
||||
#define Sub_ImgBuffer "ImgBuffer/"
|
||||
|
||||
#ifdef _WIN32
|
||||
#define SubControl_Java "SubControl/WebSub/jreWin/bin/Sub_Server.exe"
|
||||
#define SubControl_Web_Exe "SubControl/Sub_Web.exe"
|
||||
#define IPBS_NSSM_Exe "IPBS_NSSM.exe"
|
||||
#elif __linux__
|
||||
#define SubControl_Java "SubControl/WebSub/jreWin/bin/Sub_Server"
|
||||
#define SubControl_Web_Exe "SubControl/Sub_WebL"
|
||||
#endif
|
||||
|
||||
class Configuration
|
||||
{
|
||||
private:
|
||||
inline static std::mutex _mutex;
|
||||
public:
|
||||
Configuration() = default;
|
||||
inline static CCString ExePath = CApplication::GetTheProgramDirectory() + "/";
|
||||
inline static CCString jarPath = CCFile::GetnormalizePath(ExePath + SubControl_Jar);
|
||||
inline static CCString JavaPath = CCFile::GetnormalizePath(ExePath + SubControl_Java);
|
||||
inline static CCString CfgPath = ExePath + SubControl_Back_Cfg;
|
||||
inline static CCString WebCfgPath = ExePath + SubControl_Web_Cfg;
|
||||
inline static CCString WebPath = CCFile::GetnormalizePath(ExePath + SubControl_Web_Exe);
|
||||
inline static CCString IPBS_NSSMPath = CCFile::GetnormalizePath(ExePath + IPBS_NSSM_Exe);
|
||||
inline static CCString CS_IP = "";
|
||||
inline static CCString CS_Port = "";
|
||||
inline static CCString Web_IP = "";
|
||||
inline static CCString Web_Port = "";
|
||||
inline static CCString Sub_IP = CCSocket::GetLocalIP()[0];
|
||||
inline static CCString Sub_Port = "";
|
||||
inline static CCString Sub_Audio_Port = "";
|
||||
inline static CCString Sub_Org = "";
|
||||
inline static CCString Language = "";
|
||||
inline static CCString State = "Close";
|
||||
inline static int OpenSleep = 20;
|
||||
inline static CCString CORSEn = "false";
|
||||
inline static int FirstRun = 1;
|
||||
inline static CCString Web_URL = "";
|
||||
inline static std::vector<CCInt> CSPortList;
|
||||
inline static std::vector<CCString> CSIPList;
|
||||
inline static std::vector<CCString> SubIPList;
|
||||
inline static CCProcess WebRun,SubRun;
|
||||
public:
|
||||
static int GetInt(char h1, char h2)
|
||||
{
|
||||
int lowUnsigned = h1 & 0xFF;
|
||||
int highUnsigned = h2 & 0xFF;
|
||||
return (highUnsigned << 8) | lowUnsigned;
|
||||
}
|
||||
static void ReadConfigInit(){
|
||||
CCVar A = CText::ReadConfig(CfgPath.c_str());
|
||||
if(!A.empty()){
|
||||
CS_IP = A["C/S_IP"];
|
||||
CS_Port = A["C/S_PORT"];
|
||||
Web_IP = A["Sub_Control_IP"];
|
||||
Web_Port = A["Sub_Web_PORT"];
|
||||
Sub_IP = Web_IP;
|
||||
Sub_Port = A["Sub_Control_PORT"];
|
||||
Sub_Audio_Port = A["Sub_Control_Audio_PORT"];
|
||||
Sub_Org = A["Origins"];
|
||||
Language = A["Language"];
|
||||
OpenSleep = A["OpenSleep"].to_int();
|
||||
State = A["State"];
|
||||
CORSEn = A["CORSEn"];
|
||||
FirstRun = A["FirstRun"].to_int();
|
||||
}
|
||||
Configuration::Web_URL = "http://" + Web_IP + ":" + Web_Port + "/";
|
||||
}
|
||||
static void ReadCSInfo(const std::function<void()>& fun = nullptr){
|
||||
CCUniqueLock lock(_mutex);
|
||||
CSPortList.clear();
|
||||
CSIPList.clear();
|
||||
CCSocket UDP;
|
||||
UDP.Socket(IPVX::IPV4,TORU::UDP,TYPE::DGRAM);
|
||||
bool A = UDP.SetSockOpt(CCOpt::BROADCAST);
|
||||
const CCString IP = Sub_IP;
|
||||
bool F = UDP.Bind(IP.c_str(),0);
|
||||
const char str[] = {0x55,static_cast<char>(0xAA),0x48,0x00,0x00,0x00,0x00,0x00};
|
||||
sockaddr_in serverAddr{};
|
||||
serverAddr.sin_family = AF_INET;
|
||||
serverAddr.sin_port = htons(10060);
|
||||
serverAddr.sin_addr.s_addr = INADDR_BROADCAST;
|
||||
UDP.SendData(str,serverAddr);
|
||||
int AS = 0;
|
||||
while (true){
|
||||
char buf[1024] = {0};
|
||||
CCHostInfo info;
|
||||
if(UDP.isDataAvailable()){
|
||||
CCVar length = UDP.UDPRecvData(buf, 1024,&info);
|
||||
if(length > 0){
|
||||
if(buf[2] == 0x48){
|
||||
int P = GetInt(buf[4],buf[5]);
|
||||
CSIPList.emplace_back(info.IPAddress);
|
||||
CSPortList.emplace_back(P);
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(length == -1)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
AS++;
|
||||
CCThread::Sleep(1000 * 10);
|
||||
if(AS == 10){
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
UDP.Close();
|
||||
if(fun){
|
||||
fun();
|
||||
}
|
||||
}
|
||||
static void ReadSub_IP(){
|
||||
SubIPList.clear();
|
||||
foreach (QHostAddress ptr , QNetworkInterface::allAddresses()) {
|
||||
// 获取ipv4地址
|
||||
if (ptr.protocol() == QAbstractSocket::IPv4Protocol) {
|
||||
// 过滤本地回环127.0.0.1
|
||||
if (!ptr.isLoopback()) {
|
||||
CCString A = ptr.toString().toStdString();
|
||||
SubIPList.emplace_back(A);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
static void CfgInit(){
|
||||
while (true){
|
||||
CCThread::Sleep(1000 * 500);
|
||||
ReadSub_IP();
|
||||
if(!SubIPList.empty()){
|
||||
Sub_IP = SubIPList[0];
|
||||
break;
|
||||
}
|
||||
else{
|
||||
QMessageBox::StandardButton reply = QMessageBox::question(nullptr, "提示",
|
||||
"未检测到合法IPV4地址,请检查网络,是否继续检测?",
|
||||
QMessageBox::Yes | QMessageBox::No);
|
||||
if (reply == QMessageBox::Yes) {
|
||||
continue;
|
||||
} else {
|
||||
Sub_IP = "";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
while (true){
|
||||
CCThread::Sleep(1000 * 500);
|
||||
ReadCSInfo();
|
||||
if(!CSIPList.empty()){
|
||||
CS_IP = CSIPList[0];
|
||||
CS_Port = CSPortList[0].to_String();
|
||||
break;
|
||||
}
|
||||
else{
|
||||
CS_IP = "";
|
||||
CS_Port = "";
|
||||
QMessageBox::StandardButton reply = QMessageBox::question(nullptr, "提示",
|
||||
"在局域网未检测到可用的C/S服务器,请先启动C/S服务器,是否继续检测?",
|
||||
QMessageBox::Yes | QMessageBox::No);
|
||||
if (reply == QMessageBox::Yes) {
|
||||
continue;
|
||||
} else {
|
||||
CS_IP = "";
|
||||
CS_Port = "";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
CCVar Ports = getAvailablePorts(3,5417);
|
||||
Sub_Port = Ports[0].to_String();
|
||||
Sub_Audio_Port = Ports[1].to_String();
|
||||
Web_Port = Ports[2].to_String();
|
||||
Web_IP = Sub_IP;
|
||||
Sub_Org = "['http://" + Sub_IP + ":" + Sub_Port + "']";
|
||||
}
|
||||
static bool isPortAvailable(int port)
|
||||
{
|
||||
CCSocket sock;
|
||||
sock.Socket(IPV4,TCP,TYPE::STREAM);
|
||||
const bool F = sock.Bind("127.0.0.1", port);
|
||||
try{
|
||||
sock.Close();
|
||||
}
|
||||
catch (CCException& e){}
|
||||
return F;
|
||||
}
|
||||
static std::vector<CCInt> getAvailablePorts(int count, int startPort = 1024, int endPort = 65535)
|
||||
{
|
||||
std::vector<CCInt> availablePorts;
|
||||
for (int port = startPort; port <= endPort && availablePorts.size() < count; ++port) {
|
||||
if (isPortAvailable(port)) {
|
||||
availablePorts.push_back(port);
|
||||
}
|
||||
}
|
||||
return availablePorts;
|
||||
}
|
||||
static void OpenSub_Server(){
|
||||
CCString cmd = "cd " + ExePath + "SubControl/" + " && ";
|
||||
SubRun.AddCommand(cmd);
|
||||
// cmd = "start "" " + JavaPath + " -jar " + jarPath;
|
||||
cmd = JavaPath + " -jar " + jarPath;
|
||||
SubRun.AddCommand(cmd);
|
||||
SubRun.Start();
|
||||
}
|
||||
static void CloseSub_Server(){
|
||||
// CCProcess Close;
|
||||
// Close.AddCommand("taskkill /f /t /im Sub_Server.exe");
|
||||
// Close.Start();
|
||||
QProcess::startDetached("taskkill /f /t /im Sub_Server.exe");
|
||||
}
|
||||
static void OpenSub_Web(){
|
||||
CCString cmd = "cd " + ExePath + "SubControl/" + " && ";
|
||||
WebRun.AddCommand(cmd);
|
||||
cmd = WebPath;
|
||||
WebRun.AddCommand(cmd);
|
||||
WebRun.Start();
|
||||
Configuration::Web_URL = "http://" + Web_IP + ":" + Web_Port + "/";
|
||||
}
|
||||
static void CloseSub_Web(){
|
||||
// CCProcess Close;
|
||||
// Close.AddCommand("taskkill /f /t /im Sub_Web.exe");
|
||||
// Close.Start();
|
||||
QProcess::startDetached("taskkill /f /t /im Sub_Web.exe");
|
||||
}
|
||||
static bool GetSub_Status(){
|
||||
bool F = false;
|
||||
CCProcess P;
|
||||
#ifdef _WIN32
|
||||
P.AddCommand("tasklist | findstr Sub_Server.exe");
|
||||
#elif __linux__
|
||||
#endif
|
||||
P.Start(true);
|
||||
while (true){
|
||||
CCString str = P.ReadLineBuffer();
|
||||
if(str.empty()){
|
||||
break;
|
||||
}
|
||||
else{
|
||||
F = str.find("Sub_Server") != CCString::npos;
|
||||
if(F){
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
P.Stop();
|
||||
return F;
|
||||
}
|
||||
static bool GetSub_Web_Status(){
|
||||
bool F = false;
|
||||
CCProcess P;
|
||||
#ifdef _WIN32
|
||||
P.AddCommand("tasklist | findstr Sub_Web.exe");
|
||||
#elif __linux__
|
||||
#endif
|
||||
P.Start(true);
|
||||
while (true){
|
||||
CCString str = P.ReadLineBuffer();
|
||||
if(str.empty()){
|
||||
break;
|
||||
}
|
||||
else{
|
||||
F = str.find("Sub_Web") != CCString::npos;
|
||||
if(F){
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
P.Stop();
|
||||
return F;
|
||||
}
|
||||
static bool SaveJarCfg() {
|
||||
CCString File = CCFile::GetnormalizePath(CfgPath);
|
||||
FILE *fp = fopen(File.c_str(), "w");
|
||||
if(fp == nullptr){
|
||||
return false;
|
||||
}
|
||||
fprintf(fp, "C/S_IP:%s\n",CS_IP.c_str());
|
||||
fprintf(fp, "C/S_PORT:%s\n",CS_Port.c_str());
|
||||
fprintf(fp, "Sub_Control_IP:%s\n",Sub_IP.c_str());
|
||||
fprintf(fp, "Sub_Control_PORT:%s\n",Sub_Port.c_str());
|
||||
fprintf(fp, "Sub_Control_Audio_PORT:%s\n",Sub_Audio_Port.c_str());
|
||||
fprintf(fp, "Sub_Web_PORT:%s\n",Web_Port.c_str());
|
||||
fprintf(fp, "Origins:%s\n",Sub_Org.c_str());
|
||||
fprintf(fp, "#中文简体,English\n");
|
||||
fprintf(fp, "Language:%s\n",Language.c_str());
|
||||
fprintf(fp, "OpenSleep:%d\n",OpenSleep);
|
||||
fprintf(fp, "State:%s\n",Configuration::State.c_str());
|
||||
fprintf(fp, "CORSEn:%s\n",Configuration::CORSEn.c_str());
|
||||
fprintf(fp, "FirstRun:%d\n",0);
|
||||
fclose(fp);
|
||||
return true;
|
||||
}
|
||||
static bool SaveWebCfg(){
|
||||
CCString File = CCFile::GetnormalizePath(WebCfgPath);
|
||||
CCVar fp = fopen(File.c_str(), "w");
|
||||
if (fp == nullptr) {
|
||||
return false;
|
||||
}
|
||||
// 写入配置数据
|
||||
fprintf(fp, "worker_processes 1;\n"
|
||||
"events {\n"
|
||||
" worker_connections 1024;\n"
|
||||
"}\n"
|
||||
"http {\n"
|
||||
" include mime.types;\n"
|
||||
" default_type application/octet-stream;\n"
|
||||
" sendfile on;\n"
|
||||
" keepalive_timeout 65;\n"
|
||||
" client_max_body_size 500m;\n"
|
||||
" server {\n"
|
||||
" listen %s;\n"
|
||||
" server_name %s;\n"
|
||||
" location / {\n"
|
||||
" root html;\n"
|
||||
" index index.html index.htm;\n"
|
||||
" try_files $uri $uri/ /index.html;\n"
|
||||
" # try_files $uri $uri/ @router;\n"
|
||||
" }\n"
|
||||
" location /api/ {\n"
|
||||
" #rewrite ^.+api/?(.*)$ /$1 break; \n"
|
||||
" rewrite ^/api/(.*)$ /$1 break; \n"
|
||||
" proxy_pass http://%s:%s/;\n"
|
||||
" proxy_redirect off;\n"
|
||||
" proxy_set_header Host $host;\n"
|
||||
" proxy_set_header X-Real-IP $remote_addr;\n"
|
||||
" proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n"
|
||||
" }\n"
|
||||
" error_page 500 502 503 504 /50x.html;\n"
|
||||
" location = /50x.html {\n"
|
||||
" root html;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
"}",Web_Port.c_str(),Web_IP.c_str(),
|
||||
Sub_IP.c_str(),Sub_Port.c_str());
|
||||
fclose(fp);
|
||||
return true;
|
||||
}
|
||||
static void IPBS_NSSMF(bool F){
|
||||
if(F){
|
||||
CCString cmd = "cd " + ExePath + " && " + IPBS_NSSMPath;
|
||||
QProcess::startDetached(cmd.c_str());
|
||||
}
|
||||
else{
|
||||
QProcess::startDetached("taskkill /f /t /im IPBS_NSSM.exe");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
@ -8,7 +8,13 @@
|
||||
#include "../../include/CCJSONObject.h"
|
||||
#include "../../include/CCFile.h"
|
||||
#include "../../include/CCSocket.h"
|
||||
#include "../../include/CCThread.h"
|
||||
#include "../../include/CCThreadPool.h"
|
||||
#include "CCObject.h"
|
||||
#include "../../include/CCFileOutStream.h"
|
||||
#define Buffer_Max 1024
|
||||
|
||||
class CCRequest;
|
||||
enum RequestProcess
|
||||
{
|
||||
RequestProcess_First,
|
||||
@ -22,6 +28,7 @@ struct BufferReader
|
||||
CCString Method;
|
||||
CCString Path;
|
||||
CCString Version;
|
||||
std::vector<char> Buffer;
|
||||
};
|
||||
|
||||
struct BufferFile
|
||||
@ -58,8 +65,31 @@ public:
|
||||
void SetHost(const CCString& host);
|
||||
void SetBufferBody(CCString body);
|
||||
void Send();
|
||||
CCSocket GetSocket();
|
||||
};
|
||||
|
||||
class InPutStream:public CCFileOutStream
|
||||
{
|
||||
public:
|
||||
|
||||
private:
|
||||
std::vector<char> Buffer;
|
||||
BufferReader bufferReader;
|
||||
CCSocket Socket;
|
||||
std::map<CCString,CCString> FileHeaders;
|
||||
std::map<CCString,CCString> Headers;
|
||||
public:
|
||||
InPutStream() = default;
|
||||
InPutStream(CCRequest* Res);
|
||||
void WriteBufferToFile(const CCString& Path);
|
||||
CCObject Get(CCString key);
|
||||
private:
|
||||
void DeleteTailOf(CCString Path,CCString str);
|
||||
std::string readTailOfFile(const std::string& filepath, size_t bufferSize);
|
||||
bool filterAndPrint(const std::string& tail, const std::string& filter);
|
||||
};
|
||||
|
||||
|
||||
class CCRequest
|
||||
{
|
||||
private:
|
||||
@ -67,7 +97,7 @@ private:
|
||||
|
||||
public:
|
||||
std::map<CCString,CCString> Headers;
|
||||
|
||||
std::map<CCString,CCString> FileHeaders;
|
||||
public:
|
||||
CCRequest() = default;
|
||||
CCRequest(CCSocket& sc);
|
||||
@ -76,16 +106,19 @@ public:
|
||||
unsigned int GetFileSize(const char* path);
|
||||
void SetBuffer(BufferReader& buffer);
|
||||
BufferReader GetReader();
|
||||
JSON GetJson(const BufferReader& instr);
|
||||
static JSON GetJson(const BufferReader& instr);
|
||||
BufferFile GetFile(BufferReader in);
|
||||
CCString GetParameter(CCString string);
|
||||
OutPutStream GetWiter();
|
||||
BufferReader ReaderFileData();
|
||||
OutPutStream GetWriter();
|
||||
void GetFormData(CCString& input,CCString& key,CCString& value);
|
||||
CCString GetFileDateHeader(BufferReader in,std::map<CCString,CCString>& map);
|
||||
CCString GetFileDateHeader(CCString& in,std::map<CCString,CCString>& map);
|
||||
std::vector<char> ReaderFormData(BufferReader in, std::map<CCString, CCString> &map);
|
||||
InPutStream GetInputStream();
|
||||
|
||||
private:
|
||||
std::map<std::string, std::string> parseKeyValuePairs(const std::string& input);
|
||||
void GetFormData(CCString& input,CCString& key,CCString& value);
|
||||
CCString GetFileDateHeader(BufferReader in,std::map<CCString,CCString>& map);
|
||||
std::vector<char> ReaderFormData(BufferReader in, std::map<CCString, CCString> &map);
|
||||
CCSocket Socket;
|
||||
|
||||
};
|
||||
|
||||
@ -6,6 +6,11 @@
|
||||
#include "../../include/CCSocket.h"
|
||||
#include "CCString.h"
|
||||
#include "mutex"
|
||||
#include <openssl/sha.h>
|
||||
#include <openssl/bio.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/buffer.h>
|
||||
|
||||
|
||||
class HTTPResponse: public CCRequest, public CORS {
|
||||
public:
|
||||
@ -14,16 +19,26 @@ public:
|
||||
void HtmlTextWrite(const CCString& str);
|
||||
bool HtmlWrite(const CCString& str);
|
||||
void Write(const CCString& str,const char* type = "text/plain");
|
||||
bool WriteFile(const CCString& Path);
|
||||
void Write(char * data,size_t length);
|
||||
void HTTPWrite(const CCString& str);
|
||||
bool WriteMultipart(const CCString& Path);
|
||||
bool FileDownload(const CCString& Path);
|
||||
void Send(const CCString& string);
|
||||
void ResponseOK();
|
||||
|
||||
CCString ResopenseWebSocket(const CCString& Key);
|
||||
void SetHeader(const CCString& Key,CCString Value);
|
||||
bool IsConnect();
|
||||
std::map<CCString,CCString> GetHeaders();
|
||||
|
||||
private:
|
||||
bool SendResources(const char* Path, const char* Mode = "rb");
|
||||
CCString base64_encode(const unsigned char *data, size_t length);
|
||||
CCString sha1(const CCString& input);
|
||||
CCSocket Client;
|
||||
std::mutex Mutex;
|
||||
CORS CORSConfig;
|
||||
std::map<CCString,CCString> Headers;
|
||||
std::streamoff getFileSize(const std::string& filePath);
|
||||
|
||||
|
||||
private:
|
||||
@ -39,7 +54,7 @@ public:
|
||||
public:
|
||||
CCResponse() = default;
|
||||
CCResponse(CCSocket& socket,CORS& cors);
|
||||
HTTPResponse GetWiter();
|
||||
HTTPResponse GetWriter();
|
||||
|
||||
private:
|
||||
CCSocket Client;
|
||||
|
||||
@ -1,106 +0,0 @@
|
||||
#ifndef STM32API_CCSTRING_H
|
||||
#define STM32API_CCSTRING_H
|
||||
#include "../../include/CCVector.hpp"
|
||||
#include <stdio.h>
|
||||
|
||||
#define PC
|
||||
#ifdef PC
|
||||
#include <string>
|
||||
#include "strstream"
|
||||
#include "sstream"
|
||||
using CCString = std::string;
|
||||
using CCStream = std::strstream;
|
||||
#else
|
||||
class CCString
|
||||
{
|
||||
public:
|
||||
CCString() = default;
|
||||
CCString(const char* str);
|
||||
CCString(const CCString& str);
|
||||
CCString(CCVector<char> str);
|
||||
|
||||
//----------------------------------------------------------------
|
||||
const char* c_str();
|
||||
unsigned int length();
|
||||
float to_float();
|
||||
int to_int();
|
||||
void append(char str);
|
||||
void append(const char* str);
|
||||
void append(CCString str);
|
||||
void append(CCVector<char> str);
|
||||
void clear();
|
||||
//----------------------------------------------------------------
|
||||
bool operator==(const char* str);
|
||||
bool operator==(const CCString str);
|
||||
bool operator!=(const char* str);
|
||||
bool operator!=(const CCString& str);
|
||||
//----------------------------------------------------------------
|
||||
CCString operator+(const char* str);
|
||||
void erase(int index,int len);
|
||||
unsigned int find(char str);
|
||||
unsigned int find(const char* str);
|
||||
unsigned int find(CCString str);
|
||||
void replace(int index,char str);
|
||||
void replace(int index,const char* str);
|
||||
void replace(int index,int index2, const char *str);
|
||||
//----------------------------------------------------------------
|
||||
#ifdef __JSON__
|
||||
JSONObject to_json()
|
||||
{
|
||||
return JSONObject::Parse(c_str());
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
CCVector<char> data;
|
||||
void copy(const char* str);
|
||||
void copy(char* str,const char* str2,int len);
|
||||
void copy(char* str,CCVector<char> str2,int len);
|
||||
int strlenth(const char* str);
|
||||
|
||||
};
|
||||
|
||||
namespace CCTools
|
||||
{
|
||||
inline CCString To_CCString(int index)
|
||||
{
|
||||
char str[100] = {0};
|
||||
sprintf(str,"%d",index);
|
||||
return str;
|
||||
}
|
||||
|
||||
inline CCString To_CCString(float index)
|
||||
{
|
||||
char str[100] = {0};
|
||||
sprintf(str,"%.5f",index);
|
||||
return str;
|
||||
}
|
||||
|
||||
inline CCString To_CCString(double index)
|
||||
{
|
||||
char str[100] = {0};
|
||||
sprintf(str,"%lf",index);
|
||||
return str;
|
||||
}
|
||||
template<typename T>
|
||||
inline CCString To_CCString(const char* l,T num)
|
||||
{
|
||||
char str[100] = {0};
|
||||
sprintf(str,l,num);
|
||||
return str;
|
||||
}
|
||||
|
||||
#ifdef __JSON__
|
||||
inline CCString To_CCString(JSONObject a)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
#endif
|
||||
enum Error_type
|
||||
{
|
||||
Lengtherror = -1,
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -1,145 +0,0 @@
|
||||
#ifndef DEMO_CCWEB_H
|
||||
#define DEMO_CCWEB_H
|
||||
|
||||
#include "../../include/CCSocket.h"
|
||||
#include "../../include/CCThread.h"
|
||||
#include "functional"
|
||||
#include <sys/stat.h>
|
||||
#include "map"
|
||||
#include "mutex"
|
||||
#include "nlohmann/json.hpp"
|
||||
#include "fstream"
|
||||
#include "sstream"
|
||||
|
||||
#define UserMAX 20
|
||||
#define BufferSize 4096
|
||||
|
||||
enum RequestProcess
|
||||
{
|
||||
RequestProcess_First,
|
||||
RequestProcess_Header,
|
||||
RequestProcess_Body,
|
||||
};
|
||||
|
||||
struct HTTPRequestFile
|
||||
{
|
||||
std::string Name;
|
||||
std::string Type;
|
||||
std::vector<char> Buffer;
|
||||
std::map<std::string,std::string> Headers;
|
||||
bool Save(std::string Path) const;
|
||||
};
|
||||
|
||||
|
||||
struct HTTPRequest
|
||||
{
|
||||
unsigned int ID = 0;
|
||||
std::string Method;
|
||||
std::string Path;
|
||||
std::string Version;
|
||||
std::string Data;
|
||||
std::string Buffer;
|
||||
std::vector<char> Bufferstr;
|
||||
std::map<std::string,std::string> Headers;
|
||||
std::map<std::string,std::string> BodyData;
|
||||
HTTPRequestFile FileData;
|
||||
};
|
||||
|
||||
|
||||
|
||||
class CCWeb
|
||||
{
|
||||
private:
|
||||
using RequestFunc = std::function<void(const HTTPRequest&,CCWeb*)>;
|
||||
std::map<std::string,RequestFunc> RequestFun;
|
||||
std::vector<std::string> PathSix;
|
||||
bool PrintBool = false;
|
||||
std::mutex mutexs;
|
||||
std::string BUFFER;
|
||||
|
||||
public:
|
||||
CCWeb() = default;
|
||||
//----------------------------------------------------------------
|
||||
HTTPRequest HTTPRequests;
|
||||
//----------------------------------------------------------------
|
||||
bool HTTPStart(const char * IP, int port);
|
||||
bool SendResources(unsigned int ID, const char* Path, const char* Mode = "rb");
|
||||
bool SendResourcesData(unsigned int ID, const char* Data);
|
||||
bool SendData(unsigned int ID, const char* Data,const char* type = "text/plain");
|
||||
std::string GetPath(const char* Path);
|
||||
std::string GetMethod(const char* str);
|
||||
std::string GetFileSuffix(const std::string& filePath);
|
||||
std::string GetFileType(const std::string& str);
|
||||
std::string GetData(std::string name,HTTPRequest request);
|
||||
std::string FilterString(const char * str,char Begin,char End);
|
||||
std::string GetRequestData(const char * str);
|
||||
std::string GetIP(IPVX port = IPVX::IPV4);
|
||||
std::string StrSplicing(const char *__restrict _format,...);
|
||||
void HTTPStop();
|
||||
void SetAddRootPath(const std::string& rootPath);
|
||||
void SetPrint(bool print);
|
||||
void SetRequestFunction(std::string RootPath,RequestFunc RFunc);
|
||||
unsigned int GetFileSize(const char* path);
|
||||
//----------------------------------------------------------------
|
||||
template<typename Data>
|
||||
std::string ReviseHTMLData(const char * Path, const char* Flags,Data&& data);
|
||||
template<typename Data>
|
||||
std::string ReviseData(const char * Date, const char* Flags,Data&& data);
|
||||
template<class name>
|
||||
name GetHTTPRequestData(const char * Date,std::string Request);
|
||||
std::string GetHTTPRequestData(const char * Date,std::string Request);
|
||||
std::string Getboundary(std::string& FileData);
|
||||
//----------------------------------------------------------------
|
||||
|
||||
private:
|
||||
std::string Filtration(const char * buf);
|
||||
std::string FiltrationJson(const char *buf);
|
||||
//----------------------------------------------------------------
|
||||
CCSocket Server,Client[UserMAX] = { };
|
||||
CCThread Threadappect,Thread[UserMAX] = { };
|
||||
unsigned int ThreadCount = 0,lent = 0;
|
||||
CC_Thread Appect();
|
||||
CC_Thread ReadThread(unsigned int ID);
|
||||
|
||||
|
||||
};
|
||||
template<typename Data>
|
||||
inline std::string CCWeb::ReviseHTMLData(const char *Path, const char *Flags, Data&& data)
|
||||
{
|
||||
std::string str,Flag = std::string("{{") + Flags + "}}";
|
||||
std::ifstream file(Path,std::ios::in);
|
||||
if (file.is_open())
|
||||
{
|
||||
char buf[BufferSize] = {0};
|
||||
while (file.getline(buf,BufferSize))
|
||||
{
|
||||
str.append(buf);
|
||||
memset(buf,'\000',BufferSize);
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
else
|
||||
{
|
||||
return "Not found file";
|
||||
}
|
||||
size_t i = str.find(Flag);
|
||||
if(i != std::string::npos)
|
||||
{
|
||||
str.replace(i,Flag.length(),data);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
template<typename Data>
|
||||
inline std::string CCWeb::ReviseData(const char *Date, const char *Flags, Data&& data)
|
||||
{
|
||||
std::string str = Date,Flag = std::string("{{") + Flags + "}}";
|
||||
size_t i = str.find(Flag);
|
||||
if(i != std::string::npos)
|
||||
{
|
||||
str.replace(i,Flag.length(),data);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -2,47 +2,71 @@
|
||||
#define CCWeb_Servlet_H
|
||||
#pragma once
|
||||
|
||||
#include "CCSocket.h"
|
||||
#include "../../include/CCJSONObject.h"
|
||||
#include "../../include/CCThread.h"
|
||||
#include "../../include/CCThreadPool.h"
|
||||
#include "CCString.h"
|
||||
#include "CCResponse.h"
|
||||
#include "CCTimeData.h"
|
||||
#include "CCWebSocketInfo.h"
|
||||
|
||||
#define Buffer_Max 1024
|
||||
#define CC_ServletFunClass(Fun) [this](auto && PH1, auto && PH2) { Fun(std::forward<decltype(PH1)>(PH1), std::forward<decltype(PH2)>(PH2)); }
|
||||
#define CC_WSFunClass(Fun) [this](auto && PH1) { Fun(std::forward<decltype(PH1)>(PH1)); }
|
||||
#define CC_ServletFun(Fun) Fun
|
||||
#define CC_WSFun(Fun) Fun
|
||||
|
||||
enum PromptLevel
|
||||
{
|
||||
ERROR_t = 0,
|
||||
WARNING,
|
||||
INFO,
|
||||
DEBUG
|
||||
};
|
||||
|
||||
class CCWebServlet:public CCResponse
|
||||
{
|
||||
private:
|
||||
using RequestFunc = std::function<void(CCRequest& ,CCResponse&)>;
|
||||
using RecvDataFunc = std::function<void(CCWebSocketInfo&)>;
|
||||
std::map<std::string,RequestFunc> RequestFun;
|
||||
CCString ServerIP;
|
||||
CCSocket m_Socket;
|
||||
int numThreads = 5,ListenMax = 50,RootLen = 0;
|
||||
int numThreads = 5,ListenMax = 50,RootLen = 0,ServerPort;
|
||||
bool FlagRun = true;
|
||||
PromptLevel Print = DEBUG;
|
||||
CCThread m_Thread;
|
||||
CCThreadPool m_ThreadPool;
|
||||
std::vector<std::string> PathSix;
|
||||
CORS CORSConfig;
|
||||
std::mutex m_Mutex;
|
||||
|
||||
std::function<void()> WebSocketSignal;
|
||||
RequestFunc WebSignalFun;
|
||||
CCThreadPool m_ThreadPool;
|
||||
RecvDataFunc MFunc,CFunc,IFunc,EFunc;
|
||||
public:
|
||||
|
||||
public:
|
||||
CCWebServlet() = default;
|
||||
void SetThreadNumber(int headcount);
|
||||
void SetWebServlet(CCString RootPath,RequestFunc RFunc);
|
||||
void SetWebServlet(CCString UrlPath,RequestFunc RFunc);
|
||||
void SetAddRootPath(const CCString& rootPath);
|
||||
void SetWebServletFun(RequestFunc RFunc);
|
||||
bool Sign() const;
|
||||
bool Start(CCString IP,int port);
|
||||
bool Init(CCString IP,int port,bool ChokeUpSock = true);
|
||||
int Running();
|
||||
void Close();
|
||||
void SetCorsConfig(CORS& cors);
|
||||
void SetWSOnMessage(RecvDataFunc RFunc);
|
||||
void SetWSOnClose(RecvDataFunc CFunc);
|
||||
void SetWSOnOpen(RecvDataFunc IFunc);
|
||||
void SetWSOnError(RecvDataFunc EFunc);
|
||||
void SetPrint(PromptLevel level);
|
||||
CCThreadPool GetServletThreadPool();
|
||||
std::vector<CCString> GetIPS();
|
||||
|
||||
private:
|
||||
void MessagePrompt(const CCString& message);
|
||||
void ProcessRequest();
|
||||
void ResponseData(CCSocket & socket);
|
||||
|
||||
|
||||
CCString GetFileHeaders(CCString& str,CCSocket &socket,std::map<CCString, CCString> &map);
|
||||
int unPackingWSFrameData(char *msg,int msgLen,std::vector<char> &outBuf,CCWebSocketInfo& wsInfo);
|
||||
void constructCloseFrame(unsigned char *frame, int status_code, const char *reason);
|
||||
|
||||
|
||||
};
|
||||
|
||||
@ -3,7 +3,6 @@
|
||||
#include <CCThread.h>
|
||||
#include <utility>
|
||||
|
||||
|
||||
CCString CCRequest::GetFileType(const CCString &str) {
|
||||
std::string suffix = GetFileSuffix(str);
|
||||
if(suffix == "html")
|
||||
@ -177,31 +176,8 @@ void CCRequest::GetFormData(CCString &input, CCString &key, CCString &value) {
|
||||
}
|
||||
|
||||
CCString CCRequest::GetFileDateHeader(BufferReader in, std::map<CCString, CCString> &map) {
|
||||
CCString str = in.Body,A,B;
|
||||
auto len = str.find("\r\n");
|
||||
CCString Boundary = str.substr(0,len);
|
||||
str.erase(0,len+2);
|
||||
map["Boundary"] = Boundary;
|
||||
std::stringstream ss(str);
|
||||
ss >> A;
|
||||
ss >> B;
|
||||
len = A.length() + B.length();
|
||||
A.erase(A.length()-1,A.length());
|
||||
B.erase(B.length()-1,B.length());
|
||||
map[A] = B;
|
||||
str.erase(0,len+2);
|
||||
GetFormData(str,A,B);
|
||||
map[A] = B;
|
||||
len = A.length() + B.length();
|
||||
str.erase(0,len + 5);
|
||||
len = str.find("\r\n\r\n");
|
||||
CCString str2 = str.substr(0,len+4);
|
||||
str.erase(0,len+4);
|
||||
auto m = parseKeyValuePairs(str2);
|
||||
for (const auto& i : m) {
|
||||
map[i.first] = i.second;
|
||||
}
|
||||
return str;
|
||||
CCString A = GetFileDateHeader(in.Body,map);
|
||||
return A;
|
||||
}
|
||||
|
||||
std::vector<char> CCRequest::ReaderFormData(BufferReader in, std::map<CCString, CCString> &map) {
|
||||
@ -239,7 +215,7 @@ CCString CCRequest::GetParameter(CCString string) {
|
||||
return str;
|
||||
}
|
||||
|
||||
OutPutStream CCRequest::GetWiter() {
|
||||
OutPutStream CCRequest::GetWriter() {
|
||||
return this->Socket;
|
||||
}
|
||||
|
||||
@ -247,6 +223,73 @@ CCRequest::CCRequest(CCSocket &sc) {
|
||||
this->Socket = sc;
|
||||
}
|
||||
|
||||
BufferReader CCRequest::ReaderFileData() {
|
||||
auto OutPutSteam = GetWriter().GetSocket();
|
||||
std::vector<char> BF;
|
||||
while(true){
|
||||
char buffer[1024] = {0};
|
||||
if(OutPutSteam.isDataAvailable()){
|
||||
auto length = OutPutSteam.RecvData(buffer,1024);
|
||||
if(length > 0){
|
||||
for (auto i : buffer) {
|
||||
BF.push_back(i);
|
||||
}
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
auto F = GetReader();
|
||||
CCString str(BF.begin(), BF.end());
|
||||
F.Body = str;
|
||||
return F;
|
||||
}
|
||||
|
||||
CCString CCRequest::GetFileDateHeader(CCString& in, map <CCString, CCString> &map) {
|
||||
CCString str = in,A,B;
|
||||
auto len = str.find("\r\n");
|
||||
while (true){
|
||||
CCString Boundary = str.substr(0,len);
|
||||
if(Boundary.empty()){
|
||||
str.erase(0,len+2);
|
||||
}
|
||||
else {
|
||||
str.erase(0,len+2);
|
||||
map["Boundary"] = Boundary;
|
||||
break;
|
||||
}
|
||||
len = str.find("\r\n");
|
||||
}
|
||||
std::stringstream ss(str);
|
||||
ss >> A;
|
||||
ss >> B;
|
||||
len = A.length() + B.length();
|
||||
A.erase(A.length()-1,A.length());
|
||||
B.erase(B.length()-1,B.length());
|
||||
map[A] = B;
|
||||
str.erase(0,len+2);
|
||||
GetFormData(str,A,B);
|
||||
map[A] = B;
|
||||
len = A.length() + B.length();
|
||||
str.erase(0,len + 5);
|
||||
len = str.find("\r\n\r\n");
|
||||
CCString str2 = str.substr(0,len+4);
|
||||
str.erase(0,len+4);
|
||||
auto m = parseKeyValuePairs(str2);
|
||||
for (const auto& i : m) {
|
||||
map[i.first] = i.second;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
InPutStream CCRequest::GetInputStream() {
|
||||
return {this};
|
||||
}
|
||||
|
||||
void OutPutStream::SetMethod(MethodType method) {
|
||||
if(method == MethodType_GET){
|
||||
this->SendHeaders["Method"] = "GET";
|
||||
@ -293,7 +336,11 @@ void OutPutStream::Send() {
|
||||
}
|
||||
str.append("\r\n");
|
||||
str.append(this->RBody);
|
||||
Socket.Sendbyte(str.c_str(),(int)str.length());
|
||||
Socket.SendByte(str.c_str(),(int)str.length());
|
||||
}
|
||||
|
||||
CCSocket OutPutStream::GetSocket() {
|
||||
return Socket;
|
||||
}
|
||||
|
||||
bool BufferFile::Save(const CCString &Path) {
|
||||
@ -310,3 +357,118 @@ bool BufferFile::Save(const CCString &Path) {
|
||||
CCString BufferFile::GetFileName() {
|
||||
return this->Headers["filename"];
|
||||
}
|
||||
InPutStream::InPutStream(CCRequest* Res) {
|
||||
this->Socket = Res->GetWriter().GetSocket();
|
||||
this->bufferReader = Res->GetReader();
|
||||
this->FileHeaders = Res->FileHeaders;
|
||||
this->Headers = Res->Headers;
|
||||
}
|
||||
void InPutStream::WriteBufferToFile(const CCString& Path) {
|
||||
CCFile(Path.c_str(),CC::ios::wb,false).Deleted();
|
||||
CCString str = "\r\n" + FileHeaders["Boundary"] + "--\r\n";
|
||||
auto strlength = str.length();
|
||||
auto S = Headers["Content-Length"];
|
||||
if(S.empty()){
|
||||
S = Headers["content-length"];
|
||||
}
|
||||
long long Maxlength = std::stoll(S);
|
||||
std::vector<char> data = bufferReader.Buffer;
|
||||
int F = 0;
|
||||
CCFileOutStream file(Path, std::ios::app | std::ios::binary);
|
||||
// 检查文件是否成功打开
|
||||
if (!file.is_open()) {
|
||||
std::cerr << "无法打开文件: " << Path << std::endl;
|
||||
return;
|
||||
}
|
||||
while (true){
|
||||
if(Socket.isDataAvailable()){
|
||||
char buffer[Buffer_Max] = {0};
|
||||
auto l = Socket.RecvData(buffer, Buffer_Max);
|
||||
if(l > 0 && F == 0){
|
||||
if(l != Buffer_Max){
|
||||
for (int i = 0; i < l; ++i) {
|
||||
data.push_back(buffer[i]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (auto i : buffer) {
|
||||
data.push_back(i);
|
||||
}
|
||||
}
|
||||
Maxlength = Maxlength - data.size();
|
||||
if(Maxlength < Buffer_Max * 2){
|
||||
CCString DB = CCString(data.begin(),data.end());
|
||||
auto len = DB.find(str);
|
||||
if(len != std::string::npos){
|
||||
data = std::vector<char>(data.begin(),data.begin() + len);
|
||||
F = 1;
|
||||
}
|
||||
}
|
||||
file.write(data.data(), data.size());
|
||||
data.clear();
|
||||
}
|
||||
else {
|
||||
file.close();
|
||||
CCFile(Path.c_str(),CC::ios::wb,false).Deleted();
|
||||
std::cout << "连接中断" << std::endl;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
|
||||
CCObject InPutStream::Get(CCString key) {
|
||||
return FileHeaders[key].c_str();
|
||||
}
|
||||
|
||||
void InPutStream::DeleteTailOf(CCString Path, CCString str) {
|
||||
// 读取文件尾部数据
|
||||
std::string tail = readTailOfFile(Path, Buffer_Max);
|
||||
if (!tail.empty()) {
|
||||
if (filterAndPrint(tail, str)) {
|
||||
std::cout << "文件: " << Path << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::string InPutStream::readTailOfFile(const string &filepath, size_t bufferSize) {
|
||||
std::ifstream file(filepath, std::ios::binary);
|
||||
if (!file.is_open()) {
|
||||
std::cerr << "无法打开文件: " << filepath << std::endl;
|
||||
return "";
|
||||
}
|
||||
|
||||
// 获取文件大小
|
||||
file.seekg(0, std::ios::end);
|
||||
std::streampos fileSize = file.tellg();
|
||||
file.seekg(0, std::ios::beg);
|
||||
|
||||
// 计算从文件末尾读取的字节数
|
||||
size_t bytesToRead = static_cast<size_t>(fileSize);
|
||||
if (bytesToRead > bufferSize) {
|
||||
bytesToRead = bufferSize;
|
||||
}
|
||||
|
||||
// 读取文件尾部数据
|
||||
std::vector<char> buffer(bytesToRead);
|
||||
file.seekg((size_t)fileSize - bytesToRead, std::ios::beg);
|
||||
file.read(buffer.data(), bytesToRead);
|
||||
|
||||
// 将缓冲区转换为字符串
|
||||
std::string tail(buffer.begin(), buffer.end());
|
||||
return tail;
|
||||
}
|
||||
|
||||
bool InPutStream::filterAndPrint(const string &tail, const string &filter) {
|
||||
size_t pos = tail.find(filter);
|
||||
if (pos != std::string::npos) {
|
||||
std::cout << "找到指定数据: " << filter << std::endl;
|
||||
std::cout << "尾部数据: " << tail << std::endl;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1,27 +1,23 @@
|
||||
#include "CCResponse.h"
|
||||
|
||||
#include <utility>
|
||||
|
||||
CCResponse::CCResponse(CCSocket &socket,CORS& cors) {
|
||||
this->Client = socket;
|
||||
Cors = cors;
|
||||
}
|
||||
|
||||
HTTPResponse CCResponse::GetWiter()
|
||||
HTTPResponse CCResponse::GetWriter()
|
||||
{
|
||||
return HTTPResponse(Client,Cors);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void HTTPResponse::HtmlTextWrite(const CCString& str) {
|
||||
this->Write(str, "text/html");
|
||||
}
|
||||
|
||||
HTTPResponse::HTTPResponse(CCSocket &socket,CORS& cors) {
|
||||
Client = socket;
|
||||
CORSConfig = cors;
|
||||
}
|
||||
|
||||
void HTTPResponse::Write(const CCString& str, const char *type) {
|
||||
void HTTPResponse::Write(const CCString& str, const char *type){
|
||||
char buf[200] = {0};
|
||||
Client.Send("HTTP/1.1 200 OK\r\n");
|
||||
Client.Send("Server:HTTP->CCWebServlet->OK\r\n");
|
||||
@ -63,11 +59,44 @@ void HTTPResponse::Write(const CCString& str, const char *type) {
|
||||
Client.Send(str.c_str());
|
||||
//Client.Send("\r\n\r\n");
|
||||
}
|
||||
|
||||
bool HTTPResponse::HtmlWrite(const CCString &str) {
|
||||
// CCFile file = CCFile(str.c_str());
|
||||
// if (file.IsOpen()) {
|
||||
// CCVar info = file.GetFileInfo();
|
||||
// size_t fileSize = info.Size;
|
||||
// file.Close();
|
||||
// SetHeader("Content-Type", GetFileType(str));
|
||||
// SetHeader("Content-Length", std::to_string(fileSize));
|
||||
// // 获取文件流
|
||||
// std::ifstream inputFile(info.Path, std::ios::binary);
|
||||
// if (!inputFile.is_open()) {
|
||||
// std::cerr << "无法打开文件" << std::endl;
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// // 开始发送文件数据
|
||||
// const size_t bufferSize = 4096;
|
||||
// char buffer[bufferSize];
|
||||
// size_t remaining = fileSize;
|
||||
// HTTPWrite(""); // 初始化 HTTP 写入
|
||||
// while (remaining > 0) {
|
||||
// size_t bytesToRead = std::min(remaining, bufferSize);
|
||||
// inputFile.read(buffer, bytesToRead);
|
||||
// size_t bytesRead = inputFile.gcount();
|
||||
// // 将读取的数据写入 HTTP 响应
|
||||
// if(IsConnect()){
|
||||
// Write(buffer,bytesRead);
|
||||
// }
|
||||
// remaining -= bytesRead;
|
||||
// }
|
||||
// inputFile.close();
|
||||
// return true;
|
||||
// }
|
||||
// else {
|
||||
// return false;
|
||||
// }
|
||||
return SendResources(str.c_str());
|
||||
}
|
||||
|
||||
bool HTTPResponse::SendResources(const char *Path, const char *Mode) {
|
||||
Mutex.lock();
|
||||
FILE *file = fopen(Path, Mode); // 替换为你的文件名
|
||||
@ -106,11 +135,9 @@ bool HTTPResponse::SendResources(const char *Path, const char *Mode) {
|
||||
Mutex.unlock();
|
||||
return true;
|
||||
}
|
||||
|
||||
void HTTPResponse::Send(const CCString &string) {
|
||||
Client.Send(string.c_str());
|
||||
}
|
||||
|
||||
void HTTPResponse::ResponseOK() {
|
||||
char buf[200] = {0};
|
||||
Client.Send("HTTP/1.1 200 OK\r\n");
|
||||
@ -136,46 +163,170 @@ void HTTPResponse::ResponseOK() {
|
||||
Client.Send("Access-Control-Allow-Methods:GET,POST,PUT,DELETE,OPTIONS\r\n");
|
||||
Client.Send("\r\n");
|
||||
}
|
||||
CCString HTTPResponse::ResopenseWebSocket(const CCString& Key) {
|
||||
CCString acceptValue = sha1(Key);
|
||||
CCString st = "HTTP/1.1 101 Switching Protocols\r\n";
|
||||
st.append("Upgrade: websocket\r\n");
|
||||
st.append("Connection: Upgrade\r\n");
|
||||
st.append("Sec-WebSocket-Accept:" + acceptValue + "\r\n");
|
||||
st.append("\r\n");
|
||||
Client.Send(st.c_str());
|
||||
return acceptValue;
|
||||
}
|
||||
CCString HTTPResponse::base64_encode(const unsigned char *data, size_t length) {
|
||||
BIO *bio, *b64;
|
||||
BUF_MEM *bufferPtr;
|
||||
|
||||
bool HTTPResponse::WriteFile(const CCString &Path) {
|
||||
Mutex.lock();
|
||||
FILE *file = fopen(Path.c_str(), "rb"); // 替换为你的文件名
|
||||
if (file == NULL)
|
||||
{
|
||||
Mutex.unlock();
|
||||
b64 = BIO_new(BIO_f_base64());
|
||||
bio = BIO_new(BIO_s_mem());
|
||||
bio = BIO_push(b64, bio);
|
||||
|
||||
BIO_write(bio, data, (int)length);
|
||||
BIO_flush(bio);
|
||||
BIO_get_mem_ptr(bio, &bufferPtr);
|
||||
BIO_set_close(bio, BIO_NOCLOSE);
|
||||
BIO_free_all(bio);
|
||||
CCString ret(bufferPtr->data, bufferPtr->length-1);
|
||||
return ret;
|
||||
}
|
||||
CCString HTTPResponse::sha1(const CCString &input) {
|
||||
CCString str = input + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
|
||||
unsigned char hash[SHA_DIGEST_LENGTH];
|
||||
SHA_CTX sha1;
|
||||
SHA1_Init(&sha1);
|
||||
SHA1_Update(&sha1, str.c_str(), str.length());
|
||||
SHA1_Final(hash, &sha1);
|
||||
return base64_encode(hash, SHA_DIGEST_LENGTH);
|
||||
}
|
||||
|
||||
std::streamoff HTTPResponse::getFileSize(const string &filePath) {
|
||||
std::ifstream file(filePath, std::ios::binary | std::ios::ate);
|
||||
if (!file.is_open()) {
|
||||
return -1; // 文件打开失败
|
||||
}
|
||||
|
||||
// 获取文件指针当前位置,即文件大小
|
||||
std::streamoff fileSize = file.tellg();
|
||||
|
||||
// 将文件指针移回文件开头
|
||||
file.seekg(0, std::ios::beg);
|
||||
|
||||
file.close();
|
||||
return fileSize;
|
||||
}
|
||||
|
||||
bool HTTPResponse::WriteMultipart(const CCString &path) {
|
||||
// 打开文件
|
||||
std::ifstream file(path, std::ios::binary);
|
||||
if (!file.is_open()) {
|
||||
Client.Send("HTTP/1.1 404 Not Found\r\n");
|
||||
Client.Send("Content-Length: 0\r\n");
|
||||
Client.Send("\r\n");
|
||||
return false;
|
||||
}
|
||||
Client.Send("HTTP/1.1 200 OK\r\n");
|
||||
Client.Send("Server:HTTP->CCWeb->OK\r\n");
|
||||
char buf[50] = {0};
|
||||
sprintf(buf, "Content-type:text/plain\r\n");
|
||||
Client.Send(buf);
|
||||
memset(buf,0,sizeof buf);
|
||||
CCFile file2 = CCFile(Path.c_str(),CC::ios::rb,false);
|
||||
sprintf(buf, "Content-Disposition: attachment; filename=\"%s\"\r\n",file2.GetFileInfo().Name.c_str());
|
||||
Client.Send(buf);
|
||||
memset(buf,0,sizeof buf);
|
||||
sprintf(buf, "Content-Length:%ld\r\n", file2.GetFileInfo().Size);
|
||||
Client.Send(buf);//Content-Length:
|
||||
|
||||
// 获取文件大小
|
||||
std::streamoff fileSize = getFileSize(path);
|
||||
|
||||
// 设置响应头
|
||||
std::string boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW";
|
||||
std::stringstream response;
|
||||
|
||||
// 发送 HTTP 响应头
|
||||
response << "HTTP/1.1 200 OK\r\n";
|
||||
response << "Content-Type: multipart/form-data; boundary=" << boundary << "--\r\n";
|
||||
response << "Content-Length: " << (fileSize + boundary.length() + 128) << "\r\n";
|
||||
response << "\r\n";
|
||||
|
||||
// 发送 multipart/form-data 数据
|
||||
response << "--" << boundary << "\r\n";
|
||||
response << R"(Content-Disposition: form-data; name="file"; filename=")" << path << "\"\r\n";
|
||||
response << "Content-Type: application/octet-stream\r\n";
|
||||
response << "\r\n";
|
||||
|
||||
// 发送文件内容
|
||||
char buffer[4096];
|
||||
while (file.read(buffer, sizeof(buffer))) {
|
||||
// size_t bytesRead = file.gcount();
|
||||
Client.Send(buffer);
|
||||
}
|
||||
|
||||
// 发送文件末尾
|
||||
Client.Send("\r\n");
|
||||
CCString end = "--" + boundary + "--\r\n";
|
||||
Client.Send(end.c_str());
|
||||
|
||||
file.close();
|
||||
|
||||
int cout = 0;
|
||||
char bufs[4096] = { 0 };
|
||||
int fpId = -1;
|
||||
struct stat st;
|
||||
fpId = fileno( file );
|
||||
if( fstat( fpId ,&st) == -1 )
|
||||
{
|
||||
Mutex.unlock();
|
||||
return false;
|
||||
}
|
||||
while (!feof(file))
|
||||
{
|
||||
int ret = fread(bufs,sizeof(char),sizeof bufs,file);
|
||||
Client.Send(bufs,sizeof bufs,0);
|
||||
cout += ret;
|
||||
}
|
||||
fclose(file);
|
||||
Mutex.unlock();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool HTTPResponse::FileDownload(const CCString &path) {
|
||||
CCFile file = CCFile(path.c_str());
|
||||
if (file.IsOpen()) {
|
||||
CCVar info = file.GetFileInfo();
|
||||
size_t fileSize = info.Size;
|
||||
file.Close();
|
||||
SetHeader("Content-Type", "application/octet-stream; charset=utf-8");
|
||||
SetHeader("Content-Disposition", "attachment; filename=" + info.Name);
|
||||
SetHeader("Content-Length", std::to_string(fileSize));
|
||||
|
||||
// 获取文件流
|
||||
std::ifstream inputFile(info.Path, std::ios::binary);
|
||||
if (!inputFile.is_open()) {
|
||||
std::cerr << "无法打开文件" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 开始发送文件数据
|
||||
const size_t bufferSize = 4096;
|
||||
char buffer[bufferSize];
|
||||
size_t remaining = fileSize;
|
||||
HTTPWrite(""); // 初始化 HTTP 写入
|
||||
|
||||
while (remaining > 0) {
|
||||
size_t bytesToRead = std::min(remaining, bufferSize);
|
||||
inputFile.read(buffer, bytesToRead);
|
||||
size_t bytesRead = inputFile.gcount();
|
||||
// 将读取的数据写入 HTTP 响应
|
||||
if(IsConnect()){
|
||||
Write(buffer,bytesRead);
|
||||
}
|
||||
remaining -= bytesRead;
|
||||
}
|
||||
|
||||
inputFile.close();
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void HTTPResponse::SetHeader(const CCString& Key, CCString Value) {
|
||||
Headers[Key] = std::move(Value);
|
||||
}
|
||||
|
||||
std::map<CCString, CCString> HTTPResponse::GetHeaders() {
|
||||
return Headers;
|
||||
}
|
||||
|
||||
void HTTPResponse::HTTPWrite(const CCString &str) {
|
||||
CCString SData;
|
||||
SData.append("HTTP/1.1 200 OK\r\n");
|
||||
SData.append("CCWebServlet: HTTP->CCWeb->OK\r\n");
|
||||
for (CCVar i : Headers) {
|
||||
SData.append(i.first + ": " + i.second + "\r\n");
|
||||
}
|
||||
SData.append("\r\n");
|
||||
SData.append(str);
|
||||
Client.Send(SData.c_str());
|
||||
}
|
||||
|
||||
void HTTPResponse::Write(char *data, size_t length) {
|
||||
Client.Send(data, length,0);
|
||||
}
|
||||
|
||||
bool HTTPResponse::IsConnect() {
|
||||
return Client.isConnectionAlive();
|
||||
}
|
||||
|
||||
@ -1,308 +0,0 @@
|
||||
#include <cassert>
|
||||
#include "CCString.h"
|
||||
#define PC
|
||||
#ifdef PC
|
||||
|
||||
#else
|
||||
void CCString::copy(const char* str)
|
||||
{
|
||||
data.clear();
|
||||
for (int i = 0; i < strlenth(str); i++)
|
||||
{
|
||||
data.push_back(str[i]);
|
||||
}
|
||||
}
|
||||
|
||||
int CCString::strlenth(const char* str)
|
||||
{
|
||||
int count = 0;
|
||||
while (str[count] != '\0')
|
||||
{
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
CCString::CCString(const char *str)
|
||||
{
|
||||
data.clear();
|
||||
for (int i = 0; i < strlenth(str); i++)
|
||||
{
|
||||
data.push_back(str[i]);
|
||||
}
|
||||
}
|
||||
|
||||
CCString::CCString(const CCString &str)
|
||||
{
|
||||
data = str.data;
|
||||
}
|
||||
|
||||
CCString::CCString(CCVector<char> str)
|
||||
{
|
||||
data = str;
|
||||
}
|
||||
|
||||
const char *CCString::c_str()
|
||||
{
|
||||
char* c = (char*)malloc(data.size());
|
||||
for (int i = 0; i < data.size();i++)
|
||||
{
|
||||
c[i] = '\0';
|
||||
}
|
||||
for (int i = 0; i < data.size(); ++i)
|
||||
{
|
||||
c[i] = data[i];
|
||||
}
|
||||
c[data.size()] = '\0';
|
||||
return c;
|
||||
}
|
||||
|
||||
unsigned int CCString::length()
|
||||
{
|
||||
return data.size();
|
||||
}
|
||||
|
||||
float CCString::to_float()
|
||||
{
|
||||
char* str = (char*)malloc(data.size());
|
||||
copy(str,data,data.size());
|
||||
str[data.size()] = '\0';
|
||||
char *endptr; // 用于存储解析结束的位置
|
||||
double d_value = strtod(str, &endptr); // 将字符串转换为double
|
||||
if (endptr == str || *endptr != '\0')
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
float f_value = (float)d_value; // 将double转换为float
|
||||
return f_value;
|
||||
}
|
||||
}
|
||||
|
||||
int CCString::to_int()
|
||||
{
|
||||
char* str = (char*)malloc(data.size());
|
||||
copy(str,data,data.size());
|
||||
str[data.size()] = '\0';
|
||||
char *endptr; // 用于存储解析结束的位置
|
||||
double d_value = strtod(str, &endptr); // 将字符串转换为double
|
||||
if (endptr == str || *endptr != '\0')
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
int f_value = (float)d_value; // 将double转换为float
|
||||
return f_value;
|
||||
}
|
||||
}
|
||||
|
||||
void CCString::append(const char str)
|
||||
{
|
||||
data.push_back(str);
|
||||
}
|
||||
|
||||
void CCString::clear()
|
||||
{
|
||||
data.clear();
|
||||
}
|
||||
|
||||
void CCString::append(const char *str)
|
||||
{
|
||||
|
||||
for (int i = 0; i < strlenth(str); i++)
|
||||
{
|
||||
data.push_back(str[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void CCString::append(CCString str)
|
||||
{
|
||||
for (int i = 0; i < str.data.size(); i++)
|
||||
{
|
||||
data.push_back(str.data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void CCString::append(CCVector<char> str)
|
||||
{
|
||||
for (int i = 0; i < str.size(); i++)
|
||||
{
|
||||
data.push_back(str[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void CCString::copy(char *str, const char *str2, int len)
|
||||
{
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
str[i] = str2[i];
|
||||
}
|
||||
}
|
||||
|
||||
void CCString::copy(char *str, CCVector<char> str2, int len)
|
||||
{
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
str[i] = str2[i];
|
||||
}
|
||||
}
|
||||
|
||||
bool CCString::operator==(const char *str)
|
||||
{
|
||||
if(data.size() != strlenth(str))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < strlenth(str); i++)
|
||||
{
|
||||
if (data[i] != str[i])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCString::operator==(CCString str)
|
||||
{
|
||||
if(data.size() != str.length())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < str.length(); i++)
|
||||
{
|
||||
if (data[i] != str.data[i])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCString::operator!=(const char *str)
|
||||
{
|
||||
return !this->operator==(str);
|
||||
}
|
||||
|
||||
bool CCString::operator!=(const CCString &str)
|
||||
{
|
||||
return !this->operator==(str);
|
||||
}
|
||||
|
||||
CCString CCString::operator+(const char *str)
|
||||
{
|
||||
CCString newStr(*this);
|
||||
newStr.append(str);
|
||||
return newStr;
|
||||
}
|
||||
|
||||
void CCString::erase(int index, int len)
|
||||
{
|
||||
data.erase(index, len);
|
||||
}
|
||||
|
||||
unsigned int CCString::find(char str)
|
||||
{
|
||||
for (int i = 0; i < data.size(); i++)
|
||||
{
|
||||
if (data[i] == str)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
unsigned int CCString::find(const char *str)
|
||||
{
|
||||
for (int i = 0; i < data.size(); i++)
|
||||
{
|
||||
if (data[i] == str[0])
|
||||
{
|
||||
bool flag = true;
|
||||
for (int j = 0; j < strlenth(str); j++)
|
||||
{
|
||||
if (data[i + j] != str[j])
|
||||
{
|
||||
flag = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (flag)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
unsigned int CCString::find(CCString str)
|
||||
{
|
||||
for (int i = 0; i < data.size(); i++)
|
||||
{
|
||||
if (data[i] == str.data[0])
|
||||
{
|
||||
bool flag = true;
|
||||
for (int j = 0; j < str.length(); j++)
|
||||
{
|
||||
if (data[i + j] != str.data[j])
|
||||
{
|
||||
flag = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (flag)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void CCString::replace(int index, char str)
|
||||
{
|
||||
data.revise(index,str);
|
||||
}
|
||||
|
||||
void CCString::replace(int index, const char *str)
|
||||
{
|
||||
CCVector<char> newStr;
|
||||
for (int i = 0; i < index; i++)
|
||||
{
|
||||
newStr.push_back(data[i]);
|
||||
}
|
||||
for (int i = 0; i < strlenth(str); i++)
|
||||
{
|
||||
newStr.push_back(str[i]);
|
||||
}
|
||||
for (int i = index + strlenth(str); i < data.size(); i++)
|
||||
{
|
||||
newStr.push_back(data[i]);
|
||||
}
|
||||
data = newStr;
|
||||
}
|
||||
|
||||
void CCString::replace(int index,int index2, const char *str)
|
||||
{
|
||||
CCVector<char> newStr;
|
||||
for (int i = 0; i < index; i++)
|
||||
{
|
||||
newStr.push_back(data[i]);
|
||||
}
|
||||
for (int i = 0; i < strlenth(str); i++)
|
||||
{
|
||||
newStr.push_back(str[i]);
|
||||
}
|
||||
for (int i = index2; i < data.size(); i++)
|
||||
{
|
||||
newStr.push_back(data[i]);
|
||||
}
|
||||
data = newStr;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
@ -1,743 +0,0 @@
|
||||
#include "CCWeb.h"
|
||||
#include <stdarg.h>
|
||||
|
||||
std::string CCWeb::GetMethod(const char* str)
|
||||
{
|
||||
char buf[10] = { 0 };
|
||||
for (int i = 0; i < strlen(str); ++i)
|
||||
{
|
||||
if(str[i] != ' ')
|
||||
{
|
||||
buf[i] = str[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
std::string CCWeb::GetPath(const char* Path)
|
||||
{
|
||||
bool ret = false;
|
||||
char buf[50] = { 0 };
|
||||
int len = 0;
|
||||
for (int i = 0; i < strlen(Path); ++i)
|
||||
{
|
||||
if(Path[i] == '/' && !ret)
|
||||
{
|
||||
ret = true;
|
||||
}
|
||||
else if(ret)
|
||||
{
|
||||
if(Path[i] != ' ')
|
||||
{
|
||||
buf[len] = Path[i];
|
||||
++len;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
bool CCWeb::SendResources(unsigned int ID, const char *Path, const char *Mode)
|
||||
{
|
||||
FILE *file = fopen(Path, Mode); // 替换为你的文件名
|
||||
if (file == NULL)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
Client[ID].Send("HTTP/1.1 200 OK\r\n");
|
||||
Client[ID].Send("Server:HTTP->CCWeb->OK\r\n");
|
||||
char buf[50] = {0};
|
||||
sprintf(buf, "Content-type:%s\r\n", GetFileType(Path).c_str());
|
||||
Client[ID].Send(buf);
|
||||
sprintf(buf, "Content-Length:%d\r\n", GetFileSize(Path));
|
||||
Client[ID].Send(buf);//Content-Length:
|
||||
Client[ID].Send("\r\n");
|
||||
|
||||
int cout = 0;
|
||||
char bufs[4096] = { 0 };
|
||||
int fpId = -1;
|
||||
struct stat st;
|
||||
fpId = fileno( file );
|
||||
if( fstat( fpId ,&st) == -1 )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
while (!feof(file))
|
||||
{
|
||||
int ret = fread(bufs,sizeof(char),sizeof bufs,file);
|
||||
Client[ID].Send(bufs,sizeof bufs,0);
|
||||
cout += ret;
|
||||
}
|
||||
//Client[ID].Send("\r\n",sizeof "\r\n",0);
|
||||
if(PrintBool)
|
||||
{
|
||||
printf("Send to Clent len:%d\r\n",cout);
|
||||
}
|
||||
fclose(file);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCWeb::HTTPStart(const char *IP, int port)
|
||||
{
|
||||
this->SetAddRootPath("");
|
||||
lent = PathSix.size();
|
||||
Server.Socket(IPVX::IPV4,TORU::TCP);
|
||||
if(!Server.Bind(IP,port))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if(!Server.Listen(UserMAX))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
Threadappect.SetThread(&CCWeb::Appect,this);
|
||||
Threadappect.Start();
|
||||
return true;
|
||||
}
|
||||
|
||||
CC_Thread CCWeb::Appect()
|
||||
{
|
||||
while (Threadappect.Sign())
|
||||
{
|
||||
|
||||
Client[ThreadCount] = Server.Accept();
|
||||
Thread[ThreadCount].SetThread(&CCWeb::ReadThread,this,ThreadCount);
|
||||
Thread[ThreadCount].Start();
|
||||
ThreadCount++;
|
||||
if(ThreadCount >= UserMAX)
|
||||
{
|
||||
ThreadCount = 0;
|
||||
}
|
||||
}
|
||||
std::cout << "END" << std::endl;
|
||||
return Threadappect.Stop();
|
||||
}
|
||||
|
||||
CC_Thread CCWeb::ReadThread(unsigned int ID)
|
||||
{
|
||||
mutexs.lock();
|
||||
bool ReadFlag = false;
|
||||
ByteHander len = BufferSize;
|
||||
char Buffer[BufferSize] = {0};
|
||||
HTTPRequests.Bufferstr.clear();
|
||||
HTTPRequests.BodyData.clear();
|
||||
HTTPRequests.Headers.clear();
|
||||
HTTPRequests.FileData.Buffer.clear();
|
||||
HTTPRequests.FileData.Headers.clear();
|
||||
while (len >= BufferSize)
|
||||
{
|
||||
len = Client[ID].RecvData(Buffer, sizeof(Buffer));
|
||||
for (int i = 0; i < len; ++i) {
|
||||
HTTPRequests.Bufferstr.push_back(Buffer[i]);
|
||||
}
|
||||
memset(Buffer,0, BufferSize);
|
||||
}
|
||||
std::string RecvMessage(HTTPRequests.Bufferstr.begin(), HTTPRequests.Bufferstr.end());
|
||||
HTTPRequests.Bufferstr.clear();
|
||||
if (len > 0)
|
||||
{
|
||||
if (PrintBool)
|
||||
{
|
||||
std::cout << Buffer << std::endl;
|
||||
std::cout<< "ThreadID:" << ID << std::endl;
|
||||
}
|
||||
RequestProcess Stuart = RequestProcess_First;
|
||||
while(true)
|
||||
{
|
||||
auto strlen = RecvMessage.find("\r\n");
|
||||
std::istringstream stream(RecvMessage.substr());
|
||||
if(strlen == 0)
|
||||
{
|
||||
Stuart = RequestProcess_Body;
|
||||
}
|
||||
if(strlen != std::string::npos)
|
||||
{
|
||||
if(Stuart == RequestProcess_First)
|
||||
{
|
||||
stream >> HTTPRequests.Method;
|
||||
stream >> HTTPRequests.Path;
|
||||
stream >> HTTPRequests.Version;
|
||||
RecvMessage.erase(0,strlen + 2);
|
||||
Stuart = RequestProcess_Header;
|
||||
}
|
||||
else if(Stuart == RequestProcess_Header)
|
||||
{
|
||||
std::string Key,Value;
|
||||
stream >> Key;
|
||||
stream >> Value;
|
||||
Key.erase(remove(Key.begin(),Key.end(),':'),Key.end());
|
||||
HTTPRequests.Headers.insert(std::pair<std::string,std::string>(Key,Value));
|
||||
RecvMessage.erase(0,strlen + 2);
|
||||
}
|
||||
else if(Stuart == RequestProcess_Body)
|
||||
{
|
||||
if(HTTPRequests.Headers["Content-Type"] == "multipart/form-data;")
|
||||
{
|
||||
auto lenstr = HTTPRequests.Headers["Content-Length"];
|
||||
auto FileSize = atoi(lenstr.c_str());
|
||||
while (FileSize > 0)
|
||||
{
|
||||
len = Client[ID].RecvData(Buffer, sizeof(Buffer));
|
||||
for (int i = 0; i < len; ++i) {
|
||||
HTTPRequests.Bufferstr.push_back(Buffer[i]);
|
||||
}
|
||||
memset(Buffer,0, BufferSize);
|
||||
FileSize = FileSize - len;
|
||||
}
|
||||
std::string FileData(HTTPRequests.Bufferstr.begin(), HTTPRequests.Bufferstr.end());
|
||||
auto END = Getboundary(FileData);
|
||||
std::string name,filename;
|
||||
strlen = FileData.find("name=\"");
|
||||
for(int i = strlen + 6;i < FileData.length(); i++)
|
||||
{
|
||||
if(FileData[i] != '\"')
|
||||
{
|
||||
name += FileData[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
HTTPRequests.FileData.Headers.insert(std::pair<std::string,std::string>("name",name));
|
||||
strlen = FileData.find("filename=\"");
|
||||
for(int i = strlen + 10;i < FileData.length(); i++)
|
||||
{
|
||||
if(FileData[i] != '\"')
|
||||
{
|
||||
filename += FileData[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
HTTPRequests.FileData.Headers.insert(std::pair<std::string,std::string>("filename",filename));
|
||||
while(true)
|
||||
{
|
||||
strlen = FileData.find("\r\n");
|
||||
std::string Key,Value;
|
||||
std::istringstream stra(FileData.substr());
|
||||
stra >> Key;
|
||||
stra >> Value;
|
||||
Key.erase(remove(Key.begin(),Key.end(),':'),Key.end());
|
||||
HTTPRequests.FileData.Headers.insert(std::pair<std::string,std::string>(Key,Value));
|
||||
FileData.erase(0,strlen + 2);
|
||||
if(strlen == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
strlen = FileData.find("\r\n" + END + "--");
|
||||
for (int i = 0; i < strlen; ++i) {
|
||||
HTTPRequests.FileData.Buffer.push_back(FileData[i]);
|
||||
}
|
||||
HTTPRequests.FileData.Name = HTTPRequests.FileData.Headers["filename"];
|
||||
HTTPRequests.FileData.Type = HTTPRequests.FileData.Headers["name"];
|
||||
break;
|
||||
}
|
||||
else if(HTTPRequests.Headers["Content-Type"] == "application/json")
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string str;
|
||||
stream >> str;//"username=admin&password=123456"
|
||||
while(true)
|
||||
{
|
||||
strlen = str.find('&');
|
||||
std::string Key,Value;
|
||||
bool FA = false,ENDF = false;
|
||||
if(strlen == std::string::npos)
|
||||
{
|
||||
strlen = str.length();
|
||||
ENDF = true;
|
||||
}
|
||||
for (int i = 0; i < strlen; ++i)
|
||||
{
|
||||
if(str[i] != '=')
|
||||
{
|
||||
if(FA)
|
||||
{
|
||||
Value += str[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
Key += str[i];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FA = true;
|
||||
}
|
||||
}
|
||||
HTTPRequests.BodyData.insert(std::pair<std::string,std::string>(Key,Value));
|
||||
str.erase(0,strlen + 1);
|
||||
if(ENDF)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
HTTPRequests.ID = ID;
|
||||
if (HTTPRequests.Method == "GET" || HTTPRequests.Method == "POST" || HTTPRequests.Method == "PUT")
|
||||
{
|
||||
std::map<std::string, RequestFunc>::iterator t;
|
||||
for (t = RequestFun.begin(); t != RequestFun.end(); t++)
|
||||
{
|
||||
if (t->first == HTTPRequests.Path)
|
||||
{
|
||||
t->second(HTTPRequests, this);
|
||||
ReadFlag = false;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
ReadFlag = true;
|
||||
}
|
||||
}
|
||||
if (ReadFlag)
|
||||
{
|
||||
bool da = false;
|
||||
for (int i = 0; i < lent; ++i)
|
||||
{
|
||||
if (this->SendResources(ID, std::string(PathSix[i] + HTTPRequests.Path).c_str()))
|
||||
{
|
||||
da = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!da)
|
||||
{
|
||||
char bufsa[100] = {0};
|
||||
sprintf(bufsa, "无法打开文件%s\n", HTTPRequests.Path.c_str());
|
||||
perror(bufsa);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread[ID].Stop();
|
||||
}
|
||||
mutexs.unlock();
|
||||
Client[ID].Close();
|
||||
return Thread[ID].Stop();
|
||||
}
|
||||
|
||||
std::string CCWeb::GetFileSuffix(const std::string& filePath)
|
||||
{
|
||||
size_t dotPosition = filePath.rfind('.'); // 从右向左查找最后一个'.'的位置
|
||||
if (dotPosition == std::string::npos)
|
||||
{
|
||||
return ""; // 如果没有找到'.',则返回空字符串
|
||||
}
|
||||
return filePath.substr(dotPosition + 1); // 返回'.'之后的部分,即文件后缀名
|
||||
}
|
||||
|
||||
std::string CCWeb::GetFileType(const std::string &str)
|
||||
{
|
||||
std::string suffix = GetFileSuffix(str);
|
||||
if(suffix == "html")
|
||||
{
|
||||
return "text/html";
|
||||
}
|
||||
else if(suffix == "css")
|
||||
{
|
||||
return "text/css";
|
||||
}
|
||||
else if(suffix == "js")
|
||||
{
|
||||
return "text/javascript";
|
||||
}
|
||||
else if(suffix == "png")
|
||||
{
|
||||
return "image/png";
|
||||
}
|
||||
else if(suffix == "jpg")
|
||||
{
|
||||
return "image/jpg";
|
||||
}
|
||||
else if(suffix == "jpeg")
|
||||
{
|
||||
return "image/jpeg";
|
||||
}
|
||||
else if(suffix == "gif")
|
||||
{
|
||||
return "image/gif";
|
||||
}
|
||||
else if(suffix == "ico")
|
||||
{
|
||||
return "image/x-icon";
|
||||
}
|
||||
else if(suffix == "svg")
|
||||
{
|
||||
return "image/svg+xml";
|
||||
}
|
||||
else if(suffix == "txt")
|
||||
{
|
||||
return "text/plain";
|
||||
}
|
||||
else if(suffix == "xml")
|
||||
{
|
||||
return "text/xml";
|
||||
}
|
||||
else if(suffix == "json")
|
||||
{
|
||||
return "application/json";
|
||||
}
|
||||
else if(suffix == "pdf")
|
||||
{
|
||||
return "application/pdf";
|
||||
}
|
||||
else if(suffix == "zip")
|
||||
{
|
||||
return "application/zip";
|
||||
}
|
||||
else
|
||||
{
|
||||
return suffix;
|
||||
}
|
||||
}
|
||||
|
||||
void CCWeb::SetAddRootPath(const std::string& rootPath)
|
||||
{
|
||||
PathSix.push_back(rootPath);
|
||||
}
|
||||
|
||||
void CCWeb::SetPrint(bool print)
|
||||
{
|
||||
PrintBool = print;
|
||||
}
|
||||
|
||||
std::string CCWeb::Filtration(const char *buf)
|
||||
{
|
||||
char Date[BufferSize] = {0};
|
||||
std::string buffer;
|
||||
bool Flag = false;
|
||||
int len = 0;
|
||||
std::string le = buf;
|
||||
auto d = le.length();
|
||||
for (int i = 0; i < d; ++i)
|
||||
{
|
||||
if(buf[i] == '\r' && buf[i+1] == '\n' && buf[i+2] == '\r' && !Flag)
|
||||
{
|
||||
i = i+2;
|
||||
Flag = true;
|
||||
}
|
||||
else if(Flag && buf[i] != '\0')
|
||||
{
|
||||
Date[len] = buf[i];
|
||||
len++;
|
||||
if(len == sizeof Date)
|
||||
{
|
||||
buffer.append(Date);
|
||||
memset(Date,'\000',BufferSize);
|
||||
len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
buffer.append(Date);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
std::string CCWeb::FiltrationJson(const char *buf)
|
||||
{
|
||||
char Date[BufferSize] = {0};
|
||||
std::string buffer;
|
||||
bool Flag = false;
|
||||
int len = 0;
|
||||
std::string le = buf;
|
||||
auto d = le.length();
|
||||
for (int i = 0; i < d; ++i)
|
||||
{
|
||||
if(buf[i] == '\r' && buf[i+1] == '\n' && buf[i+2] == '\r' && !Flag)
|
||||
{
|
||||
i = i+2;
|
||||
Flag = true;
|
||||
}
|
||||
else if(Flag)
|
||||
{
|
||||
Date[len] = buf[i];
|
||||
if(Date[len] == '}')
|
||||
{
|
||||
Date[len+1] = '\0';
|
||||
buffer.append(Date);
|
||||
break;
|
||||
}
|
||||
len++;
|
||||
if(len == sizeof Date)
|
||||
{
|
||||
buffer.append(Date);
|
||||
len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
std::string CCWeb::GetData(std::string name, HTTPRequest request)
|
||||
{
|
||||
const HTTPRequest Date = request;
|
||||
for(auto i : Date.BodyData)
|
||||
{
|
||||
if(i.first == name)
|
||||
{
|
||||
return i.second;
|
||||
}
|
||||
}
|
||||
return "NO_Data";
|
||||
}
|
||||
|
||||
std::string CCWeb::FilterString(const char *str, char Begin, char End)
|
||||
{
|
||||
char Date[BufferSize] = {0};
|
||||
bool Flag = false;
|
||||
int len = 0;
|
||||
for (int i = 0; i < strlen(str); ++i)
|
||||
{
|
||||
if(str[i] == Begin && !Flag)
|
||||
{
|
||||
Flag = true;
|
||||
}
|
||||
if(Flag)
|
||||
{
|
||||
if(str[i] != End)
|
||||
{
|
||||
Date[len] = str[i];
|
||||
len++;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return Date;
|
||||
}
|
||||
|
||||
void CCWeb::SetRequestFunction(std::string RootPath, RequestFunc RFunc)
|
||||
{
|
||||
RequestFun.insert(std::pair<std::string, RequestFunc>(RootPath, RFunc));
|
||||
}
|
||||
|
||||
void CCWeb::HTTPStop()
|
||||
{
|
||||
Threadappect.Stop();
|
||||
Server.Close();
|
||||
for (int i = 0; i < ThreadCount; ++i)
|
||||
{
|
||||
Thread[i].Stop();
|
||||
CCSocket sc = {};
|
||||
if(Client[i] != sc)
|
||||
{
|
||||
Client[i].Close();
|
||||
}
|
||||
}
|
||||
//Threading::Sleep(1000*5000);
|
||||
ThreadCount = 0;
|
||||
}
|
||||
|
||||
std::string CCWeb::GetIP(IPVX port)
|
||||
{
|
||||
return Server.GetlocadIP(port).c_str();
|
||||
}
|
||||
|
||||
std::string CCWeb::GetRequestData(const char * str)
|
||||
{
|
||||
char Date[BufferSize] = {0};
|
||||
bool Flag = false;
|
||||
int len = 0;
|
||||
auto da = strlen(str);
|
||||
for (int i = 0; i < da; ++i)
|
||||
{
|
||||
if(str[i] == '7' && str[i+1] == 'B' && str[i+2] == '%' && str[i+3] == '7' && str[i+4] == 'B' && !Flag)
|
||||
{
|
||||
Flag = true;
|
||||
i = i+4;
|
||||
}
|
||||
else if(Flag)
|
||||
{
|
||||
if(str[i] != '%')
|
||||
{
|
||||
Date[len] = str[i];
|
||||
len++;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return Date;
|
||||
}
|
||||
|
||||
bool CCWeb::SendResourcesData(unsigned int ID, const char *Data)
|
||||
{
|
||||
Client[ID].Send("HTTP/1.1 200 OK\r\n");
|
||||
Client[ID].Send("Server:HTTP->CCWeb->OK\r\n");
|
||||
char buf[50] = {0};
|
||||
sprintf(buf, "Content-type:text/html\r\n");
|
||||
Client[ID].Send(buf);
|
||||
sprintf(buf, "Content-Length:%d\r\n", (unsigned int)strlen(Data));
|
||||
Client[ID].Send(buf);//Content-Length:
|
||||
Client[ID].Send("\r\n");
|
||||
Client[ID].Send(Data);
|
||||
//Client[ID].Send("\r\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned int CCWeb::GetFileSize(const char *Path)
|
||||
{
|
||||
FILE *file = fopen(Path, "rb");
|
||||
if (file == nullptr) {
|
||||
perror("Error opening file");
|
||||
return 1;
|
||||
}
|
||||
fclose(file);
|
||||
struct stat fileStat{};
|
||||
if (stat(Path, &fileStat) == 0)
|
||||
{
|
||||
return fileStat.st_size;
|
||||
}
|
||||
else
|
||||
{
|
||||
perror("Error getting file size");
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
std::string CCWeb::StrSplicing(const char * format,...)
|
||||
{
|
||||
char buf[BufferSize] = {0};
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
int l = vsnprintf(buf, sizeof(buf), format, args);
|
||||
if (l < 0 || l >= sizeof(buf)) {
|
||||
return "ERROR";
|
||||
}
|
||||
va_end(args);
|
||||
return buf;
|
||||
}
|
||||
|
||||
bool CCWeb::SendData(unsigned int ID, const char *Data,const char* type)
|
||||
{
|
||||
Client[ID].Send("HTTP/1.1 200 OK\r\n");
|
||||
Client[ID].Send("Server:HTTP->CCWeb->OK\r\n");
|
||||
char buf[50] = {0};
|
||||
sprintf(buf, "Content-type:%s; charset=utf-8\r\n",type);
|
||||
Client[ID].Send(buf);
|
||||
sprintf(buf, "Content-Length:%zu\r\n", strlen(Data));
|
||||
Client[ID].Send(buf);//Content-Length:
|
||||
Client[ID].Send("\r\n");
|
||||
Client[ID].Send(Data);
|
||||
//Client[ID].Send("\r\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
template<class name>
|
||||
name CCWeb::GetHTTPRequestData(const char * Date,std::string Request)
|
||||
{
|
||||
std::string Data = Date, RequestData;
|
||||
auto len = Data.find(Request);
|
||||
bool f = false;
|
||||
for (int i = len; i < Data.length(); ++i) {
|
||||
if(Data[i] == ' ' && !f)
|
||||
{
|
||||
f = true;
|
||||
}
|
||||
else if(f)
|
||||
{
|
||||
if(Data[i] != '\r')
|
||||
{
|
||||
RequestData += Data[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
name n;
|
||||
std::istringstream ss(RequestData);
|
||||
ss >> n;
|
||||
return n;
|
||||
}
|
||||
|
||||
std::string CCWeb::GetHTTPRequestData(const char * Date,std::string Request)
|
||||
{
|
||||
std::string Data = Date, RequestData;
|
||||
auto len = Data.find(Request);
|
||||
bool f = false;
|
||||
for (int i = len; i < Data.length(); ++i) {
|
||||
if(Data[i] == ' ' && !f)
|
||||
{
|
||||
f = true;
|
||||
}
|
||||
else if(f)
|
||||
{
|
||||
if(Data[i] != '\r')
|
||||
{
|
||||
RequestData += Data[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return RequestData;
|
||||
}
|
||||
|
||||
std::string CCWeb::Getboundary(std::string& FileData)
|
||||
{
|
||||
auto len = FileData.find("\r\n");
|
||||
std::string str;
|
||||
for(int i = 0; i < len; ++i)
|
||||
{
|
||||
str += FileData[i];
|
||||
}
|
||||
FileData.erase(0,len + 2);
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
bool HTTPRequestFile::Save(std::string Path) const
|
||||
{
|
||||
std::ofstream file(Path,std::ios::out|std::ios::binary); // 如果文件不存在,则创建它
|
||||
// 检查文件是否成功打开
|
||||
if (!file.is_open()) {
|
||||
std::cerr << "无法打开文件" << std::endl;
|
||||
return false;
|
||||
}
|
||||
std::string str(Buffer.begin(),Buffer.end());
|
||||
file.write(str.c_str(),str.size());
|
||||
// 关闭文件
|
||||
file.close();
|
||||
return true;
|
||||
}
|
||||
@ -1,68 +1,217 @@
|
||||
#include "CCWebServlet.h"
|
||||
|
||||
bool CCWebServlet::Start(CCString IP,int port){
|
||||
FlagRun = true;
|
||||
RootLen = this->PathSix.size();
|
||||
m_Socket.Socket(IPVX::IPV4,TORU::TCP);
|
||||
m_Socket.SetSocketNonBlocking();
|
||||
m_ThreadPool.SetThreadTimeout(1000 * 16);
|
||||
m_ThreadPool.InitStart(numThreads);
|
||||
ServerIP = IP;
|
||||
if(!m_Socket.Bind(ServerIP.c_str(), port))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if(!m_Socket.Listen(ListenMax))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
m_Thread.SetThread(&CCWebServlet::ProcessRequest, this);
|
||||
Init(IP,port);
|
||||
m_Thread.Start();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCWebServlet::Init(CCString IP, int port,bool ChokeUpSock){
|
||||
CC::CC_Print_Logo();
|
||||
FlagRun = true;
|
||||
RootLen = PathSix.size(); //获取静态文件数;
|
||||
MessagePrompt("CC_API : Number of static file directories -> " + CCInt(RootLen).to_String());
|
||||
m_Socket.Socket(IPVX::IPV4,TORU::TCP);
|
||||
if(!ChokeUpSock){
|
||||
m_Socket.SetSocketNonBlocking();
|
||||
MessagePrompt("CC_API : Socket For Nonblocking");
|
||||
}
|
||||
else{
|
||||
MessagePrompt("CC_API : Socket For blocking");
|
||||
}
|
||||
int TA = 1000;
|
||||
m_ThreadPool.SetThreadTimeout(TA);
|
||||
MessagePrompt("CC_API : Thread pool delay -> " + CCInt(TA).to_String() + "us");
|
||||
m_ThreadPool.InitStart(numThreads);
|
||||
MessagePrompt("CC_API : Number of core threads -> " + CCInt(numThreads).to_String());
|
||||
ServerIP = std::move(IP);
|
||||
ServerPort = port;
|
||||
if(!m_Socket.Bind(ServerIP.c_str(), ServerPort))
|
||||
{
|
||||
MessagePrompt("CC_API : Service binding failure");
|
||||
return false;
|
||||
}
|
||||
MessagePrompt("CC_API : Service binding successful");
|
||||
if(!m_Socket.Listen(ListenMax))
|
||||
{
|
||||
MessagePrompt("CC_API : Service listening failure");
|
||||
return false;
|
||||
}
|
||||
MessagePrompt("CC_API : Service listening succeeded");
|
||||
m_Thread.SetThread(&CCWebServlet::ProcessRequest, this);
|
||||
return true;
|
||||
}
|
||||
|
||||
int CCWebServlet::Running() {
|
||||
m_Thread.RunWait();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CCWebServlet::ProcessRequest(){
|
||||
while (m_Thread.Sign()){
|
||||
CCSocket client = m_Socket.Accept();
|
||||
if(client.GetHost().Port != 0){
|
||||
m_ThreadPool.AddTask(&CCWebServlet::ResponseData, this, client);
|
||||
if(m_Socket.isConnectionAlive()){
|
||||
if(client.GetClientHost().Port != 0){
|
||||
m_ThreadPool.AddTask(&CCWebServlet::ResponseData, this, client);
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(m_Socket.Bind(ServerIP.c_str(), ServerPort)){
|
||||
if(m_Socket.Listen(ListenMax)){
|
||||
MessagePrompt("CC_API : Socket restart succeeded. Procedure");
|
||||
}
|
||||
else{
|
||||
MessagePrompt("CC_API : The Socket service was disconnected unexpectedly.");
|
||||
Close();
|
||||
}
|
||||
}
|
||||
else{
|
||||
MessagePrompt("CC_API : The Socket service was disconnected unexpectedly.");
|
||||
Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CCWebServlet::ResponseData(CCSocket &socket){
|
||||
std::vector<char> data;
|
||||
int Error = 1;
|
||||
while (true){
|
||||
char buffer[Buffer_Max] = {0};
|
||||
if(socket.IsDataAvailable()){
|
||||
if(socket.isDataAvailable()){
|
||||
char buffer[Buffer_Max] = {0};
|
||||
auto len = socket.RecvData(buffer,Buffer_Max);
|
||||
if(len > 0){
|
||||
for (int i = 0; i < len; ++i){
|
||||
data.push_back(buffer[i]);
|
||||
for(auto i : buffer){
|
||||
data.push_back(i);
|
||||
}
|
||||
CCString string1(data.begin(), data.end());
|
||||
auto l = string1.find("\r\n\r\n");
|
||||
if(l != CCString::npos){
|
||||
break;
|
||||
}
|
||||
else {
|
||||
socket.Close();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else{
|
||||
break;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else{
|
||||
break;
|
||||
if(Error >= 7){
|
||||
break;
|
||||
}
|
||||
CCThread::Sleep(1000 * Error * 10);
|
||||
Error++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
CCString RecvMessage(data.begin(), data.end());
|
||||
if(data.empty()) {
|
||||
if(Print >= PromptLevel::WARNING){
|
||||
CCTimeData time;
|
||||
CCString str = "[" + time.to_String() + "] -> HTTPRequest Data is NULL";
|
||||
CC::Println(str);
|
||||
}
|
||||
socket.Close();
|
||||
return;
|
||||
}
|
||||
CCString RecvMessage = CCString(data.begin(), data.end());
|
||||
data.clear();
|
||||
RequestProcess Stuart = RequestProcess_First;
|
||||
auto strlen = RecvMessage.find("\r\n");
|
||||
std::istringstream stream(RecvMessage.substr());
|
||||
CCRequest HTTPRequests(socket);
|
||||
BufferReader A;
|
||||
CCResponse HTTPResponse(socket,CORSConfig);
|
||||
while (true){
|
||||
while (!RecvMessage.empty()){
|
||||
auto strlen = RecvMessage.find("\r\n");
|
||||
std::istringstream stream(RecvMessage.substr());
|
||||
if(strlen == 0)
|
||||
{
|
||||
if(strlen == 0){
|
||||
Stuart = RequestProcess_Body;
|
||||
for (const auto& str : HTTPRequests.Headers) {
|
||||
if(str.first == "Sec-WebSocket-Key"){
|
||||
CCWebSocketInfo info;
|
||||
CCString Key = str.second;
|
||||
CCString s = HTTPResponse.GetWriter().ResopenseWebSocket(Key);
|
||||
info.SetId(s);
|
||||
info.SetSocket(socket);
|
||||
if(IFunc){
|
||||
IFunc(info);
|
||||
}
|
||||
// 全局缓冲区
|
||||
std::vector<char> recvBuffer;
|
||||
while (socket.isConnectionAlive() && m_Thread.Sign()){
|
||||
if(socket.isDataAvailable() && m_Thread.Sign()){
|
||||
char buffer[Buffer_Max] = {0};
|
||||
auto len = socket.RecvData(buffer,Buffer_Max);
|
||||
if (len > 0) {
|
||||
// 合并新数据和未完全解析的数据
|
||||
recvBuffer.insert(recvBuffer.end(), buffer, buffer + len);
|
||||
// 当前合并后的数据长度
|
||||
int totalLen = recvBuffer.size();
|
||||
while (totalLen > 0) {
|
||||
std::vector<char> Data;
|
||||
int Flag = unPackingWSFrameData(recvBuffer.data(), totalLen, Data,info);
|
||||
try{
|
||||
if (Flag == 0) {
|
||||
// 解析成功,清空全局缓冲区
|
||||
Data.push_back('\0');
|
||||
info.Buffer = Data;
|
||||
recvBuffer.erase(recvBuffer.begin(), recvBuffer.begin() + totalLen);
|
||||
totalLen = 0;
|
||||
if (MFunc) {
|
||||
MFunc(info);
|
||||
}
|
||||
}
|
||||
else if (Flag == -2) {
|
||||
// 包长小于报文中记录的包长,说明数据不完整
|
||||
info.ErrorCode = WS_ErrorCode::WS_DATA_ERROR;
|
||||
if(EFunc){
|
||||
EFunc(info);
|
||||
}
|
||||
break;
|
||||
}
|
||||
else if (Flag == -3) {
|
||||
// 报文长度小于 2 字节,说明数据不完整
|
||||
info.ErrorCode = WS_ErrorCode::WS_DATA_ERROR;
|
||||
if(EFunc){
|
||||
EFunc(info);
|
||||
}
|
||||
break;
|
||||
}
|
||||
else if (Flag == -1) {
|
||||
// 断开连接类型的数据包
|
||||
Data.push_back('\0');
|
||||
info.Buffer = Data;
|
||||
recvBuffer.erase(recvBuffer.begin(), recvBuffer.begin() + totalLen);
|
||||
totalLen = 0;
|
||||
if (CFunc) {
|
||||
CFunc(info);
|
||||
}
|
||||
unsigned char frame[1024] = {0}; // 假设最大长度为 1024 字节
|
||||
constructCloseFrame(frame, 1000, "Normal closure");
|
||||
CCByteArray frameArray = CCByteArray::fromString((char*)frame);
|
||||
info.SendMassage(frameArray);
|
||||
socket.Close();
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (CCException& e){
|
||||
if(Print >= PromptLevel::ERROR_t){
|
||||
MessagePrompt(e.what());
|
||||
}
|
||||
}
|
||||
// 更新当前合并后的数据长度
|
||||
totalLen -= totalLen;
|
||||
}
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(strlen != std::string::npos) {
|
||||
if (Stuart == RequestProcess_First) {
|
||||
@ -75,10 +224,10 @@ void CCWebServlet::ResponseData(CCSocket &socket){
|
||||
A.Path = A.Path.substr(0, l);
|
||||
}
|
||||
stream >> A.Version;
|
||||
|
||||
RecvMessage.erase(0, strlen + 2);
|
||||
Stuart = RequestProcess_Header;
|
||||
} else if (Stuart == RequestProcess_Header) {
|
||||
}
|
||||
else if (Stuart == RequestProcess_Header) {
|
||||
std::string Key, Value;
|
||||
stream >> Key;
|
||||
stream >> Value;
|
||||
@ -86,40 +235,68 @@ void CCWebServlet::ResponseData(CCSocket &socket){
|
||||
HTTPRequests.Headers.insert(std::pair<std::string, std::string>(Key, Value));
|
||||
RecvMessage.erase(0, strlen + 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
RecvMessage.erase(0, strlen + 2);
|
||||
A.Body = RecvMessage;
|
||||
else{
|
||||
auto st = HTTPRequests.Headers["content-type"];
|
||||
if(st.empty()){
|
||||
st = HTTPRequests.Headers["Content-Type"];
|
||||
}
|
||||
if(st != "multipart/form-data;" && st != "multipart/form-data"){
|
||||
A.Body = RecvMessage;
|
||||
}
|
||||
else {
|
||||
RecvMessage = GetFileHeaders(RecvMessage,socket,HTTPRequests.FileHeaders);
|
||||
for (auto i : RecvMessage) {
|
||||
A.Buffer.push_back(i);
|
||||
}
|
||||
}
|
||||
RecvMessage = "";
|
||||
HTTPRequests.SetBuffer(A);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(A.Method == "OPTIONS"){
|
||||
HTTPResponse.GetWiter().ResponseOK();
|
||||
HTTPResponse.GetWriter().ResponseOK();
|
||||
}
|
||||
else{
|
||||
auto it = RequestFun[HTTPRequests.GetReader().Path];
|
||||
if(it)
|
||||
{
|
||||
it(HTTPRequests, HTTPResponse);
|
||||
CCString SPath = HTTPRequests.GetReader().Path;
|
||||
auto it = RequestFun[SPath];
|
||||
if(it){
|
||||
try {
|
||||
it(HTTPRequests, HTTPResponse);
|
||||
}
|
||||
catch (const std::exception &e) {
|
||||
if(Print >= ERROR_t){
|
||||
CCTimeData time;
|
||||
CCString str = "[" + time.to_String() + "] -> " + CC::to_String(e.what());
|
||||
CC::Println(str);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
else{
|
||||
bool da = false;
|
||||
for (int i = 0; i < RootLen; ++i)
|
||||
{
|
||||
if (HTTPResponse.GetWiter().HtmlWrite(std::string(PathSix[i] + HTTPRequests.GetReader().Path).c_str()))
|
||||
{
|
||||
for (int i = 0; i < RootLen; ++i){
|
||||
CCString Path = PathSix[i] + HTTPRequests.GetReader().Path;
|
||||
if (HTTPResponse.GetWriter().HtmlWrite(Path)){
|
||||
Threading::Sleep(1000);
|
||||
da = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!da)
|
||||
{
|
||||
char bufsa[100] = {0};
|
||||
sprintf(bufsa, "无法打开文件%s\n", HTTPRequests.GetReader().Path.c_str());
|
||||
perror(bufsa);
|
||||
if(WebSignalFun){
|
||||
try {
|
||||
WebSignalFun(HTTPRequests, HTTPResponse);
|
||||
}
|
||||
catch (const std::exception &e) {
|
||||
if(Print >= ERROR_t){
|
||||
CCTimeData time;
|
||||
CCString str = "[" + time.to_String() + "] -> " + CC::to_String(e.what());
|
||||
CC::Println(str);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -141,8 +318,8 @@ bool CCWebServlet::Sign() const {
|
||||
return FlagRun;
|
||||
}
|
||||
|
||||
void CCWebServlet::SetWebServlet(std::string RootPath, CCWebServlet::RequestFunc RFunc) {
|
||||
RequestFun.insert(std::pair<std::string, RequestFunc>(RootPath, RFunc));
|
||||
void CCWebServlet::SetWebServlet(CCString UrlPath, CCWebServlet::RequestFunc RFunc) {
|
||||
RequestFun.insert(std::pair<std::string, RequestFunc>(UrlPath, RFunc));
|
||||
}
|
||||
|
||||
void CCWebServlet::SetAddRootPath(const CCString &rootPath) {
|
||||
@ -152,3 +329,185 @@ void CCWebServlet::SetAddRootPath(const CCString &rootPath) {
|
||||
void CCWebServlet::SetCorsConfig(CORS &cors) {
|
||||
CORSConfig = cors;
|
||||
}
|
||||
|
||||
CCString CCWebServlet::GetFileHeaders(CCString& str,CCSocket &socket,std::map<CCString, CCString> &map) {
|
||||
std::vector<char> data;
|
||||
CCString A,B = str;
|
||||
while (true){
|
||||
if(socket.isDataAvailable()){
|
||||
char Buffer[1] = {0};
|
||||
auto l = socket.RecvData(Buffer, 1);
|
||||
if(l > 0){
|
||||
for(auto i : Buffer){
|
||||
data.push_back(i);
|
||||
}
|
||||
A = B + std::string(data.begin(), data.end());
|
||||
if(A.find("\r\n\r\n") != std::string::npos){
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
CCString C = GetFileDateHeader(A, map);
|
||||
return C;
|
||||
}
|
||||
|
||||
void CCWebServlet::SetWebServletFun(CCWebServlet::RequestFunc RFunc) {
|
||||
WebSignalFun = std::move(RFunc);
|
||||
}
|
||||
|
||||
CCThreadPool CCWebServlet::GetServletThreadPool() {
|
||||
return m_ThreadPool;
|
||||
}
|
||||
|
||||
std::vector<CCString> CCWebServlet::GetIPS(){
|
||||
return m_Socket.GetLocalIP();
|
||||
}
|
||||
|
||||
int CCWebServlet::unPackingWSFrameData(char *msg, int msgLen, std::vector<char> &outBuf,CCWebSocketInfo& wsInfo) {
|
||||
//报文长度一定大于2字节,对于小于的,做返回处理
|
||||
if(msgLen < 2)
|
||||
{
|
||||
return -3;
|
||||
}
|
||||
|
||||
uint8_t opcode_ = 0;
|
||||
uint8_t mask_ = 0;
|
||||
uint8_t masking_key_[4] = {0,0,0,0};
|
||||
uint64_t payload_length_ = 0;
|
||||
int pos = 0;
|
||||
|
||||
//Opcode
|
||||
opcode_ = msg[pos] & 0x0f;
|
||||
pos++;
|
||||
//MASK
|
||||
mask_ = (unsigned char)msg[pos] >> 7;
|
||||
//Payload length
|
||||
payload_length_ = msg[pos] & 0x7f;
|
||||
pos++;
|
||||
if(payload_length_ == 126)
|
||||
{
|
||||
uint16_t length = 0;
|
||||
memcpy(&length, msg + pos, 2);
|
||||
pos += 2;
|
||||
payload_length_ = ntohs(length);
|
||||
}
|
||||
else if(payload_length_ == 127)
|
||||
{
|
||||
uint32_t length = 0;
|
||||
memcpy(&length, msg + pos, 8);
|
||||
pos += 8;
|
||||
payload_length_ = ntohl(length);
|
||||
}
|
||||
//Masking-key
|
||||
if(mask_ == 1)
|
||||
{
|
||||
for(int i = 0; i < 4; i++)
|
||||
{
|
||||
masking_key_[i] = msg[pos + i];
|
||||
}
|
||||
pos += 4;
|
||||
}
|
||||
|
||||
memcpy(wsInfo.Frame.MaskingKey, masking_key_, 4);
|
||||
wsInfo.Frame.mask = mask_;
|
||||
wsInfo.Frame.payload_len = payload_length_;
|
||||
wsInfo.Frame.opcode = opcode_;
|
||||
//取出消息数据
|
||||
if (msgLen >= pos + payload_length_ )
|
||||
{
|
||||
outBuf.clear();
|
||||
if(mask_ != 1)
|
||||
{
|
||||
char* dataBegin = msg + pos;
|
||||
outBuf.insert(outBuf.begin(), dataBegin, dataBegin+payload_length_);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(unsigned int i = 0; i < payload_length_; i++)
|
||||
{
|
||||
int j = i % 4;
|
||||
outBuf.push_back(msg[pos + i] ^ masking_key_[j]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//此时包长小于报文中记录的包长
|
||||
return -2;
|
||||
}
|
||||
|
||||
//断开连接类型数据包
|
||||
if ((int)opcode_ == 0x8)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CCWebServlet::SetWSOnMessage(CCWebServlet::RecvDataFunc RFunc) {
|
||||
MFunc = std::move(RFunc);
|
||||
}
|
||||
|
||||
void CCWebServlet::SetWSOnClose(CCWebServlet::RecvDataFunc CFunc) {
|
||||
this->CFunc = std::move(CFunc);
|
||||
}
|
||||
|
||||
void CCWebServlet::SetWSOnOpen(CCWebServlet::RecvDataFunc IFunc) {
|
||||
this->IFunc = std::move(IFunc);
|
||||
}
|
||||
|
||||
void CCWebServlet::constructCloseFrame(unsigned char *frame, int status_code, const char *reason) {
|
||||
// 设置 Fin Bit 和 Opcode
|
||||
frame[0] = 0x80 | 0x08; // Fin Bit (1) + Opcode (8)
|
||||
|
||||
// 设置 Payload Length
|
||||
int payload_length = 2 + strlen(reason);
|
||||
if (payload_length <= 125) {
|
||||
frame[1] = static_cast<unsigned char>(payload_length);
|
||||
} else if (payload_length <= 65535) {
|
||||
frame[1] = 126;
|
||||
frame[2] = static_cast<unsigned char>(payload_length >> 8);
|
||||
frame[3] = static_cast<unsigned char>(payload_length & 0xFF);
|
||||
payload_length += 2;
|
||||
} else {
|
||||
frame[1] = 127;
|
||||
frame[2] = static_cast<unsigned char>(payload_length >> 56);
|
||||
frame[3] = static_cast<unsigned char>(payload_length >> 48);
|
||||
frame[4] = static_cast<unsigned char>(payload_length >> 40);
|
||||
frame[5] = static_cast<unsigned char>(payload_length >> 32);
|
||||
frame[6] = static_cast<unsigned char>(payload_length >> 24);
|
||||
frame[7] = static_cast<unsigned char>(payload_length >> 16);
|
||||
frame[8] = static_cast<unsigned char>(payload_length >> 8);
|
||||
frame[9] = static_cast<unsigned char>(payload_length & 0xFF);
|
||||
payload_length += 8;
|
||||
}
|
||||
|
||||
// 设置 Payload Data
|
||||
memcpy(frame + 2 + (payload_length > 125 ? 2 : 0), &status_code, 2);
|
||||
memcpy(frame + 4 + (payload_length > 125 ? 2 : 0), reason, strlen(reason));
|
||||
|
||||
// 设置 Masking Key (假设为固定值 0x00)
|
||||
unsigned char masking_key[4] = {0x00, 0x00, 0x00, 0x00};
|
||||
for (int i = 0; i < payload_length; ++i) {
|
||||
frame[2 + (payload_length > 125 ? 2 : 0) + i] ^= masking_key[i % 4];
|
||||
}
|
||||
}
|
||||
|
||||
void CCWebServlet::SetWSOnError(CCWebServlet::RecvDataFunc EFunc) {
|
||||
this->EFunc = std::move(EFunc);
|
||||
}
|
||||
|
||||
void CCWebServlet::SetPrint(PromptLevel level){
|
||||
Print = level;
|
||||
}
|
||||
|
||||
void CCWebServlet::MessagePrompt(const CCString& message){
|
||||
const CCTimeData Time;
|
||||
const CCString str = "[" + Time.to_String() + "] -> " + message;
|
||||
CC::Println(str);
|
||||
}
|
||||
|
||||
|
||||
@ -3,17 +3,40 @@ cmake_minimum_required(VERSION 3.0)
|
||||
add_subdirectory(Depend/portaudio)
|
||||
add_subdirectory(Depend/CSerialPort)
|
||||
add_subdirectory(Depend/mirrors_nlohmann_json)
|
||||
add_subdirectory(Depend/cppp-reiconv)
|
||||
add_subdirectory(Environment)
|
||||
|
||||
find_path(MYSQL_ROOT_DIR ${PROJECT_SOURCE_DIR}/SDK/Depend/mysql-9.0.1)
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(mysql REQUIRED_VARS MYSQL_ROOT_DIR)
|
||||
|
||||
set(INC_DIR ${PROJECT_SOURCE_DIR}/SDK/CCServlet/include)
|
||||
set(LINK_DIR ${PROJECT_SOURCE_DIR}/SDK/Depend/Lib/libs)
|
||||
set(LINK_DLL_DIR ${PROJECT_SOURCE_DIR}/SDK/Depend/Bin/bin)
|
||||
set(CC_API_INC ${PROJECT_SOURCE_DIR}/SDK/Depend/CSerialPort/include
|
||||
${PROJECT_SOURCE_DIR}/SDK/Depend/mirrors_nlohmann_json/include
|
||||
${PROJECT_SOURCE_DIR}/SDK/Depend/mirrors_nlohmann_json/include/nlohmann
|
||||
${PROJECT_SOURCE_DIR}/SDK/Depend/portaudio/include
|
||||
${PROJECT_SOURCE_DIR}/SDK/Multimedia
|
||||
${PROJECT_SOURCE_DIR}/SDK/CCServlet/SQL
|
||||
${PROJECT_SOURCE_DIR}/SDK/CCServlet/include
|
||||
${PROJECT_SOURCE_DIR}/SDK/CCServlet/SQL include
|
||||
${PROJECT_SOURCE_DIR}/SDK/Environment/IMUI/Control
|
||||
${PROJECT_SOURCE_DIR}/SDK/Environment/IMUI/Drive
|
||||
${PROJECT_SOURCE_DIR}/SDK/Environment/IMUI/ImGui
|
||||
${PROJECT_SOURCE_DIR}/SDK/Environment/IMUI/WindowOS
|
||||
${PROJECT_SOURCE_DIR}/SDK/Environment/glfw/include
|
||||
${INC_DIR}
|
||||
${PROJECT_SOURCE_DIR}/SDK/Depend/mysql-9.0.1/include
|
||||
)
|
||||
option(UIAPIS "APIS" ON)
|
||||
if (UIAPIS)
|
||||
add_library(CC_API
|
||||
STATIC
|
||||
src/CCThread.cpp
|
||||
src/CCSocket.cpp
|
||||
CCServlet/src/CCString.cpp
|
||||
src/CCString.cpp
|
||||
src/CCSerialPort.cpp
|
||||
CCServlet/src/CCWeb.cpp
|
||||
src/CCAudio.cpp
|
||||
src/CCThreadPool.cpp
|
||||
include/CCThreadPool.h
|
||||
@ -30,19 +53,67 @@ if (UIAPIS)
|
||||
CCServlet/src/CCSQLite3.cpp
|
||||
CCServlet/include/CCSQLite3.h
|
||||
src/CCEpoll.cpp
|
||||
src/CCByte.cpp
|
||||
include/CCEpoll.h
|
||||
include/CCObject.h
|
||||
src/CCFileOutStream.cpp
|
||||
src/CCEncode.cpp
|
||||
include/CCFileOutStream.h
|
||||
src/CCByteArray.cpp
|
||||
include/CCByteArray.h
|
||||
src/CCFIleInStream.cpp
|
||||
include/CCFIleInStream.h
|
||||
include/CC.h
|
||||
src/CCNetwork.cpp
|
||||
include/CCNetwork.h
|
||||
src/CCTimeData.cpp
|
||||
include/CCTimeData.h
|
||||
src/CCMySql.cpp
|
||||
include/CCMySql.h
|
||||
include/CCArray.h
|
||||
CCServlet/src/CCWebSocketInfo.cpp
|
||||
CCServlet/include/CCWebSocketInfo.h
|
||||
src/CCProcess.cpp
|
||||
include/CCProcess.h
|
||||
CCServlet/src/CCHttpClient.cpp
|
||||
)
|
||||
target_include_directories(CC_API PUBLIC
|
||||
${PROJECT_SOURCE_DIR}/SDK/Depend/CSerialPort/include
|
||||
${PROJECT_SOURCE_DIR}/SDK/Depend/mirrors_nlohmann_json/include
|
||||
${PROJECT_SOURCE_DIR}/SDK/Depend/mirrors_nlohmann_json/include/nlohmann
|
||||
${PROJECT_SOURCE_DIR}/SDK/Depend/portaudio/include
|
||||
${PROJECT_SOURCE_DIR}/SDK/Multimedia
|
||||
${PROJECT_SOURCE_DIR}/SDK/CCServlet/SQL
|
||||
${PROJECT_SOURCE_DIR}/SDK/CCServlet/include
|
||||
${PROJECT_SOURCE_DIR}/SDK/CCServlet/SQL include
|
||||
${PROJECT_SOURCE_DIR}/SDK/Environment/IMUI/Control
|
||||
${PROJECT_SOURCE_DIR}/SDK/Environment/IMUI/Drive
|
||||
${PROJECT_SOURCE_DIR}/SDK/Environment/IMUI/ImGui
|
||||
${PROJECT_SOURCE_DIR}/SDK/Environment/IMUI/WindowOS
|
||||
${PROJECT_SOURCE_DIR}/SDK/Environment/glfw/include
|
||||
${INC_DIR}
|
||||
${PROJECT_SOURCE_DIR}/SDK/Depend/mysql-9.0.1/include/
|
||||
|
||||
)
|
||||
target_include_directories(CC_API PUBLIC Depend/CSerialPort/include Depend/mirrors_nlohmann_json/include
|
||||
Depend/portaudio/include Multimedia CCServlet/SQL CCServlet/include CCServlet/SQL include)
|
||||
if(CMAKE_HOST_UNIX)
|
||||
target_link_libraries(CC_API PRIVATE libcserialport sqlite3 nlohmann_json PortAudio
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Depend/Lib/libs/x86_64/libbass.so
|
||||
${LINK_DIR}/libcppp-reiconv.static.a
|
||||
GUIAPI crypto
|
||||
# ${PROJECT_SOURCE_DIR}/SDK/Depend/mysql-9.0.1/lib/LinuxLib/libmysqlclient.so
|
||||
${PROJECT_SOURCE_DIR}/SDK/Depend/mysql-9.0.1/lib/LinuxLib/libmysqlcppconn.so
|
||||
${PROJECT_SOURCE_DIR}/SDK/Depend/mysql-9.0.1/lib/LinuxLib/libmysqlcppconnx.so
|
||||
)
|
||||
elseif(CMAKE_HOST_WIN32)
|
||||
target_link_libraries(CC_API PRIVATE ws2_32 libcserialport
|
||||
nlohmann_json
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Depend/Bin/bin/sqlite3.dll PortAudio
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Depend/Lib/libs/x86_64/bass.lib
|
||||
GUIAPI
|
||||
${LINK_DIR}/VC/X64/MD/openssl.lib
|
||||
${LINK_DIR}/VC/X64/MD/libcrypto.lib
|
||||
${LINK_DIR}/libcppp-reiconv.static-win.a
|
||||
${PROJECT_SOURCE_DIR}/SDK/Depend/mysql-9.0.1/lib/libmysql.lib
|
||||
)
|
||||
else()
|
||||
|
||||
|
||||
@ -1,361 +0,0 @@
|
||||
EXPORTS
|
||||
sqlite3_aggregate_context
|
||||
sqlite3_aggregate_count
|
||||
sqlite3_auto_extension
|
||||
sqlite3_autovacuum_pages
|
||||
sqlite3_backup_finish
|
||||
sqlite3_backup_init
|
||||
sqlite3_backup_pagecount
|
||||
sqlite3_backup_remaining
|
||||
sqlite3_backup_step
|
||||
sqlite3_bind_blob
|
||||
sqlite3_bind_blob64
|
||||
sqlite3_bind_double
|
||||
sqlite3_bind_int
|
||||
sqlite3_bind_int64
|
||||
sqlite3_bind_null
|
||||
sqlite3_bind_parameter_count
|
||||
sqlite3_bind_parameter_index
|
||||
sqlite3_bind_parameter_name
|
||||
sqlite3_bind_pointer
|
||||
sqlite3_bind_text
|
||||
sqlite3_bind_text16
|
||||
sqlite3_bind_text64
|
||||
sqlite3_bind_value
|
||||
sqlite3_bind_zeroblob
|
||||
sqlite3_bind_zeroblob64
|
||||
sqlite3_blob_bytes
|
||||
sqlite3_blob_close
|
||||
sqlite3_blob_open
|
||||
sqlite3_blob_read
|
||||
sqlite3_blob_reopen
|
||||
sqlite3_blob_write
|
||||
sqlite3_busy_handler
|
||||
sqlite3_busy_timeout
|
||||
sqlite3_cancel_auto_extension
|
||||
sqlite3_changes
|
||||
sqlite3_changes64
|
||||
sqlite3_clear_bindings
|
||||
sqlite3_close
|
||||
sqlite3_close_v2
|
||||
sqlite3_collation_needed
|
||||
sqlite3_collation_needed16
|
||||
sqlite3_column_blob
|
||||
sqlite3_column_bytes
|
||||
sqlite3_column_bytes16
|
||||
sqlite3_column_count
|
||||
sqlite3_column_database_name
|
||||
sqlite3_column_database_name16
|
||||
sqlite3_column_decltype
|
||||
sqlite3_column_decltype16
|
||||
sqlite3_column_double
|
||||
sqlite3_column_int
|
||||
sqlite3_column_int64
|
||||
sqlite3_column_name
|
||||
sqlite3_column_name16
|
||||
sqlite3_column_origin_name
|
||||
sqlite3_column_origin_name16
|
||||
sqlite3_column_table_name
|
||||
sqlite3_column_table_name16
|
||||
sqlite3_column_text
|
||||
sqlite3_column_text16
|
||||
sqlite3_column_type
|
||||
sqlite3_column_value
|
||||
sqlite3_commit_hook
|
||||
sqlite3_compileoption_get
|
||||
sqlite3_compileoption_used
|
||||
sqlite3_complete
|
||||
sqlite3_complete16
|
||||
sqlite3_config
|
||||
sqlite3_context_db_handle
|
||||
sqlite3_create_collation
|
||||
sqlite3_create_collation_v2
|
||||
sqlite3_create_collation16
|
||||
sqlite3_create_filename
|
||||
sqlite3_create_function
|
||||
sqlite3_create_function_v2
|
||||
sqlite3_create_function16
|
||||
sqlite3_create_module
|
||||
sqlite3_create_module_v2
|
||||
sqlite3_create_window_function
|
||||
sqlite3_data_count
|
||||
sqlite3_data_directory
|
||||
sqlite3_database_file_object
|
||||
sqlite3_db_cacheflush
|
||||
sqlite3_db_config
|
||||
sqlite3_db_filename
|
||||
sqlite3_db_handle
|
||||
sqlite3_db_mutex
|
||||
sqlite3_db_name
|
||||
sqlite3_db_readonly
|
||||
sqlite3_db_release_memory
|
||||
sqlite3_db_status
|
||||
sqlite3_declare_vtab
|
||||
sqlite3_deserialize
|
||||
sqlite3_drop_modules
|
||||
sqlite3_enable_load_extension
|
||||
sqlite3_enable_shared_cache
|
||||
sqlite3_errcode
|
||||
sqlite3_errmsg
|
||||
sqlite3_errmsg16
|
||||
sqlite3_error_offset
|
||||
sqlite3_errstr
|
||||
sqlite3_exec
|
||||
sqlite3_expanded_sql
|
||||
sqlite3_expired
|
||||
sqlite3_extended_errcode
|
||||
sqlite3_extended_result_codes
|
||||
sqlite3_file_control
|
||||
sqlite3_filename_database
|
||||
sqlite3_filename_journal
|
||||
sqlite3_filename_wal
|
||||
sqlite3_finalize
|
||||
sqlite3_free
|
||||
sqlite3_free_filename
|
||||
sqlite3_free_table
|
||||
sqlite3_get_autocommit
|
||||
sqlite3_get_auxdata
|
||||
sqlite3_get_clientdata
|
||||
sqlite3_get_table
|
||||
sqlite3_global_recover
|
||||
sqlite3_hard_heap_limit64
|
||||
sqlite3_initialize
|
||||
sqlite3_interrupt
|
||||
sqlite3_is_interrupted
|
||||
sqlite3_keyword_check
|
||||
sqlite3_keyword_count
|
||||
sqlite3_keyword_name
|
||||
sqlite3_last_insert_rowid
|
||||
sqlite3_libversion
|
||||
sqlite3_libversion_number
|
||||
sqlite3_limit
|
||||
sqlite3_load_extension
|
||||
sqlite3_log
|
||||
sqlite3_malloc
|
||||
sqlite3_malloc64
|
||||
sqlite3_memory_alarm
|
||||
sqlite3_memory_highwater
|
||||
sqlite3_memory_used
|
||||
sqlite3_mprintf
|
||||
sqlite3_msize
|
||||
sqlite3_mutex_alloc
|
||||
sqlite3_mutex_enter
|
||||
sqlite3_mutex_free
|
||||
sqlite3_mutex_leave
|
||||
sqlite3_mutex_try
|
||||
sqlite3_next_stmt
|
||||
sqlite3_open
|
||||
sqlite3_open_v2
|
||||
sqlite3_open16
|
||||
sqlite3_os_end
|
||||
sqlite3_os_init
|
||||
sqlite3_overload_function
|
||||
sqlite3_prepare
|
||||
sqlite3_prepare_v2
|
||||
sqlite3_prepare_v3
|
||||
sqlite3_prepare16
|
||||
sqlite3_prepare16_v2
|
||||
sqlite3_prepare16_v3
|
||||
sqlite3_preupdate_blobwrite
|
||||
sqlite3_preupdate_count
|
||||
sqlite3_preupdate_depth
|
||||
sqlite3_preupdate_hook
|
||||
sqlite3_preupdate_new
|
||||
sqlite3_preupdate_old
|
||||
sqlite3_profile
|
||||
sqlite3_progress_handler
|
||||
sqlite3_randomness
|
||||
sqlite3_realloc
|
||||
sqlite3_realloc64
|
||||
sqlite3_release_memory
|
||||
sqlite3_reset
|
||||
sqlite3_reset_auto_extension
|
||||
sqlite3_result_blob
|
||||
sqlite3_result_blob64
|
||||
sqlite3_result_double
|
||||
sqlite3_result_error
|
||||
sqlite3_result_error_code
|
||||
sqlite3_result_error_nomem
|
||||
sqlite3_result_error_toobig
|
||||
sqlite3_result_error16
|
||||
sqlite3_result_int
|
||||
sqlite3_result_int64
|
||||
sqlite3_result_null
|
||||
sqlite3_result_pointer
|
||||
sqlite3_result_subtype
|
||||
sqlite3_result_text
|
||||
sqlite3_result_text16
|
||||
sqlite3_result_text16be
|
||||
sqlite3_result_text16le
|
||||
sqlite3_result_text64
|
||||
sqlite3_result_value
|
||||
sqlite3_result_zeroblob
|
||||
sqlite3_result_zeroblob64
|
||||
sqlite3_rollback_hook
|
||||
sqlite3_rtree_geometry_callback
|
||||
sqlite3_rtree_query_callback
|
||||
sqlite3_serialize
|
||||
sqlite3_set_authorizer
|
||||
sqlite3_set_auxdata
|
||||
sqlite3_set_clientdata
|
||||
sqlite3_set_last_insert_rowid
|
||||
sqlite3_shutdown
|
||||
sqlite3_sleep
|
||||
sqlite3_snprintf
|
||||
sqlite3_soft_heap_limit
|
||||
sqlite3_soft_heap_limit64
|
||||
sqlite3_sourceid
|
||||
sqlite3_sql
|
||||
sqlite3_status
|
||||
sqlite3_status64
|
||||
sqlite3_step
|
||||
sqlite3_stmt_busy
|
||||
sqlite3_stmt_explain
|
||||
sqlite3_stmt_isexplain
|
||||
sqlite3_stmt_readonly
|
||||
sqlite3_stmt_status
|
||||
sqlite3_str_append
|
||||
sqlite3_str_appendall
|
||||
sqlite3_str_appendchar
|
||||
sqlite3_str_appendf
|
||||
sqlite3_str_errcode
|
||||
sqlite3_str_finish
|
||||
sqlite3_str_length
|
||||
sqlite3_str_new
|
||||
sqlite3_str_reset
|
||||
sqlite3_str_value
|
||||
sqlite3_str_vappendf
|
||||
sqlite3_strglob
|
||||
sqlite3_stricmp
|
||||
sqlite3_strlike
|
||||
sqlite3_strnicmp
|
||||
sqlite3_system_errno
|
||||
sqlite3_table_column_metadata
|
||||
sqlite3_temp_directory
|
||||
sqlite3_test_control
|
||||
sqlite3_thread_cleanup
|
||||
sqlite3_threadsafe
|
||||
sqlite3_total_changes
|
||||
sqlite3_total_changes64
|
||||
sqlite3_trace
|
||||
sqlite3_trace_v2
|
||||
sqlite3_transfer_bindings
|
||||
sqlite3_txn_state
|
||||
sqlite3_update_hook
|
||||
sqlite3_uri_boolean
|
||||
sqlite3_uri_int64
|
||||
sqlite3_uri_key
|
||||
sqlite3_uri_parameter
|
||||
sqlite3_user_data
|
||||
sqlite3_value_blob
|
||||
sqlite3_value_bytes
|
||||
sqlite3_value_bytes16
|
||||
sqlite3_value_double
|
||||
sqlite3_value_dup
|
||||
sqlite3_value_encoding
|
||||
sqlite3_value_free
|
||||
sqlite3_value_frombind
|
||||
sqlite3_value_int
|
||||
sqlite3_value_int64
|
||||
sqlite3_value_nochange
|
||||
sqlite3_value_numeric_type
|
||||
sqlite3_value_pointer
|
||||
sqlite3_value_subtype
|
||||
sqlite3_value_text
|
||||
sqlite3_value_text16
|
||||
sqlite3_value_text16be
|
||||
sqlite3_value_text16le
|
||||
sqlite3_value_type
|
||||
sqlite3_version
|
||||
sqlite3_vfs_find
|
||||
sqlite3_vfs_register
|
||||
sqlite3_vfs_unregister
|
||||
sqlite3_vmprintf
|
||||
sqlite3_vsnprintf
|
||||
sqlite3_vtab_collation
|
||||
sqlite3_vtab_config
|
||||
sqlite3_vtab_distinct
|
||||
sqlite3_vtab_in
|
||||
sqlite3_vtab_in_first
|
||||
sqlite3_vtab_in_next
|
||||
sqlite3_vtab_nochange
|
||||
sqlite3_vtab_on_conflict
|
||||
sqlite3_vtab_rhs_value
|
||||
sqlite3_wal_autocheckpoint
|
||||
sqlite3_wal_checkpoint
|
||||
sqlite3_wal_checkpoint_v2
|
||||
sqlite3_wal_hook
|
||||
sqlite3_win32_is_nt
|
||||
sqlite3_win32_mbcs_to_utf8
|
||||
sqlite3_win32_mbcs_to_utf8_v2
|
||||
sqlite3_win32_set_directory
|
||||
sqlite3_win32_set_directory16
|
||||
sqlite3_win32_set_directory8
|
||||
sqlite3_win32_sleep
|
||||
sqlite3_win32_unicode_to_utf8
|
||||
sqlite3_win32_utf8_to_mbcs
|
||||
sqlite3_win32_utf8_to_mbcs_v2
|
||||
sqlite3_win32_utf8_to_unicode
|
||||
sqlite3_win32_write_debug
|
||||
sqlite3changegroup_add
|
||||
sqlite3changegroup_add_strm
|
||||
sqlite3changegroup_delete
|
||||
sqlite3changegroup_new
|
||||
sqlite3changegroup_output
|
||||
sqlite3changegroup_output_strm
|
||||
sqlite3changegroup_schema
|
||||
sqlite3changeset_apply
|
||||
sqlite3changeset_apply_strm
|
||||
sqlite3changeset_apply_v2
|
||||
sqlite3changeset_apply_v2_strm
|
||||
sqlite3changeset_concat
|
||||
sqlite3changeset_concat_strm
|
||||
sqlite3changeset_conflict
|
||||
sqlite3changeset_finalize
|
||||
sqlite3changeset_fk_conflicts
|
||||
sqlite3changeset_invert
|
||||
sqlite3changeset_invert_strm
|
||||
sqlite3changeset_new
|
||||
sqlite3changeset_next
|
||||
sqlite3changeset_old
|
||||
sqlite3changeset_op
|
||||
sqlite3changeset_pk
|
||||
sqlite3changeset_start
|
||||
sqlite3changeset_start_strm
|
||||
sqlite3changeset_start_v2
|
||||
sqlite3changeset_start_v2_strm
|
||||
sqlite3rbu_bp_progress
|
||||
sqlite3rbu_close
|
||||
sqlite3rbu_create_vfs
|
||||
sqlite3rbu_db
|
||||
sqlite3rbu_destroy_vfs
|
||||
sqlite3rbu_open
|
||||
sqlite3rbu_progress
|
||||
sqlite3rbu_rename_handler
|
||||
sqlite3rbu_savestate
|
||||
sqlite3rbu_state
|
||||
sqlite3rbu_step
|
||||
sqlite3rbu_temp_size
|
||||
sqlite3rbu_temp_size_limit
|
||||
sqlite3rbu_vacuum
|
||||
sqlite3rebaser_configure
|
||||
sqlite3rebaser_create
|
||||
sqlite3rebaser_delete
|
||||
sqlite3rebaser_rebase
|
||||
sqlite3rebaser_rebase_strm
|
||||
sqlite3session_attach
|
||||
sqlite3session_changeset
|
||||
sqlite3session_changeset_size
|
||||
sqlite3session_changeset_strm
|
||||
sqlite3session_config
|
||||
sqlite3session_create
|
||||
sqlite3session_delete
|
||||
sqlite3session_diff
|
||||
sqlite3session_enable
|
||||
sqlite3session_indirect
|
||||
sqlite3session_isempty
|
||||
sqlite3session_memory_used
|
||||
sqlite3session_object_config
|
||||
sqlite3session_patchset
|
||||
sqlite3session_patchset_strm
|
||||
sqlite3session_table_filter
|
||||
@ -1,15 +1,16 @@
|
||||
git clone https://gitee.com/itas109/CSerialPort.git
|
||||
|
||||
git clone https://gitee.com/learnlov/mirrors_nlohmann_json.git
|
||||
sudo apt-get install libssl3-dev
|
||||
sudo apt install libssl-dev
|
||||
sudo apt-get install libcurl4-openssl-dev
|
||||
sudo apt-get install libsqlite3-dev
|
||||
sudo apt-get install libc6-dev
|
||||
sudo apt-get install libglfw3-dev
|
||||
sudo apt install plasma-workspace-wayland
|
||||
sudo apt-get install libxkbcommon-dev
|
||||
sudo apt-get install libx11-dev
|
||||
sudo apt-get install libxinerama-dev
|
||||
sudo apt-get install libxcursor-dev
|
||||
sudo apt-get install libxi-dev
|
||||
sudo apt install pkg-config
|
||||
sudo dpkg -i ./Depend/mysql-community-server-core_8.4.2-1debian12_amd64.deb
|
||||
|
||||
git clone https://github.com/PortAudio/portaudio.git
|
||||
|
||||
unzip ./Depend/sqlite-amalgamation-3450300.zip
|
||||
|
||||
cd sqlite-amalgamation-3450300
|
||||
|
||||
./configure --prefix=/usr/local
|
||||
|
||||
sudo make -j8
|
||||
|
||||
sudo make install
|
||||
|
||||
@ -29,6 +29,7 @@ public:
|
||||
void Create(CCSocket& socket,int size = 10);
|
||||
CCSocket Accept(CCSocket& socket);
|
||||
bool Status();
|
||||
bool CompletionKey();
|
||||
|
||||
private:
|
||||
|
||||
|
||||
@ -1,12 +1,15 @@
|
||||
#ifndef IMGUICPPDEMO_CCIOS_H
|
||||
#define IMGUICPPDEMO_CCIOS_H
|
||||
#include <filesystem>
|
||||
|
||||
#include "cstdio"
|
||||
#include "dirent.h"
|
||||
#include "vector"
|
||||
#include "CCString.h"
|
||||
#include "mutex"
|
||||
#include <unistd.h> // 包含 _access 和 mkdir
|
||||
#include <sys/stat.h> // 包含 mkdir 的权限模式
|
||||
#include "CCByteArray.h"
|
||||
#include <fstream>
|
||||
#include <unistd.h>
|
||||
|
||||
namespace CC
|
||||
{
|
||||
@ -32,7 +35,7 @@ struct FileInfo
|
||||
{
|
||||
CCString Path;
|
||||
CCString Name;
|
||||
long Size = 0;
|
||||
long long Size = 0;
|
||||
bool Directory = false;
|
||||
};
|
||||
|
||||
@ -71,10 +74,10 @@ private:
|
||||
private:
|
||||
void rmtree(const char *path);
|
||||
int is_directory(const char *path);
|
||||
long GetFileSize(const char *filename);
|
||||
long long GetFileSize(const char *filename);
|
||||
const char *GetFileName(const char *path);
|
||||
std::vector<FileInfo> GetFileList(const char *path);
|
||||
static std::string normalizePath(const std::string &path);
|
||||
static std::string normalizePath(const CCString &path);
|
||||
void move_file(const char *src, const char *dst);
|
||||
int copy_file(const char *source, const char *destination);
|
||||
static int create_fun(char*filepath);
|
||||
|
||||
@ -1,25 +1,22 @@
|
||||
#ifndef THREADPOOLDEMO_CCJSONOBJECT_H
|
||||
#define THREADPOOLDEMO_CCJSONOBJECT_H
|
||||
#include "nlohmann/json.hpp"
|
||||
#include "CC.h"
|
||||
using JSON = nlohmann::json;
|
||||
|
||||
namespace CCJSON
|
||||
{
|
||||
JSON Parse(const char* str);
|
||||
}
|
||||
|
||||
class CCJSONObject: public JSON
|
||||
{
|
||||
public:
|
||||
using nlohmann::json::json;
|
||||
CCJSONObject() = default;
|
||||
CCJSONObject(JSON && j);
|
||||
void Put(const char* key,nlohmann::json value);
|
||||
JSON Get(const char* key);
|
||||
std::string To_String();
|
||||
void put(const char* key,nlohmann::json value);
|
||||
JSON get(const char* key);
|
||||
std::string to_String();
|
||||
static CCJSONObject parse(const String& str);
|
||||
private:
|
||||
JSON j;
|
||||
|
||||
JSON J;
|
||||
};
|
||||
|
||||
|
||||
#endif //THREADPOOLDEMO_CCJSONOBJECT_H
|
||||
#endif
|
||||
|
||||
@ -1,8 +1,10 @@
|
||||
#define __CCSocket__
|
||||
#include <CCString.h>
|
||||
#include <vector>
|
||||
#ifdef __CCSocket__
|
||||
#pragma once
|
||||
|
||||
#include "iostream"
|
||||
#include "CC.h"
|
||||
#include "string"
|
||||
|
||||
struct CCHostInfo
|
||||
@ -11,6 +13,11 @@ struct CCHostInfo
|
||||
unsigned short Port;
|
||||
};
|
||||
|
||||
enum CCOpt
|
||||
{
|
||||
BROADCAST,
|
||||
};
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
#include <winsock2.h>
|
||||
@ -18,11 +25,31 @@ struct CCHostInfo
|
||||
#include <mswsock.h>
|
||||
|
||||
#pragma warning(disable : 4996)
|
||||
#pragma comment(lib,"ws2_32.lib") //<2F><><EFBFBD> 0 3<EFBFBD><D3BF> 0 4<EFBFBD>
|
||||
#pragma comment(lib,"ws2_32.lib")
|
||||
|
||||
typedef long long ByteHander;
|
||||
#define HanderSize sizeof(ByteHander)
|
||||
|
||||
class WinWSADWAInitAndClean
|
||||
{
|
||||
public:
|
||||
WSADATA wsd{};
|
||||
WinWSADWAInitAndClean(){
|
||||
if (WSAStartup(MAKEWORD(2, 2), &this->wsd)!=0){
|
||||
WSACleanup();
|
||||
}
|
||||
}
|
||||
~WinWSADWAInitAndClean(){
|
||||
WSACleanup();
|
||||
}
|
||||
};
|
||||
|
||||
inline WinWSADWAInitAndClean winsc;
|
||||
// if (WSAStartup(MAKEWORD(2, 2), &this->wsd)!=0)
|
||||
// {
|
||||
// WSACleanup();
|
||||
// return sc;
|
||||
// }
|
||||
|
||||
enum IPVX
|
||||
{
|
||||
@ -50,17 +77,20 @@ public:
|
||||
public:
|
||||
CCSocket() = default;
|
||||
CCSocket Socket(IPVX IPV4orIPV6, TORU TCPorUDP, TYPE Type = TYPE::STREAM);
|
||||
bool SetSockOpt(CCOpt opt);
|
||||
void SetSocketNonBlocking();
|
||||
bool IsDataAvailable();
|
||||
std::string GetlocadIP(IPVX ipvx = IPVX::IPV4,int Number = 1);
|
||||
CCHostInfo GetHost();
|
||||
bool isDataAvailable();
|
||||
static std::vector<CCString> GetLocalIP(IPVX ipvx = IPVX::IPV4,int Number = 1);
|
||||
CCHostInfo GetClientHost();
|
||||
CCHostInfo GetLocalHost();
|
||||
bool Connect(const char* IP, unsigned short Port);
|
||||
bool Bind(const char* IP,unsigned short Port);
|
||||
bool Listen(unsigned short UserNum = 10);
|
||||
CCSocket Accept();
|
||||
bool Send(const char* str);
|
||||
bool Send(const void *__buf, size_t __n, int __flags);
|
||||
bool Sendbyte(const char* str,int len);
|
||||
bool SendData(const char * str,sockaddr_in addr_in);
|
||||
bool SendByte(const char* str,int len);
|
||||
bool UDPSend(const char* str,const char* IP,int Port);
|
||||
bool UDPSendByte(const char* str, ByteHander len, const char* IP, int Port);
|
||||
ByteHander RecvData(char* buffer,ByteHander lens);
|
||||
@ -70,14 +100,13 @@ public:
|
||||
bool GetStrHead(char* data,ByteHander size);
|
||||
bool operator == (CCSocket socket);
|
||||
bool operator != (CCSocket socket);
|
||||
bool isConnectionAlive();
|
||||
|
||||
private:
|
||||
WSADATA wsd;
|
||||
sockaddr_in client = {};
|
||||
sockaddr_in client = {}, server = {};
|
||||
int IPVx = 0;
|
||||
int sock = -1;
|
||||
bool Stop = false;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -122,17 +151,20 @@ public:
|
||||
public:
|
||||
CCSocket() = default;
|
||||
CCSocket Socket(IPVX IPV4orIPV6, TORU TCPorUDP, TYPE Type = TYPE::STREAM);
|
||||
bool SetSockOpt(CCOpt opt);
|
||||
void SetSocketNonBlocking();
|
||||
bool IsDataAvailable();
|
||||
std::string GetlocadIP(IPVX ipvx = IPVX::IPV4,int Number = 1);
|
||||
CCHostInfo GetHost();
|
||||
bool isDataAvailable();
|
||||
static std::vector<CCString> GetLocalIP(IPVX ipvx = IPVX::IPV4,int Number = 1);
|
||||
CCHostInfo GetClientHost();
|
||||
CCHostInfo GetLocalHost();
|
||||
bool Connect(const char* IP, unsigned short Port);
|
||||
bool Bind(const char* IP,int Port);
|
||||
bool Listen(unsigned short UserNum = 10);
|
||||
CCSocket Accept();
|
||||
bool Send(const char* str);
|
||||
bool Send(const void *__buf, size_t __n, int __flags);
|
||||
bool Sendbyte(const char* str,int len);
|
||||
bool SendData(const char * str,sockaddr_in addr_in);
|
||||
bool SendByte(const char* str,int len);
|
||||
bool UDPSend(const char* str,const char* IP,int Port);
|
||||
bool UDPSendByte(const char* str, ByteHander len, const char* IP, int Port);
|
||||
ByteHander RecvData(char* buffer,ByteHander lens);
|
||||
@ -143,10 +175,10 @@ public:
|
||||
//----------------------------------------------------------------------------------------
|
||||
bool operator == (CCSocket socket);
|
||||
bool operator != (CCSocket socket);
|
||||
|
||||
bool isConnectionAlive();
|
||||
|
||||
private:
|
||||
sockaddr_in client = {};
|
||||
sockaddr_in client = {},server = {};
|
||||
int IPVx = 0;
|
||||
int opt = 1;
|
||||
bool Stop = false;
|
||||
|
||||
@ -25,12 +25,13 @@ namespace Threading
|
||||
#define FUNA void*
|
||||
|
||||
|
||||
class CCThread
|
||||
class CCThread:public std::thread
|
||||
{
|
||||
public:
|
||||
CCThread();
|
||||
CCThread(std::thread a);
|
||||
CCThread(CCThread&& other);
|
||||
using std::thread::thread;
|
||||
~CCThread();
|
||||
template <typename Func, typename... Args>
|
||||
bool SetThread(Func&& fun, Args&&... args)
|
||||
@ -50,10 +51,23 @@ public:
|
||||
Thread = std::thread(task);
|
||||
Thread.detach();
|
||||
}
|
||||
}
|
||||
void RunWait() {
|
||||
if (task) {
|
||||
Flag = true;
|
||||
Thread = std::thread(task);
|
||||
Thread.join();
|
||||
}
|
||||
}
|
||||
void Stop();
|
||||
bool Sign();
|
||||
|
||||
static void Sleep(unsigned int us){
|
||||
if(us!=0)
|
||||
std::this_thread::sleep_for(std::chrono::microseconds(us));
|
||||
else{
|
||||
while (true);
|
||||
}
|
||||
};
|
||||
|
||||
private:
|
||||
std::thread Thread;
|
||||
|
||||
@ -1,68 +1,100 @@
|
||||
#ifndef CCTHREADPOOL_H
|
||||
#define CCTHREADPOOL_H
|
||||
#ifndef __CC_ThreadPool_H__
|
||||
#define __CC_ThreadPool_H__
|
||||
#pragma once
|
||||
|
||||
#include <thread>
|
||||
#include "iostream"
|
||||
#include <functional>
|
||||
#include <queue>
|
||||
#include "deque"
|
||||
#include <mutex>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include "CCThread.h"
|
||||
|
||||
|
||||
#include "CC.h"
|
||||
|
||||
class CCThreadPool
|
||||
{
|
||||
public:
|
||||
struct TaskPool {
|
||||
std::thread* thread;
|
||||
bool Running = false;
|
||||
int ID = -1;
|
||||
bool Sign = false;
|
||||
bool Online = false;
|
||||
std::function<void()> TaskFun = nullptr;
|
||||
};
|
||||
|
||||
public:
|
||||
CCThreadPool() = default;
|
||||
explicit CCThreadPool(int numThreads);
|
||||
void InitStart(int numThreads);
|
||||
CCThreadPool(CCThreadPool& other);
|
||||
void InitStart(int corePoolSize);
|
||||
void InitStart(int corePoolSize, int maximumPoolSize,int keepAliveTime);
|
||||
template<typename Func,typename... Args>
|
||||
void AddTask(Func && func, Args&&... args);
|
||||
unsigned int GetThreadCount() const;
|
||||
unsigned int GetUnusedCount();
|
||||
void SetThreadTimeout(unsigned int us);
|
||||
std::vector<int> GetThreadUnusedID();
|
||||
void Stop();
|
||||
int GetThreadCount() const;
|
||||
int GetUnusedCount() const;
|
||||
int GetCorePoolSize() const;
|
||||
int GetPoolMaxSize() const;
|
||||
int GetTaskRunningSize() const;
|
||||
void SetPrint(bool F);
|
||||
void SetThreadTimeout(int us);
|
||||
void Stop(bool F = true);
|
||||
|
||||
|
||||
private:
|
||||
void worker(int ID);
|
||||
std::vector<TaskPool*> m_thread;
|
||||
TaskPool* T;
|
||||
template<typename Func,typename... Args>
|
||||
void AdHocTasks(Func && func, Args&&... args);
|
||||
std::vector<std::function<void()>> m_taskQueue;
|
||||
std::map<int, TaskPool> m_threads;
|
||||
std::mutex m_mutex;
|
||||
bool m_running;
|
||||
unsigned int m_threadCount, m_thread_Time = 1000 * 1000;
|
||||
|
||||
|
||||
int m_corePoolSize = 5, m_maximumPoolSize = 30, m_keepAliveTime = 1000 * 1000 * 16;
|
||||
int TaskRunningSize = 0,TemporaryThreads = 0;
|
||||
bool Print = false;
|
||||
};
|
||||
template<typename Func,typename... Args>
|
||||
inline void CCThreadPool::AddTask(Func && func, Args&&... args) {
|
||||
m_mutex.lock();
|
||||
if(TaskRunningSize >= m_maximumPoolSize){
|
||||
CC::Println("CCThreadPool::AddTask: Threaded tasks exceed the maximum, wait!");
|
||||
return;
|
||||
}
|
||||
std::function<void()> FUNS = std::bind(std::forward<Func>(func), std::forward<Args>(args)...);
|
||||
if(FUNS)
|
||||
{
|
||||
for (int i = 0;i < m_threadCount;i++)
|
||||
{
|
||||
if(!m_thread[i]->Running)
|
||||
{
|
||||
m_taskQueue[i] = FUNS;
|
||||
m_thread[i]->Running = true;
|
||||
break;
|
||||
if(FUNS){
|
||||
m_mutex.lock();
|
||||
CCVar Len = GetUnusedCount();
|
||||
if(Len > 0){
|
||||
for(auto &[fst, snd] : m_threads) {
|
||||
if(!snd.Running) {
|
||||
snd.TaskFun = FUNS;
|
||||
snd.Running = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
AdHocTasks(FUNS);
|
||||
}
|
||||
m_mutex.unlock();
|
||||
}
|
||||
else {
|
||||
CC::Println("CCThreadPool::AddTask: The task is empty!");
|
||||
}
|
||||
//Threading::Sleep(1000 * 16);
|
||||
m_mutex.unlock();
|
||||
}
|
||||
|
||||
template<typename Func, typename... Args>
|
||||
inline void CCThreadPool::AdHocTasks(Func &&func, Args &&... args) {
|
||||
CCThread([this,func](){
|
||||
TemporaryThreads++;
|
||||
try {
|
||||
func();
|
||||
}
|
||||
catch (CCException& e) {
|
||||
String str = "CCThreadPool::AdHocTasks: The temporary task failed -> " + CC::to_String(e.what());
|
||||
CC::Println(str);
|
||||
}
|
||||
TemporaryThreads--;
|
||||
CCThread::Sleep(m_keepAliveTime);
|
||||
}).detach();
|
||||
|
||||
}
|
||||
|
||||
#endif //CCTHREADPOOL_H
|
||||
#endif
|
||||
|
||||
@ -1,100 +0,0 @@
|
||||
#ifndef STM32API_CCVECTOR_HPP
|
||||
#define STM32API_CCVECTOR_HPP
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
template <typename T>
|
||||
class CCVector
|
||||
{
|
||||
public:
|
||||
typedef T value_type;
|
||||
typedef T* iterator;
|
||||
CCVector() : _start(nullptr), _finish(nullptr), _end(nullptr)
|
||||
{
|
||||
_buffer[ID] = 0;
|
||||
}
|
||||
void push_back(const value_type &x);
|
||||
T pop_back();
|
||||
value_type operator[] (int id) const
|
||||
{
|
||||
return _buffer[id];
|
||||
}
|
||||
void clear()
|
||||
{
|
||||
_buffer = (value_type*)malloc(sizeof(value_type) * 2);
|
||||
ID = 0;
|
||||
_buffer[ID] = 0;
|
||||
}
|
||||
unsigned int size()
|
||||
{
|
||||
return ID;
|
||||
}
|
||||
bool empty()
|
||||
{
|
||||
return ID == 0;
|
||||
}
|
||||
void reserve(unsigned int size)
|
||||
{
|
||||
_buffer = (value_type*)realloc(_buffer, sizeof(value_type) * size);
|
||||
}
|
||||
bool operator==(const value_type &x)
|
||||
{
|
||||
return _buffer[ID] == x;
|
||||
}
|
||||
void erase(int index,int len)
|
||||
{
|
||||
int a = ID - (len - index);
|
||||
value_type* b = (value_type*)malloc(sizeof(value_type) * a);
|
||||
for (int i = 0; i < index; ++i)
|
||||
{
|
||||
b[i] = _buffer[i];
|
||||
}
|
||||
for (int i = index; i < a; ++i)
|
||||
{
|
||||
b[i] = _buffer[i+len];
|
||||
}
|
||||
ID = ID - len;
|
||||
_buffer = b;
|
||||
}
|
||||
void revise(int index,value_type x)
|
||||
{
|
||||
_buffer[index] = x;
|
||||
}
|
||||
void insert(int index, value_type x)
|
||||
{
|
||||
push_back(_buffer[ID-1]);
|
||||
for(int i = index; i < ID; i++)
|
||||
{
|
||||
_buffer[i + 1] = _buffer[i];
|
||||
}
|
||||
_buffer[index] = x;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
iterator _start;
|
||||
iterator _finish;
|
||||
iterator _end;
|
||||
value_type* _buffer = (value_type*)malloc(sizeof(value_type) * 2);
|
||||
unsigned int ID = 0;
|
||||
|
||||
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
T CCVector<T>::pop_back()
|
||||
{
|
||||
return _buffer[--ID];
|
||||
}
|
||||
|
||||
|
||||
template<typename T>
|
||||
inline void CCVector<T>::push_back(const value_type &x)
|
||||
{
|
||||
_buffer[ID++] = x;
|
||||
_buffer = (value_type*)realloc(_buffer, sizeof(value_type) * (ID + 1));
|
||||
_buffer[ID] = 0;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
@ -6,7 +6,7 @@ CCEpoll::CCEpoll(CCSocket& socket,int size) {
|
||||
|
||||
void CCEpoll::Create(CCSocket &socket, int size) {
|
||||
#ifdef _WIN32
|
||||
this->hIoCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr, 0, 0);
|
||||
this->hIoCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
|
||||
CreateIoCompletionPort((HANDLE)socket.Socketbit, hIoCompletionPort, (ULONG_PTR)socket.Socketbit, 0);
|
||||
#elif __linux__
|
||||
|
||||
@ -35,3 +35,11 @@ bool CCEpoll::Status() {
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
bool CCEpoll::CompletionKey() {
|
||||
#ifdef _WIN32
|
||||
return completionKey == (ULONG_PTR)listenSocket.Socketbit;
|
||||
#elif __linux__
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1,18 +1,21 @@
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <dirent.h>
|
||||
#include <sys/stat.h>
|
||||
#include "../include/CCFile.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
|
||||
|
||||
CCFile::CCFile(const char *path, CC::RIos mode,bool load){
|
||||
this->Open(path, mode,load);
|
||||
}
|
||||
|
||||
void CCFile::Open(const char *path, CC::RIos mode,bool load)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
CCString A = CCByteArray::fromString(path).Format();
|
||||
path = A.c_str();
|
||||
#endif
|
||||
Mode = mode;
|
||||
if(mode == 3 || mode == 4 || mode == 5 || mode == 9 || mode == 10 || mode == 11){
|
||||
bin = true;
|
||||
@ -117,7 +120,7 @@ bool CCFile::IsDirectory() {
|
||||
return is_directory(info.Path.c_str()) != 0;
|
||||
}
|
||||
|
||||
long CCFile::GetFileSize(const char *filename) {
|
||||
long long CCFile::GetFileSize(const char *filename) {
|
||||
mtx.lock();
|
||||
FILE *file = fopen(filename, "rb");
|
||||
if (file == NULL) {
|
||||
@ -132,7 +135,7 @@ long CCFile::GetFileSize(const char *filename) {
|
||||
return -1;
|
||||
}
|
||||
// 获取文件指针的位置
|
||||
long size = ftell(file);
|
||||
long long size = ftell(file);
|
||||
// 关闭文件
|
||||
mtx.unlock();
|
||||
fclose(file);
|
||||
@ -190,7 +193,7 @@ std::vector<FileInfo> CCFile::GetDirectoryList(bool F) {
|
||||
}
|
||||
}
|
||||
|
||||
std::string CCFile::normalizePath(const std::string &path) {
|
||||
std::string CCFile::normalizePath(const CCString &path) {
|
||||
std::string normalized;
|
||||
bool lastWasSlash = false; // 标记上一个字符是否为斜杠
|
||||
|
||||
@ -221,13 +224,13 @@ void CCFile::Move(CCString Path) {
|
||||
|
||||
int CCFile::copy_file(const char *source, const char *destination) {
|
||||
FILE *in = fopen(source, "rb");
|
||||
if (in == nullptr) {
|
||||
if (in == NULL) {
|
||||
perror("Failed to open source file");
|
||||
return 1;
|
||||
}
|
||||
|
||||
FILE *out = fopen(destination, "wb");
|
||||
if (out == nullptr) {
|
||||
if (out == NULL) {
|
||||
perror("Failed to open destination file");
|
||||
fclose(in);
|
||||
return 1;
|
||||
@ -279,6 +282,7 @@ int CCFile::create_fun(char *filepath) {
|
||||
//创建文件夹
|
||||
res = mkdir(filepath,0775);// 返回 0 表示创建成功,-1 表示失败
|
||||
#endif
|
||||
|
||||
//remove(filename) 删除文件
|
||||
else
|
||||
res = 1;
|
||||
|
||||
@ -1,26 +1,27 @@
|
||||
#include "../include/CCJSONObject.h"
|
||||
|
||||
void CCJSONObject::Put(const char *key, nlohmann::json value) {
|
||||
j[key] = value;
|
||||
void CCJSONObject::put(const char *key, nlohmann::json value) {
|
||||
J[key] = value;
|
||||
}
|
||||
|
||||
JSON CCJSONObject::Get(const char *key) {
|
||||
return j[key];
|
||||
JSON CCJSONObject::get(const char *key) {
|
||||
return J[key];
|
||||
}
|
||||
|
||||
JSON CCJSON::Parse(const char *str) {
|
||||
try {
|
||||
return nlohmann::json::parse(str);
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
std::string CCJSONObject::To_String() {
|
||||
return to_string(j);
|
||||
std::string CCJSONObject::to_String() {
|
||||
return J.dump();
|
||||
}
|
||||
|
||||
CCJSONObject::CCJSONObject(JSON &&j) {
|
||||
this->j = j;
|
||||
J = j;
|
||||
}
|
||||
|
||||
CCJSONObject CCJSONObject::parse(const String &str) {
|
||||
try {
|
||||
return nlohmann::json::parse(str);
|
||||
}
|
||||
catch (...) {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -7,17 +7,9 @@
|
||||
|
||||
CCSocket CCSocket::Socket(IPVX IPV4orIPV6, TORU TCPorUDP, TYPE Type)
|
||||
{
|
||||
CCSocket sc;
|
||||
WSACleanup();
|
||||
if (WSAStartup(MAKEWORD(2, 2), &this->wsd)!=0)
|
||||
{
|
||||
WSACleanup();
|
||||
return sc;
|
||||
}
|
||||
CCSocket sc{};
|
||||
this->Socketbit = socket(IPV4orIPV6, Type, TCPorUDP);
|
||||
if (this->Socketbit == INVALID_SOCKET)
|
||||
{
|
||||
WSACleanup();
|
||||
if (this->Socketbit == INVALID_SOCKET){
|
||||
return sc;
|
||||
}
|
||||
this->sock = TCPorUDP;
|
||||
@ -28,35 +20,38 @@ CCSocket CCSocket::Socket(IPVX IPV4orIPV6, TORU TCPorUDP, TYPE Type)
|
||||
return sc;
|
||||
}
|
||||
|
||||
std::string CCSocket::GetlocadIP(IPVX ipvx,int Number)
|
||||
{
|
||||
WSADATA wsaData;
|
||||
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
|
||||
if (result != 0) {
|
||||
std::cerr << "WSAStartup failed: " << result << std::endl;
|
||||
return "Error";
|
||||
bool CCSocket::SetSockOpt(CCOpt opt){
|
||||
if(opt == CCOpt::BROADCAST)
|
||||
{
|
||||
int broadcastPermission = 1;
|
||||
if (setsockopt(this->Socketbit, SOL_SOCKET, SO_BROADCAST, (const char*)&broadcastPermission, sizeof(broadcastPermission)) < 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
std::vector<CCString> CCSocket::GetLocalIP(IPVX ipvx,int Number)
|
||||
{
|
||||
std::vector<CCString> IPList;
|
||||
int result = 0;
|
||||
// 获取主机名
|
||||
char hostName[NI_MAXHOST];
|
||||
if (gethostname(hostName, NI_MAXHOST) != 0) {
|
||||
std::cerr << "gethostname failed" << std::endl;
|
||||
WSACleanup();
|
||||
return "Error";
|
||||
return {};
|
||||
}
|
||||
|
||||
struct addrinfo hints, *info;
|
||||
ZeroMemory(&hints, sizeof(hints));
|
||||
hints.ai_family = AF_UNSPEC; // AF_INET for IPv4 only
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_protocol = IPPROTO_TCP;
|
||||
|
||||
// 获取地址信息
|
||||
result = getaddrinfo(hostName, NULL, &hints, &info);
|
||||
if (result != 0) {
|
||||
std::cerr << "getaddrinfo failed: " << result << std::endl;
|
||||
WSACleanup();
|
||||
return "Error";
|
||||
return {};
|
||||
}
|
||||
char ipString[INET6_ADDRSTRLEN] = {0};
|
||||
// 遍历所有地址信息并打印IPv4地址
|
||||
@ -73,15 +68,12 @@ std::string CCSocket::GetlocadIP(IPVX ipvx,int Number)
|
||||
|
||||
// 将地址转换为字符串
|
||||
inet_ntop(p->ai_family, addr, ipString, sizeof(ipString));
|
||||
|
||||
IPList.emplace_back(ipString);
|
||||
// std::cout << "IPv4 address: " << ipString << std::endl;
|
||||
}
|
||||
|
||||
// 释放地址信息
|
||||
freeaddrinfo(info);
|
||||
|
||||
WSACleanup();
|
||||
return ipString;
|
||||
return IPList;
|
||||
}
|
||||
|
||||
bool CCSocket::Connect(const char* IP, unsigned short Port)
|
||||
@ -101,22 +93,17 @@ bool CCSocket::Connect(const char* IP, unsigned short Port)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCSocket::Bind(const char* IP, unsigned short Port)
|
||||
{
|
||||
sockaddr_in serveraddr;
|
||||
memset(&serveraddr, 0, sizeof(serveraddr));
|
||||
serveraddr.sin_family = AF_INET;
|
||||
serveraddr.sin_port = htons(Port);
|
||||
serveraddr.sin_addr.s_addr = inet_addr(IP);
|
||||
|
||||
int i = bind(this->Socketbit, (sockaddr*)&serveraddr, sizeof(serveraddr));
|
||||
bool CCSocket::Bind(const char* IP, unsigned short Port){
|
||||
memset(&server, 0, sizeof(server));
|
||||
server.sin_family = AF_INET;
|
||||
server.sin_port = htons(Port);
|
||||
server.sin_addr.s_addr = inet_addr(IP);
|
||||
int i = bind(this->Socketbit, (sockaddr*)&server, sizeof(server));
|
||||
if (i == SOCKET_ERROR)
|
||||
{
|
||||
closesocket(this->Socketbit);
|
||||
WSACleanup();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -127,7 +114,6 @@ bool CCSocket::Listen(unsigned short UserNum)
|
||||
if (iLisRet == SOCKET_ERROR)
|
||||
{
|
||||
closesocket(this->Socketbit);
|
||||
WSACleanup();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@ -156,7 +142,7 @@ bool CCSocket::Send(const char* str)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCSocket::Sendbyte(const char* str, int len)
|
||||
bool CCSocket::SendByte(const char* str, int len)
|
||||
{
|
||||
int ires = send(this->Socketbit, str, len, 0); //<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ȥ
|
||||
if (ires == -1)
|
||||
@ -220,7 +206,6 @@ void CCSocket::Close()
|
||||
{
|
||||
Stop = false;
|
||||
closesocket(this->Socketbit);
|
||||
//WSACleanup();
|
||||
}
|
||||
|
||||
bool CCSocket::GetDateHead(char* data, ByteHander* size)
|
||||
@ -234,7 +219,6 @@ bool CCSocket::GetDateHead(char* data, ByteHander* size)
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool CCSocket::GetStrHead(char* data, ByteHander size)
|
||||
{
|
||||
for (int i = 0; i < HanderSize; i++)
|
||||
@ -260,6 +244,11 @@ bool CCSocket::Send(const void *__buf, size_t __n, int __flags)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCSocket::SendData(const char* str, sockaddr_in addr_in){
|
||||
bool F = sendto(this->Socketbit, str, strlen(str), 0, (sockaddr*)&addr_in, sizeof(addr_in)) != SOCKET_ERROR;
|
||||
return F;
|
||||
}
|
||||
|
||||
bool CCSocket::operator==(CCSocket socket)
|
||||
{
|
||||
if(socket.Socketbit == this->Socketbit)
|
||||
@ -278,7 +267,7 @@ bool CCSocket::operator!=(CCSocket socket)
|
||||
return false;
|
||||
}
|
||||
|
||||
CCHostInfo CCSocket::GetHost()
|
||||
CCHostInfo CCSocket::GetClientHost()
|
||||
{
|
||||
CCHostInfo hostInfo;
|
||||
char IP[INET_ADDRSTRLEN] = {0};
|
||||
@ -288,6 +277,15 @@ CCHostInfo CCSocket::GetHost()
|
||||
return hostInfo;
|
||||
}
|
||||
|
||||
CCHostInfo CCSocket::GetLocalHost(){
|
||||
CCHostInfo hostInfo;
|
||||
char IP[INET_ADDRSTRLEN] = {0};
|
||||
inet_ntop(IPVx, &server.sin_addr, IP, INET_ADDRSTRLEN);
|
||||
hostInfo.IPAddress = IP;
|
||||
hostInfo.Port = ntohs(server.sin_port);
|
||||
return hostInfo;
|
||||
}
|
||||
|
||||
void CCSocket::SetSocketNonBlocking()
|
||||
{
|
||||
u_long mode = 1;
|
||||
@ -297,7 +295,7 @@ void CCSocket::SetSocketNonBlocking()
|
||||
}
|
||||
}
|
||||
|
||||
bool CCSocket::IsDataAvailable()
|
||||
bool CCSocket::isDataAvailable()
|
||||
{
|
||||
fd_set readfds;
|
||||
FD_ZERO(&readfds);
|
||||
@ -312,6 +310,25 @@ bool CCSocket::IsDataAvailable()
|
||||
return FD_ISSET(this->Socketbit, &readfds);
|
||||
}
|
||||
|
||||
bool CCSocket::isConnectionAlive() {
|
||||
fd_set fds;
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(Socketbit, &fds);
|
||||
timeval timeout = { 0, 0 }; // 非阻塞模式立即返回
|
||||
int ret = select(Socketbit + 1, &fds, NULL, &fds, &timeout);
|
||||
if (ret < 0) {
|
||||
// 错误处理
|
||||
return false;
|
||||
} else if (ret > 0) {
|
||||
if (FD_ISSET(Socketbit, &fds)) {
|
||||
if (FD_ISSET(Socketbit, &fds)) {
|
||||
// 检查异常条件
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -339,8 +356,20 @@ CCSocket CCSocket::Socket(IPVX IPV4orIPV6, TORU TCPorUDP, TYPE Type)
|
||||
return sc;
|
||||
}
|
||||
|
||||
std::string CCSocket::GetlocadIP(IPVX ipvx,int Number)
|
||||
bool CCSocket::SetSockOpt(CCOpt opt){
|
||||
if(opt == CCOpt::BROADCAST)
|
||||
{
|
||||
int broadcastPermission = 1;
|
||||
if (setsockopt(this->Socketbit, SOL_SOCKET, SO_BROADCAST, (const char*)&broadcastPermission, sizeof(broadcastPermission)) < 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
std::vector<CCString> CCSocket::GetLocalIP(IPVX ipvx,int Number)
|
||||
{
|
||||
std::vector<CCString> IPList;
|
||||
struct ifaddrs *ifAddrStruct = nullptr;
|
||||
struct ifaddrs *ifa = nullptr;
|
||||
void *tmpAddrPtr = nullptr;
|
||||
@ -354,13 +383,14 @@ std::string CCSocket::GetlocadIP(IPVX ipvx,int Number)
|
||||
tmpAddrPtr = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
|
||||
|
||||
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer[d++], INET_ADDRSTRLEN);
|
||||
IPList.emplace_back(addressBuffer[d-1]);
|
||||
//std::cout << "IPv4 Address: " << addressBuffer << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
if (ifAddrStruct != nullptr)
|
||||
freeifaddrs(ifAddrStruct);
|
||||
return addressBuffer[Number];
|
||||
return IPList;
|
||||
}
|
||||
|
||||
bool CCSocket::Connect(const char* IP, unsigned short Port)
|
||||
@ -387,11 +417,10 @@ bool CCSocket::Bind(const char* IP,int Port)
|
||||
{
|
||||
// 设置地址结构
|
||||
struct sockaddr_in server_addr;
|
||||
memset(&server_addr, '0', sizeof(server_addr));
|
||||
memset(&server_addr, 0, sizeof(server_addr));
|
||||
server_addr.sin_family = IPVx;
|
||||
server_addr.sin_port = htons(8080);
|
||||
server_addr.sin_addr.s_addr = INADDR_ANY;
|
||||
|
||||
server_addr.sin_port = htons(Port);
|
||||
server_addr.sin_addr.s_addr = inet_addr(IP);
|
||||
// 绑定套接字到地址和端口
|
||||
if (bind(this->Socketbit, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
|
||||
std::cerr << "Bind failed" << std::endl;
|
||||
@ -433,7 +462,7 @@ bool CCSocket::Send(const char* str)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCSocket::Sendbyte(const char* str,int len)
|
||||
bool CCSocket::SendByte(const char* str,int len)
|
||||
{
|
||||
int err = send(Socketbit, str, len, 0);
|
||||
if(err == -1)
|
||||
@ -459,6 +488,11 @@ bool CCSocket::UDPSend(const char* str, const char* IP, int Port)
|
||||
}
|
||||
}
|
||||
|
||||
bool CCSocket::SendData(const char* str, sockaddr_in addr_in){
|
||||
bool F = sendto(this->Socketbit, str, strlen(str), 0, (sockaddr*)&addr_in, sizeof(addr_in)) != -1;
|
||||
return F;
|
||||
}
|
||||
|
||||
bool CCSocket::UDPSendByte(const char* str,ByteHander len ,const char* IP, int Port)
|
||||
{
|
||||
sockaddr_in serverAddr;
|
||||
@ -553,7 +587,7 @@ bool CCSocket::operator!=(CCSocket socket)
|
||||
return false;
|
||||
}
|
||||
|
||||
CCHostInfo CCSocket::GetHost()
|
||||
CCHostInfo CCSocket::GetClientHost()
|
||||
{
|
||||
CCHostInfo hostInfo;
|
||||
char IP[INET_ADDRSTRLEN] = {0};
|
||||
@ -562,7 +596,14 @@ CCHostInfo CCSocket::GetHost()
|
||||
hostInfo.Port = ntohs(client.sin_port);
|
||||
return hostInfo;
|
||||
}
|
||||
|
||||
CCHostInfo CCSocket::GetLocalHost(){
|
||||
CCHostInfo hostInfo;
|
||||
char IP[INET_ADDRSTRLEN] = {0};
|
||||
inet_ntop(IPVx, &server.sin_addr, IP, INET_ADDRSTRLEN);
|
||||
hostInfo.IPAddress = IP;
|
||||
hostInfo.Port = ntohs(server.sin_port);
|
||||
return hostInfo;
|
||||
}
|
||||
void CCSocket::SetSocketNonBlocking()
|
||||
{
|
||||
int flags = fcntl(this->Socketbit, F_GETFL, 0);
|
||||
@ -578,7 +619,7 @@ void CCSocket::SetSocketNonBlocking()
|
||||
}
|
||||
}
|
||||
|
||||
bool CCSocket::IsDataAvailable()
|
||||
bool CCSocket::isDataAvailable()
|
||||
{
|
||||
pollfd pfd{};
|
||||
pfd.fd = this->Socketbit;
|
||||
@ -592,7 +633,25 @@ bool CCSocket::IsDataAvailable()
|
||||
}
|
||||
return pfd.revents & POLLIN;
|
||||
}
|
||||
|
||||
bool CCSocket::isConnectionAlive() {
|
||||
fd_set fds;
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(Socketbit, &fds);
|
||||
timeval timeout = { 0, 0 }; // 非阻塞模式立即返回
|
||||
int ret = select(Socketbit + 1, &fds, NULL, &fds, &timeout);
|
||||
if (ret < 0) {
|
||||
// 错误处理
|
||||
return false;
|
||||
} else if (ret > 0) {
|
||||
if (FD_ISSET(Socketbit, &fds)) {
|
||||
if (FD_ISSET(Socketbit, &fds)) {
|
||||
// 检查异常条件
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
|
||||
#endif
|
||||
|
||||
@ -1,100 +1,119 @@
|
||||
#include "../include/CCThreadPool.h"
|
||||
#include "CCThreadPool.h"
|
||||
|
||||
CCThreadPool::CCThreadPool(int numThreads)
|
||||
{
|
||||
CCThreadPool::CCThreadPool(int numThreads){
|
||||
InitStart(numThreads);
|
||||
}
|
||||
|
||||
void CCThreadPool::InitStart(int numThreads)
|
||||
{
|
||||
m_running = true;
|
||||
m_threadCount = numThreads;
|
||||
m_taskQueue.resize(numThreads,nullptr);
|
||||
T = new TaskPool[numThreads];
|
||||
for (int i = 0;i < numThreads;i++)
|
||||
{
|
||||
void CCThreadPool::InitStart(int numThreads){
|
||||
InitStart(numThreads,30,1000 * 1000);
|
||||
}
|
||||
|
||||
T->thread = new std::thread(&CCThreadPool::worker,this,i);
|
||||
T->thread->detach();
|
||||
T->Running = false;
|
||||
m_thread.push_back(&T[i]);
|
||||
void CCThreadPool::InitStart(int corePoolSize, int maximumPoolSize, int keepAliveTime) {
|
||||
m_corePoolSize = corePoolSize;
|
||||
m_keepAliveTime = keepAliveTime;
|
||||
m_maximumPoolSize = maximumPoolSize;
|
||||
for (int i = 0; i < m_corePoolSize; ++i) {
|
||||
TaskPool pool;
|
||||
pool.ID = i;
|
||||
pool.Sign = true;
|
||||
pool.Running = false;
|
||||
m_threads[i] = pool;
|
||||
CCThread(&CCThreadPool::worker,this,i).detach();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CCThreadPool::worker(int ID)
|
||||
{
|
||||
while (m_running)
|
||||
{
|
||||
m_mutex.lock();
|
||||
std::function<void()> FUN = m_taskQueue[ID];
|
||||
m_mutex.unlock();
|
||||
if(FUN)
|
||||
{
|
||||
FUN();
|
||||
m_thread[ID]->Running = false;
|
||||
m_taskQueue[ID] = nullptr;
|
||||
void CCThreadPool::worker(int ID){
|
||||
auto& T = m_threads[ID];
|
||||
T.Online = true;
|
||||
while (T.Sign) {
|
||||
try {
|
||||
m_mutex.lock();
|
||||
if(T.TaskFun && T.Running) {
|
||||
if(Print) {
|
||||
CC::Println("CCThreadPool Start ID: " + CCInt(ID).to_String());
|
||||
}
|
||||
m_mutex.unlock();
|
||||
T.TaskFun();
|
||||
m_mutex.lock();
|
||||
T.Running = false;
|
||||
if(Print) {
|
||||
CC::Println("CCThreadPool End ID: " + CCInt(ID).to_String());
|
||||
}
|
||||
}
|
||||
else {
|
||||
m_mutex.unlock();
|
||||
CCThread::Sleep(m_keepAliveTime);
|
||||
}
|
||||
m_mutex.unlock();
|
||||
}
|
||||
else
|
||||
{
|
||||
Threading::Sleep(m_thread_Time);
|
||||
catch (CCException& exception) {
|
||||
m_mutex.unlock();
|
||||
CC::Println("CCThreadPool Error -> ID: " + CCInt(ID).to_String() + " -> " + exception.what());
|
||||
}
|
||||
}
|
||||
T.Online = false;
|
||||
if(Print) {
|
||||
CC::Println("CCThreadPool Stop ID: " + CCInt(ID).to_String());
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int CCThreadPool::GetThreadCount() const
|
||||
{
|
||||
return m_threadCount;
|
||||
int CCThreadPool::GetThreadCount() const{
|
||||
return m_threads.size() + TemporaryThreads;
|
||||
}
|
||||
|
||||
unsigned int CCThreadPool::GetUnusedCount()
|
||||
{
|
||||
m_mutex.lock();
|
||||
unsigned int count = 0;
|
||||
for(int i = 0;i < m_threadCount;i++)
|
||||
{
|
||||
if(!m_thread[i]->Running)
|
||||
{
|
||||
count++;
|
||||
int CCThreadPool::GetUnusedCount() const{
|
||||
int A = 0;
|
||||
for(auto &[fst, snd] : m_threads) {
|
||||
if(!snd.Running) {
|
||||
A++;
|
||||
}
|
||||
}
|
||||
m_mutex.unlock();
|
||||
return count;
|
||||
return A;
|
||||
}
|
||||
|
||||
void CCThreadPool::SetThreadTimeout(unsigned int us)
|
||||
{
|
||||
m_thread_Time = us;
|
||||
void CCThreadPool::SetThreadTimeout(int us){
|
||||
m_keepAliveTime = us;
|
||||
}
|
||||
|
||||
void CCThreadPool::Stop()
|
||||
{
|
||||
m_running = false;
|
||||
while (GetUnusedCount() != m_threadCount);
|
||||
for(int i = 0;i < m_threadCount;i++)
|
||||
{
|
||||
T[i].thread->join();
|
||||
m_taskQueue[i] = nullptr;
|
||||
delete T[i].thread;
|
||||
}
|
||||
m_thread.clear();
|
||||
}
|
||||
|
||||
std::vector<int> CCThreadPool::GetThreadUnusedID()
|
||||
{
|
||||
m_mutex.lock();
|
||||
std::vector<int> ID;
|
||||
for(int i = 0;i < m_threadCount;i++)
|
||||
{
|
||||
if(!m_thread[i]->Running)
|
||||
{
|
||||
ID.push_back(i);
|
||||
void CCThreadPool::Stop(bool F){
|
||||
for (auto&[fst, snd] : m_threads) {
|
||||
snd.Sign = false;
|
||||
if(F) {
|
||||
while (snd.Online);
|
||||
}
|
||||
CCThread::Sleep(1000);
|
||||
}
|
||||
m_mutex.unlock();
|
||||
return ID;
|
||||
m_threads.clear();
|
||||
}
|
||||
|
||||
CCThreadPool::CCThreadPool(CCThreadPool &other) {
|
||||
m_corePoolSize = other.m_corePoolSize;
|
||||
m_keepAliveTime = other.m_keepAliveTime;
|
||||
m_taskQueue = other.m_taskQueue;
|
||||
m_threads = other.m_threads;
|
||||
}
|
||||
|
||||
int CCThreadPool::GetCorePoolSize() const {
|
||||
return m_corePoolSize;
|
||||
}
|
||||
|
||||
int CCThreadPool::GetPoolMaxSize() const {
|
||||
return m_maximumPoolSize;
|
||||
}
|
||||
|
||||
void CCThreadPool::SetPrint(bool F) {
|
||||
Print = F;
|
||||
}
|
||||
|
||||
int CCThreadPool::GetTaskRunningSize() const {
|
||||
return TaskRunningSize;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -73,8 +73,8 @@ namespace CText{
|
||||
fclose(fp);
|
||||
return true;
|
||||
}
|
||||
inline std::map<std::string,std::string> ReadConfig(const char * filePath){
|
||||
std::map<std::string,std::string> config;
|
||||
inline std::map<CCString,CCString> ReadConfig(const char * filePath){
|
||||
std::map<CCString,CCString> config;
|
||||
FILE *fp;
|
||||
char line[MAX_LINE_LENGTH] = {0};
|
||||
ConfigPair configs;
|
||||
|
||||
941
UI/W1/widget.cpp
Normal file
941
UI/W1/widget.cpp
Normal file
@ -0,0 +1,941 @@
|
||||
#include <iostream>
|
||||
#include "widget.h"
|
||||
#include "./ui_widget.h"
|
||||
|
||||
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){
|
||||
ui->setupUi(this);
|
||||
//------------------------------------------------------------------------------------------------
|
||||
//COPYFile(WebSubPaths,"");
|
||||
Configuration::ReadConfigInit();
|
||||
InitUi();
|
||||
setAttribute(Qt::WA_TranslucentBackground); //设置窗口背景透明
|
||||
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint); //去掉窗口边框
|
||||
setAreaMovable(ui->widget_3->rect());
|
||||
this->setWindowIcon(QIcon(":logo.png"));
|
||||
CCString logopath = Configuration::ExePath + "logo.png";
|
||||
QIcon trayIconIcon(logopath.c_str()); // 使用你的图标路径
|
||||
trayIcon->setIcon(trayIconIcon);
|
||||
connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit);
|
||||
connect(showAction, &QAction::triggered, this, &Widget::show);
|
||||
trayIconMenu->addAction(showAction);
|
||||
trayIconMenu->addAction(quitAction);
|
||||
trayIcon->setContextMenu(trayIconMenu);
|
||||
trayIcon->show();
|
||||
SetPage(0);
|
||||
Btns.emplace_back(ui->HomeBtn);
|
||||
Btns.emplace_back(ui->SettingsBtn);
|
||||
Initlogo();
|
||||
//------------------------------------------------------------------------------------------------
|
||||
connect(ui->HomeBtn, &QPushButton::clicked, this, &Widget::on_pushButton_clicked);
|
||||
connect(ui->SelectSub_IPBtn, &QPushButton::clicked, this, &Widget::ReadSub_IP);
|
||||
connect(ui->SettingsBtn, &QPushButton::clicked, this, &Widget::on_pushButton_clicked2);
|
||||
connect(ui->CloseBtn, &QPushButton::clicked, this, [this](){this->close();});
|
||||
connect(ui->MinBtn, &QPushButton::clicked, this, [this](){this->showMinimized();});
|
||||
connect(ui->OpenServerBtn, &QPushButton::clicked, this, &Widget::OpenServerClick);
|
||||
connect(ui->RestBtn, &QPushButton::clicked, this, &Widget::ServerConfigInit);
|
||||
connect(ui->SetSaveBtn, &QPushButton::clicked, this, &Widget::SetSaveBtn);
|
||||
connect(ui->ReadCSInfoBtn, &QPushButton::clicked, this, &Widget::ReadCSInfoFun);
|
||||
connect(ui->Web_Port, &QLineEdit::textChanged,this, &Widget::onTextChanged);
|
||||
connect(ui->OpenPCStart, &QCheckBox::stateChanged,this, &Widget::slotCheckedChanged);
|
||||
connect(ui->RapidDeployment, &QPushButton::clicked, this, &Widget::Deploy);
|
||||
if(Configuration::CORSEn == "true"){
|
||||
ui->CORSEn->setChecked(true);
|
||||
}
|
||||
ui->Sub_Origins->setEnabled(ui->CORSEn->isChecked());
|
||||
connect(ui->CORSEn, &QCheckBox::stateChanged,this, [this]()
|
||||
{
|
||||
ui->Sub_Origins->setEnabled(ui->CORSEn->isChecked());
|
||||
SetState(ServerFlag);
|
||||
});
|
||||
connect(ui->GJSZBtn, &QPushButton::clicked,this, [this]()
|
||||
{
|
||||
auto* window = new widgetYZ(this);
|
||||
int w = this->width() / 2 - (window->width() / 2);
|
||||
int h = this->height() / 2 - (window->height() / 2);
|
||||
window->move(w,h);
|
||||
window->show();
|
||||
});
|
||||
ui->HomeBtn->setFocusPolicy(Qt::NoFocus);
|
||||
ui->SettingsBtn->setFocusPolicy(Qt::NoFocus);
|
||||
ui->CloseBtn->setFocusPolicy(Qt::NoFocus);
|
||||
ui->MinBtn->setFocusPolicy(Qt::NoFocus);
|
||||
ui->OpenServerBtn->setFocusPolicy(Qt::NoFocus);
|
||||
//------------------------------------------------------------------------------------------------
|
||||
ui->ServerConsele->append("Path:" + QApplication::applicationDirPath());
|
||||
SetBtn(0);
|
||||
Configuration::IPBS_NSSMF(false);
|
||||
Configuration::CloseSub_Server();
|
||||
Configuration::CloseSub_Web();
|
||||
Configuration::IPBS_NSSMF(true);
|
||||
CCThread([this](){
|
||||
CCString State = Configuration::State;
|
||||
CCString CORSEn = Configuration::CORSEn;
|
||||
int Op = Configuration::OpenSleep;
|
||||
if(Op > 0){
|
||||
OpenSleepValue = Op;
|
||||
}
|
||||
if(State == "Open"){
|
||||
while (OpenSleepValue > 0){
|
||||
Threading::Sleep(1000 * 1000);
|
||||
QMetaObject::invokeMethod(this, [this]() {
|
||||
ui->ServerConsele->append(CCString(std::to_string(OpenSleepValue) + "秒后自动启动服务").c_str());
|
||||
});
|
||||
OpenSleepValue--;
|
||||
if(ServerFlag){
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!ServerFlag){
|
||||
OpenServerClick();
|
||||
OpenFlagBtn(true);
|
||||
}
|
||||
}
|
||||
if(CORSEn == "true"){
|
||||
ui->CORSEn->setChecked(true);
|
||||
}
|
||||
else{
|
||||
ui->CORSEn->setChecked(false);
|
||||
}
|
||||
while (ServerThread.Sign()){
|
||||
if(ServerFlag){
|
||||
char bus[1024] = {0};
|
||||
sprintf(bus,"%d天%d小时%d分%d秒",t,h,f,s);
|
||||
s++;
|
||||
if(s >= 60){
|
||||
f++;
|
||||
s = 0;
|
||||
if(f >= 60){
|
||||
f = 0;
|
||||
if(h >= 24){
|
||||
t++;
|
||||
h = 0;
|
||||
}
|
||||
h++;
|
||||
}
|
||||
}
|
||||
QMetaObject::invokeMethod(this,[this,bus]()
|
||||
{
|
||||
QString str = bus;
|
||||
ui->RunTime->setText(str);
|
||||
});
|
||||
}
|
||||
QMetaObject::invokeMethod(this, [this](){
|
||||
// 获取当前的日期和时间
|
||||
QDateTime currentDateTime = QDateTime::currentDateTime();
|
||||
// 将日期时间对象转换为字符串格式
|
||||
QString currentTime = currentDateTime.toString("yyyy-MM-dd-hh:mm:ss");
|
||||
ui->NowTime->setText(currentTime);
|
||||
|
||||
});
|
||||
CCThread::Sleep(1000 * 1000);
|
||||
}
|
||||
}).detach();
|
||||
if(Configuration::FirstRun == 1){
|
||||
CCThread([this]()
|
||||
{
|
||||
PrintMessage("检测到首次运行,正在部署IP-Web分控服务,请耐心等待...");
|
||||
CCThread::Sleep(1000 * 1000 * 5);
|
||||
Deploy();
|
||||
// try{
|
||||
// QMetaObject::invokeMethod(this, [this]()
|
||||
// {
|
||||
// QMessageBox::StandardButton reply = QMessageBox::question(nullptr, "提示",
|
||||
// "是否现在开始快速部署IP-Web分控?",QMessageBox::Yes | QMessageBox::No);
|
||||
// if (reply == QMessageBox::Yes) {
|
||||
// Deploy();
|
||||
// } else {
|
||||
//
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// catch (...){}
|
||||
}).detach();
|
||||
}
|
||||
ui->OpenPCStart->setCheckState(checkAutoStartEntry("IPBS_Station(Web)") ? Qt::Checked:Qt::Unchecked);
|
||||
ServerThread.SetThread(&Widget::ServerListening,this);
|
||||
ServerThread.Start();
|
||||
OpenSerice(true);
|
||||
//------------------------------------------------------------------------------------------------
|
||||
}
|
||||
|
||||
Widget::~Widget(){
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void Widget::on_pushButton_clicked() {
|
||||
SetBtn(0);
|
||||
SetPage(0);
|
||||
}
|
||||
|
||||
void Widget::on_pushButton_clicked2() {
|
||||
SetBtn(1);
|
||||
SetPage(1);
|
||||
}
|
||||
|
||||
void Widget::WebThreadRun() {
|
||||
Configuration::OpenSub_Server();
|
||||
while (Configuration::SubRun.IsRunning()){
|
||||
CCString Line = Configuration::SubRun.ReadLineBuffer();
|
||||
if(!Line.empty()){
|
||||
PrintMessage(Line);
|
||||
}
|
||||
Threading::Sleep(1000 * 50);
|
||||
}
|
||||
// PrintMessage("Sub Close!");
|
||||
}
|
||||
|
||||
void Widget::closeEvent(QCloseEvent *event) {
|
||||
QMessageBox msgBox;
|
||||
msgBox.setWindowTitle(tr("退出程序"));
|
||||
msgBox.setText(tr("你确定要退出吗?"));
|
||||
QPushButton *yesButton = msgBox.addButton(tr("结束程序"), QMessageBox::YesRole);
|
||||
msgBox.addButton(tr("到托盘"), QMessageBox::NoRole);
|
||||
msgBox.exec();
|
||||
if (msgBox.clickedButton() == yesButton)
|
||||
{
|
||||
Configuration::IPBS_NSSMF(false);
|
||||
Configuration::CloseSub_Server();
|
||||
Configuration::CloseSub_Web();
|
||||
Configuration::State = "Close";
|
||||
SetServerConfig();
|
||||
ServerThread.Stop();
|
||||
WebThread.Stop();
|
||||
event->accept();
|
||||
QCoreApplication::quit();
|
||||
}
|
||||
else
|
||||
{
|
||||
this->hide();
|
||||
event->ignore(); // 阻止窗口关闭
|
||||
}
|
||||
}
|
||||
|
||||
bool Widget::WebRunFun() {
|
||||
if(!ServerFlag){
|
||||
if(!WebThread.Sign()){
|
||||
ServerFlag = true;
|
||||
SetState(ServerFlag);
|
||||
CCThread(WebThreadRun,this).detach();
|
||||
CCThread([this]()
|
||||
{
|
||||
Configuration::OpenSub_Web();
|
||||
while (Configuration::WebRun.IsRunning()){
|
||||
CCString Line = Configuration::WebRun.ReadLineBuffer();
|
||||
if(!Line.empty()){
|
||||
PrintMessage(Line);
|
||||
}
|
||||
else{
|
||||
break;
|
||||
}
|
||||
CCThread::Sleep(1000 * 1000);
|
||||
}
|
||||
PrintMessage("网址: " + Configuration::Web_URL);
|
||||
}).detach();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void Widget::SetPage(int i) {
|
||||
// ui->ServerConsele->append(ServerSttingsPath.c_str());
|
||||
ui->stackedWidget->setCurrentIndex(i);
|
||||
if(i == 1){
|
||||
InitUi();
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::SetBtn(int i) {
|
||||
for (auto & Btn : Btns) {
|
||||
Btn->setStyleSheet("QPushButton{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(255, 255, 255, 0);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"QPushButton:hover{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(74,89,146, 255);\n"
|
||||
"}");
|
||||
}
|
||||
Btns[i]->setStyleSheet("QPushButton{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(74,89,146, 255);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"QPushButton:hover{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(74,89,146, 255);\n"
|
||||
"}");
|
||||
}
|
||||
|
||||
void Widget::OpenServerClick() {
|
||||
auto A = CText::ReadConfig(Configuration::CfgPath.c_str());
|
||||
if(A.size() >= 8){
|
||||
try {
|
||||
ServerReRun();
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "Error: " << e.what() << std::endl;
|
||||
}
|
||||
}
|
||||
else{
|
||||
QMessageBox::information(this,"提示","启动参数错误,请先配置服务器参数!");
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::OpenFlagBtn(bool F) {
|
||||
if(!F){
|
||||
ui->OpenServerBtn->setStyleSheet("QPushButton{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(255,68,138,255);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"QPushButton:hover{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(255,100,150, 255);\n"
|
||||
"}");
|
||||
ui->OpenServerBtn->setText("打开服务");
|
||||
}
|
||||
else{
|
||||
ui->OpenServerBtn->setStyleSheet("QPushButton{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(255,0,0,255);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"QPushButton:hover{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(255,100,150, 255);\n"
|
||||
"}");
|
||||
ui->OpenServerBtn->setText("关闭服务");
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::ServerListening() {
|
||||
bool F = false,S = false;
|
||||
while (ServerThread.Sign()){
|
||||
Threading::Sleep(1000 * 1000 * 5);
|
||||
try {
|
||||
F = Configuration::GetSub_Status();
|
||||
S = Configuration::GetSub_Web_Status();
|
||||
QMetaObject::invokeMethod(this,[this,F,S]()
|
||||
{
|
||||
SetSuBState(F);
|
||||
SetWebState(S);
|
||||
});
|
||||
if(!F && ServerFlag){
|
||||
QMetaObject::invokeMethod(this, [this,&F](){
|
||||
if(!F){
|
||||
Configuration::OpenSub_Server();
|
||||
PrintMessage("Sub Res Start OK!");
|
||||
}
|
||||
Threading::Sleep(1000 * 1000 * 5);
|
||||
});
|
||||
}
|
||||
if(!S && ServerFlag){
|
||||
try{
|
||||
if(!S){
|
||||
Configuration::OpenSub_Web();
|
||||
PrintMessage("Web Res Start OK!");
|
||||
PrintMessage("网址: " + Configuration::Web_URL);
|
||||
}
|
||||
Threading::Sleep(1000 * 1000 * 5);
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "Error: " << e.what() << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "Error: " << e.what() << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool Widget::isJarRunning(const char *jarName) {
|
||||
#ifdef _WIN32
|
||||
CCString str = jarName;
|
||||
str.append(".exe");
|
||||
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||
if (hSnapshot == INVALID_HANDLE_VALUE) {
|
||||
return false;
|
||||
}
|
||||
PROCESSENTRY32 pe32;
|
||||
pe32.dwSize = sizeof(PROCESSENTRY32);
|
||||
if (Process32First(hSnapshot, &pe32)) {
|
||||
do {
|
||||
if (_tcsstr(pe32.szExeFile, str.c_str()) != nullptr) {
|
||||
CloseHandle(hSnapshot);
|
||||
return true;
|
||||
}
|
||||
} while (Process32Next(hSnapshot, &pe32));
|
||||
}
|
||||
|
||||
CloseHandle(hSnapshot);
|
||||
return false;
|
||||
#elif __linux__
|
||||
#endif
|
||||
}
|
||||
|
||||
bool Widget::terminateProcessByName(const char *processName) {
|
||||
#ifdef _WIN32
|
||||
CCString str = processName;
|
||||
str.append(".exe");
|
||||
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||
if (hSnapshot == INVALID_HANDLE_VALUE) {
|
||||
return false;
|
||||
}
|
||||
PROCESSENTRY32 pe32;
|
||||
pe32.dwSize = sizeof(PROCESSENTRY32);
|
||||
if (Process32First(hSnapshot, &pe32)) {
|
||||
do {
|
||||
if (_tcscmp(pe32.szExeFile, str.c_str()) == 0) {
|
||||
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID);
|
||||
if (hProcess != NULL) {
|
||||
TerminateProcess(hProcess, 0);
|
||||
CloseHandle(hProcess);
|
||||
}
|
||||
}
|
||||
} while (Process32Next(hSnapshot, &pe32));
|
||||
}
|
||||
CloseHandle(hSnapshot);
|
||||
return true;
|
||||
#elif __linux__
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void Widget::ServerReRun() {
|
||||
if(ServerFlag){
|
||||
try {
|
||||
Configuration::CloseSub_Server();
|
||||
Configuration::CloseSub_Web();
|
||||
if(ServerFlag){
|
||||
WebThread.Stop();
|
||||
PrintMessage("Server Close");
|
||||
OpenFlagBtn(false);
|
||||
ServerFlag = false;
|
||||
SetState(ServerFlag);
|
||||
ui->RunTime->setVisible(false);
|
||||
t = 0;h = 0;f = 0;s = 0;
|
||||
}
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "Error: " << e.what() << std::endl;
|
||||
}
|
||||
}
|
||||
else{
|
||||
WebRunFun();
|
||||
OpenFlagBtn(true);
|
||||
t = 0;h = 0;f = 0;s = 0;
|
||||
ui->RunTime->setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::onCurrentIndexChanged(int index) {
|
||||
ui->Web_IP->setText(ui->Sub_IP->text());
|
||||
CCString URL = ui->Sub_IP->text().toStdString()+":"+ui->Web_Port->text().toStdString();
|
||||
Configuration::Web_URL = "http://" + URL + '/';
|
||||
QString str = CCString("['http://" + ui->Sub_IP->text().toStdString() + ":" + Configuration::Web_Port + "']").c_str();
|
||||
ui->Sub_Origins->setText(str);
|
||||
}
|
||||
|
||||
void Widget::onCurrentIndexChangedCSIP(int index)
|
||||
{
|
||||
try
|
||||
{
|
||||
if(CSPortList.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
CCVar str = CCInt(CSPortList[index]).to_String().c_str();
|
||||
ui->CS_Port->setText(str);
|
||||
}
|
||||
catch (CCException& exception){}
|
||||
}
|
||||
|
||||
void Widget::SetSuBState(bool F) {
|
||||
if(F){
|
||||
ui->SubLabel->setStyleSheet("color: rgb(0, 255, 0);");
|
||||
ui->SubLabel->setText("后端:在线");
|
||||
}
|
||||
else{
|
||||
ui->SubLabel->setStyleSheet("color: rgb(255, 0, 0);");
|
||||
ui->SubLabel->setText("后端:离线");
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::SetWebState(bool F) {
|
||||
if(F){
|
||||
ui->WebLabel->setStyleSheet("color: rgb(0, 255, 0);");
|
||||
ui->WebLabel->setText("前端:在线");
|
||||
}
|
||||
else{
|
||||
ui->WebLabel->setStyleSheet("color: rgb(255, 0, 0);");
|
||||
ui->WebLabel->setText("前端:离线");
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::onTextChanged(const QString &text) {
|
||||
ui->Web_IP->setText(ui->Sub_IP->text());
|
||||
CCString URL = ui->Sub_IP->text().toStdString()+":"+ui->Web_Port->text().toStdString();
|
||||
Configuration::Web_URL = "http://" + URL + '/';
|
||||
QString str = CCString("['http://" + ui->Web_IP->text().toStdString() + ":" + text.toStdString() + "']").c_str();
|
||||
ui->Sub_Origins->setText(str);
|
||||
}
|
||||
|
||||
void Widget::SetSaveBtn() {
|
||||
if(ui->CS_IP->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "C/S_IP不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->CS_Port->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "C/S_Port不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Sub_IP->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Sub_IP不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Sub_Port->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Sub_Port不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Web_Port->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Web_Port不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Web_IP->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Web_IP不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Sub_Audio_Port->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Sub_Audio_Port不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Sub_Origins->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Sub_Origins不能为空");
|
||||
return;
|
||||
}
|
||||
SetServerConfig();
|
||||
QMessageBox::StandardButton reply = QMessageBox::question(this, "提示", "保存成功是否现在启动?",
|
||||
QMessageBox::Yes | QMessageBox::No);
|
||||
if (reply == QMessageBox::Yes) {
|
||||
// 用户点击了“是”按钮
|
||||
try {
|
||||
Configuration::CloseSub_Server();
|
||||
Configuration::CloseSub_Web();
|
||||
if(ServerFlag){
|
||||
WebThread.Stop();
|
||||
ui->ServerConsele->append("Server Close");
|
||||
OpenFlagBtn(false);
|
||||
ServerFlag = false;
|
||||
SetState(ServerFlag);
|
||||
ui->RunTime->setVisible(false);
|
||||
t = 0;h = 0;f = 0;s = 0;
|
||||
}
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "Error: " << e.what() << std::endl;
|
||||
}
|
||||
OpenServerClick();
|
||||
} else {
|
||||
// 用户点击了“否”按钮
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::ServerConfigInit() {
|
||||
Configuration::CfgInit();
|
||||
SetPage(1);
|
||||
QMessageBox::information(this, "提示", "初始化已完成!");
|
||||
}
|
||||
|
||||
void Widget::Initlogo() {
|
||||
CCString str = Configuration::ExePath + Sub_Logo;
|
||||
QPixmap pixmap(str.c_str()); // 替换为你的图片路径
|
||||
ui->logoIMG->setPixmap(pixmap);
|
||||
ui->logoIMG->setScaledContents(true); // 图片自动缩放以适应 QLabel 大小
|
||||
ui->logoIMG->setMaximumSize(111,61); // 设置 QLabel 最小尺寸
|
||||
ui->logoIMG->setMaximumSize(320,180); // 设置 QLabel 最小尺寸
|
||||
ImGLoad = ui->logoIMG;
|
||||
}
|
||||
|
||||
void Widget::SetServerConfig() {
|
||||
// FILE *fp = fopen(Configuration::CfgPath.c_str(), "w");
|
||||
// if (fp == nullptr) {
|
||||
// QMessageBox::information(this, "Error", "Failed to open ServerSttings file");
|
||||
// return;
|
||||
// }
|
||||
// // 写入配置数据
|
||||
// fprintf(fp, "C/S_IP:%s\n",ui->CS_IP->text().toStdString().c_str());
|
||||
// fprintf(fp, "C/S_PORT:%s\n",ui->CS_Port->text().toStdString().c_str());
|
||||
// fprintf(fp, "Sub_Control_IP:%s\n",ui->Sub_IP->text().toStdString().c_str());
|
||||
// fprintf(fp, "Sub_Control_PORT:%s\n",ui->Sub_Port->text().toStdString().c_str());
|
||||
// fprintf(fp, "Sub_Control_Audio_PORT:%s\n",ui->Sub_Audio_Port->text().toStdString().c_str());
|
||||
// fprintf(fp, "Sub_Web_PORT:%s\n",ui->Web_Port->text().toStdString().c_str());
|
||||
// fprintf(fp, "Origins:%s\n",ui->Sub_Origins->text().toStdString().c_str());
|
||||
// fprintf(fp, "#中文简体,English\n");
|
||||
// fprintf(fp, "Language:%s\n",ui->LabguageBox->currentText().toStdString().c_str());
|
||||
// fprintf(fp, "OpenSleep:%d\n",ui->OpenSleep->value());
|
||||
// fprintf(fp, "State:%s\n",Configuration::State.c_str());
|
||||
// fprintf(fp, "CORSEn:%s\n",Configuration::CORSEn.c_str());
|
||||
// fprintf(fp, "FirstRun:%d\n",0);
|
||||
// fclose(fp);
|
||||
// fp = fopen(Configuration::WebCfgPath.c_str(), "w");
|
||||
// if (fp == nullptr) {
|
||||
// QMessageBox::information(this, "Error", "Failed to open NginxSttings file");
|
||||
// return;
|
||||
// }
|
||||
// // 写入配置数据
|
||||
// fprintf(fp, "worker_processes 1;\n"
|
||||
// "events {\n"
|
||||
// " worker_connections 1024;\n"
|
||||
// "}\n"
|
||||
// "http {\n"
|
||||
// " include mime.types;\n"
|
||||
// " default_type application/octet-stream;\n"
|
||||
// " sendfile on;\n"
|
||||
// " keepalive_timeout 65;\n"
|
||||
// " client_max_body_size 500m;\n"
|
||||
// " server {\n"
|
||||
// " listen %s;\n"
|
||||
// " server_name %s;\n"
|
||||
// " location / {\n"
|
||||
// " root html;\n"
|
||||
// " index index.html index.htm;\n"
|
||||
// " try_files $uri $uri/ /index.html;\n"
|
||||
// " # try_files $uri $uri/ @router;\n"
|
||||
// " }\n"
|
||||
// " location /api/ {\n"
|
||||
// " #rewrite ^.+api/?(.*)$ /$1 break; \n"
|
||||
// " rewrite ^/api/(.*)$ /$1 break; \n"
|
||||
// " proxy_pass http://%s:%s/;\n"
|
||||
// " proxy_redirect off;\n"
|
||||
// " proxy_set_header Host $host;\n"
|
||||
// " proxy_set_header X-Real-IP $remote_addr;\n"
|
||||
// " proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n"
|
||||
// " }\n"
|
||||
// " error_page 500 502 503 504 /50x.html;\n"
|
||||
// " location = /50x.html {\n"
|
||||
// " root html;\n"
|
||||
// " }\n"
|
||||
// " }\n"
|
||||
// "}",ui->Web_Port->text().toStdString().c_str(),ui->Web_IP->text().toStdString().c_str(),
|
||||
// ui->Sub_IP->text().toStdString().c_str(),ui->Sub_Port->text().toStdString().c_str());
|
||||
// fclose(fp);
|
||||
Configuration::CS_IP = ui->CS_IP->text().toStdString();
|
||||
Configuration::CS_Port = ui->CS_Port->text().toStdString();
|
||||
Configuration::Sub_IP = ui->Sub_IP->text().toStdString();
|
||||
Configuration::Sub_Port = ui->Sub_Port->text().toStdString();
|
||||
Configuration::Sub_Audio_Port = ui->Sub_Audio_Port->text().toStdString();
|
||||
Configuration::Web_IP = ui->Web_IP->text().toStdString();
|
||||
Configuration::Web_Port = ui->Web_Port->text().toStdString();
|
||||
Configuration::Sub_Org = ui->Sub_Origins->text().toStdString();
|
||||
Configuration::Language = ui->LabguageBox->currentText().toStdString();
|
||||
Configuration::OpenSleep = ui->OpenSleep->value();
|
||||
Configuration::SaveJarCfg();
|
||||
Configuration::SaveWebCfg();
|
||||
Configuration::ReadConfigInit();
|
||||
}
|
||||
|
||||
void Widget::SetState(bool F) {
|
||||
Configuration::State = F ? "Open" : "Close";
|
||||
Configuration::CORSEn = ui->CORSEn->isChecked() ? "true" : "false";
|
||||
SetServerConfig();
|
||||
}
|
||||
|
||||
void Widget::SetAutoStart(const QString &path, bool enable) {
|
||||
QSettings startupSettings("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows", QSettings::NativeFormat);
|
||||
if (enable) {
|
||||
startupSettings.setValue("IPBS_Station(Web)", path);
|
||||
} else {
|
||||
startupSettings.remove("IPBS_Station(Web)");
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::OpenSerice(bool F) {
|
||||
#ifdef _WIN32
|
||||
|
||||
#elif __linux__
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void Widget::slotCheckedChanged(int i) {
|
||||
CCString str = "IPBS_Start";
|
||||
if(ui->OpenPCStart->isChecked()){
|
||||
SetAutoStart(str.c_str(),true);
|
||||
} else{
|
||||
SetAutoStart(str.c_str(),false);
|
||||
}
|
||||
str = Configuration::ExePath + QApplication::applicationName().toStdString() + ".exe.lnk";
|
||||
if(ui->OpenPCStart->isChecked()){
|
||||
CreateShortO();
|
||||
CCString A = OpenKit + QApplication::applicationName().toStdString() + ".exe.lnk";
|
||||
CCFile file = CCFile(str.c_str(), CC::ios::w,false);
|
||||
file.Copy(A);
|
||||
file.Deleted();
|
||||
}
|
||||
else{
|
||||
str = OpenKit + QApplication::applicationName().toStdString() + ".exe.lnk";
|
||||
CCFile file = CCFile(str.c_str(), CC::ios::w,false);
|
||||
file.Deleted();
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::ReadCSInfoFun(){
|
||||
CCVar* cs4 = new CSInfoW4(this);
|
||||
int w = this->width() / 2 - (cs4->width() / 2);
|
||||
int h = this->height() / 2 - (cs4->height() / 2);
|
||||
cs4->move(w,h);
|
||||
cs4->IPEdit1 = ui->CS_IP;
|
||||
cs4->IPEdit2 = ui->CS_Port;
|
||||
cs4->exec();
|
||||
}
|
||||
|
||||
void Widget::PrintMessage(CCString str)
|
||||
{
|
||||
QMetaObject::invokeMethod(this,[this,str]()
|
||||
{
|
||||
CCTimeData time;
|
||||
CCString S = "[" + time.to_String() + "] -> " + str;
|
||||
ui->ServerConsele->append(S.c_str());
|
||||
});
|
||||
}
|
||||
|
||||
void Widget::ReadSub_IP(){
|
||||
CCVar* sub = new Sub_IPUI(this);
|
||||
int w = this->width() / 2 - (sub->width() / 2);
|
||||
int h = this->height() / 2 - (sub->height() / 2);
|
||||
sub->move(w,h);
|
||||
sub->IPEdit = ui->Sub_IP;
|
||||
sub->show();
|
||||
}
|
||||
|
||||
void Widget::Deploy(){
|
||||
boolean F1 = false,F2 = false;
|
||||
PrintMessage("正在配置IP-Web分控IP地址...");
|
||||
while (true){
|
||||
CCThread::Sleep(1000 * 500);
|
||||
Configuration::ReadSub_IP();
|
||||
if(!Configuration::SubIPList.empty()){
|
||||
if(Configuration::SubIPList.size() > 1){
|
||||
PrintMessage("检测到多个IP地址,请选择要使用的IP地址!");
|
||||
CCVar* sub = new Sub_IPUI(this);
|
||||
int w = this->width() / 2 - (sub->width() / 2);
|
||||
int h = this->height() / 2 - (sub->height() / 2);
|
||||
sub->move(w,h);
|
||||
sub->IPEdit = ui->Sub_IP;
|
||||
sub->exec();
|
||||
PrintMessage("Web分控IP地址配置完成!");
|
||||
}
|
||||
else{
|
||||
Configuration::Sub_IP = Configuration::SubIPList[0];
|
||||
PrintMessage("Web分控IP地址配置完成!");
|
||||
}
|
||||
F2 = true;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
bool A1 = false;
|
||||
QMetaObject::invokeMethod(this,[this,&F2,&A1]()
|
||||
{
|
||||
QMessageBox::StandardButton reply = QMessageBox::question(nullptr, "提示",
|
||||
"未检测到合法IPV4地址,请检查网络,是否继续检测?",
|
||||
QMessageBox::Yes | QMessageBox::No);
|
||||
if (reply == QMessageBox::Yes) {
|
||||
A1 = true;
|
||||
} else {
|
||||
Configuration::Sub_IP = "";
|
||||
F2 = false;
|
||||
PrintMessage("Web分控IP地址配置跳过!");
|
||||
}
|
||||
});
|
||||
if(A1){
|
||||
continue;
|
||||
}
|
||||
else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
PrintMessage("正在配置C/S服务器参数...");
|
||||
while (true){
|
||||
PrintMessage("尝试搜索C/S服务器中...");
|
||||
CCThread::Sleep(1000 * 500);
|
||||
Configuration::ReadCSInfo();
|
||||
if(!Configuration::CSIPList.empty()){
|
||||
if(Configuration::CSIPList.size() > 1){
|
||||
PrintMessage("在局域网检测到多个C/S服务器,请选择需要使用的C/S服务器!");
|
||||
CCVar* cs4 = new CSInfoW4(this);
|
||||
int w = this->width() / 2 - (cs4->width() / 2);
|
||||
int h = this->height() / 2 - (cs4->height() / 2);
|
||||
cs4->move(w,h);
|
||||
cs4->IPEdit1 = ui->CS_IP;
|
||||
cs4->IPEdit2 = ui->CS_Port;
|
||||
cs4->exec();
|
||||
PrintMessage("C/S服务器信息配置完成");
|
||||
}
|
||||
else{
|
||||
Configuration::CS_IP = Configuration::CSIPList[0];
|
||||
Configuration::CS_Port = Configuration::CSPortList[0].to_String();
|
||||
PrintMessage("C/S服务器信息配置完成");
|
||||
}
|
||||
F1 = true;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
bool A1 = false;
|
||||
Configuration::CS_IP = "";
|
||||
Configuration::CS_Port = "";
|
||||
QMetaObject::invokeMethod(this,[this,&F1,&A1]()
|
||||
{
|
||||
QMessageBox::StandardButton reply = QMessageBox::question(nullptr, "提示",
|
||||
"在局域网未检测到可用的C/S服务器,请先启动C/S服务器,是否继续检测?",
|
||||
QMessageBox::Yes | QMessageBox::No);
|
||||
if (reply == QMessageBox::Yes) {
|
||||
A1 = true;
|
||||
}
|
||||
else {
|
||||
Configuration::CS_IP = "";
|
||||
Configuration::CS_Port = "";
|
||||
F1 = false;
|
||||
PrintMessage("C/S服务器信息配置跳过!");
|
||||
A1 = false;
|
||||
}
|
||||
});
|
||||
if(A1){
|
||||
continue;
|
||||
}
|
||||
else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
PrintMessage("正在分配IP-Web分控服务端口...");
|
||||
CCVar Ports = Configuration::getAvailablePorts(3,5417);
|
||||
Configuration::Sub_Port = Ports[0].to_String();
|
||||
Configuration::Sub_Audio_Port = Ports[1].to_String();
|
||||
Configuration::Web_Port = Ports[2].to_String();
|
||||
Configuration::Web_IP = Configuration::Sub_IP;
|
||||
PrintMessage("IP-Web分控服务端口分配完成!");
|
||||
PrintMessage("IP-Web分控服务正在设置跨域...");
|
||||
Configuration::Sub_Org = "['http://" + Configuration::Web_IP + ":" + Configuration::Web_Port + "']";
|
||||
PrintMessage("IP-Web分控服务跨域设置完成!");
|
||||
ui->CS_IP->setText(Configuration::CS_IP.c_str());
|
||||
ui->CS_Port->setText(Configuration::CS_Port.c_str());
|
||||
ui->Sub_IP->setText(Configuration::Sub_IP.c_str());
|
||||
ui->Sub_Port->setText(Configuration::Sub_Port.c_str());
|
||||
ui->Sub_Audio_Port->setText(Configuration::Sub_Audio_Port.c_str());
|
||||
ui->Sub_Origins->setText(Configuration::Sub_Org.c_str());
|
||||
if(Configuration::Language == "English"){
|
||||
ui->LabguageBox->setCurrentIndex(1);
|
||||
}
|
||||
else{
|
||||
ui->LabguageBox->setCurrentIndex(0);
|
||||
}
|
||||
ui->Web_Port->setText(Configuration::Web_Port.c_str());
|
||||
ui->Web_IP->setText(ui->Sub_IP->text());
|
||||
ui->OpenSleep->setValue(Configuration::OpenSleep);
|
||||
PrintMessage("IP-Web分控服务部署设置已完成!");
|
||||
PrintMessage("正在保存IP-Web分控服务设置...");
|
||||
SetServerConfig();
|
||||
PrintMessage("IP-Web分控服务设置保存完成");
|
||||
if(F1 && F2){
|
||||
try {
|
||||
terminateProcessByName("java");
|
||||
terminateProcessByName("nginx");
|
||||
if(ServerFlag){
|
||||
WebThread.Stop();
|
||||
ui->ServerConsele->append("Server Close");
|
||||
OpenFlagBtn(false);
|
||||
ServerFlag = false;
|
||||
SetState(ServerFlag);
|
||||
ui->RunTime->setVisible(false);
|
||||
t = 0;h = 0;f = 0;s = 0;
|
||||
}
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "Error: " << e.what() << std::endl;
|
||||
}
|
||||
if(ui->CS_IP->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "C/S_IP不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->CS_Port->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "C/S_Port不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Sub_IP->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Sub_IP不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Sub_Port->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Sub_Port不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Web_Port->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Web_Port不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Web_IP->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Web_IP不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Sub_Audio_Port->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Sub_Audio_Port不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Sub_Origins->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Sub_Origins不能为空");
|
||||
return;
|
||||
}
|
||||
PrintMessage("正在启动IP-Web分控服务...");
|
||||
OpenServerClick();
|
||||
}
|
||||
else{
|
||||
QMetaObject::invokeMethod(this,[this,F1,F2]()
|
||||
{
|
||||
if(!F1){
|
||||
PrintMessage("在局域网未检测到C/S服务器,请检查C/S服务器!");
|
||||
}
|
||||
if(!F2){
|
||||
PrintMessage("未检测到合法IPV4地址,请检查网络!");
|
||||
}
|
||||
PrintMessage("部署未完成!");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::InitUi(){
|
||||
ui->CS_IP->setText(Configuration::CS_IP.c_str());
|
||||
ui->CS_Port->setText(Configuration::CS_Port.c_str());
|
||||
ui->Sub_IP->setText(Configuration::Sub_IP.c_str());
|
||||
ui->Sub_Port->setText(Configuration::Sub_Port.c_str());
|
||||
ui->Sub_Audio_Port->setText(Configuration::Sub_Audio_Port.c_str());
|
||||
ui->Sub_Origins->setText(Configuration::Sub_Org.c_str());
|
||||
if(Configuration::Language == "English"){
|
||||
ui->LabguageBox->setCurrentIndex(1);
|
||||
}
|
||||
else{
|
||||
ui->LabguageBox->setCurrentIndex(0);
|
||||
}
|
||||
ui->Web_Port->setText(Configuration::Web_Port.c_str());
|
||||
ui->Web_IP->setText(ui->Sub_IP->text());
|
||||
ui->OpenSleep->setValue(Configuration::OpenSleep);
|
||||
}
|
||||
|
||||
bool Widget::checkAutoStartEntry(const QString &appName) {
|
||||
QSettings startupSettings("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows", QSettings::NativeFormat);
|
||||
return startupSettings.contains(appName);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@ -32,6 +32,12 @@
|
||||
#include <QDir>
|
||||
#include <QDesktopServices>
|
||||
#include <QShortcut>
|
||||
#include "CCSocket.h"
|
||||
#include "vector"
|
||||
#include "CCTimeData.h"
|
||||
#include "widgetyz.h"
|
||||
#include "csinfow4.h"
|
||||
#include "W5/sub_ipui.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <tchar.h>
|
||||
@ -50,18 +56,12 @@ class Widget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
//E:/project/UDate/Project/QtProject/WebDeploy/
|
||||
const CCString WebSubPaths = QApplication::applicationDirPath().toStdString() + "/";
|
||||
const CCString ServerSttingsPath = WebSubPaths + "src/main/resources/ServerSettings/ServerSettings.CText";
|
||||
const CCString NginxSttingsPath = WebSubPaths + "conf/nginx.conf";
|
||||
CCThread WebThread, ServerThread;
|
||||
std::vector<int> CSPortList;
|
||||
#ifdef _WIN32
|
||||
const CCString OpenKit = "C:/ProgramData/Microsoft/Windows/Start Menu/Programs/StartUp/";
|
||||
const CCString NginxExe = WebSubPaths + "nginx.exe";
|
||||
const CCString JavaExe = "WebSub/jreWin/bin/java.exe";
|
||||
#elif __linux__
|
||||
const CCString NginxExe = "./WebSub/nginx";
|
||||
const CCString JavaExe = "WebSub/jreLinux/bin/java";
|
||||
|
||||
#endif
|
||||
QRect m_areaMovable;//可移动窗口的区域,鼠标只有在该区域按下才能移动窗口
|
||||
bool m_bPressed,closeflag = false;//鼠标按下标志(不分左右键)
|
||||
@ -71,7 +71,6 @@ private:
|
||||
QMenu *trayIconMenu = new QMenu(this);
|
||||
QAction *quitAction = new QAction(tr("&退出"), this);
|
||||
QAction *showAction = new QAction(tr("&显示"), this);
|
||||
std::map<CCString,CCString> ServerSettings;
|
||||
int t = 0,h = 0,f = 0,s = 0;
|
||||
int OpenSleepValue = 10;
|
||||
|
||||
@ -89,13 +88,17 @@ public:
|
||||
bool terminateProcessByName(const char* processName);
|
||||
void ServerReRun();
|
||||
void onCurrentIndexChanged(int index);
|
||||
void onCurrentIndexChangedCSIP(int index);
|
||||
void SetSuBState(bool F);
|
||||
void SetWebState(bool F);
|
||||
void SetSaveBtn();
|
||||
void Initlogo();
|
||||
void SelectFile();
|
||||
void slotCheckedChanged(int i);
|
||||
|
||||
void ReadCSInfoFun();
|
||||
void PrintMessage(CCString str);
|
||||
void ReadSub_IP();
|
||||
void Deploy();
|
||||
void InitUi();
|
||||
|
||||
private:
|
||||
Ui::Widget *ui;
|
||||
@ -273,13 +273,13 @@ QPushButton:hover{
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>IP广播分控启动器</string>
|
||||
<string>IP广播Web分控启动器</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLabel" name="NowTime">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>250</x>
|
||||
<x>260</x>
|
||||
<y>10</y>
|
||||
<width>351</width>
|
||||
<height>41</height>
|
||||
@ -363,7 +363,7 @@ QPushButton:hover{
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>打开服务</string>
|
||||
<string>开启服务</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLabel" name="WebLabel">
|
||||
@ -423,6 +423,41 @@ QPushButton:hover{
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QPushButton" name="RapidDeployment">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>150</x>
|
||||
<y>20</y>
|
||||
<width>111</width>
|
||||
<height>41</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Bahnschrift Light</family>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::TabFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QPushButton{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,68,138,255);
|
||||
}
|
||||
|
||||
QPushButton:hover{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,100,150, 255);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>快速部署</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
@ -500,7 +535,7 @@ border-radius:10px;</string>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>C/S服务器端口</string>
|
||||
<string>C/S服务器端口:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -530,7 +565,7 @@ color: rgb(0, 0, 0);</string>
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>160</y>
|
||||
<width>311</width>
|
||||
<width>221</width>
|
||||
<height>51</height>
|
||||
</rect>
|
||||
</property>
|
||||
@ -538,12 +573,12 @@ color: rgb(0, 0, 0);</string>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Sub分控后端服务器IP</string>
|
||||
<string>分控后端服务器IP:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="Sub_IP">
|
||||
<widget class="QLineEdit" name="Sub_IP">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
@ -556,64 +591,11 @@ color: rgb(0, 0, 0);</string>
|
||||
</font>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QComboBox{
|
||||
background-color: rgb(77,85,104);
|
||||
border-radius: 10px; /* 与父控件保持一致 */
|
||||
border-style: inset; /* 与父控件保持一致 */
|
||||
border-width: 1px; /* 设置边框宽度 */
|
||||
border-color: white; /* 设置边框颜色 */
|
||||
color: rgb(255, 255, 255);
|
||||
}
|
||||
|
||||
QComboBox::drop-down {
|
||||
subcontrol-origin: padding;
|
||||
subcontrol-position: top right;/*放于右方顶部*/
|
||||
width: 50px;/*设置按钮范围宽度*/
|
||||
/*border-radius: 15px;
|
||||
border-left-width: 1px;
|
||||
border-left-color: darkgray;
|
||||
border-left-style: solid;*/
|
||||
|
||||
border-top-right-radius: 3px;/*设置边框圆角*/
|
||||
border-bottom-right-radius: 3px;
|
||||
/*padding-right: 50px;*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
QComboBox QAbstractItemView {
|
||||
border: 2px solid #f3f3f3;/*边框宽度、线形、颜色*/
|
||||
background-color: rgba(237, 242, 255, 1);/*背景颜色*/
|
||||
border-radius: 10px;/*圆角*/
|
||||
padding: 1px 2px 1px 2px; /*针对于组合框中的文本内容*/
|
||||
min-width: 9em; /*# 组合框的最小宽度*/
|
||||
font-size: 15px;
|
||||
color:rgb(0,0,0);
|
||||
}
|
||||
|
||||
/* 下拉后,整个下拉窗体每项的样式 */
|
||||
QComboBox QAbstractItemView::item {
|
||||
border-radius: 10px;/*圆角*/
|
||||
height: 50px; /* 项的高度(设置pComboBox->setView(new QListView());后,该项才起作用) */
|
||||
background-color: rgb(0, 0, 0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*以下部分不知为何不生效,有待调试*/
|
||||
/* 下拉后,整个下拉窗体越过每项的样式 */
|
||||
QComboBox QAbstractItemView::item:hover {
|
||||
color: #FFFFF0;
|
||||
/* 整个下拉窗体越过每项的背景色 */
|
||||
background-color: rgb(237, 242, 255);
|
||||
}
|
||||
|
||||
/* 下拉后,整个下拉窗体被选择的每项的样式 */
|
||||
QComboBox QAbstractItemView::item:selected {
|
||||
color: #FFFFF0;
|
||||
background-color: rgb(77, 85, 101);
|
||||
font-size: 30px;
|
||||
}</string>
|
||||
<string notr="true">background-color: rgba(255, 255, 255, 200);
|
||||
color: rgb(0, 0, 0);</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -632,7 +614,7 @@ QComboBox QAbstractItemView::item:selected {
|
||||
<item>
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Sub分控后端端口</string>
|
||||
<string>分控后端端口:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -663,14 +645,14 @@ color: rgb(0, 0, 0);</string>
|
||||
<x>10</x>
|
||||
<y>280</y>
|
||||
<width>311</width>
|
||||
<height>51</height>
|
||||
<height>61</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_8">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>Sub-IP音频端口</string>
|
||||
<string>分控音频采集端口:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -689,44 +671,6 @@ color: rgb(0, 0, 0);</string>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color: rgba(255, 255, 255, 200);
|
||||
color: rgb(0, 0, 0);</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="layoutWidget_5">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>340</y>
|
||||
<width>311</width>
|
||||
<height>51</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_9">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Sub-Origins[跨域]</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="Sub_Origins">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>30</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>15</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color: rgba(255, 255, 255, 200);
|
||||
color: rgb(0, 0, 0);</string>
|
||||
</property>
|
||||
</widget>
|
||||
@ -737,7 +681,7 @@ color: rgb(0, 0, 0);</string>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>400</y>
|
||||
<y>410</y>
|
||||
<width>311</width>
|
||||
<height>51</height>
|
||||
</rect>
|
||||
@ -746,7 +690,7 @@ color: rgb(0, 0, 0);</string>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>Language[语言]</string>
|
||||
<string>Language[语言]:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -841,16 +785,16 @@ QComboBox QAbstractItemView::item:selected {
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>40</y>
|
||||
<width>311</width>
|
||||
<height>51</height>
|
||||
<y>30</y>
|
||||
<width>221</width>
|
||||
<height>61</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>C/S服务器IP</string>
|
||||
<string>C/S服务器IP:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -878,11 +822,59 @@ color: rgb(0, 0, 0);</string>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QSpinBox" name="OpenSleep">
|
||||
<widget class="QLabel" name="label_13">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>460</y>
|
||||
<y>470</y>
|
||||
<width>111</width>
|
||||
<height>41</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>秒/自启延时(0为无)</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QPushButton" name="ReadCSInfoBtn">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>240</x>
|
||||
<y>60</y>
|
||||
<width>81</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Bahnschrift Light</family>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::TabFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QPushButton{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,68,138,255);
|
||||
}
|
||||
|
||||
QPushButton:hover{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,100,150, 255);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>选择</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QSpinBox" name="OpenSleep">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>140</x>
|
||||
<y>470</y>
|
||||
<width>181</width>
|
||||
<height>41</height>
|
||||
</rect>
|
||||
@ -897,17 +889,88 @@ color: rgb(0, 0, 0);</string>
|
||||
color: rgb(0, 0, 0);</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLabel" name="label_13">
|
||||
<widget class="QWidget" name="layoutWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>200</x>
|
||||
<y>460</y>
|
||||
<width>111</width>
|
||||
<height>41</height>
|
||||
<x>11</x>
|
||||
<y>350</y>
|
||||
<width>311</width>
|
||||
<height>53</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_9">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>分控后端IP地址白名单-[跨域]:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="CORSEn">
|
||||
<property name="text">
|
||||
<string>启用</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="Sub_Origins">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>30</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>15</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color: rgba(255, 255, 255, 200);
|
||||
color: rgb(0, 0, 0);</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QPushButton" name="SelectSub_IPBtn">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>240</x>
|
||||
<y>180</y>
|
||||
<width>81</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Bahnschrift Light</family>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::TabFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QPushButton{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,68,138,255);
|
||||
}
|
||||
|
||||
QPushButton:hover{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,100,150, 255);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>自启延时(0为无)</string>
|
||||
<string>选择</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
@ -938,7 +1001,7 @@ color: rgb(0, 0, 0);</string>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>Web前端端口</string>
|
||||
<string>分控前端端口:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -976,7 +1039,7 @@ color: rgb(0, 0, 0);</string>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="text">
|
||||
<string>Web前端IP</string>
|
||||
<string>分控前端IP:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -1004,11 +1067,11 @@ color: rgb(0, 0, 0);</string>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QPushButton" name="LogoBtn">
|
||||
<widget class="QPushButton" name="GJSZBtn">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>220</y>
|
||||
<x>130</x>
|
||||
<y>170</y>
|
||||
<width>111</width>
|
||||
<height>41</height>
|
||||
</rect>
|
||||
@ -1036,79 +1099,44 @@ QPushButton:hover{
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>更换WebLogo</string>
|
||||
<string>高级设置</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLabel" name="logos">
|
||||
<widget class="QPushButton" name="RestBtn">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>280</y>
|
||||
<width>320</width>
|
||||
<height>180</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLabel" name="label_11">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>130</x>
|
||||
<y>220</y>
|
||||
<width>181</width>
|
||||
<y>170</y>
|
||||
<width>111</width>
|
||||
<height>41</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<family>Bahnschrift Light</family>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::TabFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QPushButton{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,68,138,255);
|
||||
}
|
||||
|
||||
QPushButton:hover{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,100,150, 255);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>图片必须是100x40的大小</string>
|
||||
<string>初始化设置</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QWidget" name="layoutWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>160</y>
|
||||
<width>311</width>
|
||||
<height>51</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_13">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_10">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>15</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>URL</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="HTTPURL">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>15</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="openExternalLinks">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
@ -1132,26 +1160,32 @@ QPushButton:hover{
|
||||
<string notr="true">background-color: rgb(10,22,53);
|
||||
border-radius:10px;</string>
|
||||
</property>
|
||||
<widget class="QPushButton" name="RestBtn">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>560</x>
|
||||
<y>20</y>
|
||||
<width>111</width>
|
||||
<height>41</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Bahnschrift Light</family>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::TabFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QPushButton{
|
||||
<layout class="QGridLayout" name="gridLayout_4">
|
||||
<item row="0" column="2">
|
||||
<widget class="QPushButton" name="SetSaveBtn">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>120</width>
|
||||
<height>45</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>120</width>
|
||||
<height>45</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Bahnschrift Light</family>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::TabFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QPushButton{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,68,138,255);
|
||||
@ -1162,67 +1196,47 @@ QPushButton:hover{
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,100,150, 255);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>初始化设置</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QPushButton" name="SetSaveBtn">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>440</x>
|
||||
<y>20</y>
|
||||
<width>111</width>
|
||||
<height>41</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Bahnschrift Light</family>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::TabFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QPushButton{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,68,138,255);
|
||||
}
|
||||
|
||||
QPushButton:hover{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,100,150, 255);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>保存</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QCheckBox" name="OpenPCStart">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>280</x>
|
||||
<y>20</y>
|
||||
<width>151</width>
|
||||
<height>41</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>15</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">color: rgb(255, 255, 255);</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>设置开机自启</string>
|
||||
</property>
|
||||
</widget>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>保存</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="OpenPCStart">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>45</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>15</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">color: rgb(255, 255, 255);</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>设置开机自启</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
@ -1242,7 +1256,7 @@ QPushButton:hover{
|
||||
</layout>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="Res/rs.qrc"/>
|
||||
<include location="../../Res/rs.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
44
UI/W2/widgetyz.cpp
Normal file
44
UI/W2/widgetyz.cpp
Normal file
@ -0,0 +1,44 @@
|
||||
#include "widgetyz.h"
|
||||
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "ui_widgetYZ.h"
|
||||
#include <QDesktopWidget>
|
||||
#include <QScreen>
|
||||
|
||||
widgetYZ::widgetYZ(QWidget *parent) :QWidget(parent), ui(new Ui::widgetYZ) {
|
||||
ui->setupUi(this);
|
||||
setWindowFlags(this->windowFlags() &~ Qt::WindowMaximizeButtonHint);
|
||||
connect(ui->YZQRBtn, &QPushButton::clicked,this, &widgetYZ::QRBtnFun);
|
||||
connect(ui->YZQXBtn, &QPushButton::clicked,this, &widgetYZ::QXBtnFun);
|
||||
}
|
||||
|
||||
widgetYZ::~widgetYZ() {
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void widgetYZ::QRBtnFun()
|
||||
{
|
||||
if(ui->YZMMInput->text() == "123456")
|
||||
{
|
||||
auto* win = new widget3();
|
||||
// 获取屏幕的几何尺寸
|
||||
QScreen *screen = QGuiApplication::primaryScreen();
|
||||
QRect screenGeometry = screen->geometry();
|
||||
int x = (screenGeometry.width() - width()) / 2;
|
||||
int y = (screenGeometry.height() - height()) / 2;
|
||||
// 移动窗口到计算出的中心位置
|
||||
win->move(x, y);
|
||||
win->show();
|
||||
this->close();
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::warning(this, "提示", "密码错误!");
|
||||
}
|
||||
}
|
||||
|
||||
void widgetYZ::QXBtnFun()
|
||||
{
|
||||
this->close();
|
||||
}
|
||||
25
UI/W2/widgetyz.h
Normal file
25
UI/W2/widgetyz.h
Normal file
@ -0,0 +1,25 @@
|
||||
#ifndef WIDGETYZ_H
|
||||
#define WIDGETYZ_H
|
||||
|
||||
#include <QWidget>
|
||||
#include "widget3.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui { class widgetYZ; }
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class widgetYZ : public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit widgetYZ(QWidget *parent = nullptr);
|
||||
~widgetYZ() override;
|
||||
void QRBtnFun();
|
||||
void QXBtnFun();
|
||||
|
||||
private:
|
||||
Ui::widgetYZ *ui;
|
||||
};
|
||||
|
||||
|
||||
#endif //WIDGETYZ_H
|
||||
174
UI/W2/widgetyz.ui
Normal file
174
UI/W2/widgetyz.ui
Normal file
@ -0,0 +1,174 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>widgetYZ</class>
|
||||
<widget class="QWidget" name="widgetYZ">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>367</width>
|
||||
<height>184</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>管理员验证</string>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color: rgba(10, 23, 53, 200);</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QWidget" name="widget" native="true">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>50</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>15</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="layoutDirection">
|
||||
<enum>Qt::LeftToRight</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color: rgba(255, 255, 255, 0);
|
||||
color: rgb(255, 255, 255);</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>管理员密码</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="YZMMInput">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>30</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>15</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color: rgb(202,205,211);
|
||||
color: rgb(0, 0, 0);
|
||||
border-radius:8px;</string>
|
||||
</property>
|
||||
<property name="echoMode">
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>密码</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="spacing">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>20</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>15</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>20</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="YZQRBtn">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>35</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Bahnschrift Light</family>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::TabFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QPushButton{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,68,138,255);
|
||||
}
|
||||
|
||||
QPushButton:hover{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,100,150, 255);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>确定</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="YZQXBtn">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>35</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Bahnschrift Light</family>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::TabFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QPushButton{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,68,138,255);
|
||||
}
|
||||
|
||||
QPushButton:hover{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,100,150, 255);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>取消</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
64
UI/W3/widget3.cpp
Normal file
64
UI/W3/widget3.cpp
Normal file
@ -0,0 +1,64 @@
|
||||
#include "widget3.h"
|
||||
|
||||
#include <CCFile.h>
|
||||
#include <QFileDialog>
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "ui_widget3.h"
|
||||
|
||||
|
||||
widget3::widget3(QWidget *parent) :QWidget(parent), ui(new Ui::widget3) {
|
||||
ui->setupUi(this);
|
||||
setWindowFlags(this->windowFlags() &~ Qt::WindowMaximizeButtonHint);
|
||||
connect(ui->LogoBtn, &QPushButton::clicked,this, &widget3::SelectFile);
|
||||
}
|
||||
|
||||
widget3::~widget3() {
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void widget3::SelectFile() {
|
||||
try {
|
||||
//定义文件对话框类
|
||||
QFileDialog *fileDialog = new QFileDialog(this);
|
||||
//定义文件对话框标题
|
||||
fileDialog->setWindowTitle(QStringLiteral("选择文件"));
|
||||
//设置打开的文件路径
|
||||
fileDialog->setDirectory("./");
|
||||
//设置文件过滤器,只显示.ui .cpp 文件,多个过滤文件使用空格隔开
|
||||
fileDialog->setNameFilter(tr("File(*.png*)"));
|
||||
//设置可以选择多个文件,默认为只能选择一个文件QFileDialog::ExistingFiles
|
||||
fileDialog->setFileMode(QFileDialog::ExistingFile);
|
||||
//设置视图模式
|
||||
fileDialog->setViewMode(QFileDialog::Detail);
|
||||
//获取选择的文件的路径
|
||||
QStringList fileNames;
|
||||
if (fileDialog->exec()) {
|
||||
fileNames = fileDialog->selectedFiles();
|
||||
}
|
||||
if(!fileNames.isEmpty()){
|
||||
CCString fileName = fileNames[0].toStdString();
|
||||
CCFile file = CCFile(fileName.c_str(), CC::ios::rb, false);
|
||||
CCString str = WebSubPaths + "html/assets/logo-CuXNbvLG.png";
|
||||
bool F = file.Copy(str);
|
||||
if(F){
|
||||
CCString str = WebSubPaths + "html/assets/logo-CuXNbvLG.png";
|
||||
QPixmap pixmap(str.c_str()); // 替换为你的图片路径
|
||||
if(ImGLoad != nullptr)
|
||||
{
|
||||
ImGLoad->setPixmap(pixmap);
|
||||
ImGLoad->setScaledContents(true); // 图片自动缩放以适应 QLabel 大小
|
||||
ImGLoad->setMaximumSize(111,61); // 设置 QLabel 最小尺寸
|
||||
ImGLoad->setMaximumSize(320,180); // 设置 QLabel 最小尺寸
|
||||
}
|
||||
QMessageBox::information(this, "Success", "Copy OK!");
|
||||
}
|
||||
else{
|
||||
QMessageBox::information(this, "Error", "Failed to copy file,Chinese is not supported");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
|
||||
}
|
||||
}
|
||||
31
UI/W3/widget3.h
Normal file
31
UI/W3/widget3.h
Normal file
@ -0,0 +1,31 @@
|
||||
#ifndef WIDGET3_H
|
||||
#define WIDGET3_H
|
||||
|
||||
#include <QApplication>
|
||||
#include <QLabel>
|
||||
#include <QWidget>
|
||||
#include "CCString.h"
|
||||
|
||||
inline QLabel* ImGLoad = nullptr;
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui { class widget3; }
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class widget3 : public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
private:
|
||||
const CCString WebSubPaths = QApplication::applicationDirPath().toLocal8Bit().toStdString() + "/";
|
||||
|
||||
public:
|
||||
explicit widget3(QWidget *parent = nullptr);
|
||||
~widget3() override;
|
||||
void SelectFile();
|
||||
|
||||
private:
|
||||
Ui::widget3 *ui;
|
||||
};
|
||||
|
||||
|
||||
#endif //WIDGET3_H
|
||||
119
UI/W3/widget3.ui
Normal file
119
UI/W3/widget3.ui
Normal file
@ -0,0 +1,119 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>widget3</class>
|
||||
<widget class="QWidget" name="widget3">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>481</width>
|
||||
<height>333</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>高级设置</string>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QWidget" name="widget" native="true">
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<widget class="QLabel" name="label_11">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>170</x>
|
||||
<y>10</y>
|
||||
<width>181</width>
|
||||
<height>41</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color: rgba(255, 255, 255, 0);
|
||||
</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>图片必须是100x40的大小</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLabel" name="logos">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>60</x>
|
||||
<y>80</y>
|
||||
<width>341</width>
|
||||
<height>211</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color: rgba(255, 255, 255, 0);</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QPushButton" name="LogoBtn">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>30</x>
|
||||
<y>10</y>
|
||||
<width>121</width>
|
||||
<height>41</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Bahnschrift Light</family>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::TabFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QPushButton{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,68,138,255);
|
||||
}
|
||||
|
||||
QPushButton:hover{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,100,150, 255);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>更改logo图片</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
46
UI/W4/csinfow4.cpp
Normal file
46
UI/W4/csinfow4.cpp
Normal file
@ -0,0 +1,46 @@
|
||||
#include "csinfow4.h"
|
||||
|
||||
#include <QLineEdit>
|
||||
|
||||
#include "ui_CSInfoW4.h"
|
||||
|
||||
|
||||
CSInfoW4::CSInfoW4(QWidget *parent) :QDialog(parent), ui(new Ui::CSInfoW4) {
|
||||
ui->setupUi(this);
|
||||
setAttribute(Qt::WA_TranslucentBackground);
|
||||
setWindowFlags(Qt::FramelessWindowHint);
|
||||
connect(ui->QueRBtn1, &QPushButton::clicked, this, &CSInfoW4::QueRBtn1);
|
||||
connect(ui->QuXiaoBtn1, &QPushButton::clicked, this, &CSInfoW4::QuXiaoBtn1);
|
||||
Configuration::ReadCSInfo([this]()
|
||||
{
|
||||
model = new QStringListModel(this);
|
||||
QStringList data;
|
||||
for(auto& i:Configuration::CSIPList){
|
||||
data.push_back(i.c_str());
|
||||
}
|
||||
model->setStringList(data);
|
||||
ui->listViewCS_IP->setModel(model);
|
||||
ui->listViewCS_IP->setFocusPolicy(Qt::NoFocus);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
CSInfoW4::~CSInfoW4() {
|
||||
delete model;
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void CSInfoW4::QueRBtn1(){
|
||||
QString ip = ui->listViewCS_IP->currentIndex().data().toString();
|
||||
int port = ui->listViewCS_IP->currentIndex().row();
|
||||
QString P = CCInt(Configuration::CSPortList[port]).to_String().c_str();
|
||||
this->IPEdit1->setText(ip);
|
||||
this->IPEdit2->setText(P);
|
||||
Configuration::CS_IP = ip.toStdString();
|
||||
Configuration::CS_Port = P.toStdString();
|
||||
accept(); // 关闭对话框并返回 Accepted
|
||||
}
|
||||
|
||||
void CSInfoW4::QuXiaoBtn1(){
|
||||
reject(); // 关闭对话框并返回 Rejected
|
||||
}
|
||||
31
UI/W4/csinfow4.h
Normal file
31
UI/W4/csinfow4.h
Normal file
@ -0,0 +1,31 @@
|
||||
#ifndef CSINFOW4_H
|
||||
#define CSINFOW4_H
|
||||
|
||||
#include <qdialog.h>
|
||||
#include <QWidget>
|
||||
#include "Configuration.h"
|
||||
#include <QStringListModel>
|
||||
#include <QLineEdit>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui { class CSInfoW4; }
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class CSInfoW4 : public QDialog {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit CSInfoW4(QWidget *parent = nullptr);
|
||||
~CSInfoW4() override;
|
||||
void QueRBtn1();
|
||||
void QuXiaoBtn1();
|
||||
QLineEdit *IPEdit1 = nullptr;
|
||||
QLineEdit *IPEdit2 = nullptr;
|
||||
|
||||
private:
|
||||
Ui::CSInfoW4 *ui;
|
||||
QStringListModel *model;
|
||||
};
|
||||
|
||||
|
||||
#endif //CSINFOW4_H
|
||||
170
UI/W4/csinfow4.ui
Normal file
170
UI/W4/csinfow4.ui
Normal file
@ -0,0 +1,170 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>CSInfoW4</class>
|
||||
<widget class="QWidget" name="CSInfoW4">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>374</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>选择局域网CS服务器</string>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color: rgba(10, 23, 53, 200);
|
||||
border:none;
|
||||
border-radius:20px;</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout" stretch="4">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QWidget" name="widget" native="true">
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QListView" name="listViewCS_IP">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QListView {
|
||||
background-color: rgba(255, 255, 255,0);
|
||||
border-radius:10px;
|
||||
}
|
||||
|
||||
QListView::item{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
padding:10px;
|
||||
margin-top:8px;
|
||||
}
|
||||
|
||||
QListView::item:hover{
|
||||
border-radius:10px;
|
||||
background-color: rgba(255, 255, 255,50);
|
||||
color: rgb(0, 0, 0);
|
||||
font-size:18px;
|
||||
}
|
||||
QListView::item:selected {
|
||||
border-left: 4px solid #009688;
|
||||
background-color: rgba(182, 210, 255,100);
|
||||
}
|
||||
</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QWidget" name="widget_2" native="true">
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QPushButton" name="QuXiaoBtn1">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>120</width>
|
||||
<height>45</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>120</width>
|
||||
<height>45</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Bahnschrift Light</family>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::TabFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QPushButton{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(200,68,138,0);
|
||||
border: 2px solid rgba(200,68,138,255);
|
||||
}
|
||||
|
||||
QPushButton:hover{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,100,150, 255);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>取消</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QPushButton" name="QueRBtn1">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>120</width>
|
||||
<height>45</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>120</width>
|
||||
<height>45</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Bahnschrift Light</family>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::TabFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QPushButton{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,68,138,255);
|
||||
}
|
||||
|
||||
QPushButton:hover{
|
||||
border-radius:10px;
|
||||
color: rgb(255, 255, 255);
|
||||
background-color: rgba(255,100,150, 255);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>确认</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
668
widget.cpp
668
widget.cpp
@ -1,668 +0,0 @@
|
||||
#include <iostream>
|
||||
#include "widget.h"
|
||||
#include "./ui_widget.h"
|
||||
|
||||
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){
|
||||
ui->setupUi(this);
|
||||
//------------------------------------------------------------------------------------------------
|
||||
// COPYFile(WebSubPaths,"");
|
||||
setAttribute(Qt::WA_TranslucentBackground); //设置窗口背景透明
|
||||
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint); //去掉窗口边框
|
||||
setAreaMovable(ui->widget_3->rect());
|
||||
this->setWindowIcon(QIcon(":logo.png"));
|
||||
CCString logopath = WebSubPaths + "logo.png";
|
||||
QIcon trayIconIcon(logopath.c_str()); // 使用你的图标路径
|
||||
trayIcon->setIcon(trayIconIcon);
|
||||
QObject::connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit);
|
||||
QObject::connect(showAction, &QAction::triggered, this, &Widget::show);
|
||||
trayIconMenu->addAction(showAction);
|
||||
trayIconMenu->addAction(quitAction);
|
||||
trayIcon->setContextMenu(trayIconMenu);
|
||||
trayIcon->show();
|
||||
SetPage(0);
|
||||
Btns.emplace_back(ui->HomeBtn);
|
||||
Btns.emplace_back(ui->SettingsBtn);
|
||||
Initlogo();
|
||||
//------------------------------------------------------------------------------------------------
|
||||
connect(ui->Sub_IP, QOverload<int>::of(&QComboBox::currentIndexChanged),this, &Widget::onCurrentIndexChanged);
|
||||
connect(ui->HomeBtn, &QPushButton::clicked, this, &Widget::on_pushButton_clicked);
|
||||
connect(ui->SettingsBtn, &QPushButton::clicked, this, &Widget::on_pushButton_clicked2);
|
||||
connect(ui->CloseBtn, &QPushButton::clicked, this, [this](){this->close();});
|
||||
connect(ui->MinBtn, &QPushButton::clicked, this, [this](){this->showMinimized();});
|
||||
connect(ui->OpenServerBtn, &QPushButton::clicked, this, &Widget::OpenServerClick);
|
||||
connect(ui->RestBtn, &QPushButton::clicked, this, &Widget::ServerConfigInit);
|
||||
connect(ui->SetSaveBtn, &QPushButton::clicked, this, &Widget::SetSaveBtn);
|
||||
connect(ui->LogoBtn, &QPushButton::clicked, this, &Widget::SelectFile);
|
||||
connect(ui->Web_Port, &QLineEdit::textChanged,this, &Widget::onTextChanged);
|
||||
connect(ui->OpenPCStart, &QCheckBox::stateChanged,this, &Widget::slotCheckedChanged);
|
||||
ui->HomeBtn->setFocusPolicy(Qt::NoFocus);
|
||||
ui->SettingsBtn->setFocusPolicy(Qt::NoFocus);
|
||||
ui->CloseBtn->setFocusPolicy(Qt::NoFocus);
|
||||
ui->MinBtn->setFocusPolicy(Qt::NoFocus);
|
||||
ui->OpenServerBtn->setFocusPolicy(Qt::NoFocus);
|
||||
//------------------------------------------------------------------------------------------------
|
||||
ui->ServerConsele->append("Path:" + QApplication::applicationDirPath());
|
||||
SetBtn(0);
|
||||
terminateProcessByName("IPBS_NSSM");
|
||||
terminateProcessByName("java");
|
||||
terminateProcessByName("nginx");
|
||||
QProcess::startDetached("./IPBS_NSSM.exe");
|
||||
std::thread([this](){
|
||||
CCString s = WebSubPaths + "State.cfg";
|
||||
auto AS = CText::ReadConfig(s.c_str());
|
||||
auto ASD = CText::ReadConfig(ServerSttingsPath.c_str());
|
||||
if(!AS.empty()) {
|
||||
CCString State = AS["State"];
|
||||
int Op = QString(ASD["OpenSleep"].c_str()).toInt();
|
||||
if(Op > 0){
|
||||
OpenSleepValue = Op;
|
||||
}
|
||||
if(State == "Open"){
|
||||
while (OpenSleepValue > 0){
|
||||
Threading::Sleep(1000 * 1000);
|
||||
QMetaObject::invokeMethod(this, [this]() {
|
||||
ui->ServerConsele->append(CCString(std::to_string(OpenSleepValue) + "秒后自动启动服务").c_str());
|
||||
});
|
||||
OpenSleepValue--;
|
||||
}
|
||||
if(!ServerFlag){
|
||||
OpenServerClick();
|
||||
OpenFlagBtn(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}).detach();
|
||||
ui->OpenPCStart->setCheckState(checkAutoStartEntry("IPBS_Station(Web)") ? Qt::Checked:Qt::Unchecked);
|
||||
ServerThread.SetThread(&Widget::ServerListening,this);
|
||||
ServerThread.Start();
|
||||
OpenSerice(true);
|
||||
foreach (QHostAddress ptr , QNetworkInterface::allAddresses()) {
|
||||
// 获取ipv4地址
|
||||
if (ptr.protocol() == QAbstractSocket::IPv4Protocol) {
|
||||
// 过滤本地回环127.0.0.1
|
||||
if (!ptr.isLoopback()) {
|
||||
CCString A = ptr.toString().toStdString();
|
||||
ui->Sub_IP->addItem(A.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
//------------------------------------------------------------------------------------------------
|
||||
}
|
||||
|
||||
Widget::~Widget(){
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void Widget::on_pushButton_clicked() {
|
||||
SetBtn(0);
|
||||
SetPage(0);
|
||||
}
|
||||
|
||||
void Widget::on_pushButton_clicked2() {
|
||||
SetBtn(1);
|
||||
SetPage(1);
|
||||
}
|
||||
|
||||
void Widget::WebThreadRun() {
|
||||
CCString jre = WebSubPaths + JavaExe;
|
||||
CCString cmd = jre + " -jar " + WebSubPaths + "WebSub/SpringWeb.jar";
|
||||
bool F = QProcess::startDetached(cmd.c_str());
|
||||
if(F){
|
||||
ui->ServerConsele->append("Sub Start OK!");
|
||||
}
|
||||
F = QProcess::startDetached(NginxExe.c_str());
|
||||
if(F){
|
||||
ui->ServerConsele->append("Web Start OK!");
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::closeEvent(QCloseEvent *event) {
|
||||
QMessageBox msgBox;
|
||||
msgBox.setWindowTitle(tr("退出程序"));
|
||||
msgBox.setText(tr("你确定要退出吗?"));
|
||||
QPushButton *yesButton = msgBox.addButton(tr("结束程序"), QMessageBox::YesRole);
|
||||
msgBox.addButton(tr("到托盘"), QMessageBox::NoRole);
|
||||
msgBox.exec();
|
||||
if (msgBox.clickedButton() == yesButton)
|
||||
{
|
||||
terminateProcessByName("IPBS_NSSM");
|
||||
ServerThread.Stop();
|
||||
WebThread.Stop();
|
||||
terminateProcessByName("java");
|
||||
terminateProcessByName("nginx");
|
||||
event->accept();
|
||||
QCoreApplication::quit();
|
||||
}
|
||||
else
|
||||
{
|
||||
this->hide();
|
||||
event->ignore(); // 阻止窗口关闭
|
||||
}
|
||||
}
|
||||
|
||||
bool Widget::WebRunFun() {
|
||||
if(!ServerFlag){
|
||||
if(!WebThread.Sign()){
|
||||
ServerFlag = true;
|
||||
SetState(ServerFlag);
|
||||
WebThread.SetThread(&Widget::WebThreadRun,this);
|
||||
WebThread.Start();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void Widget::SetPage(int i) {
|
||||
ui->stackedWidget->setCurrentIndex(i);
|
||||
if(i == 1){
|
||||
ServerSettings = CText::ReadConfig(ServerSttingsPath.c_str());
|
||||
if(!ServerSettings.empty()){
|
||||
ui->CS_IP->setText(ServerSettings["C/S_IP"].c_str());
|
||||
ui->CS_Port->setText(ServerSettings["C/S_PORT"].c_str());
|
||||
for (int j = 0; j < ui->Sub_IP->count(); ++j) {
|
||||
if(ui->Sub_IP->itemText(j) == ServerSettings["Sub_Control_IP"].c_str()){
|
||||
ui->Sub_IP->setCurrentIndex(j);
|
||||
}
|
||||
}
|
||||
ui->Sub_Port->setText(ServerSettings["Sub_Control_PORT"].c_str());
|
||||
ui->Sub_Audio_Port->setText(ServerSettings["Sub_Control_Audio_PORT"].c_str());
|
||||
ui->Web_IP->setText(ui->Sub_IP->currentText());
|
||||
if(ServerSettings["Sub_Web_PORT"].empty()){
|
||||
ui->Web_Port->setText("5180");
|
||||
}
|
||||
else{
|
||||
ui->Web_Port->setText(ServerSettings["Sub_Web_PORT"].c_str());
|
||||
}
|
||||
if(!ServerSettings["OpenSleep"].empty()){
|
||||
OpenSleepValue = QString(ServerSettings["OpenSleep"].c_str()).toInt();
|
||||
}
|
||||
if(ServerSettings["Language"] == "English"){
|
||||
ui->LabguageBox->setCurrentIndex(1);
|
||||
}
|
||||
else{
|
||||
ui->LabguageBox->setCurrentIndex(0);
|
||||
}
|
||||
QString str = CCString("['http://" + ui->Sub_IP->currentText().toStdString() + ":" + ui->Web_Port->text().toStdString() + "']").c_str();
|
||||
ui->Sub_Origins->setText(str);
|
||||
CCString URL = ui->Sub_IP->currentText().toStdString()+":"+ui->Web_Port->text().toStdString();
|
||||
ui->HTTPURL->setText(CCString("<a style='color: red; text-decoration: none' href = "+URL+">http://"+URL).c_str());
|
||||
ui->OpenSleep->setValue(OpenSleepValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::SetBtn(int i) {
|
||||
for (auto & Btn : Btns) {
|
||||
Btn->setStyleSheet("QPushButton{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(255, 255, 255, 0);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"QPushButton:hover{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(74,89,146, 255);\n"
|
||||
"}");
|
||||
}
|
||||
Btns[i]->setStyleSheet("QPushButton{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(74,89,146, 255);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"QPushButton:hover{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(74,89,146, 255);\n"
|
||||
"}");
|
||||
}
|
||||
|
||||
void Widget::OpenServerClick() {
|
||||
auto A = CText::ReadConfig(ServerSttingsPath.c_str());
|
||||
if(A.size() >= 8){
|
||||
try {
|
||||
ServerReRun();
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "Error: " << e.what() << std::endl;
|
||||
}
|
||||
}
|
||||
else{
|
||||
QMessageBox::information(this,"提示","启动参数错误,请先配置服务器参数!");
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::OpenFlagBtn(bool F) {
|
||||
if(!F){
|
||||
ui->OpenServerBtn->setStyleSheet("QPushButton{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(255,68,138,255);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"QPushButton:hover{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(255,100,150, 255);\n"
|
||||
"}");
|
||||
ui->OpenServerBtn->setText("打开服务");
|
||||
}
|
||||
else{
|
||||
ui->OpenServerBtn->setStyleSheet("QPushButton{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(255,0,0,255);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"QPushButton:hover{\n"
|
||||
"\tborder-radius:10px;\n"
|
||||
"\tcolor: rgb(255, 255, 255);\n"
|
||||
"\tbackground-color: rgba(255,100,150, 255);\n"
|
||||
"}");
|
||||
ui->OpenServerBtn->setText("关闭服务");
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::ServerListening() {
|
||||
bool F = false,S = false;
|
||||
Threading::Sleep(1000 * 1000 * 60);
|
||||
while (ServerThread.Sign()){
|
||||
try {
|
||||
F = isJarRunning("java");
|
||||
S = isJarRunning("nginx");
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "Error: " << e.what() << std::endl;
|
||||
}
|
||||
char bus[1024] = {0};
|
||||
if(ServerFlag){
|
||||
sprintf(bus,"%d天%d小时%d分%d秒",t,h,f,s);
|
||||
s++;
|
||||
if(s >= 60){
|
||||
f++;
|
||||
s = 0;
|
||||
if(f >= 60){
|
||||
f = 0;
|
||||
if(h >= 24){
|
||||
t++;
|
||||
h = 0;
|
||||
}
|
||||
h++;
|
||||
}
|
||||
}
|
||||
}
|
||||
QMetaObject::invokeMethod(this, [this,F,S,bus](){
|
||||
SetSuBState(F);
|
||||
SetWebState(S);
|
||||
// 获取当前的日期和时间
|
||||
QDateTime currentDateTime = QDateTime::currentDateTime();
|
||||
// 将日期时间对象转换为字符串格式
|
||||
QString currentTime = currentDateTime.toString("yyyy-MM-dd-hh:mm:ss");
|
||||
ui->NowTime->setText(currentTime);
|
||||
QString str = bus;
|
||||
ui->RunTime->setText(str);
|
||||
});
|
||||
if(!F && ServerFlag){
|
||||
QMetaObject::invokeMethod(this, [this](){
|
||||
CCString jre = WebSubPaths + JavaExe;
|
||||
CCString cmd = jre + " -jar " + WebSubPaths + "WebSub/SpringWeb.jar";
|
||||
bool F = QProcess::startDetached(cmd.c_str());
|
||||
if(F){
|
||||
ui->ServerConsele->append("Sub Res Start OK!");
|
||||
}
|
||||
Threading::Sleep(1000 * 1000 * 10);
|
||||
});
|
||||
}
|
||||
if(!S && ServerFlag){
|
||||
try{
|
||||
F = QProcess::startDetached(NginxExe.c_str());
|
||||
if(F){
|
||||
ui->ServerConsele->append("Web Res Start OK!");
|
||||
}
|
||||
Threading::Sleep(1000 * 1000 * 10);
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "Error: " << e.what() << std::endl;
|
||||
}
|
||||
}
|
||||
Threading::Sleep(1000 * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
bool Widget::isJarRunning(const char *jarName) {
|
||||
#ifdef _WIN32
|
||||
CCString str = jarName;
|
||||
str.append(".exe");
|
||||
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||
if (hSnapshot == INVALID_HANDLE_VALUE) {
|
||||
return false;
|
||||
}
|
||||
PROCESSENTRY32 pe32;
|
||||
pe32.dwSize = sizeof(PROCESSENTRY32);
|
||||
if (Process32First(hSnapshot, &pe32)) {
|
||||
do {
|
||||
if (_tcsstr(pe32.szExeFile, str.c_str()) != nullptr) {
|
||||
CloseHandle(hSnapshot);
|
||||
return true;
|
||||
}
|
||||
} while (Process32Next(hSnapshot, &pe32));
|
||||
}
|
||||
|
||||
CloseHandle(hSnapshot);
|
||||
return false;
|
||||
#elif __linux__
|
||||
#endif
|
||||
}
|
||||
|
||||
bool Widget::terminateProcessByName(const char *processName) {
|
||||
#ifdef _WIN32
|
||||
CCString str = processName;
|
||||
str.append(".exe");
|
||||
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||
if (hSnapshot == INVALID_HANDLE_VALUE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
PROCESSENTRY32 pe32;
|
||||
pe32.dwSize = sizeof(PROCESSENTRY32);
|
||||
|
||||
if (Process32First(hSnapshot, &pe32)) {
|
||||
do {
|
||||
if (_tcscmp(pe32.szExeFile, str.c_str()) == 0) {
|
||||
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID);
|
||||
if (hProcess != NULL) {
|
||||
TerminateProcess(hProcess, 0);
|
||||
CloseHandle(hProcess);
|
||||
}
|
||||
}
|
||||
} while (Process32Next(hSnapshot, &pe32));
|
||||
}
|
||||
|
||||
CloseHandle(hSnapshot);
|
||||
return true;
|
||||
#elif __linux__
|
||||
#endif
|
||||
}
|
||||
|
||||
void Widget::ServerReRun() {
|
||||
if(ServerFlag){
|
||||
try {
|
||||
terminateProcessByName("java");
|
||||
terminateProcessByName("nginx");
|
||||
if(ServerFlag){
|
||||
WebThread.Stop();
|
||||
ui->ServerConsele->append("Server Close");
|
||||
OpenFlagBtn(false);
|
||||
ServerFlag = false;
|
||||
SetState(ServerFlag);
|
||||
ui->RunTime->setVisible(false);
|
||||
t = 0;h = 0;f = 0;s = 0;
|
||||
}
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "Error: " << e.what() << std::endl;
|
||||
}
|
||||
}
|
||||
else{
|
||||
WebRunFun();
|
||||
OpenFlagBtn(true);
|
||||
t = 0;h = 0;f = 0;s = 0;
|
||||
ui->RunTime->setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::onCurrentIndexChanged(int index) {
|
||||
ui->Web_IP->setText(ui->Sub_IP->currentText());
|
||||
CCString URL = ui->Sub_IP->currentText().toStdString()+":"+ui->Web_Port->text().toStdString();
|
||||
ui->HTTPURL->setText(CCString("<a style='color: red; text-decoration: none' href = "+URL+">http://"+URL).c_str());
|
||||
QString str = CCString("['http://" + ui->Sub_IP->currentText().toStdString() + ":" + ServerSettings["Sub_Web_PORT"] + "']").c_str();
|
||||
ui->Sub_Origins->setText(str);
|
||||
}
|
||||
|
||||
void Widget::SetSuBState(bool F) {
|
||||
if(F){
|
||||
ui->SubLabel->setStyleSheet("color: rgb(0, 255, 0);");
|
||||
ui->SubLabel->setText("后端:在线");
|
||||
}
|
||||
else{
|
||||
ui->SubLabel->setStyleSheet("color: rgb(255, 0, 0);");
|
||||
ui->SubLabel->setText("后端:离线");
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::SetWebState(bool F) {
|
||||
if(F){
|
||||
ui->WebLabel->setStyleSheet("color: rgb(0, 255, 0);");
|
||||
ui->WebLabel->setText("前端:在线");
|
||||
}
|
||||
else{
|
||||
ui->WebLabel->setStyleSheet("color: rgb(255, 0, 0);");
|
||||
ui->WebLabel->setText("前端:离线");
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::onTextChanged(const QString &text) {
|
||||
ui->Web_IP->setText(ui->Sub_IP->currentText());
|
||||
CCString URL = ui->Sub_IP->currentText().toStdString()+":"+ui->Web_Port->text().toStdString();
|
||||
ui->HTTPURL->setText(CCString("<a style='color: red; text-decoration: none' href = "+URL+">http://"+URL).c_str());
|
||||
QString str = CCString("['http://" + ui->Web_IP->text().toStdString() + ":" + text.toStdString() + "']").c_str();
|
||||
ui->Sub_Origins->setText(str);
|
||||
}
|
||||
|
||||
void Widget::SetSaveBtn() {
|
||||
if(ui->CS_IP->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "C/S_IP不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->CS_Port->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "C/S_Port不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Sub_IP->currentText().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Sub_IP不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Sub_Port->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Sub_Port不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Web_Port->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Web_Port不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Web_IP->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Web_IP不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Sub_Audio_Port->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Sub_Audio_Port不能为空");
|
||||
return;
|
||||
}
|
||||
if(ui->Sub_Origins->text().isEmpty()){
|
||||
QMessageBox::information(this, "Error", "Sub_Origins不能为空");
|
||||
return;
|
||||
}
|
||||
SetServerConfig();
|
||||
QMessageBox::information(this, "Success", "Write OK!");
|
||||
}
|
||||
|
||||
void Widget::ServerConfigInit() {
|
||||
QString IP = ui->Sub_IP->currentText();
|
||||
ui->CS_IP->setText(IP);
|
||||
ui->CS_Port->setText("5418");
|
||||
ui->Web_IP->setText(IP);
|
||||
ui->Sub_Port->setText("5417");
|
||||
ui->Web_Port->setText("5180");
|
||||
ui->Sub_Audio_Port->setText("52018");
|
||||
QString str = CCString("['http://" + ui->Web_IP->text().toStdString() + ":" + ui->Web_Port->text().toStdString() + "']").c_str();
|
||||
ui->Sub_Origins->setText(str);
|
||||
ui->LabguageBox->setCurrentIndex(0);
|
||||
}
|
||||
|
||||
void Widget::Initlogo() {
|
||||
CCString str = WebSubPaths + "html/assets/logo-CuXNbvLG.png";
|
||||
QPixmap pixmap(str.c_str()); // 替换为你的图片路径
|
||||
ui->logoIMG->setPixmap(pixmap);
|
||||
ui->logoIMG->setScaledContents(true); // 图片自动缩放以适应 QLabel 大小
|
||||
ui->logoIMG->setMaximumSize(111,61); // 设置 QLabel 最小尺寸
|
||||
ui->logos->setPixmap(pixmap);
|
||||
ui->logos->setScaledContents(true); // 图片自动缩放以适应 QLabel 大小
|
||||
ui->logoIMG->setMaximumSize(320,180); // 设置 QLabel 最小尺寸
|
||||
}
|
||||
|
||||
void Widget::SelectFile() {
|
||||
try {
|
||||
//定义文件对话框类
|
||||
QFileDialog *fileDialog = new QFileDialog(this);
|
||||
//定义文件对话框标题
|
||||
fileDialog->setWindowTitle(QStringLiteral("选择文件"));
|
||||
//设置打开的文件路径
|
||||
fileDialog->setDirectory("./");
|
||||
//设置文件过滤器,只显示.ui .cpp 文件,多个过滤文件使用空格隔开
|
||||
fileDialog->setNameFilter(tr("File(*.png*)"));
|
||||
//设置可以选择多个文件,默认为只能选择一个文件QFileDialog::ExistingFiles
|
||||
fileDialog->setFileMode(QFileDialog::ExistingFile);
|
||||
//设置视图模式
|
||||
fileDialog->setViewMode(QFileDialog::Detail);
|
||||
//获取选择的文件的路径
|
||||
QStringList fileNames;
|
||||
if (fileDialog->exec()) {
|
||||
fileNames = fileDialog->selectedFiles();
|
||||
}
|
||||
if(!fileNames.isEmpty()){
|
||||
CCString fileName = fileNames[0].toStdString();
|
||||
CCFile file = CCFile(fileName.c_str(), CC::ios::rb, false);
|
||||
CCString str = WebSubPaths + "html/assets/logo-CuXNbvLG.png";
|
||||
ui->ServerConsele->append(CCString("OLD:"+str).c_str());
|
||||
ui->ServerConsele->append(CCString("New:"+fileName).c_str());
|
||||
bool F = file.Copy(str);
|
||||
if(F){
|
||||
Initlogo();
|
||||
QMessageBox::information(this, "Success", "Copy OK!");
|
||||
}
|
||||
else{
|
||||
QMessageBox::information(this, "Error", "Failed to copy file,Chinese is not supported");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
ui->ServerConsele->append(e.what());
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::SetServerConfig() {
|
||||
FILE *fp = fopen(ServerSttingsPath.c_str(), "w");
|
||||
if (fp == nullptr) {
|
||||
QMessageBox::information(this, "Error", "Failed to open ServerSttings file");
|
||||
return;
|
||||
}
|
||||
// 写入配置数据
|
||||
fprintf(fp, "C/S_IP:%s\n",ui->CS_IP->text().toStdString().c_str());
|
||||
fprintf(fp, "C/S_PORT:%s\n",ui->CS_Port->text().toStdString().c_str());
|
||||
fprintf(fp, "Sub_Control_IP:%s\n",ui->Sub_IP->currentText().toStdString().c_str());
|
||||
fprintf(fp, "Sub_Control_PORT:%s\n",ui->Sub_Port->text().toStdString().c_str());
|
||||
fprintf(fp, "Sub_Control_Audio_PORT:%s\n",ui->Sub_Audio_Port->text().toStdString().c_str());
|
||||
fprintf(fp, "Sub_Web_PORT:%s\n",ui->Web_Port->text().toStdString().c_str());
|
||||
fprintf(fp, "Origins:%s\n",ui->Sub_Origins->text().toStdString().c_str());
|
||||
fprintf(fp, "#中文简体,English\n");
|
||||
fprintf(fp, "Language:%s\n",ui->LabguageBox->currentText().toStdString().c_str());
|
||||
fprintf(fp, "OpenSleep:%d\n",ui->OpenSleep->value());
|
||||
fclose(fp);
|
||||
fp = fopen(NginxSttingsPath.c_str(), "w");
|
||||
if (fp == nullptr) {
|
||||
QMessageBox::information(this, "Error", "Failed to open NginxSttings file");
|
||||
return;
|
||||
}
|
||||
// 写入配置数据
|
||||
fprintf(fp, "worker_processes 1;\n"
|
||||
"events {\n"
|
||||
" worker_connections 1024;\n"
|
||||
"}\n"
|
||||
"http {\n"
|
||||
" include mime.types;\n"
|
||||
" default_type application/octet-stream;\n"
|
||||
" sendfile on;\n"
|
||||
" keepalive_timeout 65;\n"
|
||||
" client_max_body_size 500m;\n"
|
||||
" server {\n"
|
||||
" listen %s;\n"
|
||||
" server_name %s;\n"
|
||||
" location / {\n"
|
||||
" root html;\n"
|
||||
" index index.html index.htm;\n"
|
||||
" try_files $uri $uri/ /index.html;\n"
|
||||
" # try_files $uri $uri/ @router;\n"
|
||||
" }\n"
|
||||
" location /api/ {\n"
|
||||
" #rewrite ^.+api/?(.*)$ /$1 break; \n"
|
||||
" rewrite ^/api/(.*)$ /$1 break; \n"
|
||||
" proxy_pass http://%s:%s/;\n"
|
||||
" proxy_redirect off;\n"
|
||||
" proxy_set_header Host $host;\n"
|
||||
" proxy_set_header X-Real-IP $remote_addr;\n"
|
||||
" proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n"
|
||||
" }\n"
|
||||
" error_page 500 502 503 504 /50x.html;\n"
|
||||
" location = /50x.html {\n"
|
||||
" root html;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
"}",ui->Web_Port->text().toStdString().c_str(),ui->Web_IP->text().toStdString().c_str(),
|
||||
ui->Sub_IP->currentText().toStdString().c_str(),ui->Sub_Port->text().toStdString().c_str());
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
void Widget::SetState(bool F) {
|
||||
CCString str = WebSubPaths + "State.cfg";
|
||||
CCFile file = CCFile(str.c_str(), CC::ios::w);
|
||||
file.Write(F ? "State:Open\n" : "State:Close\n");
|
||||
file.Close();
|
||||
}
|
||||
|
||||
void Widget::SetAutoStart(const QString &path, bool enable) {
|
||||
QSettings startupSettings("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows", QSettings::NativeFormat);
|
||||
if (enable) {
|
||||
startupSettings.setValue("IPBS_Station(Web)", path);
|
||||
} else {
|
||||
startupSettings.remove("IPBS_Station(Web)");
|
||||
}
|
||||
}
|
||||
|
||||
void Widget::OpenSerice(bool F) {
|
||||
#ifdef _WIN32
|
||||
|
||||
#elif __linux__
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void Widget::slotCheckedChanged(int i) {
|
||||
CCString str = "IPBS_Start";
|
||||
if(ui->OpenPCStart->isChecked()){
|
||||
SetAutoStart(str.c_str(),true);
|
||||
} else{
|
||||
SetAutoStart(str.c_str(),false);
|
||||
}
|
||||
str = WebSubPaths + QApplication::applicationName().toStdString() + ".exe.lnk";
|
||||
if(ui->OpenPCStart->isChecked()){
|
||||
CreateShortO();
|
||||
CCString A = OpenKit + QApplication::applicationName().toStdString() + ".exe.lnk";
|
||||
CCFile file = CCFile(str.c_str(), CC::ios::w,false);
|
||||
file.Copy(A);
|
||||
file.Deleted();
|
||||
} else{
|
||||
str = OpenKit + QApplication::applicationName().toStdString() + ".exe.lnk";
|
||||
CCFile file = CCFile(str.c_str(), CC::ios::w,false);
|
||||
file.Deleted();
|
||||
}
|
||||
}
|
||||
|
||||
bool Widget::checkAutoStartEntry(const QString &appName) {
|
||||
QSettings startupSettings("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows", QSettings::NativeFormat);
|
||||
return startupSettings.contains(appName);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user