@@ -455,7 +455,42 @@ void SocketApi::command_VERSION(const QString &, SocketListener *listener)
455455
456456void SocketApi::command_SHARE_MENU_TITLE (const QString &, SocketListener *listener)
457457{
458- listener->sendMessage (QLatin1String (" SHARE_MENU_TITLE:" ) + tr (" Share with %1" , " parameter is Nextcloud" ).arg (Theme::instance ()->appNameGUI ()));
458+ // listener->sendMessage(QLatin1String("SHARE_MENU_TITLE:") + tr("Share with %1", "parameter is Nextcloud").arg(Theme::instance()->appNameGUI()));
459+ listener->sendMessage (QLatin1String (" SHARE_MENU_TITLE:" ) + Theme::instance ()->appNameGUI ());
460+ }
461+
462+ void SocketApi::command_EDIT (const QString &localFile, SocketListener *listener)
463+ {
464+ auto fileData = FileData::get (localFile);
465+ if (!fileData.folder ) {
466+ qCWarning (lcSocketApi) << " Unknown path" << localFile;
467+ return ;
468+ }
469+
470+ auto record = fileData.journalRecord ();
471+ if (!record.isValid ())
472+ return ;
473+
474+ DirectEditor* editor = getDirectEditorForLocalFile (fileData.localPath );
475+ if (!editor)
476+ return ;
477+
478+ JsonApiJob *job = new JsonApiJob (fileData.folder ->accountState ()->account (), QLatin1String (" ocs/v2.php/apps/files/api/v1/directEditing/open" ), this );
479+
480+ QUrlQuery params;
481+ params.addQueryItem (" path" , fileData.accountRelativePath );
482+ params.addQueryItem (" editorId" , editor->id ());
483+ job->addQueryParams (params);
484+ job->usePOST ();
485+
486+ QObject::connect (job, &JsonApiJob::jsonReceived, [](const QJsonDocument &json){
487+ auto data = json.object ().value (" ocs" ).toObject ().value (" data" ).toObject ();
488+ auto url = QUrl (data.value (" url" ).toString ());
489+
490+ if (!url.isEmpty ())
491+ Utility::openBrowser (url, nullptr );
492+ });
493+ job->start ();
459494}
460495
461496// don't pull the share manager into socketapi unittests
@@ -644,7 +679,7 @@ void SocketApi::command_GET_STRINGS(const QString &argument, SocketListener *lis
644679{
645680 static std::array<std::pair<const char *, QString>, 5 > strings { {
646681 { " SHARE_MENU_TITLE" , tr (" Share options" ) },
647- { " CONTEXT_MENU_TITLE" , tr ( " Share via %1 " ). arg ( Theme::instance ()->appNameGUI ()) },
682+ { " CONTEXT_MENU_TITLE" , Theme::instance ()->appNameGUI () },
648683 { " COPY_PRIVATE_LINK_MENU_TITLE" , tr (" Copy private link to clipboard" ) },
649684 { " EMAIL_PRIVATE_LINK_MENU_TITLE" , tr (" Send private link by email …" ) },
650685 } };
@@ -738,13 +773,41 @@ void SocketApi::command_GET_MENU_ITEMS(const QString &argument, OCC::SocketListe
738773 FileData fileData = hasSeveralFiles ? FileData{} : FileData::get (argument);
739774 bool isOnTheServer = fileData.journalRecord ().isValid ();
740775 auto flagString = isOnTheServer ? QLatin1String (" ::" ) : QLatin1String (" :d:" );
776+ auto capabilities = fileData.folder ->accountState ()->account ()->capabilities ();
777+
741778 if (fileData.folder && fileData.folder ->accountState ()->isConnected ()) {
779+ DirectEditor* editor = getDirectEditorForLocalFile (fileData.localPath );
780+ if (editor) {
781+ // listener->sendMessage(QLatin1String("MENU_ITEM:EDIT") + flagString + tr("Edit via ") + editor->name());
782+ listener->sendMessage (QLatin1String (" MENU_ITEM:EDIT" ) + flagString + tr (" Edit" ));
783+ } else {
784+ listener->sendMessage (QLatin1String (" MENU_ITEM:OPEN_PRIVATE_LINK" ) + flagString + tr (" Open in browser" ));
785+ }
786+
742787 sendSharingContextMenuOptions (fileData, listener);
743- listener->sendMessage (QLatin1String (" MENU_ITEM:OPEN_PRIVATE_LINK" ) + flagString + tr (" Open in browser" ));
744788 }
745789 listener->sendMessage (QString (" GET_MENU_ITEMS:END" ));
746790}
747791
792+ DirectEditor* SocketApi::getDirectEditorForLocalFile (const QString &localFile)
793+ {
794+ FileData fileData = FileData::get (localFile);
795+ auto capabilities = fileData.folder ->accountState ()->account ()->capabilities ();
796+
797+ if (fileData.folder && fileData.folder ->accountState ()->isConnected ()) {
798+ QMimeDatabase db;
799+ QMimeType type = db.mimeTypeForFile (localFile);
800+
801+ DirectEditor* editor = capabilities.getDirectEditorForMimetype (type);
802+ if (!editor) {
803+ editor = capabilities.getDirectEditorForOptionalMimetype (type);
804+ }
805+ return editor;
806+ }
807+
808+ return nullptr ;
809+ }
810+
748811QString SocketApi::buildRegisterPathMessage (const QString &path)
749812{
750813 QFileInfo fi (path);
0 commit comments