Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add MMCP Development Preview #7155

Draft
wants to merge 111 commits into
base: development
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 88 commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
fc5b247
mudmaster chat work
jmckisson Feb 8, 2024
dd51cb8
mmcp fully working, fixed private chat missing carriage return
jmckisson Feb 8, 2024
9352301
add mmcp files to CMakeLists
jmckisson Feb 11, 2024
87af144
initialize mmcpServer ptr
jmckisson Feb 11, 2024
53ed8e5
Merge branch 'Mudlet:development' into development
jmckisson Feb 11, 2024
269932b
Merge branch 'Mudlet:development' into mmcp-dev
jmckisson Feb 11, 2024
699551d
remove getColorCode, moved to scripts
jmckisson Feb 12, 2024
888e48d
revert WITH_UPDATER
jmckisson Feb 17, 2024
df64bc2
chat preferences, snoop, more commands
jmckisson Feb 17, 2024
d651e6e
Merge branch 'Mudlet:development' into development
jmckisson Feb 17, 2024
ef7e183
Merge branch 'Mudlet:development' into mmcp-dev
jmckisson Feb 17, 2024
0c9242c
Merge branch 'mmcp-dev' of https://github.com/jmckisson/Mudlet into m…
jmckisson Feb 17, 2024
1ec6291
split mmcp lua code into separate cpp file
jmckisson Feb 17, 2024
fe42cdc
move mmcp options to child node
jmckisson Feb 17, 2024
fc9bfd0
add guards, send mudlet scmVersion as mmcp version
jmckisson Feb 17, 2024
89f8936
add peek, chat msgs now use postMessage
jmckisson Feb 18, 2024
d5cf54d
Merge branch 'development' into mmcp-dev
jmckisson Feb 18, 2024
35b17c5
Merge branch 'Mudlet:development' into mmcp-dev
jmckisson Feb 18, 2024
1fff890
Merge branch 'development' of https://github.com/jmckisson/Mudlet int…
jmckisson Feb 18, 2024
295375a
Merge remote-tracking branch 'origin/development' into mmcp-dev
jmckisson Feb 18, 2024
ba4fa5f
Merge branch 'mmcp-dev' of https://github.com/jmckisson/Mudlet into m…
jmckisson Feb 18, 2024
19ed75d
cleanup
jmckisson Feb 18, 2024
74bde1a
codefactor fixes
jmckisson Feb 18, 2024
eb13e11
fix overtloaded signal connection
jmckisson Feb 18, 2024
b1cadee
tab fixes and add copyright
jmckisson Feb 18, 2024
c26c141
move copyright
jmckisson Feb 18, 2024
f66ac57
cast error signal to avoid conflict with QObject::error
jmckisson Feb 18, 2024
4879de5
add chat group, ip display fixes, newline fix for chatAll
jmckisson Feb 20, 2024
6bba39b
fix port padding
jmckisson Feb 23, 2024
bcfe448
side channel
jmckisson Feb 23, 2024
90b9ac4
add end marker to side channel message
jmckisson Feb 23, 2024
12671c9
remove extra newline on chatAll display, move SideChannel event to MM…
jmckisson Feb 24, 2024
cb24311
Improve: add support for a codec to support a revised Medievia custom…
SlySven Feb 9, 2024
de51573
add leading carriage return to self chatAll display
jmckisson Feb 25, 2024
da190f5
Merge branch 'Mudlet:development' into mmcp-dev
jmckisson Feb 25, 2024
75af708
Merge branch 'mmcp-dev' of https://github.com/jmckisson/Mudlet into m…
jmckisson Feb 25, 2024
5c22f1d
Merge remote-tracking branch 'slysven/Improve_addMedieviaSpecificDeco…
jmckisson Feb 25, 2024
729ead2
only send side channel data to mudlet clients
jmckisson Feb 25, 2024
1c61ba2
Merge branch 'development' into mmcp-dev
SlySven Feb 28, 2024
3577e8e
fix and tidy peek request and display
jmckisson Feb 29, 2024
6d319ce
more CR fixes, peek request fix, peek display tidy
jmckisson Feb 29, 2024
69c93cc
dont stat server only to stop it
jmckisson Feb 29, 2024
7c14456
fix handling of partial chat buffers
jmckisson Feb 29, 2024
8f4eb85
pretty up peek list display
jmckisson Feb 29, 2024
b094bce
dont echo password and such while snooping
jmckisson Mar 5, 2024
06cd98a
Fix: add missing braces
SlySven Mar 6, 2024
8288aa1
fix chatStartServer arg
jmckisson Mar 6, 2024
80bb588
simplify trimming of displayed chat messages
jmckisson Mar 6, 2024
280754c
fix qt version macro, remove regex for future handling of utf8 encoding
jmckisson Mar 6, 2024
c86a8ea
Merge branch 'mmcp-dev' into Fix_addMissingBraces
jmckisson Mar 6, 2024
c03c6a7
Merge pull request #1 from SlySven/Fix_addMissingBraces
jmckisson Mar 6, 2024
6db10f0
Improve: simplify some MMCPServer methods
SlySven Mar 7, 2024
07be048
Merge pull request #2 from SlySven/Improve_simplifySomeMMCPServerMethods
jmckisson Mar 7, 2024
e690269
mmcpmessage event
jmckisson Mar 9, 2024
37a20f6
fix chatname message in setgroup
jmckisson Mar 9, 2024
4c531b6
Merge branch 'development' into mmcp-dev
SlySven Mar 9, 2024
970be1c
Merge branch 'development' into mmcp-dev
SlySven Mar 10, 2024
c7306cc
Merge branch 'development' into mmcp-dev
SlySven Mar 11, 2024
7ab9cb5
fix mmcpmessage event
jmckisson Mar 11, 2024
5cd05ae
add do not disturb
jmckisson Mar 11, 2024
aff68a0
Merge branch 'mmcp-dev' of https://github.com/jmckisson/Mudlet into m…
jmckisson Mar 11, 2024
881a570
Merge branch 'development' into mmcp-dev
SlySven Mar 11, 2024
a9fd491
Improve: rename some members and methods
SlySven Mar 8, 2024
ec6419e
oops
jmckisson Mar 12, 2024
034e499
add chatDoNotDisturb lua func entry
jmckisson Mar 12, 2024
9b9be54
Merge pull request #3 from SlySven/Improve_renameMembersAndMethods
jmckisson Mar 12, 2024
afc9570
Infrastructure: remove Host::mMMCPAppendNewlineAfterChats
SlySven Mar 13, 2024
9b930dc
Merge branch 'mmcp-dev' of https://github.com/jmckisson/Mudlet into m…
jmckisson Mar 15, 2024
59d2896
fix do not disturb from merge
jmckisson Mar 15, 2024
a9ffe37
add do not disturb to lua registry
jmckisson Mar 15, 2024
bf74e60
dont continue with client accept if port part fails
jmckisson Mar 15, 2024
f9a050d
prepend chatname to emoteAll messages
jmckisson Mar 15, 2024
8c0d246
Fix: bug in displaying Peek information from a peer
SlySven Mar 15, 2024
a06abfc
Fix: typo in revised header guards
SlySven Mar 15, 2024
4025bc3
fix outgoing connect msg
jmckisson Mar 15, 2024
6a11915
use default chat server setting, display server stop message
jmckisson Mar 16, 2024
91ae2f5
Improve: convert `QString(...)` to `qsl(...)` or `tr(...)`
SlySven Mar 15, 2024
8e84cd2
Revise: report disconnections
SlySven Mar 19, 2024
f40a188
fix out of order host/post on connect, how did this happen?
jmckisson Mar 19, 2024
4fdb8ee
temporary change, set terminal name to detailed string
jmckisson Mar 19, 2024
ade9e69
Fix: handle some pathological cases
SlySven Mar 20, 2024
4fc82e0
Improve: handle the case where a group gets emptied better
SlySven Mar 20, 2024
b1de862
Fix: correct three error messages to match others
SlySven Mar 20, 2024
5a5443c
Merge branch 'SlySven_mmcp-dev' into mmcp-dev
SlySven Mar 20, 2024
a9f619e
Merge branch 'premerge-mmcp-dev' into mmcp-dev
SlySven Mar 20, 2024
35d10c4
Revert "temporary change, set terminal name to detailed string"
SlySven Mar 20, 2024
401a0a5
Infrastructure: brand this PR's builds with a semi-permanent MMCP text
SlySven Mar 20, 2024
ad2a705
Fix: clean up some rough edges
SlySven Mar 20, 2024
524b2b1
Merge pull request #4 from SlySven/mmcp-dev
jmckisson Mar 20, 2024
63bd689
add various chat options
jmckisson Mar 23, 2024
98b03a7
add chat options
jmckisson Mar 23, 2024
58e4dc9
temporary change, provide scmVersion for terminal name
jmckisson Mar 23, 2024
343f03f
add game details and icon for Medievia
jmckisson Mar 27, 2024
49c1f6e
add support for auto accept chat calls and manual accept/deny
jmckisson Mar 27, 2024
0d333bc
change side channel cmd to dec 40
jmckisson Mar 29, 2024
07343f9
re-add postMMCPMessage to clientMessage
jmckisson Mar 29, 2024
0ae856e
add medievia font
jmckisson Apr 10, 2024
7eb11f2
add medievia specific bootstrap script
jmckisson Apr 10, 2024
b074655
add bootstrap script for medievia
jmckisson Apr 12, 2024
a0e809a
modify formatting of side channel
jmckisson Apr 12, 2024
ec3df4b
Merge branch 'development' of https://github.com/jmckisson/Mudlet int…
jmckisson Apr 12, 2024
a365885
Merge branch 'development' into mmcp-dev
jmckisson Apr 12, 2024
0b12c4e
update osdn mirror to hopefully working one
jmckisson Apr 13, 2024
bbfacfb
add boostrap version
jmckisson Apr 13, 2024
31a35d1
increment boostrap version, trying to get appveyor working
jmckisson Apr 13, 2024
c44e64f
try princeton osdn mirror
jmckisson Apr 13, 2024
0e08b83
change mingw-get download to archive.org pr 7204
jmckisson Apr 13, 2024
a226d33
update icon to fix libpng bKGD invalid issue
jmckisson Apr 15, 2024
c01f5f1
update MedBootstrap script
jmckisson Apr 17, 2024
0e55b62
Merge branch 'development' into mmcp-dev
jlabmckisson Apr 30, 2024
d37d45c
Merge branch 'development' into mmcp-dev
SlySven May 7, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 4 additions & 3 deletions CMakeLists.txt
Expand Up @@ -134,9 +134,10 @@ if(DEFINED ENV{MUDLET_VERSION_BUILD} AND NOT $ENV{MUDLET_VERSION_BUILD}
message(STATUS "Value written to app-build.txt file: $ENV{MUDLET_VERSION_BUILD}-${GIT_SHA1}")
set(APP_BUILD $ENV{MUDLET_VERSION_BUILD} CACHE STRING "This variable is automatically set during the CMake run and should not be manually altered!" FORCE)
else()
file(WRITE ${CMAKE_SOURCE_DIR}/src/app-build.txt "-dev-${GIT_SHA1}")
message(STATUS "Value written to app-build.txt file: -dev-${GIT_SHA1}")
set(APP_BUILD "-dev" CACHE STRING "This variable is automatically set during the CMake run and should not be manually altered!" FORCE)
# PLACEMARKER: revert "MMCP" back to "dev" in the next three lines before merging this code into the main development branch:
file(WRITE ${CMAKE_SOURCE_DIR}/src/app-build.txt "-MMCP-${GIT_SHA1}")
message(STATUS "Value written to app-build.txt file: -MMCP-${GIT_SHA1}")
set(APP_BUILD "-MMCP" CACHE STRING "This variable is automatically set during the CMake run and should not be manually altered!" FORCE)
Comment on lines +137 to +140
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# PLACEMARKER: revert "MMCP" back to "dev" in the next three lines before merging this code into the main development branch:
file(WRITE ${CMAKE_SOURCE_DIR}/src/app-build.txt "-MMCP-${GIT_SHA1}")
message(STATUS "Value written to app-build.txt file: -MMCP-${GIT_SHA1}")
set(APP_BUILD "-MMCP" CACHE STRING "This variable is automatically set during the CMake run and should not be manually altered!" FORCE)
file(WRITE ${CMAKE_SOURCE_DIR}/src/app-build.txt "-dev-${GIT_SHA1}")
message(STATUS "Value written to app-build.txt file: -dev-${GIT_SHA1}")
set(APP_BUILD "-dev" CACHE STRING "This variable is automatically set during the CMake run and should not be manually altered!" FORCE)

# Core dev team setting things up for a release should comment out the above
# three lines and uncomment these below - note that the app-build.txt must not
# contain anything (other than whitespace) for a RELEASE build:
Expand Down
6 changes: 6 additions & 0 deletions src/CMakeLists.txt
Expand Up @@ -98,6 +98,9 @@ set(mudlet_SRCS
LuaInterface.cpp
main.cpp
mapInfoContributorManager.cpp
MMCPServer.cpp
MMCPClient.cpp
TLuaInterpreterMMCP.cpp
mudlet.cpp
MudletInstanceCoordinator.cpp
ShortcutsManager.cpp
Expand Down Expand Up @@ -262,6 +265,9 @@ set(mudlet_HDRS
KeyUnit.h
LuaInterface.h
mapInfoContributorManager.h
MMCP.h
MMCPServer.h
MMCPClient.h
mudlet.h
MudletInstanceCoordinator.h
post_guard.h
Expand Down
66 changes: 65 additions & 1 deletion src/Host.cpp
@@ -1,7 +1,7 @@
/***************************************************************************
* Copyright (C) 2008-2013 by Heiko Koehn - KoehnHeiko@googlemail.com *
* Copyright (C) 2014 by Ahmed Charles - acharles@outlook.com *
* Copyright (C) 2015-2023 by Stephen Lyons - slysven@virginmedia.com *
* Copyright (C) 2015-2024 by Stephen Lyons - slysven@virginmedia.com *
* Copyright (C) 2016 by Ian Adkins - ieadkins@gmail.com *
* Copyright (C) 2018 by Huadong Qi - novload@outlook.com *
* Copyright (C) 2023 by Lecker Kebap - Leris@mudlet.org *
Expand Down Expand Up @@ -51,6 +51,8 @@
#include "dlgProfilePreferences.h"
#include "dlgIRC.h"
#include "mudlet.h"
#include "MMCP.h"
#include "MMCPServer.h"

#include "pre_guard.h"
#include <chrono>
Expand Down Expand Up @@ -328,7 +330,12 @@ Host::Host(int port, const QString& hostname, const QString& login, const QStrin
, mSearchOptions(dlgTriggerEditor::SearchOption::SearchOptionNone)
, mBufferSearchOptions(TConsole::SearchOption::SearchOptionNone)
, mpDlgIRC(nullptr)
, mmcpServer(nullptr)
, mpDlgProfilePreferences(nullptr)
, mMMCPChatPort(csDefaultMMCPHostPort)
, mMMCPAutostartServer(false)
, mMMCPAllowConnectionRequests(false)
, mMMCPAllowPeekRequests(false)
, mTutorialForCompactLineAlreadyShown(false)
, mDisplayFont(QFont(qsl("Bitstream Vera Sans Mono"), 14, QFont::Normal))
, mLuaInterface(nullptr)
Expand Down Expand Up @@ -1633,6 +1640,16 @@ void Host::postIrcMessage(const QString& a, const QString& b, const QString& c)
raiseEvent(event);
}

void Host::postChatChannelMessage(const QString& from, const QString& channel, const QString& message)
{
TEvent event {};
event.mArgumentList << csMMCPChatSideChannelEvent;
event.mArgumentList << from << channel << message;
event.mArgumentTypeList << ARGUMENT_TYPE_STRING << ARGUMENT_TYPE_STRING << ARGUMENT_TYPE_STRING << ARGUMENT_TYPE_STRING;
raiseEvent(event);
}


void Host::enableTimer(const QString& name)
{
mTimerUnit.enableTimer(name);
Expand Down Expand Up @@ -2708,6 +2725,53 @@ bool Host::discordUserIdMatch(const QString& userName, const QString& userDiscri
}
}

void Host::postMMCPMessage(const QString& a) {
TEvent event {};
event.mArgumentList << QLatin1String("sysMMCPMessage");
event.mArgumentList << a;
event.mArgumentTypeList << ARGUMENT_TYPE_STRING << ARGUMENT_TYPE_STRING;
raiseEvent(event);
}

void Host::initMMCPServer() {
if (mmcpServer) {
return;
}

mmcpServer = new MMCPServer(this);
}

/**
* Get the current chat name from the MMCPServer if it exists, otherwise
* read it from our saved profile information
* There is also the mMMCPChatname read from the xml package, where should we
* use that?
*/
QString Host::getMMCPChatName() {
return mMMCPChatName;
}

void Host::setMMCPChatName(const QString& name) {
mMMCPChatName = name;
emit mmcpChatNameChanged(name);
}

quint16 Host::getMMCPPort() {
return mMMCPChatPort;
}

bool Host::getMMCPAutoStartServer() {
return mMMCPAutostartServer;
}

bool Host::getMMCPAllowConnectionRequests() {
return mMMCPAllowConnectionRequests;
}

bool Host::getMMCPAllowPeekRequests() {
return mMMCPAllowPeekRequests;
}

QString Host::getSpellDic()
{
if (!mSpellDic.isEmpty()) {
Expand Down
19 changes: 19 additions & 0 deletions src/Host.h
Expand Up @@ -68,6 +68,7 @@ class TConsole;
class TMainConsole;
class dlgNotepad;
class TMap;
class MMCPServer;
class dlgIRC;
class dlgPackageManager;
class dlgModuleManager;
Expand Down Expand Up @@ -241,6 +242,8 @@ class Host : public QObject

void incomingStreamProcessor(const QString& paragraph, int line);
void postIrcMessage(const QString&, const QString&, const QString&);
void postMMCPMessage(const QString&);
void postChatChannelMessage(const QString&, const QString&, const QString&);
void enableTimer(const QString&);
void disableTimer(const QString&);
void enableTrigger(const QString&);
Expand Down Expand Up @@ -325,6 +328,11 @@ class Host : public QObject
void clearDiscordData();
void processDiscordMSDP(const QString& variable, QString value);
bool discordUserIdMatch(const QString& userName, const QString& userDiscriminator) const;
QString getMMCPChatName();
quint16 getMMCPPort();
bool getMMCPAutoStartServer();
bool getMMCPAllowConnectionRequests();
bool getMMCPAllowPeekRequests();
void setMmpMapLocation(const QString& data);
QString getMmpMapLocation() const;
void setMediaLocationGMCP(const QString& mediaUrl);
Expand Down Expand Up @@ -420,6 +428,9 @@ class Host : public QObject
bool showIdsInEditor() const { return mShowIDsInEditor; }
void setShowIdsInEditor(const bool isShown) { mShowIDsInEditor = isShown; if (mpEditorDialog) {mpEditorDialog->showIDLabels(isShown);} }

void initMMCPServer();
void setMMCPChatName(const QString&);

cTelnet mTelnet;
QPointer<TMainConsole> mpConsole;
dlgPackageManager* mpPackageManager;
Expand Down Expand Up @@ -669,6 +680,7 @@ class Host : public QObject
dlgTriggerEditor::SearchOptions mSearchOptions;
TConsole::SearchOptions mBufferSearchOptions;
QPointer<dlgIRC> mpDlgIRC;
MMCPServer *mmcpServer;
QPointer<dlgProfilePreferences> mpDlgProfilePreferences;
QList<QString> mDockLayoutChanges;
QList<QPointer<TToolBar>> mToolbarLayoutChanges;
Expand Down Expand Up @@ -717,6 +729,7 @@ class Host : public QObject
void signal_controlCharacterHandlingChanged(const ControlCharacterMode);
// Tells all command lines to save their history:
void signal_saveCommandLinesHistory();
void mmcpChatNameChanged(const QString&);

private slots:
void slot_purgeTemps();
Expand Down Expand Up @@ -819,6 +832,12 @@ private slots:
QString mRequiredDiscordUserName;
QString mRequiredDiscordUserDiscriminator;

QString mMMCPChatName;
quint16 mMMCPChatPort;
bool mMMCPAutostartServer;
bool mMMCPAllowConnectionRequests;
bool mMMCPAllowPeekRequests;

// Handles whether to treat 16M-Colour ANSI SGR codes which only use
// semi-colons as separator have the initial Colour Space Id parameter
// (true) or not (false):
Expand Down
91 changes: 91 additions & 0 deletions src/MMCP.h
@@ -0,0 +1,91 @@
#ifndef MUDLET_MMCP_H
#define MUDLET_MMCP_H
/***************************************************************************
* Copyright (C) 2024 by John McKisson - john.mckisson@gmail.com *
* Copyright (C) 2024 by Stephen Lyons - slysven@virginmedia.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/

#include "pre_guard.h"
#include <QFlags>
#include "post_guard.h"

inline static uint16_t csDefaultMMCPHostPort{4050};
inline static QLatin1String csDefaultMMCPChatName{"Mudlet"};
inline static QLatin1String csDefaultMMCPGroupName{"<none>"};
inline static QLatin1String csMMCPChatSideChannelEvent{"sysChatChannelMessage"};

enum MMCPChatCommand {
NameChange = 1,
RequestConnections = 2,
ConnectionList = 3,
TextEveryone = 4,
TextPersonal = 5,
TextGroup = 6,
Message = 7,
DoNotDisturb = 8,
Version = 19,
FileStart = 20,
FileDeny = 21,
FileBlockRequest = 22,
FileBlock = 23,
FileEnd = 24,
FileCancel = 25,
PingRequest = 26,
PingResponse = 27,
PeekConnections = 28,
PeekList = 29,
Snoop = 30,
SnoopData = 31,
SnoopColor = 32,
SideChannel = 33,
ChannelData = 240,
End = 255
};
Q_DECLARE_FLAGS(MMCPChatCommands, MMCPChatCommand)

namespace AnsiColors {
constexpr char const* RST = "\x1b[0m";
constexpr char const* BLD = "\x1b[1m";
constexpr char const* REV = "\x1b[7m";
constexpr char const* FBLK = "\x1b[30m";
constexpr char const* FRED = "\x1b[31m";
constexpr char const* FGRN = "\x1b[32m";
constexpr char const* FYEL = "\x1b[33m";
constexpr char const* FBLU = "\x1b[34m";
constexpr char const* FMAG = "\x1b[35m";
constexpr char const* FCYN = "\x1b[36m";
constexpr char const* FWHT = "\x1b[37m";
constexpr char const* FBLDGRY = "\x1b[1;30m";
constexpr char const* FBLDRED = "\x1b[1;31m";
constexpr char const* FBLDGRN = "\x1b[1;32m";
constexpr char const* FBLDYEL = "\x1b[1;33m";
constexpr char const* FBLDBLU = "\x1b[1;34m";
constexpr char const* FBLDMAG = "\x1b[1;35m";
constexpr char const* FBLDCYN = "\x1b[1;36m";
constexpr char const* FBLDWHT = "\x1b[1;37m";
constexpr char const* BBLK = "\x1b[40m";
constexpr char const* BRED = "\x1b[41m";
constexpr char const* BGRN = "\x1b[42m";
constexpr char const* BYEL = "\x1b[43m";
constexpr char const* BBLU = "\x1b[44m";
constexpr char const* BMAG = "\x1b[45m";
constexpr char const* BCYN = "\x1b[46m";
constexpr char const* BWHT = "\x1b[47m";
} // namespace AnsiColors

#endif // MUDLET_MMCP_H