Skip to content

Commit

Permalink
Refactored: do not pass TC handlers to plugin classes, use self-writt…
Browse files Browse the repository at this point in the history
…en handlers instead (lesser parameters required) + some UTF-8 conversion
  • Loading branch information
pozitronik committed Jun 2, 2017
1 parent 7f44fd3 commit d6216fe
Show file tree
Hide file tree
Showing 11 changed files with 129 additions and 117 deletions.
40 changes: 20 additions & 20 deletions ANSIFunctions.pas
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ interface

uses Windows, PLUGIN_TYPES, AnsiStrings;

procedure FsGetDefRootName(DefRootName: PAnsiChar; maxlen: integer); stdcall; //Ïðîöåäóðà âûçûâàåòñÿ îäèí ðàç ïðè óñòàíîâêå ïëàãèíà
procedure FsGetDefRootName(DefRootName: PAnsiChar; maxlen: integer); stdcall; //Процедура вызывается один раз при установке плагина
procedure FsStatusInfo(RemoteDir: PAnsiChar; InfoStartEnd, InfoOperation: integer); stdcall;
function FsFindFirst(path: PAnsiChar; var FindData: tWIN32FINDDATAA): THandle; stdcall;
function FsFindNext(Hdl: THandle; var FindData: tWIN32FINDDATAA): Bool; stdcall;
function FsExecuteFile(MainWin: THandle; RemoteName, Verb: PAnsiChar): integer; stdcall; //Çàïóñê ôàéëà
function FsGetFile(RemoteName, LocalName: PAnsiChar; CopyFlags: integer; RemoteInfo: pRemoteInfo): integer; stdcall; //Êîïèðîâàíèå ôàéëà èç ôàéëîâîé ñèñòåìû ïëàãèíà
function FsPutFile(LocalName, RemoteName: PAnsiChar; CopyFlags: integer): integer; stdcall; //Êîïèðîâàíèå ôàéëà â ôàéëîâóþ ñèñòåìó ïëàãèíà
function FsExecuteFile(MainWin: THandle; RemoteName, Verb: PAnsiChar): integer; stdcall; //Запуск файла
function FsGetFile(RemoteName, LocalName: PAnsiChar; CopyFlags: integer; RemoteInfo: pRemoteInfo): integer; stdcall; //Копирование файла из файловой системы плагина
function FsPutFile(LocalName, RemoteName: PAnsiChar; CopyFlags: integer): integer; stdcall; //Копирование файла в файловую систему плагина
function FsDeleteFile(RemoteName: PAnsiChar): Bool; stdcall;
function FsRenMovFile(OldName: PAnsiChar; NewName: PAnsiChar; Move: Boolean; OverWrite: Boolean; ri: pRemoteInfo): integer;
function FsDisconnect(DisconnectRoot: PAnsiChar): Bool; stdcall;
Expand All @@ -24,7 +24,7 @@ function FsExtractCustomIcon(RemoteName: pchar; ExtractFlags: integer; var TheIc

implementation

procedure FsGetDefRootName(DefRootName: PAnsiChar; maxlen: integer); stdcall; //Ïðîöåäóðà âûçûâàåòñÿ îäèí ðàç ïðè óñòàíîâêå ïëàãèíà
procedure FsGetDefRootName(DefRootName: PAnsiChar; maxlen: integer); stdcall; //Процедура вызывается один раз при установке плагина
Begin
AnsiStrings.StrLCopy(DefRootName, PAnsiChar('CloudMailRu'), maxlen);
End;
Expand All @@ -37,61 +37,61 @@ procedure FsStatusInfo(RemoteDir: PAnsiChar; InfoStartEnd, InfoOperation: intege
function FsFindFirst(path: PAnsiChar; var FindData: tWIN32FINDDATAA): THandle; stdcall;
begin
SetLastError(ERROR_INVALID_FUNCTION);
Result := ERROR_INVALID_HANDLE; //Ansi-çàãëóøêà
Result := ERROR_INVALID_HANDLE; //Ansi-заглушка
end;

function FsFindNext(Hdl: THandle; var FindData: tWIN32FINDDATAA): Bool; stdcall;
begin
SetLastError(ERROR_INVALID_FUNCTION);
Result := false; //Ansi-çàãëóøêà
Result := false; //Ansi-заглушка
end;

function FsExecuteFile(MainWin: THandle; RemoteName, Verb: PAnsiChar): integer; stdcall; //Çàïóñê ôàéëà
function FsExecuteFile(MainWin: THandle; RemoteName, Verb: PAnsiChar): integer; stdcall; //Запуск файла
Begin
SetLastError(ERROR_INVALID_FUNCTION);
Result := FS_EXEC_ERROR; //Ansi-çàãëóøêà
Result := FS_EXEC_ERROR; //Ansi-заглушка
End;

function FsGetFile(RemoteName, LocalName: PAnsiChar; CopyFlags: integer; RemoteInfo: pRemoteInfo): integer; stdcall; //Êîïèðîâàíèå ôàéëà èç ôàéëîâîé ñèñòåìû ïëàãèíà
function FsGetFile(RemoteName, LocalName: PAnsiChar; CopyFlags: integer; RemoteInfo: pRemoteInfo): integer; stdcall; //Копирование файла из файловой системы плагина
begin
SetLastError(ERROR_INVALID_FUNCTION);
Result := FS_FILE_NOTSUPPORTED; //Ansi-çàãëóøêà
Result := FS_FILE_NOTSUPPORTED; //Ansi-заглушка
end;

function FsPutFile(LocalName, RemoteName: PAnsiChar; CopyFlags: integer): integer; stdcall; //Êîïèðîâàíèå ôàéëà â ôàéëîâóþ ñèñòåìó ïëàãèíà
function FsPutFile(LocalName, RemoteName: PAnsiChar; CopyFlags: integer): integer; stdcall; //Копирование файла в файловую систему плагина
begin
SetLastError(ERROR_INVALID_FUNCTION);
Result := FS_FILE_NOTSUPPORTED; //Ansi-çàãëóøêà
Result := FS_FILE_NOTSUPPORTED; //Ansi-заглушка
end;

function FsDeleteFile(RemoteName: PAnsiChar): Bool; stdcall; //Óäàëåíèå ôàéëà èç ôàéëîâîé ññèñòåìû ïëàãèíà
function FsDeleteFile(RemoteName: PAnsiChar): Bool; stdcall; //Удаление файла из файловой ссистемы плагина
Begin
SetLastError(ERROR_INVALID_FUNCTION); //Ansi-çàãëóøêà
SetLastError(ERROR_INVALID_FUNCTION); //Ansi-заглушка
Result := false;
End;

function FsRenMovFile(OldName: PAnsiChar; NewName: PAnsiChar; Move: Boolean; OverWrite: Boolean; ri: pRemoteInfo): integer;
begin
SetLastError(ERROR_INVALID_FUNCTION);
Result := FS_FILE_NOTSUPPORTED; //Ansi-çàãëóøêà
Result := FS_FILE_NOTSUPPORTED; //Ansi-заглушка
end;

function FsDisconnect(DisconnectRoot: PAnsiChar): Bool; stdcall;
begin
SetLastError(ERROR_INVALID_FUNCTION);
Result := false; //ansi-çàãëóøêà
Result := false; //ansi-заглушка
end;

function FsMkDir(path: PAnsiChar): Bool; stdcall;
begin
SetLastError(ERROR_INVALID_FUNCTION);
Result := false; //ansi-çàãëóøêà
Result := false; //ansi-заглушка
end;

function FsRemoveDir(RemoteName: PAnsiChar): Bool; stdcall;
begin
SetLastError(ERROR_INVALID_FUNCTION);
Result := false; //ansi-çàãëóøêà
Result := false; //ansi-заглушка
end;

procedure FsSetCryptCallback(PCryptProc: TCryptProcW; CryptoNr: integer; Flags: integer); stdcall;
Expand Down Expand Up @@ -205,7 +205,7 @@ function FsContentGetValue(FileName: PAnsiChar; FieldIndex: integer; UnitIndex:
function FsExtractCustomIcon(RemoteName: pchar; ExtractFlags: integer; var TheIcon: hicon): integer; stdcall;
begin
SetLastError(ERROR_INVALID_FUNCTION);
Result := FS_FILE_NOTSUPPORTED; //Ansi-çàãëóøêà
Result := FS_FILE_NOTSUPPORTED; //Ansi-заглушка
end;

end.
2 changes: 1 addition & 1 deletion CMLJSON.pas
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ function fromJSON_OperationResult(JSON: WideString; var OperationStatus: integer
if error = 'export_limit_exceeded' then exit(CLOUD_ERROR_EXPORT_LIMIT_EXCEEDED);
if error = 'unprocessable_entry' then exit(CLOUD_ERROR_UNPROCESSABLE_ENTRY);

exit(CLOUD_ERROR_UNKNOWN); //Ýòó îøèáêó ìû ïîêà íå âñòðå÷àëè
exit(CLOUD_ERROR_UNKNOWN); //Эту ошибку мы пока не встречали

end;
JSONVal.free;
Expand Down
62 changes: 31 additions & 31 deletions CMLTypes.pas
Original file line number Diff line number Diff line change
Expand Up @@ -46,38 +46,38 @@ interface
TYPE_FILE = 'file';

KIND_SHARED = 'shared';
{Êîíñòàíòû äëÿ îáîçíà÷åíèÿ îøèáîê, âîçâðàùàåìûõ ïðè ïàðñèíãå îòâåòîâ îáëàêà. Äîïîëíÿåì ïî ìåðå îáíàðóæåíèÿ}
CLOUD_ERROR_UNKNOWN = -2; //unknown: 'Îøèáêà íà ñåðâåðå'
{Константы для обозначения ошибок, возвращаемых при парсинге ответов облака. Дополняем по мере обнаружения}
CLOUD_ERROR_UNKNOWN = -2; //unknown: 'Ошибка на сервере'
CLOUD_OPERATION_ERROR_STATUS_UNKNOWN = -1;
CLOUD_OPERATION_OK = 0;
CLOUD_OPERATION_FAILED = 1;
CLOUD_OPERATION_CANCELLED = 5;

CLOUD_ERROR_EXISTS = 1; //exists: 'Ïàïêà ñ òàêèì íàçâàíèåì óæå ñóùåñòâóåò. Ïîïðîáóéòå äðóãîå íàçâàíèå'
CLOUD_ERROR_REQUIRED = 2; //required: 'Íàçâàíèå ïàïêè íå ìîæåò áûòü ïóñòûì'
CLOUD_ERROR_INVALID = 3; //invalid: '&laquo;' + app.escapeHTML(name) + '&raquo; ýòî íåïðàâèëüíîå íàçâàíèå ïàïêè. Â íàçâàíèè ïàïîê íåëüçÿ èñïîëüçîâàòü ñèìâîëû «" * / : < > ? \\ |»'
CLOUD_ERROR_READONLY = 4; //readonly|read_only: 'Íåâîçìîæíî ñîçäàòü. Äîñòóï òîëüêî äëÿ ïðîñìîòðà'
CLOUD_ERROR_NAME_LENGTH_EXCEEDED = 5; //name_length_exceeded: 'Îøèáêà: Ïðåâûøåíà äëèíà èìåíè ïàïêè. <a href="https://help.mail.ru/cloud_web/confines" target="_blank">Ïîäðîáíåå…</a>'
CLOUD_ERROR_OVERQUOTA = 7; //overquota: 'Íåâîçìîæíî ñêîïèðîâàòü, â âàøåì Îáëàêå íåäîñòàòî÷íî ìåñòà'
CLOUD_ERROR_QUOTA_EXCEEDED = 7; //"quota_exceeded": 'Íåâîçìîæíî ñêîïèðîâàòü, â âàøåì Îáëàêå íåäîñòàòî÷íî ìåñòà'
CLOUD_ERROR_NOT_EXISTS = 8; //"not_exists": 'Êîïèðóåìàÿ ññûëêà íå ñóùåñòâóåò'
CLOUD_ERROR_OWN = 9; //"own": 'Íåâîçìîæíî êëîíèðîâàòü ñîáñòâåííóþ ññûëêó'
CLOUD_ERROR_NAME_TOO_LONG = 10; //"name_too_long": 'Ïðåâûøåí ðàçìåð èìåíè ôàéëà'
CLOUD_ERROR_VIRUS_SCAN_FAIL = 11; //"virus_scan_fail": 'Ôàéë çàðàæåí âèðóñîì'
CLOUD_ERROR_OWNER = 12; //Íåëüçÿ èñïîëüçîâàòü ñîáñòâåííûé email
CLOUD_ERROR_FAHRENHEIT = 451; //Ïóáëèêàöèÿ êîíòåíòà çàáëîêèðîâàíà ïî òðåáîâàíèþ ïðàâîîáëàäàòåëÿ èëè óïîëíîìî÷åííîãî ãîñóäàðñòâåííîãî âåäîìñòâà.
CLOUD_ERROR_EXISTS = 1; //exists: 'Папка с таким названием уже существует. Попробуйте другое название'
CLOUD_ERROR_REQUIRED = 2; //required: 'Название папки не может быть пустым'
CLOUD_ERROR_INVALID = 3; //invalid: '&laquo;' + app.escapeHTML(name) + '&raquo; это неправильное название папки. В названии папок нельзя использовать символы «" * / : < > ? \\ |»'
CLOUD_ERROR_READONLY = 4; //readonly|read_only: 'Невозможно создать. Доступ только для просмотра'
CLOUD_ERROR_NAME_LENGTH_EXCEEDED = 5; //name_length_exceeded: 'Ошибка: Превышена длина имени папки. <a href="https://help.mail.ru/cloud_web/confines" target="_blank">Подробнее…</a>'
CLOUD_ERROR_OVERQUOTA = 7; //overquota: 'Невозможно скопировать, в вашем Облаке недостаточно места'
CLOUD_ERROR_QUOTA_EXCEEDED = 7; //"quota_exceeded": 'Невозможно скопировать, в вашем Облаке недостаточно места'
CLOUD_ERROR_NOT_EXISTS = 8; //"not_exists": 'Копируемая ссылка не существует'
CLOUD_ERROR_OWN = 9; //"own": 'Невозможно клонировать собственную ссылку'
CLOUD_ERROR_NAME_TOO_LONG = 10; //"name_too_long": 'Превышен размер имени файла'
CLOUD_ERROR_VIRUS_SCAN_FAIL = 11; //"virus_scan_fail": 'Файл заражен вирусом'
CLOUD_ERROR_OWNER = 12; //Нельзя использовать собственный email
CLOUD_ERROR_FAHRENHEIT = 451; //Публикация контента заблокирована по требованию правообладателя или уполномоченного государственного ведомства.
CLOUD_ERROR_BAD_REQUEST = 400; //
CLOUD_ERROR_TREES_CONFLICT = 15; //Íåëüçÿ ñäåëàòü ïàïêó îáùåé, åñëè îíà ñîäåðæèò äðóãèå îáùèå ïàïêè èëè íàõîäèòñÿ â îáùåé ïàïêå
CLOUD_ERROR_UNPROCESSABLE_ENTRY = 16; //Íåëüçÿ îòêðûòü äîñòóï ê ôàéëó
CLOUD_ERROR_USER_LIMIT_EXCEEDED = 17; //Íåâîçìîæíî äîáàâèòü ïîëüçîâàòåëÿ. Âû ìîæåòå èìåòü íå áîëåå 200 ïîëüçîâàòåëåé â îäíîé îáùåé ïàïêå
CLOUD_ERROR_EXPORT_LIMIT_EXCEEDED = 18; //Íåâîçìîæíî äîáàâèòü ïîëüçîâàòåëÿ. Âû ìîæåòå ñîçäàòü íå áîëåå 50 îáùèõ ïàïîê
CLOUD_ERROR_NOT_ACCEPTABLE = 406; //Íåëüçÿ äîáàâèòü ýòîãî ïîëüçîâàòåëÿ

{Ðåæèìû ðàáîòû ïðè êîíôëèêòàõ êîïèðîâàíèÿ}
CLOUD_CONFLICT_STRICT = 'strict'; //âîçâðàùàåì îøèáêó ïðè ñóùåñòâîâàíèè ôàéëà
CLOUD_CONFLICT_IGNORE = 'ignore'; //Â API, âèäèìî, íå ðåàëèçîâàíî
CLOUD_CONFLICT_RENAME = 'rename'; //Ïåðåèìåíóåì íîâûé ôàéë
//CLOUD_CONFLICT_REPLACE = 'overwrite'; // õç, ýòîò êëþ÷ íå âñêðûò
CLOUD_ERROR_TREES_CONFLICT = 15; //Нельзя сделать папку общей, если она содержит другие общие папки или находится в общей папке
CLOUD_ERROR_UNPROCESSABLE_ENTRY = 16; //Нельзя открыть доступ к файлу
CLOUD_ERROR_USER_LIMIT_EXCEEDED = 17; //Невозможно добавить пользователя. Вы можете иметь не более 200 пользователей в одной общей папке
CLOUD_ERROR_EXPORT_LIMIT_EXCEEDED = 18; //Невозможно добавить пользователя. Вы можете создать не более 50 общих папок
CLOUD_ERROR_NOT_ACCEPTABLE = 406; //Нельзя добавить этого пользователя

{Режимы работы при конфликтах копирования}
CLOUD_CONFLICT_STRICT = 'strict'; //возвращаем ошибку при существовании файла
CLOUD_CONFLICT_IGNORE = 'ignore'; //В API, видимо, не реализовано
CLOUD_CONFLICT_RENAME = 'rename'; //Переименуем новый файл
//CLOUD_CONFLICT_REPLACE = 'overwrite'; // хз, этот ключ не вскрыт

CLOUD_SHARE_ACCESS_READ_ONLY = 'read_only';
CLOUD_SHARE_ACCESS_READ_WRITE = 'read_write';
Expand All @@ -90,12 +90,12 @@ interface
CLOUD_SHARE_RO = 1;
CLOUD_SHARE_NO = 2;

{Ïîääåðæèâàåìûå ìåòîäû àâòîðèçàöèè}
CLOUD_AUTH_METHOD_WEB = 0; //×åðåç ïàðñèíã HTTP-ñòðàíèöû
CLOUD_AUTH_METHOD_TWO_STEP = 1; //×åðåç ïàðñèíã HTTP-ñòðàíèöû, äâóõôàêòîðíàÿ
CLOUD_AUTH_METHOD_OAUTH = 2; //×åðåç ñåðâåð OAuth-àâòîðèçàöèè
{Поддерживаемые методы авторизации}
CLOUD_AUTH_METHOD_WEB = 0; //Через парсинг HTTP-страницы
CLOUD_AUTH_METHOD_TWO_STEP = 1; //Через парсинг HTTP-страницы, двухфакторная
CLOUD_AUTH_METHOD_OAUTH = 2; //Через сервер OAuth-авторизации

{Êîíñòàíòà èñïîëüçîâàíèÿ ìîáèëüíîãî àóòåíòèôèêàòîðà äëÿ äâóõôàêòîðíîé àâòîðèçàöèè}
{Константа использования мобильного аутентификатора для двухфакторной авторизации}
AUTH_APP_USED = -1;

type
Expand Down
16 changes: 7 additions & 9 deletions CloudMailRu.pas
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ interface
TCloudMailRu = class
private
{VARIABLES}
ExternalPluginNr: integer; //todo remove
ExternalSourceName: PWideChar;
ExternalTargetName: PWideChar;
domain: WideString;
Expand All @@ -30,9 +29,9 @@ TCloudMailRu = class
login_method: integer;
Cookie: TIdCookieManager;
Socks: TIdSocksInfo;
ExternalProgressProc: TProgressProcW;
ExternalProgressProc: TProgressHandler;
ExternalLogProc: TLogHandler;
ExternalRequestProc: TRequestProcW;
ExternalRequestProc: TRequestHandler;
Shard: WideString;
Proxy: TProxySettings;
ConnectTimeout: integer;
Expand Down Expand Up @@ -83,7 +82,7 @@ TCloudMailRu = class
Property ConnectTimeoutValue: integer read ConnectTimeout;
function getSharedFileUrl(remotePath: WideString; DoUrlEncode: Boolean = true): WideString;
{CONSTRUCTOR/DESTRUCTOR}
constructor Create(AccountSettings: TAccountSettings; split_file_size: integer; Proxy: TProxySettings; ConnectTimeout: integer; ExternalProgressProc: TProgressProcW = nil; PluginNr: integer = -1; ExternalLogProc: TLogHandler = nil; ExternalRequestProc: TRequestProcW = nil);
constructor Create(AccountSettings: TAccountSettings; split_file_size: integer; Proxy: TProxySettings; ConnectTimeout: integer; ExternalProgressProc: TProgressHandler = nil; ExternalLogProc: TLogHandler = nil; ExternalRequestProc: TRequestHandler = nil);
destructor Destroy; override;
{CLOUD INTERFACE METHODS}
function login(method: integer = CLOUD_AUTH_METHOD_WEB): Boolean;
Expand Down Expand Up @@ -219,7 +218,7 @@ function TCloudMailRu.cpFile(OldName, NewName: WideString): integer;
end;
end;

constructor TCloudMailRu.Create(AccountSettings: TAccountSettings; split_file_size: integer; Proxy: TProxySettings; ConnectTimeout: integer; ExternalProgressProc: TProgressProcW; PluginNr: integer; ExternalLogProc: TLogHandler; ExternalRequestProc: TRequestProcW);
constructor TCloudMailRu.Create(AccountSettings: TAccountSettings; split_file_size: integer; Proxy: TProxySettings; ConnectTimeout: integer; ExternalProgressProc: TProgressHandler = nil; ExternalLogProc: TLogHandler = nil; ExternalRequestProc: TRequestHandler = nil);
begin
try
self.Cookie := TIdCookieManager.Create();
Expand Down Expand Up @@ -265,7 +264,6 @@ constructor TCloudMailRu.Create(AccountSettings: TAccountSettings; split_file_si
self.ExternalLogProc := ExternalLogProc;
self.ExternalRequestProc := ExternalRequestProc;

self.ExternalPluginNr := PluginNr;
self.ExternalSourceName := '';
self.ExternalTargetName := '';
except
Expand Down Expand Up @@ -1086,7 +1084,7 @@ procedure TCloudMailRu.HTTPProgress(ASender: TObject; AWorkMode: TWorkMode; AWor
if (Pos('chunked', LowerCase(HTTP.Response.TransferEncoding)) = 0) and (ContentLength > 0) then
begin
Percent := 100 * AWorkCount div ContentLength;
if Assigned(ExternalProgressProc) and (ExternalProgressProc(self.ExternalPluginNr, self.ExternalSourceName, self.ExternalTargetName, Percent) = 1) then abort;
if Assigned(ExternalProgressProc) and (ExternalProgressProc(self.ExternalSourceName, self.ExternalTargetName, Percent) = 1) then abort;
end;
end;

Expand Down Expand Up @@ -1136,7 +1134,7 @@ function TCloudMailRu.loginRegular(method: integer): Boolean;
Log(LogLevelDebug, MSGTYPE_DETAILS, 'Awaiting for security key... ');
GetMem(SecurityKey, 32);
ZeroMemory(SecurityKey, 32);
if (true = ExternalRequestProc(self.ExternalPluginNr, RT_Other, 'Enter auth key', PWideChar(AuthMessage), SecurityKey, 32)) then
if (true = ExternalRequestProc(RT_Other, 'Enter auth key', PWideChar(AuthMessage), SecurityKey, 32)) then
begin
FormFields.Clear;
FormFields.AddOrSetValue('Login', self.user + '@' + self.domain);
Expand Down Expand Up @@ -1469,7 +1467,7 @@ function TCloudMailRu.putFileSplit(localPath, remotePath, ConflictMode: WideStri
ChunkFileName: WideString;
begin
try
Splitter := TFileSplitter.Create(localPath, self.split_file_size, self.ExternalProgressProc, self.ExternalPluginNr); //memleak possible
Splitter := TFileSplitter.Create(localPath, self.split_file_size, self.ExternalProgressProc); //memleak possible
SplitResult := Splitter.split();
except
on E: Exception do
Expand Down
Loading

0 comments on commit d6216fe

Please sign in to comment.