рефакторинг кода сервера компонент
This commit is contained in:
4
.idea/workspace.xml
generated
4
.idea/workspace.xml
generated
@@ -8,9 +8,9 @@
|
|||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="e42177c3-2328-4b27-8a01-35779b2beb99" name="Default Changelist" comment="">
|
<list default="true" id="e42177c3-2328-4b27-8a01-35779b2beb99" name="Default Changelist" comment="">
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/Passes/Server/RepositoryPass.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/Passes/Server/RepositoryPass.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/Constants.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/Constants.java" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/Repository/Server/ComponentsServer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/Repository/Server/ComponentsServer.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/Repository/Server/ServerCode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/Repository/Server/ServerCode.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/Repository/Server/ServerCode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/Repository/Server/ServerCode.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/Common/TestingServer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/Common/TestingServer.java" afterDir="false" />
|
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ public class Constants {
|
|||||||
"bad termination"
|
"bad termination"
|
||||||
};
|
};
|
||||||
public final static String separator = "----------------------------------";
|
public final static String separator = "----------------------------------";
|
||||||
|
public static final String server_dvm_drv = "/home/DVM/dvm_current/dvm_sys/bin/dvm_drv"; //зависимость от путей. в настройки?
|
||||||
//-------------------------------------------------------
|
//-------------------------------------------------------
|
||||||
public static String[] resourses_names = new String[]{
|
public static String[] resourses_names = new String[]{
|
||||||
//--
|
//--
|
||||||
|
|||||||
@@ -37,17 +37,16 @@ import java.util.Calendar;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Vector;
|
import java.util.Vector;
|
||||||
public class ComponentsServer extends RepositoryServer<BugReportsDatabase> {
|
public class ComponentsServer extends RepositoryServer<BugReportsDatabase> {
|
||||||
public static final String server_dvm_drv = "/home/DVM/dvm_current/dvm_sys/bin/dvm_drv";
|
|
||||||
public static ZipFolderPass zip = new ZipFolderPass();
|
public static ZipFolderPass zip = new ZipFolderPass();
|
||||||
public static UnzipFolderPass unzip = new UnzipFolderPass();
|
public static UnzipFolderPass unzip = new UnzipFolderPass();
|
||||||
public static ArchivesBackupPass backupSession = new ArchivesBackupPass();
|
public static ArchivesBackupPass backupSession = new ArchivesBackupPass();
|
||||||
//-
|
//-
|
||||||
public static Vector<Pair<Machine, User>> storages = new Vector<>(Arrays.asList(new Pair<>(new Machine("titan", "dvmh.keldysh.ru", 22, MachineType.Server), new User("dvmuser1", "mprit_2011"))
|
public static Vector<Pair<Machine, User>> storages = new Vector<>(
|
||||||
/*
|
Arrays.asList(new Pair<>(new Machine("titan",
|
||||||
new Pair<>(
|
"dvmh.keldysh.ru",
|
||||||
new Machine("k100", "k100.kiam.ru", 22, MachineType.Server),
|
22, MachineType.Server),
|
||||||
new User("dvmuser1", "mprit_2011"))
|
new User("dvmuser1", "mprit_2011"))
|
||||||
*/));
|
));
|
||||||
//-
|
//-
|
||||||
protected Thread backUp = new Thread(() -> {
|
protected Thread backUp = new Thread(() -> {
|
||||||
while (true) {
|
while (true) {
|
||||||
@@ -140,7 +139,12 @@ public class ComponentsServer extends RepositoryServer<BugReportsDatabase> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void DVMConvertProject() throws Exception {
|
@Override
|
||||||
|
protected void startAdditionalThreads() {
|
||||||
|
backUp.start();
|
||||||
|
}
|
||||||
|
//-
|
||||||
|
void DVMConvertProject() throws Exception {
|
||||||
String[] args = request.arg.split("\n");
|
String[] args = request.arg.split("\n");
|
||||||
//-
|
//-
|
||||||
String projectName = args[0];
|
String projectName = args[0];
|
||||||
@@ -160,7 +164,7 @@ public class ComponentsServer extends RepositoryServer<BugReportsDatabase> {
|
|||||||
File program = Paths.get(project.getAbsolutePath(), fileName).toFile();
|
File program = Paths.get(project.getAbsolutePath(), fileName).toFile();
|
||||||
//--
|
//--
|
||||||
File convertedProgram = Paths.get(program.getParent(), Utils_.getFileNameWithoutExtension(program) + ".DVMH." + (projectLanguage.equals(LanguageName.fortran) ? "f" : "c")).toFile();
|
File convertedProgram = Paths.get(program.getParent(), Utils_.getFileNameWithoutExtension(program) + ".DVMH." + (projectLanguage.equals(LanguageName.fortran) ? "f" : "c")).toFile();
|
||||||
String command = Utils_.DQuotes(server_dvm_drv) + " " + projectLanguage.getDVMCompile() + "dv " + options + " " + Utils_.DQuotes(program.getName());
|
String command = Utils_.DQuotes(Constants.server_dvm_drv) + " " + projectLanguage.getDVMCompile() + "dv " + options + " " + Utils_.DQuotes(program.getName());
|
||||||
//--
|
//--
|
||||||
File fileWorkspace = program.getParentFile();
|
File fileWorkspace = program.getParentFile();
|
||||||
Process process = Utils.startScript(workspace, fileWorkspace, Utils_.getDateName("convert_script"), command);
|
Process process = Utils.startScript(workspace, fileWorkspace, Utils_.getDateName("convert_script"), command);
|
||||||
@@ -186,8 +190,7 @@ public class ComponentsServer extends RepositoryServer<BugReportsDatabase> {
|
|||||||
//--
|
//--
|
||||||
} else throw new RepositoryRefuseException("Внутренняя ошибка. Не удалось распаковать проект");
|
} else throw new RepositoryRefuseException("Внутренняя ошибка. Не удалось распаковать проект");
|
||||||
}
|
}
|
||||||
private void GetComponentsVersionsInfo() throws Exception {
|
void GetComponentsVersionsInfo() throws Exception {
|
||||||
Print("Получить информацию о версиях компонент");
|
|
||||||
Vector<String> types = (Vector<String>) request.object;
|
Vector<String> types = (Vector<String>) request.object;
|
||||||
Vector<ComponentVersionsInfoJson> res = new Vector<>();
|
Vector<ComponentVersionsInfoJson> res = new Vector<>();
|
||||||
for (String sType : types) {
|
for (String sType : types) {
|
||||||
@@ -199,30 +202,21 @@ public class ComponentsServer extends RepositoryServer<BugReportsDatabase> {
|
|||||||
info.minimal_version = Utils_.removeCharacters(Utils.ReadAllText(minimalVersionFile), "\n", "\r");
|
info.minimal_version = Utils_.removeCharacters(Utils.ReadAllText(minimalVersionFile), "\n", "\r");
|
||||||
res.add(info);
|
res.add(info);
|
||||||
}
|
}
|
||||||
response = new ServerExchangeUnit_2021(ServerCode.OK);
|
|
||||||
response.object = res;
|
response.object = res;
|
||||||
}
|
}
|
||||||
private void AppendBugReportField() throws Exception {
|
void AppendBugReportField() throws Exception {
|
||||||
BugReportAdditionJson transport = (BugReportAdditionJson) request.object;
|
BugReportAdditionJson transport = (BugReportAdditionJson) request.object;
|
||||||
Print("Дополнить поле " + request.arg + " баг репорта " + transport.id);
|
|
||||||
if (db.bugReports.containsKey(transport.id)) {
|
if (db.bugReports.containsKey(transport.id)) {
|
||||||
BugReport actual = db.bugReports.get(transport.id);
|
BugReport actual = db.bugReports.get(transport.id);
|
||||||
Field field = BugReport.class.getField(transport.fieldName);
|
Field field = BugReport.class.getField(transport.fieldName);
|
||||||
field.set(actual, field.get(actual) + "\n" + transport.textAddition);
|
field.set(actual, field.get(actual) + "\n" + transport.textAddition);
|
||||||
actual.change_date = new Date().getTime();
|
actual.change_date = new Date().getTime();
|
||||||
db.Update(actual);
|
db.Update(actual);
|
||||||
response = new ServerExchangeUnit_2021(ServerCode.OK);
|
|
||||||
response.object = actual;
|
response.object = actual;
|
||||||
} else throw new RepositoryRefuseException("Баг репорт с ключом " + transport.id + " не существует.");
|
} else throw new RepositoryRefuseException("Баг репорт с ключом " + transport.id + " не существует.");
|
||||||
}
|
}
|
||||||
@Override
|
void PublishComponent() throws Exception {
|
||||||
protected void startAdditionalThreads() {
|
|
||||||
backUp.start();
|
|
||||||
}
|
|
||||||
//-
|
|
||||||
private void UpdateComponent() throws Exception {
|
|
||||||
ComponentPublicationInfoJson info = (ComponentPublicationInfoJson) request.object;
|
ComponentPublicationInfoJson info = (ComponentPublicationInfoJson) request.object;
|
||||||
Print("Опубликовать компонент " + info.componentType);
|
|
||||||
File componentHome = Utils_.getFile(Utils_.getHomePath(), "Components", info.componentType.toString());
|
File componentHome = Utils_.getFile(Utils_.getHomePath(), "Components", info.componentType.toString());
|
||||||
File componentFile = new File(componentHome, info.fileName);
|
File componentFile = new File(componentHome, info.fileName);
|
||||||
File versionFile = new File(componentHome, "version.txt");
|
File versionFile = new File(componentHome, "version.txt");
|
||||||
@@ -261,10 +255,8 @@ public class ComponentsServer extends RepositoryServer<BugReportsDatabase> {
|
|||||||
bufferWriter_.write("Минимальная версия поднята до " + info.versionText + "\n");
|
bufferWriter_.write("Минимальная версия поднята до " + info.versionText + "\n");
|
||||||
bufferWriter_.close();
|
bufferWriter_.close();
|
||||||
}
|
}
|
||||||
//-
|
|
||||||
response = new ServerExchangeUnit_2021(ServerCode.OK);
|
|
||||||
}
|
}
|
||||||
private void CheckSubscriberRole() throws Exception {
|
void CheckSubscriberRole() throws Exception {
|
||||||
Account account = (Account) request.object;
|
Account account = (Account) request.object;
|
||||||
Subscriber subscriber = null;
|
Subscriber subscriber = null;
|
||||||
if (db.subscribers.containsKey(account.email)) {
|
if (db.subscribers.containsKey(account.email)) {
|
||||||
@@ -278,102 +270,55 @@ public class ComponentsServer extends RepositoryServer<BugReportsDatabase> {
|
|||||||
}
|
}
|
||||||
response.object = subscriber; //возвращаем информацию о подписчике.
|
response.object = subscriber; //возвращаем информацию о подписчике.
|
||||||
}
|
}
|
||||||
//--
|
void ReceiveAllArchives() throws Exception {
|
||||||
@Override
|
ZipFolderPass zip = new ZipFolderPass();
|
||||||
protected void Session() throws Exception {
|
File archives = new File(Utils_.getDateName("Bugs"));
|
||||||
switch (code) {
|
if (zip.Do("Bugs", archives.getAbsolutePath())) {
|
||||||
//<editor-fold desc="Регистрация">
|
response.object = Utils_.fileToBytes(archives);
|
||||||
case CheckSubscriberRole:
|
} else throw new RepositoryRefuseException("Не удалось запаковать архивы");
|
||||||
Print("Проверить роль пользователя");
|
}
|
||||||
CheckSubscriberRole();
|
void GetComponentsBackUps() throws Exception {
|
||||||
break;
|
File backupsDirectory = Paths.get(Utils_.getHomePath(), "Components", request.arg, "Backups").toFile();
|
||||||
//</editor-fold>
|
//--
|
||||||
//<editor-fold desc="БАГ РЕПОРТЫ">
|
if (backupsDirectory.exists()) {
|
||||||
case ReceiveAllArchives:
|
File[] files = backupsDirectory.listFiles(File::isFile);
|
||||||
Print("Отправить клиенту архив всех архивов баг репортов");
|
if (files != null) {
|
||||||
ZipFolderPass zip = new ZipFolderPass();
|
Vector<RemoteFile> res = new Vector<>();
|
||||||
File archives = new File(Utils_.getDateName("Bugs"));
|
for (File file : files)
|
||||||
if (zip.Do("Bugs", archives.getAbsolutePath())) {
|
res.add(new RemoteFile(file.getAbsolutePath(), false)); //тут всегда линух.
|
||||||
response.object = Utils_.fileToBytes(archives);
|
response.object = res;
|
||||||
Print("Архив успешно запакован");
|
} else throw new RepositoryRefuseException("Не удалось получить список предыдущих версий");
|
||||||
} else throw new RepositoryRefuseException("Не удалось запаковать архивы");
|
} else {
|
||||||
break;
|
//баги еще не создавались. штатная ситуация.
|
||||||
case UpdateBugReport:
|
response.object = new Vector<>();
|
||||||
UpdateBugReport();
|
|
||||||
break;
|
|
||||||
//--
|
|
||||||
case AppendBugReportTextField:
|
|
||||||
AppendBugReportField();
|
|
||||||
break;
|
|
||||||
//--
|
|
||||||
case ReceiveBugReportsDatabase:
|
|
||||||
Print("Получить базу данных баг репортов");
|
|
||||||
response.object = Utils_.fileToBytes(db.getFile());
|
|
||||||
break;
|
|
||||||
case ReceiveBugReport:
|
|
||||||
Print("Скачать баг репорт по ключу " + request.arg);
|
|
||||||
File bugArchive = Utils_.getFile(Utils_.getHomePath(), "Bugs", request.arg);
|
|
||||||
response.object = Utils_.fileToBytes(bugArchive);
|
|
||||||
break;
|
|
||||||
case SendBugReport: //todo устарело
|
|
||||||
Print("Отправить баг репорт " + request.arg);
|
|
||||||
File bugArchive1 = Utils_.getFile(Utils_.getHomePath(), "Bugs", request.arg);
|
|
||||||
Utils_.bytesToFile((byte[]) request.object, bugArchive1);
|
|
||||||
break;
|
|
||||||
//</editor-fold>
|
|
||||||
case GetComponentsBackups:
|
|
||||||
Print("Получить список сохраненных версий компонента " + request.arg);
|
|
||||||
File backupsDirectory = Paths.get(Utils_.getHomePath(), "Components", request.arg, "Backups").toFile();
|
|
||||||
//--
|
|
||||||
if (backupsDirectory.exists()) {
|
|
||||||
File[] files = backupsDirectory.listFiles(File::isFile);
|
|
||||||
if (files != null) {
|
|
||||||
Vector<RemoteFile> res = new Vector<>();
|
|
||||||
for (File file : files)
|
|
||||||
res.add(new RemoteFile(file.getAbsolutePath(), false)); //тут всегда линух.
|
|
||||||
response.object = res;
|
|
||||||
} else throw new RepositoryRefuseException("Не удалось получить список предыдущих версий");
|
|
||||||
} else {
|
|
||||||
//баги еще не создавались. штатная ситуация.
|
|
||||||
response.object = new Vector<>();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case UpdateComponent:
|
|
||||||
UpdateComponent();
|
|
||||||
break;
|
|
||||||
case ReceiveComponent:
|
|
||||||
String[] packed1 = request.arg.split("\n");
|
|
||||||
//тип/имя файла
|
|
||||||
File componentFile1 = Paths.get(Utils_.getHomePath(), "Components", packed1[0], packed1[1]).toFile();
|
|
||||||
Print("Получить компонент " + packed1[0]);
|
|
||||||
response.object = Utils_.fileToBytes(componentFile1);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new RepositoryRefuseException("Неподдерживаемый код: " + code);
|
|
||||||
case GetComponentsVersionsInfo:
|
|
||||||
GetComponentsVersionsInfo();
|
|
||||||
break;
|
|
||||||
case GetComponentChangesLog:
|
|
||||||
Print("Получить журнал изменений компонента " + request.arg);
|
|
||||||
response.object = Utils_.fileToBytes(Paths.get(Utils_.getHomePath(), "Components", request.arg, "changes.txt").toFile());
|
|
||||||
break;
|
|
||||||
case CheckURLRegistered:
|
|
||||||
Print("Проверить учетную запись на машине");
|
|
||||||
String[] data = request.arg.split("\n");
|
|
||||||
String email = data[0];
|
|
||||||
String machineURL = data[1];
|
|
||||||
String login = data[2];
|
|
||||||
response.object = db.workspaces.findWorkspace(email, machineURL, login);
|
|
||||||
break;
|
|
||||||
case DVMConvertProject:
|
|
||||||
Print("Сконвертировать проект в DVM код");
|
|
||||||
DVMConvertProject();
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void ReceiveBugReportsDatabase() throws Exception{
|
||||||
|
response.object = Utils_.fileToBytes(db.getFile());
|
||||||
|
}
|
||||||
|
void ReceiveBugReport() throws Exception {
|
||||||
|
File bugArchive = Utils_.getFile(Utils_.getHomePath(), "Bugs", request.arg);
|
||||||
|
response.object = Utils_.fileToBytes(bugArchive);
|
||||||
|
}
|
||||||
|
void ReceiveComponent() throws Exception {
|
||||||
|
String[] packed1 = request.arg.split("\n");
|
||||||
|
//тип/имя файла
|
||||||
|
File componentFile1 = Paths.get(Utils_.getHomePath(), "Components", packed1[0], packed1[1]).toFile();
|
||||||
|
Print("Получить компонент " + packed1[0]);
|
||||||
|
response.object = Utils_.fileToBytes(componentFile1);
|
||||||
|
}
|
||||||
|
void CheckURLRegistered() throws Exception {
|
||||||
|
String[] data = request.arg.split("\n");
|
||||||
|
String email = data[0];
|
||||||
|
String machineURL = data[1];
|
||||||
|
String login = data[2];
|
||||||
|
response.object = db.workspaces.findWorkspace(email, machineURL, login);
|
||||||
|
}
|
||||||
|
void GetComponentChangesLog() throws Exception {
|
||||||
|
response.object = Utils_.fileToBytes(Paths.get(Utils_.getHomePath(), "Components", request.arg, "changes.txt").toFile());
|
||||||
|
}
|
||||||
void UpdateBugReport() throws Exception {
|
void UpdateBugReport() throws Exception {
|
||||||
BugReport oldBugReport = (BugReport) request.object;
|
BugReport oldBugReport = (BugReport) request.object;
|
||||||
Print("Обновить баг репорт " + oldBugReport.id);
|
|
||||||
if (db.bugReports.containsKey(oldBugReport.id)) {
|
if (db.bugReports.containsKey(oldBugReport.id)) {
|
||||||
BugReport bugReport = db.bugReports.get(oldBugReport.id);
|
BugReport bugReport = db.bugReports.get(oldBugReport.id);
|
||||||
bugReport.SynchronizeFields(oldBugReport);
|
bugReport.SynchronizeFields(oldBugReport);
|
||||||
@@ -382,4 +327,53 @@ public class ComponentsServer extends RepositoryServer<BugReportsDatabase> {
|
|||||||
} else
|
} else
|
||||||
throw new RepositoryRefuseException("Баг репорт с ключом " + oldBugReport.id + " не существует.");
|
throw new RepositoryRefuseException("Баг репорт с ключом " + oldBugReport.id + " не существует.");
|
||||||
}
|
}
|
||||||
|
//--
|
||||||
|
@Override
|
||||||
|
protected void Session() throws Exception {
|
||||||
|
switch (code) {
|
||||||
|
// ПРОХОДЫ НЕЗАВИСИМЫЕ ОТ ВЕРСИИ
|
||||||
|
case CheckSubscriberRole:
|
||||||
|
CheckSubscriberRole();
|
||||||
|
break;
|
||||||
|
case GetComponentsBackups:
|
||||||
|
GetComponentsBackUps();
|
||||||
|
break;
|
||||||
|
case UpdateComponent:
|
||||||
|
PublishComponent();
|
||||||
|
break;
|
||||||
|
case ReceiveComponent:
|
||||||
|
ReceiveComponent();
|
||||||
|
break;
|
||||||
|
case CheckURLRegistered:
|
||||||
|
CheckURLRegistered();
|
||||||
|
break;
|
||||||
|
case GetComponentsVersionsInfo:
|
||||||
|
GetComponentsVersionsInfo();
|
||||||
|
break;
|
||||||
|
case GetComponentChangesLog:
|
||||||
|
GetComponentChangesLog();
|
||||||
|
break;
|
||||||
|
//------------------------------------------------------------------------>>>>
|
||||||
|
case ReceiveAllArchives:
|
||||||
|
ReceiveAllArchives();
|
||||||
|
break;
|
||||||
|
case UpdateBugReport:
|
||||||
|
UpdateBugReport();
|
||||||
|
break;
|
||||||
|
case AppendBugReportTextField:
|
||||||
|
AppendBugReportField();
|
||||||
|
break;
|
||||||
|
case ReceiveBugReportsDatabase:
|
||||||
|
ReceiveBugReportsDatabase();
|
||||||
|
break;
|
||||||
|
case ReceiveBugReport:
|
||||||
|
ReceiveBugReport();
|
||||||
|
break;
|
||||||
|
case DVMConvertProject:
|
||||||
|
DVMConvertProject();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new RepositoryRefuseException("Неподдерживаемый код: " + code);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ public enum ServerCode {
|
|||||||
UpdateComponent,
|
UpdateComponent,
|
||||||
ReceiveComponent,
|
ReceiveComponent,
|
||||||
ReceiveBugReport,
|
ReceiveBugReport,
|
||||||
SendBugReport,
|
|
||||||
GetComponentsVersionsInfo,
|
GetComponentsVersionsInfo,
|
||||||
GetComponentChangesLog,
|
GetComponentChangesLog,
|
||||||
//--
|
//--
|
||||||
@@ -81,8 +80,6 @@ public enum ServerCode {
|
|||||||
return "Публикация компонента на сервере";
|
return "Публикация компонента на сервере";
|
||||||
case PublishObject:
|
case PublishObject:
|
||||||
return "Публикация объекта на сервере";
|
return "Публикация объекта на сервере";
|
||||||
case SendBugReport:
|
|
||||||
return "Отправка отчета об ошибке на сервер";
|
|
||||||
case AppendBugReportTextField:
|
case AppendBugReportTextField:
|
||||||
return "Дополнение описание или комментария отчета об ошибке на сервере";
|
return "Дополнение описание или комментария отчета об ошибке на сервере";
|
||||||
case ReceiveBugReportsDatabase:
|
case ReceiveBugReportsDatabase:
|
||||||
|
|||||||
Reference in New Issue
Block a user